Как программно открыть внешнюю печатную форму в 1С:УНФ и исправить ошибку "Поле объекта не обнаружено"?

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

При автоматизации бизнес-процессов часто возникает задача программного вызова печатных форм, например, для формирования счета на оплату сразу после проведения документа. При попытке реализовать такой функционал можно столкнуться с ошибками, связанными с неправильной передачей параметров в стандартные формы 1С. Рассмотрим типичную ситуацию на примере вызова внешней печатной формы (ВПФ) в конфигурации 1С:УНФ 3 и разберем, как исправить ошибку "Поле объекта не обнаружено (КлючПараметровПечати)".

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

Разбираем ошибку "Поле объекта не обнаружено (КлючПараметровПечати)"

Предположим, у нас есть задача: после проведения документа "Заказ покупателя" необходимо сразу открыть внешнюю печатную форму "Счет на оплату". Автор исходного кода попытался решить это следующим образом:


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

При выполнении этого кода система выдает ошибку: Поле объекта не обнаружено (КлючПараметровПечати). Давайте выясним причину.

Ошибка возникает в строке ПараметрыОткрытия.КлючПараметровПечати = .... Это происходит потому, что при создании объекта Структура мы явно указали, какие в ней будут поля: Новый Структура("ИсточникДанных, ПараметрыИсточника"). В этой структуре нет поля с именем КлючПараметровПечати, и попытка присвоить ему значение закономерно приводит к ошибке.

Чтобы исправить это, необходимо сразу при создании структуры ПараметрыОткрытия объявить все необходимые поля. Общая форма ПечатьДокументов ожидает ключ КлючПараметровПечати именно в корневой структуре параметров, а не во вложенных.

Правильный вариант кода выглядит так:


&НаКлиенте
Процедура Pro_кнПровестиИСчетПосле(Команда)
    Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
    
    Обр = ПолучитьОбработкуНаСервере(); // Получаем объект ВПФ
    
    ОбъектыНазначения = Новый Массив;
    ОбъектыНазначения.Добавить(Объект.Ссылка);

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

Этот код успешно передаст все необходимые параметры в форму печати и решит исходную проблему.

Что делать, если появляются новые ошибки, например, "Поле объекта не обнаружено (Автомасштаб)"?

Иногда после исправления одной ошибки появляется другая. В нашем случае после применения правильного кода может возникнуть ошибка Поле объекта не обнаружено (Автомасштаб).

Что это означает? Это верный признак того, что проблема находится не в коде вызова, а внутри самой внешней печатной формы (ВПФ). Свойство Автомасштаб принадлежит объекту ТабличныйДокумент. Ошибка говорит о том, что в коде ВПФ происходит попытка обратиться к этому свойству (например, ТабДок.Автомасштаб = Истина) в тот момент, когда переменная ТабДок еще не создана или не является объектом типа ТабличныйДокумент.

Что делать в таком случае:

  1. Откройте внешнюю печатную форму в режиме конфигуратора.
  2. Найдите в модуле объекта экспортную процедуру Печать().
  3. Внимательно проанализируйте код этой процедуры. Найдите место, где используется свойство Автомасштаб.
  4. Убедитесь, что перед использованием этого свойства объект табличного документа уже создан (например, строкой ТабДок = Новый ТабличныйДокумент;).
  5. Исправьте логику кода внутри ВПФ. Вероятно, потребуется перенести строки инициализации табличного документа в начало процедуры.

Такая диагностика позволяет локализовать проблему и понять, что дальнейшие исправления нужно вносить уже в саму дорабатываемую обработку, а не в код ее вызова.

Рекомендуемый способ вызова печатных форм через Библиотеку стандартных подсистем (БСП)

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

Рассмотрим, как реализовать нашу задачу с помощью функций БСП. Процесс делится на два этапа:

  1. Формирование табличного документа на сервере. Для этого используется функция ПечатьПоВнешнемуИсточнику из общего модуля ДополнительныеОтчетыИОбработки.
  2. Передача сформированного документа на клиент и его отображение стандартной формой печати через процедуру УправлениеПечатьюКлиент.ПечатьДокументов.

Посмотрим на пример реализации.


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

    // Готовим коллекцию печатных форм для отображения
    // "СчетНаОплату" - это имя команды, которое будет отображаться в форме печати
    КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("СчетНаОплату");
    
    ПараметрыВывода = КоллекцияПечатныхФорм[0];
    ПараметрыВывода.ТабличныйДокумент = РезультатФормирования.ТабличныйДокумент;
    ПараметрыВывода.СинонимМакета = "Счет на оплату (внешний)"; // Заголовок в окне предварительного просмотра

    // Вызываем стандартную форму печати БСП
    УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, , ЭтаФорма);
КонецПроцедуры

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

    Возврат Новый Структура("ТабличныйДокумент", ТабДок);
КонецФункции

// Вспомогательная функция для получения ссылки на ВПФ
&НаСервере
Функция ПолучитьСсылкуНаВПФНаСервере()
    // Здесь должен быть код для поиска нужной ВПФ в справочнике
    // "Дополнительные отчеты и обработки". Например, по имени.
    // Для примера вернем пустое значение. В реальной задаче его нужно найти.
    Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Мой Счет на оплату");
КонецФункции

Преимущества подхода с использованием БСП:

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

← На главную