Задача создания печатной формы для справочника — распространенная потребность при доработке конфигураций 1С. Хотя этот процесс похож на создание печатных форм для документов, он имеет свои особенности, особенно при работе с Библиотекой стандартных подсистем (БСП). Давайте разберемся, как правильно подключить внешнюю печатную форму к справочнику, и какие существуют подходы, если стандартный метод вызывает затруднения.
Проанализируем два основных способа решения этой задачи: канонический, через интеграцию с подсистемой печати БСП, и более простой, альтернативный — с помощью собственной кнопки на форме.
Этот метод является наиболее правильным и универсальным, так как он встраивает вашу печатную форму в стандартный механизм печати конфигурации. Команда для вызова вашей формы появится в общем подменю «Печать», как и для всех остальных объектов.
Рассмотрим по шагам, что для этого необходимо.
ДобавитьКомандыПечати в модуле менеджера справочника.
Ключевым моментом для интеграции с БСП является наличие экспортной процедуры ДобавитьКомандыПечати в модуле менеджера того справочника, для которого вы создаете печатную форму. Эта процедура вызывается подсистемой печати для сбора всех доступных команд.
В этой процедуре нужно описать вашу команду, указав ее идентификатор, представление для пользователя и другие параметры. Подсистема печати сама добавит ее в нужное место.
Важный момент: Как справедливо замечено в обсуждении на форуме, реализация этого механизма сильно зависит от версии БСП, используемой в вашей конфигурации (например, БСП 2.4 и 3.1 имеют отличия). Перед началом работы обязательно уточните версию БСП и обратитесь к документации на ИТС для получения актуальных примеров кода.
Сама внешняя печатная форма (обработка) должна содержать стандартную экспортную функцию СведенияОВнешнейОбработке(). Именно в ней система получает информацию о том, что это за обработка и к каким объектам она относится.
Для привязки к справочнику в параметре Назначение необходимо указать массив, содержащий строковое представление типа вашего справочника, например, "Справочник.Номенклатура" или "Справочник.ИТ_ОбъектыЭксплуатацииКонтрагентовПрисоединенныеФайлы".
Посмотрим на пример структуры такой функции:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Наименование", "Печать карточки объекта эксплуатации");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма для справочника");
// Указываем, для какого объекта предназначена форма
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Справочник.ИТ_ОбъектыЭксплуатацииКонтрагентовПрисоединенныеФайлы");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
// Добавляем описание команды
ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
ТаблицаКоманд.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Карточка объекта эксплуатации";
НоваяКоманда.Идентификатор = "КарточкаОбъекта";
НоваяКоманда.Использование = "ВызовСерверногоМетода";
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
После регистрации такой обработки в системе (через раздел «Печатные формы, отчеты и обработки») и при наличии корректной процедуры ДобавитьКомандыПечати, команда печати должна появиться автоматически.
Если интеграция с БСП кажется избыточной или вызывает сложности, есть более простой и надежный путь, предложенный в ходе обсуждения. Он заключается в том, чтобы не зависеть от подсистемы печати, а добавить на форму справочника (элемента или списка) свою собственную кнопку.
Разберем этот метод по шагам:
Посмотрим на пример кода для обработчика такой кнопки:
&НаКлиенте
Процедура МояПечать(Команда)
// Объект.Ссылка содержит ссылку на текущий элемент справочника
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
// Вызываем серверную процедуру для формирования и показа печатной формы
СформироватьИПоказатьПФНаСервере(Объект.Ссылка);
Иначе
ПоказатьПредупреждение(,"Объект не записан!");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СформироватьИПоказатьПФНаСервере(СсылкаНаОбъект)
// Здесь размещаем код формирования табличного документа.
// Например, получаем макет.
Макет = ПолучитьМакет("МойМакет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Наименование = СсылкаНаОбъект.Наименование;
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(ОбластьШапка);
// Этот код можно вынести в общий модуль или в модуль самой внешней обработки
// ... дальнейшее заполнение табличного документа ...
// Показываем результат пользователю
ТабДок.Показать("Печать карточки");
КонецПроцедуры
Преимущества этого способа:
Недостатки:
В ходе обсуждения возник интересный вопрос: что делать, если пользователь хочет сам выбирать, какие поля выводить на печать? Стандартные механизмы не предоставляют такого функционала «из коробки», но его можно реализовать несколькими способами.
В итоге, выбор способа реализации зависит от ваших требований. Для быстрой и надежной реализации печати из справочника подойдет вариант с собственной кнопкой. Если же важна интеграция со стандартными механизмами, придется разбираться с подсистемой печати БСП, внимательно изучив документацию для вашей версии.