Я думаю, на мировом рынке можно будет продать штук пять компьютеров.
Директор компании "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)  Тогда
    Т = СоздатьОбъект("Таблица");     //делаем новую таблицу
Иначе
    Т.Очистить();     //а потом будем работать с этой же таблицей
КонецЕсли;

Задание для самостоятельное работы: насколько я понимаю - почти любой бухгалтерский отчет, который Вы строили раньше, можно расшифровать с помощью стандартных отчетов. Порядок действий прост:

  1. Решите для себя - какой отчет должен открываться при расшифровки
  2. Выпишите,   какие параметры нужны расшифровывающему отчету. Это можно найти в процедуре ПриОткрытии()
  3. Для ячеек которые будут расшифровываться задайте параметр "Расшифровка". В качестве параметра должен фигурировать список значений.
  4. Перед тем как выводить соответствующую ячейку - задайте параметры для ее расшифровки.
  5. Не забудьте в списке с параметрами указать какой отчет должен отрываться. (параметр "Отчет")

Алексей Колосов
 

Hosted by uCoz