При работе с конфигурациями 1С:Предприятие 8.3, особенно с нетиповыми документами, часто возникает необходимость в создании и подключении внешних печатных форм (ВПФ). Эти формы позволяют гибко настраивать вывод данных, не изменяя при этом основную конфигурацию и не снимая ее с поддержки. В данном материале мы подробно рассмотрим, как осуществить подключение ВПФ к нетиповому документу, принимая во внимание особенности работы со старыми версиями Библиотеки стандартных подсистем (БСП), как в случае с Бухгалтерией предприятия, редакция 3.0 (3.0.39.67).
Предположим, вы уже создали документ, который не является типовым, и хотите для него создать ВПФ. Вы уже добавили документ в общую команду, но при попытке вызвать печатную форму из списка или из самого документа она не появляется. Давайте разбираться, что нужно сделать.
Внешние печатные формы (ВПФ) представляют собой отдельные файлы с расширением *.epf, которые хранятся вне основной конфигурации. Это позволяет изменять их без снятия конфигурации с поддержки, что является критически важным преимуществом.
Регистрация ВПФ в пользовательском режиме:
Для подключения ВПФ в пользовательском режиме нам необходимо перейти в раздел "Администрирование" и найти пункт "Печатные формы, отчеты и обработки". Здесь мы должны убедиться, что установлен флажок "Дополнительные отчеты и обработки". После этого переходим по соответствующей ссылке и добавляем файл нашей ВПФ.
При добавлении ВПФ мы указываем:
Определение сведений о ВПФ в ее модуле объекта:
В модуле объекта нашей внешней печатной формы мы обязательно должны определить экспортную функцию СведенияОВнешнейОбработке(). Эта функция возвращает структуру с параметрами регистрации, которые БСП использует для корректного отображения и вызова нашей формы.
Типовая структура может включать следующие поля:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); // Указываем, что это печатная форма
ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Моя нетиповая печатная форма'")); // Название формы
ПараметрыРегистрации.Вставить("Версия", "1.0"); // Версия обработки
ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Выводит данные по нетиповому документу.'")); // Описание
// Назначение: к какому документу привязываем ВПФ
ТаблицаНазначений = Новый ТаблицаЗначений;
ТаблицаНазначений.Колонки.Добавить("ИмяОбъекта");
НоваяСтрока = ТаблицаНазначений.Добавить();
НоваяСтрока.ИмяОбъекта = "Документ.ВашНетиповойДокумент"; // Имя объекта метаданных
ПараметрыРегистрации.Вставить("Назначение", ТаблицаНазначений);
// Команды печати: как будут вызываться
ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Представление");
ТаблицаКоманд.Колонки.Добавить("Идентификатор");
ТаблицаКоманд.Колонки.Добавить("Использование"); // Например, ВызовСерверногоМетода
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Печать нетипового документа'");
НоваяКоманда.Идентификатор = "ПечатьНетиповогоДокумента"; // Уникальный идентификатор команды
НоваяКоманда.Использование = "ВызовСерверногоМетода"; // Или ОткрытиеФормы, ВызовКлиентскогоМетода
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция Печать(МассивОбъектов, ОбъектыПечати, ПараметрыПечати) Экспорт
// Здесь реализуется основная логика формирования макета и вывода печатной формы
// ...
КонецФункции
В функции Печать(), которую вызывает БСП, мы уже реализуем саму логику формирования печатной формы: получаем данные из базы, заполняем макет, выводим табличный документ.
Как вы отметили, в вашем случае (Бухгалтерия предприятия 3.0.39.67) версия БСП может быть старой, и типовые механизмы, такие как "ПодключаемыеКоманды", могут быть недоступны или работать некорректно. Это означает, что для вызова ВПФ из форм нетипового документа или списка потребуется ручное внесение изменений в конфигурацию, но эти изменения можно минимизировать, используя расширения конфигурации.
Разберем по шагам, что именно необходимо добавить в формы вашего нетипового документа.
Добавление элементов формы для вызова печати:
Вам необходимо добавить на командную панель формы документа (или формы списка) группу типа "Подменю", которая будет служить кнопкой "Печать". Мы рекомендуем назвать ее, например, ПодменюПечать, и присвоить ей вид "Подменю". В нее затем будут автоматически подгружаться зарегистрированные печатные формы.
Модификация обработчика события ПриСозданииНаСервере формы:
В модуле формы вашего нетипового документа или его списка, в обработчике события ПриСозданииНаСервере, нам нужно вызвать метод БСП УправлениеПечатью.ПриСозданииНаСервере(). Этот метод отвечает за наполнение подменю печати соответствующими командами.
Пример для формы документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ... Ваш существующий код ...
// Вызов метода БСП для инициализации команд печати
// Убедитесь, что Элементы.ПодменюПечать существует в вашей форме
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюПечать);
// ... Дальнейший код ...
КонецПроцедуры
Если вы работаете с формой списка документов, то принцип аналогичен, но в качестве элемента меню передаем соответствующий элемент формы списка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ... Ваш существующий код ...
// Предполагается, что на форме списка есть элемент ПодменюПечать,
// а также список документов, например, Элементы.Список
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюПечать);
// ... Дальнейший код ...
КонецПроцедуры
Добавление клиентской процедуры Подключаемый_ВыполнитьКомандуПечати:
На клиенте нам необходимо добавить экспортную процедуру, которая будет вызываться при выборе команды печати из подменю. Эта процедура будет передавать управление соответствующему клиентскому методу БСП.
Пример для формы документа:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда) Экспорт
// Вызов клиентского метода БСП для выполнения команды печати
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект);
КонецПроцедуры
Здесь Объект – это сам объект документа, для которого мы формируем печатную форму.
Пример для формы списка документов:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда) Экспорт
// Для формы списка необходимо передать элемент списка для получения выбранных элементов
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Элементы.СписокДокументов);
КонецПроцедуры
В этом случае Элементы.СписокДокументов – это элемент формы типа "Таблица", который отображает список документов.
Важно: Все эти изменения рекомендуется вносить через расширения конфигурации. Это позволит сохранить конфигурацию на поддержке и упростит дальнейшие обновления. Если изменения вносятся непосредственно в конфигурацию, то документ перестанет быть типовым с точки зрения поддержки, что нежелательно.
Помимо вызова ВПФ из интерфейса, иногда требуется программно сформировать и распечатать внешнюю форму. Для этого в БСП-конфигурациях предусмотрены специальные методы.
Использование ПечатьПоВнешнемуИсточнику():
Для программного формирования ВПФ, которая уже подключена через справочник "Дополнительные отчеты и обработки" БСП, мы можем использовать метод ПечатьПоВнешнемуИсточнику() общего модуля ДополнительныеОтчетыИОбработки.
Этот метод принимает следующие основные параметры:
СсылкаНаДокумент: Ссылка на объект документа, для которого формируется печатная форма.СсылкаНаВнешнююОбработку: Ссылка на элемент справочника "Дополнительные отчеты и обработки", соответствующий нашей ВПФ.ИдентификаторКоманды: Идентификатор команды печати, который мы указали в функции СведенияОВнешнейОбработке() (например, "ПечатьНетиповогоДокумента").Пример вызова:
&НаСервере
Функция СформироватьВнешнююПечатнуюФорму(СсылкаНаДокумент, ИдентификаторКоманды)
// Находим нашу внешнюю обработку по наименованию или идентификатору
// (для примера, предположим, что мы знаем ее GUID или имя)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеОтчетыИОбработки.Ссылка
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
|ГДЕ
| ДополнительныеОтчетыИОбработки.Наименование = &НаименованиеВПФ
| И ДополнительныеОтчетыИОбработки.Вид = &ВидВПФ";
Запрос.УстановитьПараметр("НаименованиеВПФ", "Моя нетиповая печатная форма");
Запрос.УстановитьПараметр("ВидВПФ", Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если НЕ РезультатЗапроса.Следующий() Тогда
Возврат Неопределено;
КонецЕсли;
СсылкаНаВнешнююОбработку = РезультатЗапроса.Ссылка;
ТабличныйДокумент = ДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику(
СсылкаНаДокумент,
СсылкаНаВнешнююОбработку,
ИдентификаторКоманды
);
Возврат ТабличныйДокумент;
КонецФункции
Открытие сформированной печатной формы:
После того как мы получили ТабличныйДокумент, его можно открыть для просмотра или печати на клиенте с помощью метода УправлениеПечатьюКлиент.ПечатьДокументов().
Пример вызова на клиенте:
&НаКлиенте
Процедура ОткрытьИРаспечататьВПФ()
// Предположим, у нас есть ссылка на документ и идентификатор команды
СсылкаДокумента = Объект.Ссылка; // Или получаем как-то иначе
ИдентификаторКоманды = "ПечатьНетиповогоДокумента";
ТабличныйДокументДляПечати = СформироватьВнешнююПечатнуюФорму(СсылкаДокумента, ИдентификаторКоманды); // Вызов серверной функции
Если ТабличныйДокументДляПечати <> Неопределено Тогда
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ИмяМакета", ИдентификаторКоманды); // Имя макета для панели просмотра
УправлениеПечатьюКлиент.ПечатьДокументов(ТабличныйДокументДляПечати, ПараметрыПечати);
Иначе
ПоказатьПредупреждение(, НСтр("ru = 'Не удалось сформировать печатную форму.'"));
КонецЕсли;
КонецПроцедуры
Автор обсуждения выразил нежелание писать логику печати непосредственно в модуле менеджера документа. И это абсолютно обоснованное желание, особенно если макеты форм могут часто меняться.
Тем не менее, для полноты картины, стоит упомянуть, что для нетиповых документов некоторые разработчики все же предпочитают реализовывать печать прямо в модуле менеджера документа. Это может быть оправдано в случаях, когда:
В этом случае, в модуле менеджера документа создается экспортная функция Печать(), которая принимает МассивОбъектов (ссылки на документы) и возвращает ТабличныйДокумент. Однако этот подход снимает конфигурацию с поддержки или, если применяется через расширение, требует более сложной логики для перехвата вызова печати.
Учитывая, что макет формы может меняться чуть ли не каждые две недели, как было упомянуто в обсуждении, использование внешних печатных форм является гораздо более гибким и предпочтительным решением. Оно позволяет обновлять макеты без повторной публикации расширения или снятия с поддержки всей конфигурации.
Как мы увидели, создание и подключение внешней печатной формы для нетипового документа в 1С:Бухгалтерии 3.0, особенно при работе со старой версией БСП, требует ряда дополнительных шагов. Нам придется вручную дорабатывать формы документа или списка, добавляя элементы для меню печати и вызывая соответствующие методы БСП УправлениеПечатью.ПриСозданииНаСервере() и УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(). Все эти изменения рекомендуется выполнять через расширения конфигурации, чтобы сохранить возможность стандартного обновления.
Несмотря на кажущуюся сложность, этот подход предоставляет максимальную гибкость и независимость в настройке печатных форм, что является неоспоримым преимуществом при длительной поддержке и развитии информационной системы.