Как привязать электронное письмо к заказу покупателя при отправке внешней печатной формы в 1С:УНФ 1.6

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

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

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

Выясняем причину проблемы

Проанализируем стандартный механизм работы печати в 1С. Когда мы нажимаем кнопку «Печать» и выбираем вариант отправки по почте, система вызывает процедуру Печать в модуле объекта внешней обработки. Для формирования письма используются данные из структуры ПараметрыВывода. Если в этой структуре явно не указаны объекты, на основании которых создается печатная форма, система создает «автономное» письмо, не имеющее контекстной связи с заказом.

Типовая процедура УправлениеНебольшойФирмойСервер.ЗаполнитьПараметрыОтправки, которую часто используют разработчики, отлично работает для встроенных форм, но при работе с ВПФ ей может не хватать данных в контексте вызова.

Шаг 1: Использование свойства ДокументыОснования

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

Разберем пример кода:


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

    // КРИТИЧЕСКИ ВАЖНЫЙ УЧАСТОК:
    // Явно указываем документы основания, чтобы письмо привязалось к заказу
    ПараметрыВывода.Вставить("ДокументыОснования", МассивОбъектов);

    // Заполняем параметры отправки типовым методом УНФ
    УправлениеНебольшойФирмойСервер.ЗаполнитьПараметрыОтправки(
        ПараметрыВывода.ПараметрыОтправки, 
        МассивОбъектов, 
        КоллекцияПечатныхФорм
    );
    
КонецПроцедуры

Добавление строки ПараметрыВывода.Вставить("ДокументыОснования", МассивОбъектов); сообщает подсистеме печати, что создаваемое Событие должно содержать ссылки на объекты из МассивОбъектов в своей табличной части Документы основания.

Шаг 2: Настройка структуры ПараметрыОтправки

В некоторых релизах УНФ 1.6 (особенно старых, таких как 1.6.7) процедура ЗаполнитьПараметрыОтправки может работать не совсем корректно с внешними обработками. Если после первого шага связь все еще не появилась, проанализируем структуру ПараметрыОтправки.

Внутри ПараметрыВывода.ПараметрыОтправки существует ключ Основание (в некоторых версиях — Предмет). Для того чтобы письмо «увидело» конкретный заказ, мы можем заполнить его вручную:


// Дополнительная настройка параметров отправки
Если ПараметрыВывода.Свойство("ПараметрыОтправки") Тогда
    // Если отправляем один документ, устанавливаем его как основной предмет события
    Если МассивОбъектов.Количество() > 0 Тогда
        ПараметрыВывода.ПараметрыОтправки.Вставить("Основание", МассивОбъектов[0]);
    КонецЕсли;
КонецЕсли;

Шаг 3: Проверка коллекции ОбъектыПечати

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

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


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

Если связь между ТабличныйДокумент и ОбъектыПечати не установлена, система не сможет понять, какой файл вложения к какому документу-основанию относится при массовой рассылке.

Особенности для версии УНФ 1.6.7

Поскольку версия 1.6.7 является достаточно ранним релизом линейки 1.6, в ней могут отсутствовать некоторые автоматические обработчики, появившиеся в более поздних версиях БСП. В этом случае рекомендуется:

  1. Проверить, что в функции СведенияОВнешнейОбработке для команды указано использование ВызовСерверногоМетода.
  2. Убедиться, что вы не переопределяете ПараметрыВывода полностью, а лишь дополняете существующую структуру.
  3. Если типовой механизм ЗаполнитьПараметрыОтправки игнорирует ваши данные, попробуйте вручную заполнить структуру ПараметрыОтправки, указав в ней Тема, Получатели и Текст.

Резюме

Для того чтобы внешняя печатная форма в УНФ 1.6 корректно привязывала отправленные письма к документам-основаниям, необходимо:

Соблюдение этих правил гарантирует, что каждое отправленное письмо будет автоматически отображаться в списке События соответствующего Заказа покупателя, что значительно упростит работу пользователей с историей взаимодействий.

← На главную