Когда все в порядке, никто этого не замечает.
Закон незаметности

Урок 22.
"Применение списка значений: 'Док.Печать()' ".

 

   Сегодня рассмотрим еще один из вариантов применения списка значений. В 1С 7.7. есть один недостаток, заключающийся в том, что для объектов нельзя создать свои методы. И это очень неудобно. Представьте себе конструкцию вида Док.Печать(). Насколько было бы удобно ей пользоваться, например, при массовой распечатке счетов для клиентов, или при печати документа прямо из журнала (особенно, если документ большой и открывается долго).  

    Этот же механизм позволяет передавать наборы значений между отчетами. В 1С это активно используется для расшифровки бухгалтерских отчетов.

    Итак суть механизма.  Участвуют всегда 2 процедуры. Первая процедура, которая вызывает объект (например, документ), а вторая процедура, которая выполняет необходимые действия. Вторая процедура - это процедура "ПриОткрытии" формы того объект, который вызывается. Сложно. Рассмотрим на конкретном примере. Пусть нам надо сделать обработку, которая бы позволяла распечатывать все счета за заданный период в нужном количестве экземпляров. 

Сначала рассмотрим вызывающую процедуру:

Процедура Сформировать()
    //НачДата и КонДата - ревизиты формы
    //количествоКопий - реквизит формы типа "Число"
    док=СоздатьОбъект("Документ.Счет");
    Док.ВыбратьДокументы(НачДата,КонДата);
    Пока док.ПолучитьДокумент()=1 цикл 
        сз=создатьобъект("СписокЗначений");//создаем список значений
        сз.ДобавитьЗначение("Печать"); ///управляющий параметр
        сз.ДобавитьЗначение(количествоКопий);//дополнительные параметры
        ///дополнительных параметров может быть много
        ОткрытьФОрму(док.ТекущийДокумент(), сз,);
    конецЦикла;
КонецПроцедуры

Можете скопировать процедуру во внешний отчет. Не забудьте добавить реквизиты формы НачДата, КонДата и КоличествоКопий.

Особое внимание обратите на метод ОткрытьФорму(док.ТекущийДокумент(), сз,); Мы пытаемся открыть существующий документ и передаем в открываемый документ наш список значений.  Этот список значений будет доступен в открывшемся документе через Форма.Параметр.  Рассмотрим процедуру ПриОткрытии(), расположенную в форме документа "Счет"

Процедура ПриОткрытии()
    Если пустоеЗначение(Форма.Параметр)=0 тогда    ///смотрим передается  ли какое-нибудь значение
        Если ТипЗначенияСТр(Форма.Параметр)="СписокЗначений" тогда    ///мы хотим только список значений
            сз=Форма.Параметр;    ///получаем наш список
            оп=сз.ПолучитьЗначение(1);    //смотрим, что за команда в 1-ой строке
            Если оп="Печать" тогда    ///там может быть и другая команда
                кол=сз.ПолучитьЗначение(2);    ///под конкретную команду мы получаем управляющий значений
                для к=1 по кол цикл    //и обрабатываем команду и дополнительные значения
                    печать();    //выведем на печать, используем процедуру, прописанную в модуле формы.
                конецЦикла; 
                статусВозврата(0);    ///сам документ нам открывать не надо
            конецЕсли;
        КонецЕсли;
    конецЕсли;
    ......................///продолжение модуля при открытии
    .......................///для случая "нормального" открытия
    ......................
КонецПроцедуры.

    Пояснения: при начале открытия смотрим параметр формы. Если он есть, значит документ пытаются открыть из другого модуля. Если нет параметра, то будет стандартное открытие документа. Параметр может быть любой: строка, число, список значений, элемент справочника и или другой документ. Но нас интересует только список значений. Удобно список организовывать следующим образом: в 1-ой строке списка - управляющая команда (печать,  обновить) . По этой управляющей команде Вы будете определять, что надо проделать в документе. Из разных мест - документ может вызываться с разными целями (например, у одного документа могут быть разные печатные формы: расх.накл + сч.фактура.). В последующих строках - указываются дополнительные параметры, управляющие работой процедуры "ПриОткрытии". Параметров может быть много, но их все надо обрабатывать в форме документа в процедуре "ПриОкрытии". Вполне возможно, что процедура приОткрытии будет уметь делать много работы: печать, пересчет, получение каких-то сумм из докуента и т.д. В этом случае в общем виде процедура будет выглядеть так:

Если пустоеЗначение(Форма.Параметр)=0 тогда
    Если ТипЗначенияСТр(Форма.Параметр)="СписокЗначений" тогда
        сз=Форма.Параметр;
        оп=сз.ПолучитьЗначение(1);
        Если оп="Печать" тогда
        .............
        .............
        иначеЕсли оп="Пересчет" тогда
        .............
        .............
        иначеЕсли оп="Обновление" тогда
        .............
        .............
        конецЕсли;
        статусВозврата(0);
        возврат;
   конецЕсли;
    ////стандартная процедура открытия
    .........
    .........
Такой же механизм используется при расшифровке отчетов, но этой теме будет посвящен отдельный выпуск.

Задание для самостоятельной работы:

  1. Проверьте на практике процедуру печати счета. Доработайте, так чтобы по выбору пользователя можно было показывать печатные формы или сразу посылать их на принтер без вывода на экран. 

  2. В журнале счетов создайте кнопку "Печать". По выбору пользователя она должна печатать либо текущий счет, либо все счета из диапазона открытого журнала.

Hosted by uCoz