При разработке внешних печатных форм (ВПФ) для конфигурации «1С:Управление нашей фирмой» (УНФ) версии 1.6 программисты часто сталкиваются с проблемой: печатная форма корректно формируется и отправляется по электронной почте, создается документ Событие, однако это событие не привязывается к исходному документу (например, к Заказу покупателя). В итоге в журнале событий заказа пусто, а связь приходится устанавливать вручную.
В этой статье мы подробно разберем, как модифицировать код внешней печатной формы, чтобы механизм Библиотеки стандартных подсистем (БСП) автоматически заполнял документы-основания в почтовом отправлении.
Проанализируем стандартный механизм работы печати в 1С. Когда мы нажимаем кнопку «Печать» и выбираем вариант отправки по почте, система вызывает процедуру Печать в модуле объекта внешней обработки. Для формирования письма используются данные из структуры ПараметрыВывода. Если в этой структуре явно не указаны объекты, на основании которых создается печатная форма, система создает «автономное» письмо, не имеющее контекстной связи с заказом.
Типовая процедура УправлениеНебольшойФирмойСервер.ЗаполнитьПараметрыОтправки, которую часто используют разработчики, отлично работает для встроенных форм, но при работе с ВПФ ей может не хватать данных в контексте вызова.
Самым важным моментом является заполнение коллекции ДокументыОснования внутри структуры ПараметрыВывода. Рассмотрим, как должен выглядеть исправленный код основной процедуры Печать в модуле вашей внешней обработки.
Разберем пример кода:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, нужно ли печатать нашу форму
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплату") Тогда
// Формируем табличный документ
ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
// Выводим документ в коллекцию
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СчетНаОплату",
"Счет на оплату (внешний)",
ТабличныйДокумент
);
КонецЕсли;
// КРИТИЧЕСКИ ВАЖНЫЙ УЧАСТОК:
// Явно указываем документы основания, чтобы письмо привязалось к заказу
ПараметрыВывода.Вставить("ДокументыОснования", МассивОбъектов);
// Заполняем параметры отправки типовым методом УНФ
УправлениеНебольшойФирмойСервер.ЗаполнитьПараметрыОтправки(
ПараметрыВывода.ПараметрыОтправки,
МассивОбъектов,
КоллекцияПечатныхФорм
);
КонецПроцедуры
Добавление строки ПараметрыВывода.Вставить("ДокументыОснования", МассивОбъектов); сообщает подсистеме печати, что создаваемое Событие должно содержать ссылки на объекты из МассивОбъектов в своей табличной части Документы основания.
В некоторых релизах УНФ 1.6 (особенно старых, таких как 1.6.7) процедура ЗаполнитьПараметрыОтправки может работать не совсем корректно с внешними обработками. Если после первого шага связь все еще не появилась, проанализируем структуру ПараметрыОтправки.
Внутри ПараметрыВывода.ПараметрыОтправки существует ключ Основание (в некоторых версиях — Предмет). Для того чтобы письмо «увидело» конкретный заказ, мы можем заполнить его вручную:
// Дополнительная настройка параметров отправки
Если ПараметрыВывода.Свойство("ПараметрыОтправки") Тогда
// Если отправляем один документ, устанавливаем его как основной предмет события
Если МассивОбъектов.Количество() > 0 Тогда
ПараметрыВывода.ПараметрыОтправки.Вставить("Основание", МассивОбъектов[0]);
КонецЕсли;
КонецЕсли;
Важно помнить, что механизм БСП сопоставляет печатные формы и документы через коллекцию ОбъектыПечати. Внутри вашей функции формирования табличного документа (в нашем примере это СформироватьПечатнуюФорму) обязательно должен вызываться метод заполнения этой коллекции.
Посмотрим на пример реализации внутри функции формирования:
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
Для Каждого СсылкаНаЗаказ Из МассивОбъектов Цикл
// Начало формирования области...
// Сопоставляем область табличного документа с объектом ссылки
// Это необходимо для корректной работы штатных механизмов отправки
ИмяОбласти = "Заказ_" + СсылкаНаЗаказ.Номер;
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, 1, ОбъектыПечати, СсылкаНаЗаказ);
// Продолжение формирования...
КонецЦикла;
Возвращает ТабличныйДокумент;
КонецФункции
Если связь между ТабличныйДокумент и ОбъектыПечати не установлена, система не сможет понять, какой файл вложения к какому документу-основанию относится при массовой рассылке.
Поскольку версия 1.6.7 является достаточно ранним релизом линейки 1.6, в ней могут отсутствовать некоторые автоматические обработчики, появившиеся в более поздних версиях БСП. В этом случае рекомендуется:
СведенияОВнешнейОбработке для команды указано использование ВызовСерверногоМетода.ПараметрыВывода полностью, а лишь дополняете существующую структуру.ЗаполнитьПараметрыОтправки игнорирует ваши данные, попробуйте вручную заполнить структуру ПараметрыОтправки, указав в ней Тема, Получатели и Текст.Для того чтобы внешняя печатная форма в УНФ 1.6 корректно привязывала отправленные письма к документам-основаниям, необходимо:
МассивОбъектов в ПараметрыВывода.ДокументыОснования.ОбъектыПечати в процессе формирования табличного документа.УправлениеНебольшойФирмойСервер.ЗаполнитьПараметрыОтправки для инициализации структуры почтового сообщения.Соблюдение этих правил гарантирует, что каждое отправленное письмо будет автоматически отображаться в списке События соответствующего Заказа покупателя, что значительно упростит работу пользователей с историей взаимодействий.