Как вывести кнопку "Печать" для нового документа в 1С:ЗУП 3.1, используя БСП?

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

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

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

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

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

Пошаговое добавление кнопки "Печать" и реализация печатной формы

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

  1. Подключение подсистемы "ПодключаемыеКоманды" к форме документа

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

    Откроем модуль формы нашего документа (например, Документ.ВашДокумент.Форма.ФормаДокумента) и найдем процедуру ПриСозданииНаСервере. Если ее нет, создадим. Внутри этой процедуры добавим вызов:

    
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Стандартный вызов БСП для подключения команд
        ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    
        // Ваш дополнительный код при создании на сервере
        // ...
    КонецПроцедуры
    

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

  2. Регистрация команд печати в модуле менеджера вашего документа (или расширения)

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

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

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

    Пример кода:

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

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

  3. Определение настроек печати для вашего документа (в общем модуле расширения/обработки)

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

    Если вы работаете в расширении, рекомендуется создать новый общий модуль (например, ВашДокумент_Печать) в этом расширении. Убедитесь, что свойства модуля Клиент, Сервер, ВнешнееСоединение, ВызовСервера установлены в Истина, а также Привилегированный установлен в Истина, если требуется доступ к данным, на которые нет прав у пользователя.

    В этом общем модуле создадим процедуру ПриОпределенииНастроек:

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

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

  4. Реализация основной процедуры "Печать" (в общем модуле расширения/обработки)

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

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

    
    Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
        // Получаем полное имя метаданных первого объекта в массиве (обычно это ссылка на наш документ)
        Перем ПолноеИмяМетаданных;
        Если МассивОбъектов.Количество() > 0 Тогда
            ПолноеИмяМетаданных = МассивОбъектов[0].Метаданные().ПолноеИмя();
        Иначе
            Возврат; // Нечего печатать
        КонецЕсли;
    
        // Получаем сведения о конкретной печатной форме по ее идентификатору
        // Идентификатор должен совпадать с тем, что мы указали в ДобавитьКомандыПечати
        ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ВашаПечатнаяФормаИдентификатор");
    
        Если ПечатнаяФорма <> Неопределено Тогда
            // Вызываем нашу функцию, которая будет формировать сам табличный документ
            ПечатнаяФорма.ТабличныйДокумент = ВашаФункцияФормированияПечатнойФормы(МассивОбъектов, ОбъектыПечати, ПолноеИмяМетаданных);
            
            // Синоним макета будет отображаться в заголовке окна предварительного просмотра
            ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Ваша печатная форма для документа'"); 
            
            // Указываем полный путь к макету. Если макет находится в самом документе,
            // используем Документ.<ИмяВашегоДокумента>.<ИмяВашегоМакета>
            ПечатнаяФорма.ПолныйПутьКМакету = "Документ.ВашДокумент.ПФ_MXL_НазваниеВашегоМакета";
        КонецЕсли;
    КонецПроцедуры
    

    Функция УправлениеПечатью.СведенияОПечатнойФорме позволяет получить объект с информацией о печатной форме, который мы затем заполняем сформированным табличным документом.

  5. Разработка функции формирования печатной формы (`ВашаФункцияФормированияПечатнойФормы`)

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

    Внутри этой функции мы последовательно выполняем следующие действия:

    1. Получение данных: Используем объект Запрос для выборки необходимых данных из документа и его табличных частей.
    2. Загрузка макета: Получаем объект макета из документа.
    3. Создание табличного документа: Инициализируем новый объект ТабличныйДокумент, в который будем выводить данные.
    4. Заполнение и вывод: Заполняем области макета полученными данными и выводим их в табличный документ.

    Пример структуры функции:

    
    Функция ВашаФункцияФормированияПечатнойФормы(МассивОбъектов, ОбъектыПечати, ПолноеИмяМетаданных) Экспорт
        // Инициализируем табличный документ, который будет результатом функции
        ТабДок = Новый ТабличныйДокумент;
        
        // Проверяем, что есть объекты для печати
        Если МассивОбъектов.Количество() = 0 Тогда
            Возврат ТабДок;
        КонецЕсли;
        
        // Получаем ссылку на наш документ из массива объектов
        СсылкаНаДокумент = МассивОбъектов[0]; 
    
        // 1. Получение данных из базы данных
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |    ВашДокумент.Дата КАК ДатаДокумента,
            |    ВашДокумент.Номер КАК НомерДокумента,
            |    ВашДокумент.Ответственный КАК Ответственный,
            |    ВашДокументТабличнаяЧасть.Поле1 КАК ТабЧастьПоле1,
            |    ВашДокументТабличнаяЧасть.Поле2 КАК ТабЧастьПоле2,
            |    ВашДокументТабличнаяЧасть.Сумма КАК ТабЧастьСумма
            |ИЗ
            |    Документ.ВашДокумент КАК ВашДокумент
            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВашДокумент.ВашаТабличнаяЧасть КАК ВашДокументТабличнаяЧасть
            |        ПО ВашДокумент.Ссылка = ВашДокументТабличнаяЧасть.Ссылка
            |ГДЕ
            |    ВашДокумент.Ссылка = &Ссылка";
        
        Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
        
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаДанных = РезультатЗапроса.Выбрать();
        
        // 2. Загрузка макета печатной формы
        // Макет должен быть добавлен в ваш документ в конфигураторе
        // Используйте правильное имя документа и макета.
        Макет = Документы.ВашДокумент.ПолучитьМакет("ПФ_MXL_НазваниеВашегоМакета"); 
    
        // 3. Вывод данных в табличный документ
        // Получаем области макета
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); // Например, Заголовок документа
        ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы"); // Шапка табличной части
        ОбластьСтрокаТаблицы = Макет.ПолучитьОбласть("СтрокаТаблицы"); // Строка табличной части
        ОбластьПодвал = Макет.ПолучитьОбласть("Подвал"); // Например, Подвал документа
        
        // Если запрос вернул данные, заполняем заголовок
        Если ВыборкаДанных.Следующий() Тогда
            ОбластьЗаголовок.Параметры.ДатаДокумента = ВыборкаДанных.ДатаДокумента;
            ОбластьЗаголовок.Параметры.НомерДокумента = ВыборкаДанных.НомерДокумента;
            ОбластьЗаголовок.Параметры.Ответственный = ВыборкаДанных.Ответственный;
            ТабДок.Вывести(ОбластьЗаголовок);
            
            // Выводим шапку табличной части
            ТабДок.Вывести(ОбластьШапкаТаблицы);
    
            // Обходим остальные строки запроса для табличной части
            СуммаИтого = 0;
            ВыборкаДанных.Сбросить(); // Сбрасываем выборку, чтобы начать с первой строки для табличной части
            Пока ВыборкаДанных.Следующий() Цикл
                // Проверяем, что строка относится к табличной части, а не только к шапке
                Если ВыборкаДанных.ТабЧастьПоле1 <> Неопределено Тогда
                    ОбластьСтрокаТаблицы.Параметры.ТабЧастьПоле1 = ВыборкаДанных.ТабЧастьПоле1;
                    ОбластьСтрокаТаблицы.Параметры.ТабЧастьПоле2 = ВыборкаДанных.ТабЧастьПоле2;
                    ОбластьСтрокаТаблицы.Параметры.ТабЧастьСумма = ВыборкаДанных.ТабЧастьСумма;
                    ТабДок.Вывести(ОбластьСтрокаТаблицы);
                    СуммаИтого = СуммаИтого + ВыборкаДанных.ТабЧастьСумма;
                КонецЕсли;
            КонецЦикла;
            
            // Заполняем подвал, если он есть
            ОбластьПодвал.Параметры.ИтоговаяСумма = СуммаИтого;
            ТабДок.Вывести(ОбластьПодвал);
    
        КонецЕсли;
        
        Возврат ТабДок;
    КонецФункции
    

    При составлении запросов и отладке их результатов очень полезно использовать инструмент "Консоль запросов". Он позволяет быстро тестировать запросы и видеть структуру получаемых данных, что значительно ускоряет разработку печатных форм.

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

    Макет — это визуальное представление вашей печатной формы. Его нужно создать в режиме конфигуратора и добавить к вашему документу (или в соответствующем расширении).

    Порядок действий:

    1. Откройте конфигуратор, найдите ваш документ.
    2. В дереве объектов документа, в разделе "Макеты", добавьте новый макет типа "Табличный документ".
    3. Дайте макету имя, которое вы использовали в процедуре Печать (например, ПФ_MXL_НазваниеВашегоМакета). Важно: используйте префикс ПФ_MXL_ для именования макетов, это стандартное требование БСП для корректного их распознавания.
    4. Нарисуйте в макете необходимые области: "Заголовок", "ШапкаТаблицы", "СтрокаТаблицы", "Подвал" и любые другие, которые вам нужны.
    5. В каждой области укажите параметры, используя квадратные скобки (например, [ДатаДокумента], [ТабЧастьПоле1]). Эти параметры затем будут заполняться из вашей функции формирования печатной формы.

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

  7. Размещение кода в расширении и нюансы

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

    Структура расширения для наших целей может быть следующей:

    • Подсистема: В расширении можно создать новую подсистему, например, "Обработки", или использовать существующую, если она подходит.
    • Общий модуль: Именно здесь будет находиться код процедур ПриОпределенииНастроек и Печать, а также функция ВашаФункцияФормированияПечатнойФормы. Назовите его, например, ВашДокумент_Печать.
    • Макеты: Макеты печатных форм добавляем к соответствующим объектам, перенесенным в расширение, или, если документ не перенесен, создаем макеты прямо в расширении и указываем на них корректный путь.
    • Пустая форма: Иногда для корректной работы расширения и загрузки всех его модулей в БСП, особенно если вы используете БСП-обработчики, может потребоваться наличие хотя бы одной пустой формы в какой-либо обработке в расширении. Это может быть связано с особенностями платформы, которые не всегда очевидны. Если при выполнении всех шагов кнопка все еще не появляется, попробуйте добавить пустую форму в любую обработку вашего расширения.

Важные аспекты и советы

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

← На главную