Как подключить внешнюю печатную форму в 1С 8.3, исправить ошибки регистрации и добавить диалоговые параметры?

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

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

Подключение внешней печатной формы и исправление распространенных ошибок регистрации

Давайте обсудим процесс подключения вашей первой внешней печатной формы (ВПФ) в 1С 8.3 и разберем распространенную ошибку, которая может возникнуть на этапе регистрации. Для начала, вспомним структуру модуля объекта внешней обработки, которая необходима для регистрации ВПФ. Ключевой функцией является СведенияОВнешнейОбработке, которая возвращает структуру с параметрами регистрации. Внутри этой функции мы обычно вызываем вспомогательные функции, такие как ПолучитьНазначениеОбработки и ПолучитьТаблицуКоманд.

Пример некорректного кода (исходная проблема автора):


Функция ПолучитьНазначениеОбработки
    Массив = Новый Массив;
    Массив.Добавить("Документ.ЗаказПокупателя");
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь,Модификатор = "");
    НоваяКоманда = ТаблицаКоманд.Добавить;
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.Оповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

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

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

Причина ошибки: Мы внимательно анализируем функцию ПолучитьТаблицуКоманд и видим, что она создает таблицу значений Команды, добавляет к ней колонки, но не возвращает эту таблицу. В результате, когда в функции СведенияОВнешнейОбработке мы пишем Команды = ПолучитьТаблицуКоманд;, переменная Команды получает значение Неопределено, а не объект ТаблицаЗначений. Соответственно, при попытке вызвать метод Добавить для Неопределено возникает ошибка.

Исправление ошибки: Необходимо добавить оператор Возврат Команды; в конце функции ПолучитьТаблицуКоманд.

Пример исправленного кода:


Функция ПолучитьТаблицуКоманд
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление",Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор",Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование",Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Оповещение",Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор",Новый ОписаниеТипов("Строка"));
    // Здесь ранее отсутствовал возврат
    Возврат Команды; // <-- ДОБАВЛЕНО
КонецФункции

С этим исправлением обработка должна успешно подключиться. Также, не забудьте, что функция ПолучитьНазначениеОбработки также должна возвращать массив:


Функция ПолучитьНазначениеОбработки
    Массив = Новый Массив;
    Массив.Добавить("Документ.ЗаказПокупателя");
    Возврат Массив; // <-- ДОБАВЛЕНО
КонецФункции

Использование Библиотеки стандартных подсистем (БСП) для регистрации ВПФ

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

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

Пример использования БСП:


Функция СведенияОВнешнейОбработке Экспорт
    // Вызываем функцию БСП для получения базовой структуры параметров
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1"); // Укажите актуальную версию БСП

    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
    ПараметрыРегистрации.Версия = "1.1";
    ПараметрыРегистрации.Назначение.Добавить("Документ._ДемоСчетНаОплатуПокупателю"); // Замените на ваше назначение

    // Добавляем команды
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); // Используем метод Добавить()
    НоваяКоманда.Представление = НСтр("ru = 'Счет на оплату'");
    НоваяКоманда.Идентификатор = "СчетЗаказ";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";

    // Можно добавить несколько команд, например, для комплекта
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Счет на оплату (комплект)'");
    НоваяКоманда.Идентификатор = "СчетЗаказ,СчетЗаказ,СчетЗаказ2"; // Пример нескольких команд
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";

    Возврат ПараметрыРегистрации;
КонецФункции

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

Реализация диалогового окна для дополнительных параметров перед печатью

Часто возникает необходимость ввести дополнительные параметры (например, процент наценки, выбор макета) перед формированием печатной формы. 1С 8.3 предоставляет механизм для реализации таких диалоговых окон.

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

Шаги реализации:

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

Пример кода в СведенияОВнешнейОбработке для команды, открывающей форму:


// ...
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Коммерческое предложение с параметрами'");
НоваяКоманда.Идентификатор = "КоммерческоеПредложениеСПараметрами";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы; // <-- КЛЮЧЕВОЕ ИЗМЕНЕНИЕ
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "Печать"; // Или другой модификатор, если нужен
// ...

