Разработка внешних печатных форм (ВПФ) в среде «1С:Предприятие 8» на базе Библиотеки стандартных подсистем (БСП) — стандартная задача для программиста. Однако трудности начинаются тогда, когда перед печатью пользователю необходимо показать диалоговое окно (например, для выбора каталога сохранения файлов, ввода даты или указания подписанта).
В этот момент разработчик сталкивается с проблемой: код выполняется в контексте формы обработки, а не самого документа. Попытка получить ссылку через стандартный реквизит Объект приводит к ошибке, так как в данном контексте Объект — это сама внешняя обработка, а не печатаемый документ. Выясним причину этой проблемы и подробно разберем, как правильно передать и получить ссылку на документ в управляемой форме ВПФ.
---
Рассмотрим типичную ошибку начинающих разработчиков. В кодовой базе формы они часто пытаются написать следующий код:
&НаСервере
Функция ВыгрузитьФайлыНаСервере()
// Ошибка! Объект здесь — это сама обработка, а не документ
ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
СсылкаНаДокумент = ОбъектНаСервере.Ссылка;
КонецФункции
При таком подходе платформа выдаст ошибку или вернет ссылку на саму внешнюю обработку (если она сохранена в базе), но никак не на документ «Заказ на производство» или «Реализация товаров». Чтобы связать форму обработки с документом-источником, необходимо использовать штатные механизмы интеграции БСП. Рассмотрим два основных сценария реализации этой задачи.
---
Это наиболее удобный и лаконичный сценарий, если вам гарантированно нужно открыть форму диалога перед началом формирования печатных файлов. При использовании этого типа команды БСП автоматически передает параметры печати (включая ссылки на документы) в открываемую форму.
Шаг 1. Настройка параметров формы в Конфигураторе
Для того чтобы управляемая форма вашей внешней обработки могла принять данные от БСП, откройте свойства формы в конфигураторе и на вкладке «Параметры» вручную добавьте следующие параметры:
ДополнительнаяОбработкаСсылка (тип: СправочникСсылка.ДополнительныеОтчетыИОбработки);ИдентификаторКоманды (тип: Строка);ОбъектыНазначения (тип: Произвольный, так как типа «Массив» в стандартном списке выбора параметров нет).Шаг 2. Регистрация команды в модуле объекта ВПФ
В функции СведенияОВнешнейОбработке() укажите тип запуска команды как ОткрытиеФормы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ЗаказНаПроизводство2_2"); // Указываем целевой документ
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Печать документов в XLS");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Указываем тип запуска "ОткрытиеФормы"
ДобавитьКоманду(ТаблицаКоманд, "Выгрузить файлы в каталог", "ВыгрузитьВФайлы", "ОткрытиеФормы", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 3. Получение ссылки на документ в модуле формы
Теперь в модуле управляемой формы обработки мы можем перехватить переданный массив документов в обработчике события ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, что форма открыта механизмом БСП, а не вручную
Если Параметры.Свойство("ОбъектыНазначения") Тогда
МассивДокументов = Параметры.ОбъектыНазначения;
Если МассивДокументов.Количество() > 0 Тогда
// Записываем ссылку на документ в реквизит формы для дальнейшего использования
// Предварительно создайте реквизит формы "ДокументСсылка" с типом вашего документа
ДокументСсылка = МассивДокументов[0];
КонецЕсли;
КонецЕсли;
КонецПроцедуры
---
Этот способ применяется, когда логика требует предварительной проверки условий на клиенте или динамического решения, нужно ли вообще открывать форму. При таком подходе БСП не открывает форму сама, а вызывает экспортную процедуру Печать() в модуле вашей управляемой формы.
Шаг 1. Регистрация команды в модуле объекта
В модуле объекта внешней обработки при регистрации команды укажите тип запуска ВызовКлиентскогоМетода:
ДобавитьКоманду(ТаблицаКоманд, "Сформировать файлы", "ЗаказНаПроизводствоФайлы", "ВызовКлиентскогоМетода", Истина, "ПечатьMXL");
Шаг 2. Код в модуле управляемой формы
В модуле формы обязательно должна присутствовать экспортная клиентская процедура Печать. Именно в нее БСП передает массив ссылок на документы, из которых была вызвана печать:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
// Безопасное извлечение ссылки на документ
Если ТипЗнч(ОбъектыНазначения) = Тип("Массив") И ОбъектыНазначения.Количество() > 0 Тогда
СсылкаНаДокумент = ОбъектыНазначения[0];
// Открываем форму настройки параметров и передаем туда структуру с документами
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбъектыНазначения", ОбъектыНазначения);
// Открываем форму нашей ВПФ
ОткрытьФорму("ВнешняяОбработка.ИмяВашейВПФ.Форма.ОсновнаяФорма", ПараметрыФормы);
Иначе
ПоказатьПредупреждение(, "Не удалось определить документ-основание для печати!");
КонецЕсли;
КонецПроцедуры
---
Часто в процессе разработки возникает ошибка обращения по индексу к переменной ОбъектыНазначения:
СсылкаНаОбъект = ОбъектыНазначения[0]; // Ошибка! Получение элемента по индексу для значения не определено
Проанализируем ситуацию. Данная ошибка возникает по двум основным причинам:
ОбъектыНазначения имеет значение Неопределено. Попытка обратиться к ней как к массиву вызывает аварийное завершение работы системы.Массив и количество элементов, чтобы избежать падения интерфейса у пользователя.Пример правильного и безопасного извлечения данных в форме:
&НаСервере
Функция ПолучитьДокументБезопасно(ВходящиеПараметры)
Если ТипЗнч(ВходящиеПараметры) = Тип("Массив") И ВходящиеПараметры.Количество() > 0 Тогда
Возврат ВходящиеПараметры[0];
КонецЕсли;
Возврат Неопределено;
КонецФункции
---
Постоянно загружать измененную обработку в справочник «Дополнительные отчеты и обработки» для тестирования каждой строчки кода — неэффективно. Применим практический прием для отладки формы через стандартное меню «Файл — Открыть».
Разберем по шагам, как настроить форму для двойного режима работы:
ДокументСсылка (для выбора документа вручную) и разместим его на форме в отдельной группе под названием ГруппаОтладки.ПриСозданииНаСервере пропишем управление видимостью этой группы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем, как запущена обработка
ЗапущеноЧерезБСП = Параметры.Свойство("ОбъектыНазначения");
// Показываем поле выбора документа только при ручном открытии для отладки
Элементы.ГруппаОтладки.Видимость = Не ЗапущеноЧерезБСП;
Если ЗапущеноЧерезБСП Тогда
// Рабочий режим запуска из документа через БСП
МассивДокументов = Параметры.ОбъектыНазначения;
Если МассивДокументов.Количество() > 0 Тогда
ДокументСсылка = МассивДокументов[0];
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Благодаря этому приему при ручном открытии обработки через «Файл — Открыть» разработчик увидит поле выбора документа и сможет протестировать формирование и сохранение файлов XLS в выбранный каталог. В рабочей же базе группа отладки автоматически скроется, а документ будет подставляться из контекста БСП совершенно незаметно для конечного пользователя.