Как создать расширение для печати документа в 1С ЗУП: подробное руководство

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет IT и автоматизация бизнеса
← К списку

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

Быстрое решение: Добавление команды печати на форму документа через расширение

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

  1. Создание команды печати на форме:

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

  2. Реализация клиентской процедуры для команды:

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

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

    
    &НаКлиенте
    Процедура мПечать(Команда)
        // Получаем текущие данные из табличной части формы.
        // Обратите внимание, что "ТЧ" здесь - это имя вашей табличной части на форме.
        ТекДанные = Элементы.ТЧ.ТекущиеДанные;
    
        // Вызываем серверную функцию для формирования табличного документа.
        ТабДок = мПечатьНаСервере(ТекДанные.Сотрудник);
    
        // Показываем сформированный табличный документ пользователю.
        ТабДок.Показать();
    КонецПроцедуры
    

    В этом примере Элементы.ТЧ.ТекущиеДанные позволяет нам получить данные текущей строки табличной части, где ТЧ — это имя вашей табличной части на форме документа. Например, если у вас табличная часть называется "СписокСотрудников", то вы будете обращаться к Элементы.СписокСотрудников.ТекущиеДанные.

  3. Реализация серверной функции для формирования ТабличногоДокумента:

    Теперь нам нужно создать соответствующую серверную функцию, которая будет принимать необходимые параметры (например, ссылку на сотрудника) и на их основе формировать табличный документ.

    Эта функция должна быть экспортной и находиться в модуле формы документа (или в общем модуле, если это предусмотрено архитектурой).

    
    &НаСервере
    Функция мПечатьНаСервере(СсылкаНаСотрудника)
        // Здесь будет логика формирования табличного документа.
        // Например, мы можем получить данные из базы данных по СсылкаНаСотрудника.
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    Сотрудники.ФИО
                       |ИЗ
                       |    Справочник.Сотрудники КАК Сотрудники
                       |ГДЕ
                       |    Сотрудники.Ссылка = &СсылкаНаСотрудника";
        Запрос.УстановитьПараметр("СсылкаНаСотрудника", СсылкаНаСотрудника);
    
        РезультатЗапроса = Запрос.Выполнить().Выбрать();
        РезультатЗапроса.Следующий();
    
        // Создаем новый ТабличныйДокумент
        ТабДок = Новый ТабличныйДокумент;
        ТабДок.НачатьВывод();
    
        // Пример заполнения ячеек
        ТабДок.Область(1,1).Текст = "Печатная форма для сотрудника:";
        ТабДок.Область(2,1).Текст = РезультатЗапроса.ФИО;
    
        ТабДок.ЗакончитьВывод();
    
        Возврат ТабДок;
    КонецФункции
    

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

Рекомендуемое решение: Использование Библиотеки стандартных подсистем (БСП) для печати через расширение

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

Ключевое преимущество БСП заключается в том, что она позволяет нам создавать внешние печатные формы (по сути, обработки с типом "ПечатнаяФорма") или добавлять новые макеты и команды печати непосредственно в типовые документы, используя механизм расширений, без заимствования форм или модулей объекта целиком.

Шаг 1: Изучаем основы работы БСП с печатью

Прежде чем углубляться в детали, давайте выясним общие принципы:

  1. Понимание архитектуры печати БСП:

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

  2. Практика "Hello world":

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

Шаг 2: Создание печатной формы в расширении

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

  1. Подключение подсистемы "Печать":

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

  2. Процедура ДобавитьКомандыПечати:

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

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

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

    Эта процедура описывает команду печати, указывая ее Идентификатор и Представление, которые будут отображаться в меню "Печать".

  3. Процедура Печать:

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

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

    В этой процедуре мы получаем ссылки на объекты для печати, макет и формируем ТабличныйДокумент, который затем добавляем в КоллекциюПечатныхФорм.

  4. Макеты печатных форм:

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

    Для нашего примера, нам нужно добавить макет с именем "МойМакет" к документу в расширении, и в нем создать области "Заголовок" и "Данные".

  5. Структура внешней печатной формы на БСП (как альтернатива):

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

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

Шаг 3: Передача дополнительных параметров в печатную форму

Часто возникает необходимость передать дополнительные данные из формы документа или справочника в процедуру формирования печатной формы. Рассмотрим, как это можно сделать:

  1. Использование ОписаниеКоманды.ДополнительныеПараметры:

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

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

    Затем эти параметры будут доступны в процедуре Печать через параметр ПараметрыПечати.

  2. Механизм ПередатьВПараметрыКоманды:

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

  3. Запрос дополнительных данных на клиенте:

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

Дополнительные рекомендации и возможности БСП

Используя БСП, мы получаем доступ к целому ряду полезных функций:

  1. Комплекты печатных форм:

    БСП поддерживает печать комплектов документов. Это означает, что мы можем настроить печать нескольких связанных документов (например, счета и акта) одной кнопкой, что значительно повышает удобство работы.

  2. Вывод логотипов, печатей и подписей:

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

  3. Разработка без заимствования формы:

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

Мы рассмотрели основные подходы к созданию расширения для печати документа в 1С ЗУП. Хотя прямое добавление команды на форму может показаться быстрым решением, мы убедились, что использование механизмов Библиотеки стандартных подсистем является более надежным, гибким и поддерживаемым способом реализации печатных форм в долгосрочной перспективе. Изучайте БСП, экспериментируйте с "Hello world" формами и применяйте эти знания на практике!

← К списку