Я думаю, на мировом рынке можно будет продать штук пять
компьютеров.
Директор компании "IВМ" Томас Уотсон в 1943 г.
1С:Школа.
Выпуск 37.
"Работа с таблицами (часть 5) Расшифровка стандартных отчетов".
В типовых конфигурациях (Бухгалтерия и Комплексная) разработан не тривиальный алгоритм расшифровки стандартных бухгалтерских отчетов. К этим отчетам относятся: оборотно-сальдовая ведомость, анализы счета, карточки счета и т.д. Сегодня мы попробуем разобраться в принципе построения этих отчетов.
В механизме расшифровки участвуют:
1. Глобальная переменная глФлагРасшифровки. Значение переменной может быть равно 1 или 0. Переменная анализируется в каждом отчете в процедуре "ПриОткрытии". Если значение переменной равно 1, это означает, что отчет открывается извне для расшифровки другого отчета. В этом случае стандартный диалог для заполнения параметров отчета (период, субконто и т.д.) не выводится, а сразу строится отчет. Значение переменной глФлагРасшифровки устанавливается в глобальном модуле в процедуре ОбработкаЯчейкиТаблицы().
2. При открытии каждого отчета происходит анализ переменной глФлагРасшифровки и если ее значение равно 1, то отчет строится автоматически на основании переданных в отчет параметров. Параметры передаются с помощью глобальной переменной глРасшифровка. Значение этой переменной представляет из себя список значений. Этот список формируется в том отчете ИЗ которого вызывается расшифровка. Что должно содержаться в списке? Это легко узнать, если посмотреть процедуру ПриОткрытии() вызываемого отчета. В глРасшифровка содержится набор параметров отчета, которые находятся в форме отчета. Например, рассмотрим часть процедура ПриОткрытии() отчета АнализСубконто. В этом отчете жирным выделены те параметры, которые мы получаем для построения отчета из глобальной переменной глРасшифровка
..................................................
Если глФлагРасшифровки = 1 Тогда //отчет открывается
для расшифровки
Обновить = глОбновить; //про это позже
ВыбПланСчетов = 0;
ПланСчетов = глРасшифровка.Получить("ПланСчетов");
РУ = глРасшифровка.Получить("РазделительУчета");
Если ТипЗначенияСтр(РУ) <> "" Тогда
РазделительУчета = РУ;
ПоВсемРУ = 0;
Иначе
Форма.РазделительУчета.НазначитьТип("");
ПоВсемРУ = 1;
КонецЕсли;
Дата1 = глРасшифровка.Получить("Дата1");
Дата2 = глРасшифровка.Получить("Дата2");
ВыбВидСубконто1 = глРасшифровка.Получить("ВидСубконто1");
Форма.Субконто1.НазначитьТип(ВыбВидСубконто1);
Субконто1 = глРасшифровка.Получить("Субконто1");
ПоГруппам1 = глРасшифровка.Получить("ПоГруппам1");
ОтборСубконто1.ТекущаяСтрока(глРасшифровка.Получить("ОтборСубконто1"));
ВыбВидСубконто2 = глРасшифровка.Получить("ВидСубконто2");
Форма.Субконто2.НазначитьТип(ВыбВидСубконто2);
Субконто2 = глРасшифровка.Получить("Субконто2");
ПоГруппам2 = глРасшифровка.Получить("ПоГруппам2");
ОтборСубконто2.ТекущаяСтрока(глРасшифровка.Получить("ОтборСубконто2"));
ВыбВидСубконто3 = глРасшифровка.Получить("ВидСубконто3");
Форма.Субконто3.НазначитьТип(ВыбВидСубконто3);
Субконто3 = глРасшифровка.Получить("Субконто3");
ПоГруппам3 = глРасшифровка.Получить("ПоГруппам3");
ОтборСубконто3.ТекущаяСтрока(глРасшифровка.Получить("ОтборСубконто3"));
ДанныеПоСубсчетам = глРасшифровка.Получить("ДанныеПоСубсчетам");
...............................................
...............................................
иначе
................................................
конецЕсли;
Как видно список может быть огромным, и вы вправе добавлять туда свои параметры под своими именами (чтоб не испортить работающую систему).
Где формируется значения в списке глРасшифровка? Формирование списка
происходит в модуле того отчета, который хотим расшифровать. Механизм такой: В
свойствах ячеек, которые должны быть расшифрованы, в поле Расшифровка,
записывается список значений. Этот список называется везде одинаково
Расшифровка. Он заполняется необходимыми значениями перед выводом каждой ячейки.
Заполнение списка для каждой ячейки может происходить индивидуально - это очень
кропотливая работа. Например, в том же отчете "Анализ Субконто" это
выглядит примерно так: сначала заполняется общая часть списка (жирным отмечены
устанавливаемые параметры):
//..................................................................
Расшифровка.УдалитьВсе();
Расшифровка.Установить("Отчет", "КарточкаСубконто");
Расшифровка.Установить("РазделительУчета", РазделительУчета);
Расшифровка.Установить("ПланСчетов", ПланСчетов);
Расшифровка.Установить("Дата1", Дата1);
Расшифровка.Установить("Дата2", Дата2);
НеВыбраноСубконто = 0;
Для А=1 По 3 Цикл
Если ОтборСубконто[А] <> 3 Тогда
Расшифровка.Установить("ВидСубконто"+Номер[А],
ВидСубконто[А]);
Расшифровка.Установить("ОтборСубконто"+Номер[А],
ОтборСубконто[А]);
Расшифровка.Установить("Субконто"+Номер[А], Субконто[А]);
Иначе
НеВыбраноСубконто = НеВыбраноСубконто + 1;
КонецЕсли;
КонецЦикла;
//.........................................................................
Ну а потом начинается самое интересное - для каждой ячейки - происходит пополнение списка. Не буду даже вырезать этот кусок модуля - Вы без труда его найдете.
3. Еще одно действующее лицо: ОбработкаЯчейкиТаблицы(). Эта процедура располагается в глобальном модуле. Ее вызов происходит в тот момент, когда пользователь дважды щелкает по ячейке, которую хочет расшифровать. Основное назначение процедуры - перенаправить вызов в нужный отчет. Эта процедура получает на входе список Расшифровка и ищет там "Меню", "Отчет", "Обновить", "ОткрытьЖурналДокументов", "Документ". По модулю не трудно разобраться для чего нужны эти параметры. Добавлю только, что ОбработкаЯчейкиТаблицы() может для расшифровки открывать другие отчеты, открывать документы и операции. Если будет определен параметр "Меню" (предполагается, что это список значений), то система выдаст меню для выбора желаемого отчета. Пример Вы можете увидеть в оборотно-сальдовой ведомости.
4. Параметр "Обновить" в глРасшифровка. Стандартные отчеты можно
не только формировать и расшифровывать, но и обновлять (читай переформировывать
заново) уже открытые печатные формы отчетов. Для этого и предназначен параметр
обновить. Он может принимать следующие значения: 1 - отчет надо обновить с
теми же параметрами; 2 - отчету надо задать новые параметры для
формирования; 0 - обыкновенное формирование отчета. В большинстве случаев
параметр обновить обрабатывается следующим образом:
Если (ТипЗначенияСтр(Т) <> "Таблица") ИЛИ (Обновить=0) Тогда
Т = СоздатьОбъект("Таблица"); //делаем
новую таблицу
Иначе
Т.Очистить(); //а потом будем
работать с этой же таблицей
КонецЕсли;
Задание для самостоятельное работы: насколько я понимаю - почти любой бухгалтерский отчет, который Вы строили раньше, можно расшифровать с помощью стандартных отчетов. Порядок действий прост: