При разработке внешних печатных форм (ВПФ) для конфигураций, использующих Библиотеку стандартных подсистем (БСП), часто возникает задача: как из кода обработки получить доступ к документу или элементу справочника, для которого пользователь запустил печать? Интуитивная попытка обратиться к свойству ВладелецФормы, как правило, не приводит к успеху. Давайте разберемся, почему так происходит и какой механизм следует использовать на самом деле.
Проанализируем типичную ситуацию: вы создали ВПФ, подключили ее к документу, например, "Счет на оплату покупателю". При вызове команды печати открывается ваша форма для ввода дополнительных параметров, и в этот момент нужно получить ссылку на исходный счет, чтобы заполнить данные. Попытки использовать код вида ВладелецФормы.Объект или ВладелецФормы.ДокументСсылка не работают.
Причина в том, что механизм дополнительных отчетов и обработок в БСП работает иначе. Он не устанавливает форму документа в качестве владельца для формы вашей обработки. Вместо этого он передает все необходимые данные через параметры.
Ключевым элементом для решения нашей задачи является специальный массив ОбъектыНазначения. Именно в него система помещает ссылки на те объекты (один или несколько), из которых была вызвана команда печати. Рассмотрим, как с ним работать.
Если у ВПФ есть форма для ввода параметров:
Если ваша печатная форма сначала открывает диалоговое окно для уточнения каких-либо параметров, то в этой форме необходимо создать реквизит с именем ОбъектыНазначения и типом данных Массив. При открытии формы система автоматически заполнит этот реквизит ссылками на исходные документы.
Если ВПФ формируется без диалогового окна:
В этом случае данные передаются напрямую в экспортную процедуру модуля объекта вашей обработки. Стандартная процедура печати, которую вызывает БСП, выглядит следующим образом:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// ... здесь код формирования печатной формы
КонецПроцедуры
Первый параметр, который мы здесь назвали МассивОбъектов (имя может быть любым, важен порядок), и есть тот самый массив ссылок ОбъектыНазначения. Если печать вызывается для одного документа, то ссылка на него будет первым и единственным элементом этого массива.
Посмотрим на пример:
Допустим, нам нужно получить ссылку на документ и вывести ее в печатную форму.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, что массив не пустой
Если МассивОбъектов.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Получаем ссылку на первый документ из массива
СсылкаНаДокумент = МассивОбъектов[0];
// Далее получаем объект документа для доступа к его данным
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
// ... ваш код для формирования табличного документа,
// используя данные из ОбъектДокумента
КонецПроцедуры
Таким образом, правильный путь — это работа с первым параметром процедуры Печать, а не попытки найти данные через ВладелецФормы.
Вторая частая проблема, с которой сталкиваются разработчики, — невозможность отладки. Вы ставите точку останова в коде ВПФ, запускаете отладку, вызываете печать из документа, но отладчик не останавливается. Это происходит потому, что система запускает не ваш исходный файл .epf, а его копию из временного хранилища.
К счастью, эту проблему можно легко решить. Рассмотрим самый надежный способ.
Этот метод позволяет полноценно использовать отладчик для ВПФ, подключенных через БСП. Разберем его по шагам:
СведенияОВнешнейОбработке(). В структуре возвращаемых параметров установите для ключа БезопасныйРежим значение Ложь. Если этого ключа нет, добавьте его.
Пример кода:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Наименование", "Моя внешняя печатная форма");
ПараметрыРегистрации.Вставить("Версия", "1.0");
// Ключевой параметр для отладки!
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
// ... другие параметры
Возврат ПараметрыРегистрации;
КонецФункции
После изменения кода не забудьте переподключить вашу обработку в справочнике "Дополнительные отчеты и обработки", чтобы изменения вступили в силу.
.epf через меню "Файл" -> "Открыть". Это ключевой шаг! Он заставляет систему связать запущенный код с вашим исходным файлом.
Этот метод является самым удобным и быстрым для отладки ВПФ в рабочих условиях. Он позволяет исследовать значения всех переменных, включая тот самый массив ОбъектыНазначения, и быстро находить ошибки.