Как реализовать заполнение данными внешней печатной формы в 1С:Документооборот 2.1 КОРП

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

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

Анализ структуры внешней печатной формы

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

Типичная ошибка заключается в том, что в коде создания печатной формы используется «шаблонный» запрос, который выбирает только ссылку на документ, но не выбирает его реквизиты (например, дату, номер, организацию или данные табличной части). Проанализируем, как это исправить.

Шаг 1: Правильное заполнение сведений об обработке

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


Функция СведенияОВнешнейОбработке() Экспорт
    Назначения = Новый Массив();
    Назначения.Добавить("Документ.ТабельУчетаРабочегоВремени");
    
    ПараметрыРегистрации = Новый Структура();
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", Назначения);
    ПараметрыРегистрации.Вставить("Наименование", "Печатная форма учета времени");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Команды = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(Команды, "Печать табеля учета времени", "ПечатьТабеля", "ВызовСерверногоМетода", Ложь, "ПечатьMXL");
    
    ПараметрыРегистрации.Вставить("Команды", Команды);
    Возврат ПараметрыРегистрации;
КонецФункции

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

Шаг 2: Формирование запроса к данным документа

Выясним основную причину «пустой» формы. Если ваш запрос выглядит как ВЫБРАТЬ Ссылка ИЗ Документ.ТабельУчетаРабочегоВремени, то система получит только ссылку. Для заполнения параметров макета (таких как Организация, Подразделение, Месяц) необходимо явно перечислить эти поля в секции ВЫБРАТЬ.

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


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

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

Шаг 3: Подготовка макета и работа с областями

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

Рекомендуем разделять макет на функциональные области:

  1. Заголовок — содержит название документа, номер и дату.
  2. Шапка — содержит общие реквизиты (Организация, Период).
  3. Строка — повторяющаяся часть для вывода табличной части.
  4. Подвал — места для подписей ответственных лиц.

Шаг 4: Вывод данных в табличный документ

Разберем по шагам процесс вывода. Мы используем метод ПолучитьОбласть() для каждой части макета и заполняем параметры этой области. Рассмотрим пример реализации цикла вывода:


Процедура ВывестиДанныеВТабличныйДокумент(Макет, ДокументРезультат, ВыборкаДокументы, ОбъектыПечати)
    
    ПервыйДокумент = Истина;
    
    Пока ВыборкаДокументы.Следующий() Цикл
        
        Если Не ПервыйДокумент Тогда
            ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        ПервыйДокумент = Ложь;
        
        НачалоДокумента = ДокументРезультат.ВысотаТаблицы + 1;
        
        // Выводим область заголовка
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
        ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Табель учета рабочего времени № " 
            + ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ВыборкаДокументы.Номер) 
            + " от " + Формат(ВыборкаДокументы.Дата, "ДЛФ=DD");
        ДокументРезультат.Вывести(ОбластьЗаголовок);
        
        // Заполнение параметров шапки через ЗаполнитьЗначенияСвойств
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ОбластьШапка.Параметры.ЗаполнитьЗначенияСвойств(ВыборкаДокументы);
        ДокументРезультат.Вывести(ОбластьШапка);
        
        // Здесь можно добавить цикл по табличной части документа
        // Рассмотрим пример обращения к ТЧ:
        Для Каждого СтрокаТЧ Из ВыборкаДокументы.Ссылка.ДанныеОРабочемВремени Цикл
            ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
            ОбластьСтрока.Параметры.Сотрудник = СтрокаТЧ.Сотрудник;
            ОбластьСтрока.Параметры.Часы = СтрокаТЧ.ОтработаноЧасов;
            ДокументРезультат.Вывести(ОбластьСтрока);
        КонецЦикла;
        
        // Установка области печати для корректного формирования PDF/предпросмотра
        УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ДокументРезультат, НачалоДокумента, ОбъектыПечати, ВыборкаДокументы.Ссылка);
        
    КонецЦикла;
    
КонецПроцедуры

Особенности использования БСП в Документообороте

В конфигурации 1С:Документооборот активно применяется механизм префиксации. Чтобы номера документов выглядели корректно (без лишних нулей и префиксов), используйте функцию ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(). Это позволит привести номер "0000-000123" к виду "123".

Также обратите внимание на параметр ОбъектыПечати. Он необходим для того, чтобы в окне предпросмотра печати система понимала связь между сформированными листами и объектами информационной базы. Если его не заполнить с помощью УправлениеПечатью.ЗадатьОбластьПечатиДокумента(), некоторые сервисные функции (например, сохранение в PDF по отдельным объектам) могут работать некорректно.

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

Для ускорения процесса разработки рекомендуем не загружать обработку в справочник "Дополнительные отчеты и обработки" после каждого изменения кода. Рассмотрим эффективный способ отладки:

  1. Создайте в обработке временную форму.
  2. Добавьте на нее реквизит с типом ДокументСсылка.ТабельУчетаРабочегоВремени.
  3. Создайте команду, которая вызывает вашу экспортную процедуру Печать().
  4. Открывайте обработку через Файл - Открыть и запускайте печать для выбранного документа.

Это позволит вам моментально видеть изменения в макете и коде запроса, экономя время на администрировании системы.

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

← На главную