Как программно реализовать печать документов за период из внешней формы на управляемых формах 1С 8.3

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Постановка задачи и проектирование интерфейса

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

Первым делом создадим форму внешней обработки. Нам потребуются следующие реквизиты:

  1. ДатаНачала (Тип: Дата) — для указания начала периода выборки.
  2. ДатаОкончания (Тип: Дата) — для указания конца периода.
  3. Организация (Тип: СправочникСсылка.Организации) — для фильтрации документов по фирме.

После добавления реквизитов на форму, разместим команду Печать и соответствующую ей кнопку. Теперь перейдем к программной реализации логики.

Программный вызов механизма печати через БСП

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


&НаКлиенте
Процедура Печать(Команда)
    // Вызываем серверную функцию для подготовки коллекции печатных форм
    КоллекцияПечатныхФормМассив = ПечатьНаСервере();
    
    // Используем стандартный клиентский метод БСП для вывода форм на экран
    УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФормМассив);
КонецПроцедуры

&НаСервере
Функция ПечатьНаСервере()
    // 1. Формируем массив объектов (документов), которые нужно распечатать
    МассивОбъектов = ПолучитьМассивДокументовЗаПериод(); 
    
    // 2. Подготавливаем коллекцию печатных форм (имя формы берем из метаданных)
    ИмяПечФормы = "ПФ_MXL_РасходныйКассовыйОрдер"; 
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИмяПечФормы);
    
    // 3. Задаем параметры вывода
    ПараметрыВывода = Новый Структура;
    ПараметрыВывода.Вставить("ДоступнаПечатьПоКомплектно", Истина);
    ПараметрыВывода.Вставить("ПараметрыОтправки", Неопределено);
    
    // 4. Вызываем метод печати из модуля объекта нашей обработки
    // Предварительно в модуль объекта нужно скопировать процедуры печати из менеджера документа
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, Новый СписокЗначений, ПараметрыВывода);
    
    // 5. Преобразуем таблицу в массив для передачи на клиент
    Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
КонецФункции

В этом примере функция ПолучитьМассивДокументовЗаПериод должна выполнять запрос к базе данных и возвращать массив ссылок на документы, подходящие под условия фильтра. Использование УправлениеПечатьюКлиент.ПечатьДокументов позволяет задействовать стандартное окно предпросмотра 1С, где пользователь может выбрать принтер или сохранить результат в PDF.

Формирование данных: Получение ответственных лиц в запросе

Одной из самых трудоемких задач при создании печатных форм кассовых документов является получение актуальных данных о руководителе, главном бухгалтере и кассире на момент создания документа. Для этого необходимо обратиться к соответствующему регистру сведений (обычно ОтветственныеЛица или ОтветственныеЛицаОрганизаций).

Рассмотрим, как правильно составить запрос, чтобы получить данные сразу для нескольких типов ответственных лиц с помощью механизма ЛЕВОЕ СОЕДИНЕНИЕ. Это позволит избежать лишних обращений к базе данных внутри цикла. Выясним причину использования нескольких соединений к одной и той же виртуальной таблице СрезПоследних.


ВЫБРАТЬ
    РКО.Ссылка КАК Документ,
    РКО.Фирма КАК Фирма,
    ОтветственныеРуководитель.Сотрудник.Представление КАК ФИОРуководителя,
    ОтветственныеРуководитель.Должность КАК ДолжностьРуководителя,
    ОтветственныеГлБух.Сотрудник.Представление КАК ФИОГлБухгалтера,
    ОтветственныеКассир.Сотрудник.Представление КАК ФИОКассира
ИЗ
    Документ.РасходныйКассовыйОрдер КАК РКО
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛица.СрезПоследних(&ДатаКон, ) КАК ОтветственныеРуководитель
        ПО РКО.Фирма = ОтветственныеРуководитель.Фирма 
        И ОтветственныеРуководитель.Должность = ЗНАЧЕНИЕ(Перечисление.ОтветственныеЛица.Руководитель)
        
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛица.SрезПоследних(&ДатаКон, ) КАК ОтветственныеГлБух
        ПО РКО.Фирма = ОтветственныеГлБух.Фирма 
        И ОтветственныеГлБух.Должность = ЗНАЧЕНИЕ(Перечисление.ОтветственныеЛица.ГлавныйБухгалтер)
        
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛица.СрезПоследних(&ДатаКон, ) КАК ОтветственныеКассир
        ПО РКО.Фирма = ОтветственныеКассир.Фирма 
        И ОтветственныеКассир.Должность = ЗНАЧЕНИЕ(Перечисление.ОтветственныеЛица.Кассир)
ГДЕ
    РКО.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И РКО.Фирма = &Фирма

Важный момент: При работе со срезом последних в запросе для списка документов за период, передача параметра &ДатаКон в виртуальную таблицу вернет ответственных лиц, актуальных на конец периода. Если же в течение периода ответственные лица менялись и вам критически важно выводить подпись того человека, который работал именно в день выписки чека, запрос следует усложнить, соединяясь с физической таблицей регистра или используя временные таблицы для вычисления актуального среза на каждую дату документа.

Вывод макета и заполнение параметров

Когда данные получены, их необходимо передать в макет табличного документа. Разберем по шагам классический алгоритм заполнения области макета:

  1. Получение макета: Если макет встроен в обработку, используем ЭтотОбъект.ПолучитьМакет("ИмяМакета").
  2. Получение области: Выделяем нужную секцию (например, «Шапка» или «Строка»).
  3. Заполнение параметров: Присваиваем значения полям, определенным в макете через фигурные скобки [ИмяПараметра].
  4. Вывод в итоговый документ: Добавляем заполненную область в ТабличныйДокумент.

Процедура ЗаполнитьМакет(ТабДок, ДанныеДокумента)
    Макет = ПолучитьМакет("МакетПКО");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    // Заполняем параметры из структуры данных
    ОбластьШапка.Параметры.НомерДокумента = ДанныеДокумента.Номер;
    ОбластьШапка.Параметры.ДатаДокумента = Формат(ДанныеДокумента.Дата, "ДЛФ=D");
    ОбластьШапка.Параметры.Организация = ДанныеДокумента.Фирма;
    
    // Выводим область
    ТабДок.Вывести(ОбластьШапка);
    
    // Если нужно, чтобы каждый документ начинался с новой страницы
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры

Проанализируем ситуацию, когда документов много. Чтобы печатная форма выглядела профессионально, используйте метод ТабДок.АвтоМасштаб = Истина;. Это позволит системе автоматически подогнать ширину печатной формы под лист бумаги. Также не забывайте про свойство ОриентацияСтраницы, которое для кассовых ордеров обычно устанавливается в значение ОриентацияСтраницы.Портрет или Ландшафт в зависимости от конкретного макета.

Рекомендации по оптимизации

Рассмотрим несколько практических советов, которые помогут избежать ошибок при разработке внешних печатных форм:

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

← На главную