Как создать внешнюю печатную форму для справочника в 1С?

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

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

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

Способ 1: Интеграция с подсистемой печати БСП (рекомендуемый)

Этот метод является наиболее правильным и универсальным, так как он встраивает вашу печатную форму в стандартный механизм печати конфигурации. Команда для вызова вашей формы появится в общем подменю «Печать», как и для всех остальных объектов.

Рассмотрим по шагам, что для этого необходимо.

  1. Реализация процедуры ДобавитьКомандыПечати в модуле менеджера справочника.

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

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

    Важный момент: Как справедливо замечено в обсуждении на форуме, реализация этого механизма сильно зависит от версии БСП, используемой в вашей конфигурации (например, БСП 2.4 и 3.1 имеют отличия). Перед началом работы обязательно уточните версию БСП и обратитесь к документации на ИТС для получения актуальных примеров кода.

  2. Подготовка внешней обработки.

    Сама внешняя печатная форма (обработка) должна содержать стандартную экспортную функцию СведенияОВнешнейОбработке(). Именно в ней система получает информацию о том, что это за обработка и к каким объектам она относится.

    Для привязки к справочнику в параметре Назначение необходимо указать массив, содержащий строковое представление типа вашего справочника, например, "Справочник.Номенклатура" или "Справочник.ИТ_ОбъектыЭксплуатацииКонтрагентовПрисоединенныеФайлы".

    Посмотрим на пример структуры такой функции:

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

    После регистрации такой обработки в системе (через раздел «Печатные формы, отчеты и обработки») и при наличии корректной процедуры ДобавитьКомандыПечати, команда печати должна появиться автоматически.

Способ 2: Своя кнопка на форме (простой и быстрый)

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

Разберем этот метод по шагам:

  1. Создайте команду на форме. В редакторе нужной формы (например, формы элемента справочника) перейдите на вкладку «Команды» и добавьте новую команду, например, «МояПечать».
  2. Добавьте кнопку на форму. Перетащите созданную команду в желаемое место на форме, например, в командную панель. 1С автоматически создаст кнопку, связанную с этой командой.
  3. Напишите обработчик команды. Создайте для команды обработчик действия. В этом обработчике будет находиться логика вызова вашей печатной формы.

Посмотрим на пример кода для обработчика такой кнопки:


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

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

    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Вывести(ОбластьШапка);

    // Этот код можно вынести в общий модуль или в модуль самой внешней обработки
    // ... дальнейшее заполнение табличного документа ...

    // Показываем результат пользователю
    ТабДок.Показать("Печать карточки");
КонецПроцедуры

Преимущества этого способа:

Недостатки:

Дополнительная задача: Как дать пользователю выбирать поля для печати?

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

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

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

← На главную