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