Логика в форме обработки: В форме обработки, которую мы создали, реализуйте кнопки "Печать" и "Отмена". При нажатии на "Печать" вы сможете получить введенные пользователем параметры и передать их в серверную процедуру, которая формирует печатную форму. Вы можете передавать эти параметры в процедуру печати через дополнительные параметры команды или напрямую.

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

Отладка внешних печатных форм в 1С 8.3

Отладка внешних печатных форм (ВПФ) в 1С 8.3 имеет свои особенности и может вызвать затруднения, поскольку подключенная ВПФ ведет себя не так, как обычная обработка, открытая через меню "Файл" -> "Открыть".

Почему возникают трудности?

  1. Когда мы подключаем ВПФ в справочник "Дополнительные отчеты и обработки", ее файл сохраняется в базе данных (в ХранилищеЗначений).
  2. При выполнении обработки система извлекает ее из хранилища, записывает во временный каталог на диске и запускает оттуда.
  3. Это означает, что точки останова, установленные в исходном .epf файле, который открыт в конфигураторе, не будут срабатывать, если мы запускаем печать через интерфейс 1С (кнопка "Печать" в документе). Изменения, внесенные в исходный файл, также не будут видны без переподключения.

Рекомендованные методы отладки:

  1. Временное открытие файла .epf через "Файл" -> "Открыть":
    • Это самый распространенный и эффективный способ для отладки логики формирования печатной формы.
    • Откройте ваш .epf файл в режиме 1С:Предприятия через "Файл" -> "Открыть...".
    • Для имитации вызова печатной формы из документа, вам потребуется добавить на форму вашей обработки реквизит, например, СсылкаНаОбъект (тип "ДокументСсылка.ЗаказПокупателя" или универсальный "ДокументСсылка.Любой") и поле ввода для него.
    • На форме обработки создайте кнопку "Тестовая печать" и в ее обработчике вызовите вашу серверную процедуру печати, передавая ей выбранный документ.
    • В таком режиме точки останова, установленные в конфигураторе в модуле объекта этой открытой обработки, будут срабатывать.
  2. Обновление обработки в справочнике "Дополнительные отчеты и обработки":
    • Если вам все же нужно отлаживать ВПФ в режиме ее "подключенности" к конфигурации (т.е. через кнопку "Печать" в документе), то после каждого изменения кода в .epf файле вам придется заходить в справочник "Дополнительные отчеты и обработки", находить вашу ВПФ и нажимать кнопку "Обновить из файла". Только после этого изменения вступят в силу, и вы сможете попытаться отладить ее (хотя с точками останова все еще могут быть сложности из-за временного файла).
    • Для отладки в этом режиме может помочь установка отладчика в автоматическом режиме (подключение к фоновым заданиям или сеансам).
  3. Использование "режима отладки" для подключенной обработки (в справочнике):
    • Опция "режим отладки" для подключенной ВПФ означает, что она будет видна только администраторам системы. Это не меняет механизм исполнения файла из временного хранилища и не упрощает установку точек останова в исходном файле.
    • Если необходимо отладить поведение именно "подключенной" ВПФ, придется применять более сложные методы, такие как подключение отладчика к запущенному клиентскому процессу или к серверному процессу (для серверных вызовов), но даже в этом случае, точки останова могут не срабатывать в исходном файле, а только если открыть модуль объекта из отладчика.

Важно: При отладке всегда используйте "табло" и "стек вызовов" в отладчике для контроля значений переменных и последовательности вызовов функций.

Дополнительные рекомендации

Безопасный режим: Для внешних обработок мы настоятельно рекомендуем устанавливать БезопасныйРежим = Истина в функции СведенияОВнешнейОбработке. Это значительно повышает безопасность системы, ограничивая доступ обработки к файловой системе и другим потенциально опасным операциям.

Совместимость версий: Всегда учитывайте версию платформы 1С и версию Библиотеки стандартных подсистем вашей конфигурации. Несоответствие версий может приводить к ошибкам при подключении и работе ВПФ.

← На главную