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

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

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

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

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

Правильный способ: используем массив `ОбъектыНазначения`

Ключевым элементом для решения нашей задачи является специальный массив ОбъектыНазначения. Именно в него система помещает ссылки на те объекты (один или несколько), из которых была вызвана команда печати. Рассмотрим, как с ним работать.

Если у ВПФ есть форма для ввода параметров:

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

Если ВПФ формируется без диалогового окна:

В этом случае данные передаются напрямую в экспортную процедуру модуля объекта вашей обработки. Стандартная процедура печати, которую вызывает БСП, выглядит следующим образом:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // ... здесь код формирования печатной формы
КонецПроцедуры

Первый параметр, который мы здесь назвали МассивОбъектов (имя может быть любым, важен порядок), и есть тот самый массив ссылок ОбъектыНазначения. Если печать вызывается для одного документа, то ссылка на него будет первым и единственным элементом этого массива.

Посмотрим на пример:

Допустим, нам нужно получить ссылку на документ и вывести ее в печатную форму.


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Проверяем, что массив не пустой
    Если МассивОбъектов.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;

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

Таким образом, правильный путь — это работа с первым параметром процедуры Печать, а не попытки найти данные через ВладелецФормы.

Как отладить внешнюю печатную форму?

Вторая частая проблема, с которой сталкиваются разработчики, — невозможность отладки. Вы ставите точку останова в коде ВПФ, запускаете отладку, вызываете печать из документа, но отладчик не останавливается. Это происходит потому, что система запускает не ваш исходный файл .epf, а его копию из временного хранилища.

К счастью, эту проблему можно легко решить. Рассмотрим самый надежный способ.

Способ 1: Отключение безопасного режима

Этот метод позволяет полноценно использовать отладчик для ВПФ, подключенных через БСП. Разберем его по шагам:

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

    Пример кода:

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

    После изменения кода не забудьте переподключить вашу обработку в справочнике "Дополнительные отчеты и обработки", чтобы изменения вступили в силу.

  2. Запустите отладку. Запустите сеанс 1С:Предприятие в режиме отладки из Конфигуратора.
  3. Откройте файл обработки. В запущенном сеансе, перед тем как вызывать команду печати, откройте ваш файл .epf через меню "Файл" -> "Открыть". Это ключевой шаг! Он заставляет систему связать запущенный код с вашим исходным файлом.
  4. Запустите печать. Теперь перейдите в документ или список и вызовите вашу печатную форму. Отладчик должен остановиться на установленной вами точке останова.

Этот метод является самым удобным и быстрым для отладки ВПФ в рабочих условиях. Он позволяет исследовать значения всех переменных, включая тот самый массив ОбъектыНазначения, и быстро находить ошибки.

← На главную