Как получить ссылку на печатаемый документ во внешней печатной форме (ВПФ) 1С

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

Разработка внешних печатных форм (ВПФ) в среде «1С:Предприятие 8» на базе Библиотеки стандартных подсистем (БСП) — стандартная задача для программиста. Однако трудности начинаются тогда, когда перед печатью пользователю необходимо показать диалоговое окно (например, для выбора каталога сохранения файлов, ввода даты или указания подписанта).

В этот момент разработчик сталкивается с проблемой: код выполняется в контексте формы обработки, а не самого документа. Попытка получить ссылку через стандартный реквизит Объект приводит к ошибке, так как в данном контексте Объект — это сама внешняя обработка, а не печатаемый документ. Выясним причину этой проблемы и подробно разберем, как правильно передать и получить ссылку на документ в управляемой форме ВПФ.

---

Почему возникает путаница с реквизитом «Объект»?

Рассмотрим типичную ошибку начинающих разработчиков. В кодовой базе формы они часто пытаются написать следующий код:


&НаСервере
Функция ВыгрузитьФайлыНаСервере()
    // Ошибка! Объект здесь — это сама обработка, а не документ
    ОбъектНаСервере = РеквизитФормыВЗначение("Объект"); 
    СсылкаНаДокумент = ОбъектНаСервере.Ссылка; 
КонецФункции

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

---

Вариант А. Использование типа команды «ОткрытиеФормы»

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

Шаг 1. Настройка параметров формы в Конфигураторе

Для того чтобы управляемая форма вашей внешней обработки могла принять данные от БСП, откройте свойства формы в конфигураторе и на вкладке «Параметры» вручную добавьте следующие параметры:

Шаг 2. Регистрация команды в модуле объекта ВПФ

В функции СведенияОВнешнейОбработке() укажите тип запуска команды как ОткрытиеФормы:


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

Шаг 3. Получение ссылки на документ в модуле формы

Теперь в модуле управляемой формы обработки мы можем перехватить переданный массив документов в обработчике события ПриСозданииНаСервере:


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

---

Вариант Б. Использование типа команды «ВызовКлиентскогоМетода»

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

Шаг 1. Регистрация команды в модуле объекта

В модуле объекта внешней обработки при регистрации команды укажите тип запуска ВызовКлиентскогоМетода:


ДобавитьКоманду(ТаблицаКоманд, "Сформировать файлы", "ЗаказНаПроизводствоФайлы", "ВызовКлиентскогоМетода", Истина, "ПечатьMXL");

Шаг 2. Код в модуле управляемой формы

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


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

---

Разбор ошибки: «Получение элемента по индексу для значения не определено»

Часто в процессе разработки возникает ошибка обращения по индексу к переменной ОбъектыНазначения:

СсылкаНаОбъект = ОбъектыНазначения[0]; // Ошибка! Получение элемента по индексу для значения не определено

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

  1. Интерактивный запуск через «Файл — Открыть»: При отладке разработчик открывает обработку напрямую. В этом случае параметры БСП не инициализируются, и переменная ОбъектыНазначения имеет значение Неопределено. Попытка обратиться к ней как к массиву вызывает аварийное завершение работы системы.
  2. Отсутствие проверки на тип данных: Всегда проверяйте входящие параметры на тип Массив и количество элементов, чтобы избежать падения интерфейса у пользователя.

Пример правильного и безопасного извлечения данных в форме:


&НаСервере
Функция ПолучитьДокументБезопасно(ВходящиеПараметры)
    Если ТипЗнч(ВходящиеПараметры) = Тип("Массив") И ВходящиеПараметры.Количество() > 0 Тогда
        Возврат ВходящиеПараметры[0];
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

---

Организация удобной отладки без постоянной перезаписи в базу

Постоянно загружать измененную обработку в справочник «Дополнительные отчеты и обработки» для тестирования каждой строчки кода — неэффективно. Применим практический прием для отладки формы через стандартное меню «Файл — Открыть».

Разберем по шагам, как настроить форму для двойного режима работы:

  1. Добавим на управляемую форму реквизит ДокументСсылка (для выбора документа вручную) и разместим его на форме в отдельной группе под названием ГруппаОтладки.
  2. В модуле формы в процедуре ПриСозданииНаСервере пропишем управление видимостью этой группы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определяем, как запущена обработка
    ЗапущеноЧерезБСП = Параметры.Свойство("ОбъектыНазначения");
    
    // Показываем поле выбора документа только при ручном открытии для отладки
    Элементы.ГруппаОтладки.Видимость = Не ЗапущеноЧерезБСП;
    
    Если ЗапущеноЧерезБСП Тогда
        // Рабочий режим запуска из документа через БСП
        МассивДокументов = Параметры.ОбъектыНазначения;
        Если МассивДокументов.Количество() > 0 Тогда
            ДокументСсылка = МассивДокументов[0];
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

← На главную