Приступая к разработке и подключению внешних печатных форм (ВПФ) в системе 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 предоставляет механизм для реализации таких диалоговых окон.
Принцип действия: Вместо прямого вызова серверной процедуры печати, мы будем открывать специальную форму внешней обработки, в которой пользователь сможет ввести необходимые данные.
Шаги реализации:
СведенияОВнешнейОбработке. Вместо ВызовСерверногоМетода укажите ОткрытиеФормы.Пример кода в СведенияОВнешнейОбработке для команды, открывающей форму:
// ...
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Коммерческое предложение с параметрами'");
НоваяКоманда.Идентификатор = "КоммерческоеПредложениеСПараметрами";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы; // <-- КЛЮЧЕВОЕ ИЗМЕНЕНИЕ
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "Печать"; // Или другой модификатор, если нужен
// ...
Логика в форме обработки: В форме обработки, которую мы создали, реализуйте кнопки "Печать" и "Отмена". При нажатии на "Печать" вы сможете получить введенные пользователем параметры и передать их в серверную процедуру, которая формирует печатную форму. Вы можете передавать эти параметры в процедуру печати через дополнительные параметры команды или напрямую.
В контексте БСП, подсистема "Печать" позволяет передавать дополнительные параметры в печатную форму через параметр ОписаниеКоманды.ДополнительныеПараметры в клиентской экспортной функции формирования печатной формы. Это позволяет из формы документа или справочника передавать значения в процедуру Печать() для использования в алгоритме формирования.
Отладка внешних печатных форм (ВПФ) в 1С 8.3 имеет свои особенности и может вызвать затруднения, поскольку подключенная ВПФ ведет себя не так, как обычная обработка, открытая через меню "Файл" -> "Открыть".
Почему возникают трудности?
ХранилищеЗначений)..epf файле, который открыт в конфигураторе, не будут срабатывать, если мы запускаем печать через интерфейс 1С (кнопка "Печать" в документе). Изменения, внесенные в исходный файл, также не будут видны без переподключения.Рекомендованные методы отладки:
.epf через "Файл" -> "Открыть":
.epf файл в режиме 1С:Предприятия через "Файл" -> "Открыть...".СсылкаНаОбъект (тип "ДокументСсылка.ЗаказПокупателя" или универсальный "ДокументСсылка.Любой") и поле ввода для него..epf файле вам придется заходить в справочник "Дополнительные отчеты и обработки", находить вашу ВПФ и нажимать кнопку "Обновить из файла". Только после этого изменения вступят в силу, и вы сможете попытаться отладить ее (хотя с точками останова все еще могут быть сложности из-за временного файла).Важно: При отладке всегда используйте "табло" и "стек вызовов" в отладчике для контроля значений переменных и последовательности вызовов функций.
Безопасный режим: Для внешних обработок мы настоятельно рекомендуем устанавливать БезопасныйРежим = Истина в функции СведенияОВнешнейОбработке. Это значительно повышает безопасность системы, ограничивая доступ обработки к файловой системе и другим потенциально опасным операциям.
Совместимость версий: Всегда учитывайте версию платформы 1С и версию Библиотеки стандартных подсистем вашей конфигурации. Несоответствие версий может приводить к ошибкам при подключении и работе ВПФ.