Генератор документации средствами встроенного языка 1С: Предприятие 8.3.10

в 13:45, , рубрики: 1с предприятие 8, Программирование

Добрый день!
Пару недель назад почитал форумы и подготовил универсальную обработку на встроенном языке 1С анализирующую исходный код любых отчетов и обработок «1С: Предприятие 8». Вызван анализ исходного кода был появлением продаж на моей домашней страничке. Попытки написать в ручную документации для нескольких тысяч файлов успеха не имели.

Шаг первый:

— Создать таблицы для анализа исходного кода одного модуля (для отладки шаблона):

image

— Создать макет для вывода функционала исходного кода одного модуля в документацию:

image

— Создать процедуры для анализа исходного кода одного модуля:

Много кода

&НаКлиенте
Процедура ЗаполнитьКодМодуля()
ИмяФайлаПриИзменении("");
Текст=Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяФайла);
КодМодуля.Очистить();
Для н=1 по Текст.КоличествоСтрок() Цикл
Стр=Текст.ПолучитьСтроку(н);
СтрКодаМодуля=КодМодуля.Добавить();
СтрКодаМодуля.Стр=Стр;
СтрКодаМодуля.НомерСтроки=н;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьОператоры()
Перем СтрОператора;
Операторы.Очистить();
Для каждого СтрКодаМодуля из КодМодуля Цикл
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Процедура")<>0 Тогда
Попытка
СтрОператора.НомерСтрокиОкончания=СтрКодаМодуля.НомерСтроки-4;
Исключение
КонецПопытки;
СтрОператора=Операторы.Добавить();
М=СтрРазделить(СтрКодаМодуля.Стр,"(");
М1=СтрРазделить(М.Получить(0)," ");
СтрОператора.Оператор=М1.Получить(1);
СтрОператора.НомерСтрокиНачала=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Функция")<>0 Тогда
Попытка
СтрОператора.НомерСтрокиОкончания=СтрКодаМодуля.НомерСтроки-4;
Исключение
КонецПопытки;
СтрОператора=Операторы.Добавить();
М=СтрРазделить(СтрКодаМодуля.Стр,"(");
М1=СтрРазделить(М.Получить(0)," ");
СтрОператора.Оператор=М1.Получить(1);
СтрОператора.НомерСтрокиНачала=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЦикла;
СтрОператора.НомерСтрокиОкончания=КодМодуля.Количество()-2;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТаблицыОператоров()
Для каждого СтрОператора из Операторы Цикл
Для н=СтрОператора.НомерСтрокиНачала по СтрОператора.НомерСтрокиОкончания Цикл
СтрКодаМодуля=КодМодуля.Получить(н);
СтрКодаОператора=СтрОператора.КодОператора.Добавить();
СтрКодаОператора.Стр=СтрКодаМодуля.Стр;
СтрКодаОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Справочник")<>0 Тогда
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Найти")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
Для ном=0 по М.Количество()-1 Цикл
Если ном+1<М.Количество() Тогда
Если Лев(М.Получить(ном+1),5)="Найти" Тогда
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М.Получить(ном)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М.Получить(ном);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Справочник "+М.Получить(ном);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
М1=СтрРазделить(СтрКодаМодуля.Стр,"()");
Если М1.Количество()<=5 Тогда
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Сокр")=0 Тогда
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"НайтиПоКоду")<>0 Тогда
Если СтрЧислоВхождений(М1.Получить(1),"НайтиПоКоду")<>0 Тогда
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Код="+М1.Получить(2)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Код="+М1.Получить(2);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
Иначе
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Код="+М1.Получить(1)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Код="+М1.Получить(1);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЕсли;
Иначе
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Наименование="+М1.Получить(1)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Наименование="+М1.Получить(1);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЕсли;
Иначе
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"НайтиПоКоду")<>0 Тогда
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Код="+М1.Получить(2)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Код="+М1.Получить(2);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
Иначе
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Наименование="+М1.Получить(2)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Наименование="+М1.Получить(2);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"НайтиПоКоду")<>0 Тогда
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Код="+М1.Получить(М1.Количество()-3)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Код="+М1.Получить(М1.Количество()-3);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
Иначе
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Наименование="+М1.Получить(М1.Количество()-3)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Наименование="+М1.Получить(М1.Количество()-3);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"|")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
Если СтрЧислоВхождений(М.Получить(М.Количество()-1)," КАК ")<>0 Тогда
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Справочник "+Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4);
М1=СтрРазделить(М.Получить(М.Количество()-1)," КАК ");
ТаблицаИспользуемаяОператором.Переменная=М1.Получить(М1.Количество()-1);
КонецЕсли;
Иначе
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М.Получить(М.Количество()-1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М.Получить(М.Количество()-1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Справочник "+М.Получить(М.Количество()-1);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Object")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,Символ(34));
М1=СтрРазделить(М.Получить(1),".");
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М1.Получить(1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М1.Получить(1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Справочник в подключаемой базе "+М1.Получить(1);
М2=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М2.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М2.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Документы.")<>0 Тогда
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Найти")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М.Получить(1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М.Получить(1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Документ "+М.Получить(1);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
М1=СтрРазделить(СтрКодаМодуля.Стр,"()");
М2=СтрРазделить(М1.Получить(1),",");
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Номер="+М2.Получить(0)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Номер="+М2.Получить(0);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
Масс=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.НайтиСтроки(Новый Структура("Условие","Дата="+М2.Получить(1)));
Если Масс.Количество()=0 Тогда
УсловияПоТаблицеОператора=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Добавить();
УсловияПоТаблицеОператора.Условие="Дата="+М2.Получить(1);
УсловияПоТаблицеОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"|")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
Если СтрЧислоВхождений(М.Получить(М.Количество()-1)," КАК ")<>0 Тогда
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Документ "+Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
Иначе
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М.Получить(М.Количество()-1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М.Получить(М.Количество()-1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Документ "+М.Получить(М.Количество()-1);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Object")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,Символ(34));
М1=СтрРазделить(М.Получить(1),".");
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М1.Получить(1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М1.Получить(1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Документ в подключаемой базе "+М1.Получить(1);
М2=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М2.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М2.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Регистр")<>0 Тогда
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"СоздатьМенеджер")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М.Получить(1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М.Получить(1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Регистр "+М.Получить(1);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"|")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
Если СтрЧислоВхождений(М.Получить(М.Количество()-1)," КАК ")<>0 Тогда
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Регистр "+Сред(М.Получить(М.Количество()-1),1,СтрДлина(М.Получить(М.Количество()-1))-Найти(М.Получить(М.Количество()-1)," КАК ")-4);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
Иначе
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М.Получить(М.Количество()-1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М.Получить(М.Количество()-1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Регистр "+М.Получить(М.Количество()-1);
М1=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М1.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М1.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,"Object")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,Символ(34));
М1=СтрРазделить(М.Получить(1),".");
Масс=СтрОператора.ИспользуемыеТаблицы.НайтиСтроки(Новый Структура("Таблица",М1.Получить(1)));
Если Масс.Количество()=0 Тогда
ТаблицаИспользуемаяОператором=СтрОператора.ИспользуемыеТаблицы.Добавить();
ТаблицаИспользуемаяОператором.Таблица=М1.Получить(1);
ТаблицаИспользуемаяОператором.НомерСтроки=СтрКодаМодуля.НомерСтроки;
ТаблицаИспользуемаяОператором.Синоним="Регистр в подключаемой базе "+М1.Получить(1);
М2=СтрРазделить(СтрКодаМодуля.Стр,"=");
Если СтрЧислоВхождений(М2.Получить(0),".")=0 Тогда
ТаблицаИспользуемаяОператором.Переменная=СокрЛП(М2.Получить(0));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПоляТаблицОператоров()
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Если СокрЛП(ТаблицаИспользуемаяОператором.Переменная)<>"" Тогда
Для н=СтрОператора.НомерСтрокиНачала по СтрОператора.НомерСтрокиОкончания Цикл
СтрКодаМодуля=КодМодуля.Получить(н);
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,СокрЛП(ТаблицаИспользуемаяОператором.Переменная)+".")<>0 Тогда
М=СтрРазделить(СтрКодаМодуля.Стр,".");
М1=СтрРазделить(М.Получить(1),"=");
Если СтрЧислоВхождений(М1.Получить(0),"(")=0 Тогда
Если СтрЧислоВхождений(М1.Получить(0),Символ(34))=0 Тогда
Если СтрЧислоВхождений(М1.Получить(0),"ССЫЛКА")=0 Тогда
Если СтрЧислоВхождений(М1.Получить(0),")")=0 Тогда
Если СтрЧислоВхождений(М1.Получить(0),СокрЛП(ТаблицаИспользуемаяОператором.Переменная))=0 Тогда
Масс=ТаблицаИспользуемаяОператором.Поля.НайтиСтроки(Новый Структура("Поле",СтрЗаменить(СтрЗаменить(М1.Получить(0)," Тогда",""),";","")));
Если Масс.Количество()=0 Тогда
ПолеТаблицыОператора=ТаблицаИспользуемаяОператором.Поля.Добавить();
ПолеТаблицыОператора.Поле=СтрЗаменить(СтрЗаменить(М1.Получить(0)," Тогда",""),";","");
ПолеТаблицыОператора.НомерСтроки=СтрКодаМодуля.НомерСтроки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьТаблицыОператоров()
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Если СокрЛП(ТаблицаИспользуемаяОператором.Переменная)<>"" Тогда
Для н=СтрОператора.НомерСтрокиНачала по СтрОператора.НомерСтрокиОкончания Цикл
СтрКодаМодуля=КодМодуля.Получить(н);
Если СтрЧислоВхождений(СтрКодаМодуля.Стр,СокрЛП(ТаблицаИспользуемаяОператором.Переменная)+".Записать")<>0 Тогда
ТаблицаИспользуемаяОператором.ЕстьЗапись=Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ПолучитьФункционалОбработкиНаСервере()
ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ТабличныйДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаТаблицы");
ТабличныйДокумент.Вывести(ОбластьМакета);
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Таблица");
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Масс=ТЗ.НайтиСтроки(Новый Структура("Таблица",ТаблицаИспользуемаяОператором.Синоним));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Таблица=ТаблицаИспользуемаяОператором.Синоним;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Таблица Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТаблицы");
ОбластьМакета.Параметры.НомерПП = н;
ОбластьМакета.Параметры.Таблица = СтрТЗ.Таблица;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаУсловия");
ТабличныйДокумент.Вывести(ОбластьМакета);
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Условие");
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Для каждого УсловияПоТаблицеОператора из ТаблицаИспользуемаяОператором.УсловияПоТаблицам Цикл
Масс=ТЗ.НайтиСтроки(Новый Структура("Условие",ТаблицаИспользуемаяОператором.Таблица+"."+УсловияПоТаблицеОператора.Условие));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Условие=ТаблицаИспользуемаяОператором.Таблица+"."+УсловияПоТаблицеОператора.Условие;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Условие Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаУсловия");
ОбластьМакета.Параметры.НомерПП = н;
ОбластьМакета.Параметры.Условие = СтрТЗ.Условие;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаПоля");
ТабличныйДокумент.Вывести(ОбластьМакета);
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Поле");
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Для каждого ПолеТаблицыОператора из ТаблицаИспользуемаяОператором.Поля Цикл
Масс=ТЗ.НайтиСтроки(Новый Структура("Поле",ТаблицаИспользуемаяОператором.Таблица+"."+ПолеТаблицыОператора.Поле));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Поле=ТаблицаИспользуемаяОператором.Таблица+"."+ПолеТаблицыОператора.Поле;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Поле Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаПоля");
ОбластьМакета.Параметры.НомерПП = н;
ОбластьМакета.Параметры.Поле = СтрТЗ.Поле;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаФункционал");
ТабличныйДокумент.Вывести(ОбластьМакета);
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Функционал");
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Если ТаблицаИспользуемаяОператором.ЕстьЗапись=Истина Тогда
Масс=ТЗ.НайтиСтроки(Новый Структура("Функционал",ТаблицаИспользуемаяОператором.Синоним));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Функционал=ТаблицаИспользуемаяОператором.Синоним;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Функционал Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаФункционала");
ОбластьМакета.Параметры.НомерПП = н;
ОбластьМакета.Параметры.Функционал = СтрТЗ.Функционал;
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;
ТабличныйДокумент.АвтоМасштаб = Истина;
Объект.ДокументПечати = ТабличныйДокумент;
КонецПроцедуры

Шаг второй:

— Перебор всех файлов отчетов и обработок для распаковки и анализа:


&НаКлиенте
Процедура ПолучитьСписокОбработок(База,ИмяПапки,СоздаватьКаталог)
НайденныеФайлы = НайтиФайлы(ИмяПапки+""+База, "*.*",Истина);
Для н=0 по НайденныеФайлы.Количество()-1 Цикл
ТекФайл=НайденныеФайлы.Получить(н);
Если ТекФайл.ЭтоКаталог()=Истина Тогда
Если Прав(ТекФайл.Путь,5+СтрДлина(База))="8.3"+База+"" Тогда
НайденныеФайлы1 = НайтиФайлы(ИмяПапкиСОбработками+""+База+""+ТекФайл.Имя, "*.epf",Ложь);
Если НайденныеФайлы1.Количество()<>0 Тогда
СтрПапок=Папки.Добавить();
СтрПапок.База=База;
СтрПапок.Тип=НомерРаздела;
СтрПапок.ИмяПапки=ТекФайл.Имя;
Для н1=0 по НайденныеФайлы1.Количество()-1 Цикл
ТекФайл1=НайденныеФайлы1.Получить(н1);
Если ТекФайл1.ЭтоКаталог()=Ложь Тогда
Если Сред(ТекФайл1.ИмяБезРасширения,СтрДлина(ТекФайл1.ИмяБезРасширения)-2)<>"(1)" Тогда
СтрФайлов=СтрПапок.Файлы.Добавить();
СтрФайлов.ИмяФайла=ТекФайл1.ИмяБезРасширения;
НайденныеФайлы4 = НайтиФайлы(ИмяПапкиССкриншотами+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения, "*.*",Ложь);
Если НайденныеФайлы4.Количество()=0 Тогда
Если СоздаватьКаталог=Истина Тогда
СоздатьКаталог(ИмяПапкиССкриншотами+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения);
КонецЕсли;
КонецЕсли;
НайденныеФайлы2 = НайтиФайлы(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения, "*.*",Ложь);
Если НайденныеФайлы2.Количество()=0 Тогда
Если СоздаватьКаталог=Истина Тогда
СоздатьКаталог(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения);
ИмяПапкиСКодамиМодулей=ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения;
ИмяОбработки=ИмяПапкиСОбработками+""+База+""+ТекФайл.Имя+""+ТекФайл1.Имя;
КомандаСистемы("UnpackV8.exe -parse "+Символ(34)+ИмяОбработки+Символ(34)+" "+Символ(34)+ИмяПапкиСКодамиМодулей+Символ(34));
КонецЕсли;
КонецЕсли;
НайденныеФайлы2 = НайтиФайлы(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения, "*.0",Ложь);
Если НайденныеФайлы2.Количество()<>0 Тогда
Для н2=0 по НайденныеФайлы2.Количество()-1 Цикл
ТекФайл2=НайденныеФайлы2.Получить(н2);
Если ТекФайл2.ЭтоКаталог()=Истина Тогда
НайденныеФайлы3 = НайтиФайлы(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения+""+ТекФайл2.Имя, "*.*",Ложь);
Если НайденныеФайлы3.Количество()<>0 Тогда
Для н3=0 по НайденныеФайлы3.Количество()-1 Цикл
ТекФайл3=НайденныеФайлы3.Получить(н3);
Если ТекФайл3.ЭтоКаталог()=Ложь Тогда
СтрМодулей=СтрФайлов.Модули.Добавить();
СтрМодулей.ИмяМодуля=ТекФайл3.ПолноеИмя;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
СтрМодулей=СтрФайлов.Модули.Добавить();
СтрМодулей.ИмяМодуля=ТекФайл2.ПолноеИмя;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьСписокОтчетов(База,ИмяПапки,СоздаватьКаталог)
НайденныеФайлы = НайтиФайлы(ИмяПапки+""+База, "*.*",Истина);
Для н=0 по НайденныеФайлы.Количество()-1 Цикл
ТекФайл=НайденныеФайлы.Получить(н);
Если ТекФайл.ЭтоКаталог()=Истина Тогда
Если Прав(ТекФайл.Путь,5+СтрДлина(База))="8.3"+База+"" Тогда
НайденныеФайлы1 = НайтиФайлы(ИмяПапкиСОбработками+""+База+""+ТекФайл.Имя, "*.erf",Ложь);
Если НайденныеФайлы1.Количество()<>0 Тогда
СтрПапок=Папки.Добавить();
СтрПапок.База=База;
СтрПапок.Тип=НомерРаздела;
СтрПапок.ИмяПапки=ТекФайл.Имя;
Для н1=0 по НайденныеФайлы1.Количество()-1 Цикл
ТекФайл1=НайденныеФайлы1.Получить(н1);
Если ТекФайл1.ЭтоКаталог()=Ложь Тогда
Если Сред(ТекФайл1.ИмяБезРасширения,СтрДлина(ТекФайл1.ИмяБезРасширения)-2)<>"(1)" Тогда
СтрФайлов=СтрПапок.Файлы.Добавить();
СтрФайлов.ИмяФайла=ТекФайл1.ИмяБезРасширения;
НайденныеФайлы4 = НайтиФайлы(ИмяПапкиССкриншотами+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения, "*.*",Ложь);
Если НайденныеФайлы4.Количество()=0 Тогда
Если СоздаватьКаталог=Истина Тогда
СоздатьКаталог(ИмяПапкиССкриншотами+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения);
КонецЕсли;
КонецЕсли;
НайденныеФайлы2 = НайтиФайлы(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения, "*.*",Ложь);
Если НайденныеФайлы2.Количество()=0 Тогда
Если СоздаватьКаталог=Истина Тогда
СоздатьКаталог(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения);
ИмяПапкиСКодамиМодулей=ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения;
ИмяОбработки=ИмяПапкиСОбработками+""+База+""+ТекФайл.Имя+""+ТекФайл1.Имя;
КомандаСистемы("UnpackV8.exe -parse "+Символ(34)+ИмяОбработки+Символ(34)+" "+Символ(34)+ИмяПапкиСКодамиМодулей+Символ(34));
КонецЕсли;
КонецЕсли;
НайденныеФайлы2 = НайтиФайлы(ИмяПапкиСМодулями+"8.3"+База+""+ТекФайл.Имя+""+ТекФайл1.ИмяБезРасширения, "*.0",Ложь);
Если НайденныеФайлы2.Количество()<>0 Тогда
Для н2=0 по НайденныеФайлы2.Количество()-1 Цикл
ТекФайл2=НайденныеФайлы2.Получить(н2);
Если ТекФайл2.ЭтоКаталог()=Ложь Тогда
СтрМодулей=СтрФайлов.Модули.Добавить();
СтрМодулей.ИмяМодуля=ТекФайл2.ПолноеИмя;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

— Запись документаций в СУБД:

Много кода

&НаКлиенте
Процедура СохранитьФункционалИзФайлов(База,Тип,ИмяПапки,ИмяФайла,НомерФайла)
КоличествоТаблиц=0;
КоличествоУсловий=0;
КоличествоИзменений=0;
Для каждого СтрОператора из Операторы Цикл
Если СтрОператора.ИспользуемыеТаблицы.Количество()<>0 Тогда
КоличествоТаблиц=СтрОператора.ИспользуемыеТаблицы.Количество();
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Если ТаблицаИспользуемаяОператором.ЕстьЗапись=Истина Тогда
КоличествоИзменений=КоличествоИзменений+1;
КонецЕсли;
Если ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Количество()<>0 Тогда
КоличествоУсловий=ТаблицаИспользуемаяОператором.УсловияПоТаблицам.Количество();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если КоличествоТаблиц<>0 Тогда
Текст=Новый ТекстовыйДокумент;
Если ЭтоОбработки=Истина Тогда
Текст.Прочитать(ИмяПапкиСЗапросами+"8.3"+База+"Обработки"+Строка(НомерФайла)+".sql",КодировкаТекста.UTF8);
Иначе
Текст.Прочитать(ИмяПапкиСЗапросами+"8.3"+База+"Отчеты"+Строка(НомерФайла)+".sql",КодировкаТекста.UTF8);
КонецЕсли;
СтрТекста="INSERT INTO u8051_4.apps (`idr`,`name`,`text`,`img`,`url`,`data`,`status`,`idu`,`pop`,`price`) VALUES ("+Тип+",'"+ИмяФайла+"','";
СтрТекста=СтрТекста+"<h1>Модуль выполняет выборку и обработку данных ("+ИмяПапки+")<br></h1>";
СтрТекста=СтрТекста+"<h1>из таблиц в базе <a href=http://icanmakeit.ru/index.php?pg=magazin&d="+Тип+">"+СтрЗаменить(База,"О"," (Дополнительные о")+")</a>.<br></h1>";
СтрТекста=СтрТекста+"<br>";
СтрТекста=СтрТекста+"<h4>Таблицы используемые в выборке:<br></h4>";
ТЗ.Очистить();
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Масс=ТЗ.НайтиСтроки(Новый Структура("Реквизит",ТаблицаИспользуемаяОператором.Синоним));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Реквизит=ТаблицаИспользуемаяОператором.Синоним;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Реквизит Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
СтрТекста=СтрТекста+Строка(н)+" "+СтрТЗ.Реквизит+"<br>";
КонецЦикла;
Если КоличествоУсловий<>0 Тогда
СтрТекста=СтрТекста+"<br>";
СтрТекста=СтрТекста+"<h4>Условия по таблицам в выборке:<br></h4>";
ТЗ.Очистить();
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Для каждого УсловияПоТаблицеОператора из ТаблицаИспользуемаяОператором.УсловияПоТаблицам Цикл
Масс=ТЗ.НайтиСтроки(Новый Структура("Реквизит",ТаблицаИспользуемаяОператором.Таблица+"."+УсловияПоТаблицеОператора.Условие));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Реквизит=ТаблицаИспользуемаяОператором.Таблица+"."+УсловияПоТаблицеОператора.Условие;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Реквизит Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
СтрТекста=СтрТекста+Строка(н)+" "+СтрТЗ.Реквизит+"<br>";
КонецЦикла;
КонецЕсли;
СтрТекста=СтрТекста+"<br>";
СтрТекста=СтрТекста+"<h4>Выбираемые поля выборки:<br></h4>";
ТЗ.Очистить();
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Для каждого ПолеТаблицыОператора из ТаблицаИспользуемаяОператором.Поля Цикл
Масс=ТЗ.НайтиСтроки(Новый Структура("Реквизит",ТаблицаИспользуемаяОператором.Таблица+"."+ПолеТаблицыОператора.Поле));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Реквизит=ТаблицаИспользуемаяОператором.Таблица+"."+ПолеТаблицыОператора.Поле;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Реквизит Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
СтрТекста=СтрТекста+Строка(н)+" "+СтрТЗ.Реквизит+"<br>";
КонецЦикла;
Если КоличествоИзменений<>0 Тогда
СтрТекста=СтрТекста+"<br>";
СтрТекста=СтрТекста+"<h4>Обработка перебирает строки выборки и записывает (изменяет) данные в таблицах:<br></h4>";
ТЗ.Очистить();
Для каждого СтрОператора из Операторы Цикл
Для каждого ТаблицаИспользуемаяОператором из СтрОператора.ИспользуемыеТаблицы Цикл
Если ТаблицаИспользуемаяОператором.ЕстьЗапись=Истина Тогда
Масс=ТЗ.НайтиСтроки(Новый Структура("Реквизит",ТаблицаИспользуемаяОператором.Синоним));
Если Масс.Количество()=0 Тогда
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Реквизит=ТаблицаИспользуемаяОператором.Синоним;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТЗ.Сортировать("Реквизит Возр");
н=0;
Для каждого СтрТЗ из ТЗ Цикл
н=н+1;
СтрТекста=СтрТекста+Строка(н)+" "+СтрТЗ.Реквизит+"<br>";
КонецЦикла;
КонецЕсли;
Текст.ДобавитьСтроку(СтрТекста);
Если ЭтоОбработки=Истина Тогда
Текст.Записать(ИмяПапкиСЗапросами+"8.3"+База+"Обработки"+Строка(НомерФайла)+".sql",КодировкаТекста.UTF8);
Иначе
Текст.Записать(ИмяПапкиСЗапросами+"8.3"+База+"Отчеты"+Строка(НомерФайла)+".sql",КодировкаТекста.UTF8);
КонецЕсли;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СохранитьФункционалыВФайлПоЗапросу(База)
н=1;
ном=0;
Пока Папки.Количество()<>0 Цикл
СтрПапок=Папки.Получить(0);
Пока СтрПапок.Файлы.Количество()<>0 Цикл
СтрФайлов=СтрПапок.Файлы.Получить(0);
ном=ном+1;
КодМодуля.Очистить();
Операторы.Очистить();
Для каждого СтрМодулей из СтрФайлов.Модули Цикл
ИмяФайла=СтрМодулей.ИмяМодуля;
ЗаполнитьКодМодуляИзФайлов();
ЗаполнитьОператорыИзФайлов();
ЗаполнитьТаблицыОператоровИзФайлов();
ЗаполнитьПоляТаблицОператоровИзФайлов();
ОбновитьТаблицыОператоровИзФайлов();
КонецЦикла;
Состояние(СтрФайлов.ИмяФайла);
СохранитьФункционалИзФайлов(СтрПапок.База,СтрПапок.Тип,СтрПапок.ИмяПапки,СтрФайлов.ИмяФайла,н);
СтрПапок.Файлы.Удалить(0);
Если ном=10 Тогда
н=н+1;
Текст=Новый ТекстовыйДокумент;
Если ЭтоОбработки=Истина Тогда
Текст.Записать(ИмяПапкиСЗапросами+"8.3"+База+"Обработки"+Строка(н)+".sql",КодировкаТекста.UTF8);
Иначе
Текст.Записать(ИмяПапкиСЗапросами+"8.3"+База+"Отчеты"+Строка(н)+".sql",КодировкаТекста.UTF8);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Если СтрПапок.Файлы.Количество()=0 Тогда
КомандаСистемы("move "+Символ(34)+ИмяПапкиСМодулями+"8.3"+База+""+СтрПапок.ИмяПапки+Символ(34)+" "+Символ(34)+ИмяПапкиСМодулями+"8.3OLD"+База+""+СтрПапок.ИмяПапки+Символ(34));
Папки.Удалить(0);
КонецЕсли;
Если ном=10 Тогда
ном=0;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Шаг третий:

— Перебор всех файлов отчетов и обработок для создания скриншотов:

Много кода

&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)
Если ЭтоОбработки=Истина Тогда
ИмяОбработки =  ВнешниеОбработки.Подключить(АдресХранилища);
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);
Иначе
ИмяОбработки =  ВнешниеОтчеты.Подключить(АдресХранилища);
ОбъектОбработки = ВнешниеОтчеты.Создать(ИмяОбработки);
КонецЕсли;
Возврат Новый Структура("ИмяОбработки,ИмяФайлаОбработки",
ИмяОбработки, ОбъектОбработки.ИспользуемоеИмяФайла);
КонецФункции 

&НаКлиенте
Процедура СделатьСкриншот(ЛокальноеИмяФайла,База,Папка,ИмяФайла)
АдресХранилища = "";
Попытка
Результат = ПоместитьФайл(АдресХранилища, ЛокальноеИмяФайла, , Ложь);
ДанныеОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
Если ЭтоОбработки=Истина Тогда
ФормаОбработки=ПолучитьФорму("ВнешняяОбработка."+ ДанныеОбработки.ИмяОбработки +".Форма"); 
Иначе
ФормаОбработки=ПолучитьФорму("ВнешнийОтчет."+ ДанныеОбработки.ИмяОбработки +".Форма"); 
КонецЕсли;
ФормаОбработки.Открыть();
ИмяФайлаКартинки = ИмяПапкиССкриншотами+""+База+""+Папка+""+ИмяФайла+".jpg";
Shell = Новый COMОбъект("WScript.Shell");
Текст = """& {[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');"
+ "$size = [Windows.Forms.SystemInformation]::VirtualScreen;"
+ "$bitmap = new-object Drawing.Bitmap $size.width, $size.height;"
+ "$graphics = [Drawing.Graphics]::FromImage($bitmap);"
+ "$graphics.CopyFromScreen($size.location,[Drawing.Point]::Empty, $size.size);"
+ "$graphics.Dispose();"
+ "$bitmap.Save('"+ИмяФайлаКартинки+"');"
+ "$bitmap.Dispose()}""";
WshExec = Shell.Run("PowerShell -Command "+Текст, 0, "True");//0 - не отображать окно, "True" - возобновление работы только после завершения вызванного процесса
ФормаОбработки.Закрыть();
Исключение
КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьСписокОбработок()
НайденныеФайлы = НайтиФайлы(ИмяПапкиССкриншотами+""+ИмяБазы, "*.*",Истина);
Для н=0 по НайденныеФайлы.Количество()-1 Цикл
ТекФайл=НайденныеФайлы.Получить(н);
Если ТекФайл.ЭтоКаталог()=Истина Тогда
Если Прав(ТекФайл.Путь,1+СтрДлина(ИмяБазы))=ИмяБазы+"" Тогда
НайденныеФайлы1 = НайтиФайлы(ИмяПапкиССкриншотами+""+ИмяБазы+""+ТекФайл.Имя, "*.*",Ложь);
Если НайденныеФайлы1.Количество()<>0 Тогда
Для н1=0 по НайденныеФайлы1.Количество()-1 Цикл
ТекФайл1=НайденныеФайлы1.Получить(н1);
НайденныеФайлы2 = НайтиФайлы(ИмяПапкиССкриншотами+""+ИмяБазы+""+ТекФайл.Имя, ТекФайл1.Имя+".jpg",Ложь);
Если НайденныеФайлы2.Количество()=0 Тогда
СделатьСкриншот(ИмяПапкиСОбработками+""+ИмяБазы+""+ТекФайл.Имя+""+ТекФайл1.Имя+".epf",ИмяБазы,ТекФайл.Имя,ТекФайл1.ИмяБезРасширения);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьСписокОтчетов()
НайденныеФайлы = НайтиФайлы(ИмяПапкиССкриншотами+""+ИмяБазы, "*.*",Истина);
Для н=0 по НайденныеФайлы.Количество()-1 Цикл
ТекФайл=НайденныеФайлы.Получить(н);
Если ТекФайл.ЭтоКаталог()=Истина Тогда
Если Прав(ТекФайл.Путь,1+СтрДлина(ИмяБазы))=ИмяБазы+"" Тогда
НайденныеФайлы1 = НайтиФайлы(ИмяПапкиССкриншотами+""+ИмяБазы+""+ТекФайл.Имя, "*.*",Ложь);
Если НайденныеФайлы1.Количество()<>0 Тогда
Для н1=0 по НайденныеФайлы1.Количество()-1 Цикл
ТекФайл1=НайденныеФайлы1.Получить(н1);
НайденныеФайлы2 = НайтиФайлы(ИмяПапкиССкриншотами+""+ИмяБазы+""+ТекФайл.Имя, ТекФайл1.Имя+".jpg",Ложь);
Если НайденныеФайлы2.Количество()=0 Тогда
СделатьСкриншот(ИмяПапкиСОбработками+""+ИмяБазы+""+ТекФайл.Имя+""+ТекФайл1.Имя+".erf",ИмяБазы,ТекФайл.Имя,ТекФайл1.ИмяБезРасширения);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Вы спросите как я до «такого» докатился?

Ответ приходит (если немного покопаться в памяти с психологом):
— 17 лет назад я «работал» в дружном коллективе компании «Дистар Электроникс» (г.Пермь) программистом. Работой я это назвать никак не могу (первый опыт работы программистом).
Всех ребят я помню и вспоминаю со слезами, как я по ним скучаю. К сожалению никак не получается найти координаты разработчика программы 1С: Предприятие 7.7 (именно он дал мне почитать исходный код одной из библиотек DLL — запретный плод).

С уважением.

Автор: zekrus

Источник

Поделиться

* - обязательные к заполнению поля