Как передать ссылку на документ во внешнюю печатную форму в 1С 8.3?

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

Разработка внешних печатных форм (ВПФ) — одна из самых частых задач программиста 1С. Однако при работе с современными конфигурациями, такими как Управление торговлей 11, ERP 2 или Комплексная автоматизация 2, разработчики часто сталкиваются с проблемой: при запуске печати реквизиты документа оказываются пустыми. Рассмотрим подробнее, почему это происходит и как правильно организовать получение данных во внешней обработке.

Разберем механизм работы БСП

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

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


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Здесь располагается код формирования печатной формы
КонецПроцедуры
  1. МассивОбъектов — это ключевой параметр. Он содержит массив ссылок на объекты (документы или элементы справочников), для которых была вызвана печать. Даже если вы печатаете один-единственный счет, это все равно будет массив с одним элементом.
  2. КоллекцияПечатныхФорм — это служебная таблица значений. В нее мы должны добавить информацию о результате нашей работы: идентификатор формы и сам сформированный табличный документ.
  3. ОбъектыПечати — это список значений, который используется для связи строк табличного документа с конкретными объектами. Это критически важно для пакетной печати нескольких документов в один поток.
  4. ПараметрыВывода — структура, содержащая дополнительные настройки, такие как параметры двусторонней печати или количество копий.

Как получить данные документа внутри ВПФ

Посмотрим на пример того, как правильно извлечь ссылку на документ из переданных параметров. Поскольку МассивОбъектов может содержать несколько документов, мы должны обработать их в цикле или использовать один запрос для получения данных сразу по всем ссылкам. Рассмотрим второй вариант как наиболее производительный.

Проанализируем типичный алгоритм действий в модуле объекта ВПФ:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // 1. Проверяем, нужно ли печатать именно нашу форму
    // (актуально, если обработка содержит несколько вариантов печати)
    ПараметрыПечати = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "МояВнешняяФормаСчета");
    
    Если ПараметрыПечати <> Неопределено Тогда
        
        // 2. Формируем табличный документ
        ТабличныйДокумент = СформироватьПечатнуюФормуСчета(МассивОбъектов, ОбъектыПечати);
        
        // 3. Передаем готовый документ обратно в систему
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм, 
            "МояВнешняяФормаСчета", 
            "Счет на оплату (внешний)", 
            ТабличныйДокумент);
            
    КонецЕсли;

КонецПроцедуры

В функции СформироватьПечатнуюФормуСчета нам необходимо получить данные. Запомните важное правило: никогда не обращайтесь к реквизитам через точку (например, Ссылка.Дата) внутри циклов. Используйте запрос к Документ.ЗаказКлиента, где условие будет ГДЕ Ссылка В (&МассивОбъектов).

Почему копирование кода из модуля менеджера не работает сразу?

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

Роль реквизита СсылкаНаОбъект

Часто в советах на форумах можно встретить рекомендацию создать в обработке реквизит с именем СсылкаНаОбъект. Рассмотрим подробнее его назначение. Для работы в составе БСП этот реквизит не обязателен. Система его не заполняет автоматически при нажатии кнопки "Печать" в интерфейсе программы.

Однако этот реквизит крайне полезен для отладки. Создав форму обработки и добавив на нее этот реквизит, вы сможете:

  1. Открыть обработку через "Файл -> Открыть".
  2. Выбрать конкретный документ Заказ клиента.
  3. Нажать на кнопку и запустить формирование макета, предварительно поставив точку останова в конфигураторе.

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


// Код в форме обработки для отладки
&НаКлиенте
Процедура КомандаПечать(Команда)
    ОбъектыПечати = Новый СписокЗначений;
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
    
    // Имитируем структуру коллекции для вызова
    Коллекция = Новый ТаблицаЗначений;
    Коллекция.Колонки.Добавить("ИмяМакета");
    Коллекция.Колонки.Добавить("ТабличныйДокумент");
    // ... другие колонки ...
    
    ПечатьВнешняя(МассивОбъектов, Коллекция, ОбъектыПечати);
КонецПроцедуры

Функция СведенияОВнешнейОбработке

Чтобы система вообще "увидела" вашу печатную форму и поняла, к какому документу её привязать, необходимо правильно настроить функцию регистрации. Выясним основные моменты:


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

Обратите внимание на ТипКомандыВызовСерверногоМетода(). Это означает, что при нажатии кнопки система будет искать именно экспортную процедуру Печать в модуле объекта. Если вы укажете другой тип команды, механизм работы будет иным.

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

← На главную