Столкнулись с необходимостью добавить новую печатную форму в 1С:ЗУП с помощью расширения? Разберем, как это сделать!

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

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

Решение 1: "Быстрый" подход с добавлением команды на форму

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

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

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

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

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

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

    В этом примере мы получаем текущие данные из элемента формы Элементы.ТЧ.ТекущиеДанные. Обратите внимание, что доступ к элементам формы осуществляется на клиенте. Затем мы вызываем серверную функцию мПечатьНаСервере, передавая ей нужный нам контекст, например, ссылку на сотрудника. После получения табличного документа, мы показываем его пользователю.

  3. Реализация серверной функции:

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

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

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

    Для полноценной реализации здесь необходимо:

    • Получить макет печатной формы (который можно создать в расширении).
    • Выполнить запросы к базе данных для получения всей необходимой информации.
    • Заполнить области макета данными и вывести их в ТабличныйДокумент.

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

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

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

  1. Общие принципы работы с БСП через расширение:

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

    • В расширение добавить модуль менеджера объекта (например, документа), для которого мы хотим добавить печать.
    • Описать команды печати в этом модуле.
    • Реализовать экспортную процедуру печати.
  2. Определение команд печати:

    Нам необходимо определить команды печати, которые будут отображаться в стандартном меню "Печать". Это делается путем добавления обработчика к процедуре ДобавитьКомандыПечати в модуле менеджера объекта. Если такой процедуры нет, ее нужно добавить в расширение.

    В модуле менеджера объекта (например, Документ.ПриемНаРаботу.МодульМенеджера), добавленного в расширение, создадим процедуру:

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

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

  3. Реализация процедуры печати:

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

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

    Рассмотрим пример реализации:

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

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

  4. Работа с макетами:

    БСП поддерживает как табличные документы (MXL), так и макеты в формате Word (DOCX) — для создания кастомных документов по шаблонам Word пригодится конструктор печати по шаблонам Word и OpenOffice. Вы можете реализовать заполнение Word-макетов при помощи БСП за 3 шага, используя встроенные функции, такие как УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента для их подготовки.

  5. Передача дополнительных параметров:

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

Дополнительные возможности и нюансы

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

  1. Конструктор документов Word (без программирования):

    В 1С:ЗУП, особенно в более новых версиях, предусмотрены механизмы, позволяющие создавать и редактировать печатные формы без навыков программирования. Для этого мы можем перейти в раздел "Администрирование – Печатные формы, отчеты и обработки – Макеты печатных форм". Здесь можно создать новый макет Office Open XML. Используя встроенный редактор Word, пользователи могут перетаскивать доступные реквизиты документа в шаблон, тем самым настраивая внешний вид и наполнение печатной формы. Этот подход значительно упрощает процесс для конечных пользователей.

  2. Настраиваемые печатные формы (в ЗУП КОРП):

    В версии 1С:ЗУП КОРП доступен механизм "Настраиваемые печатные формы". Он позволяет пользователям изменять макеты некоторых кадровых приказов. Однако, если вам нужна специфическая печатная форма «О неразглашении коммерческой тайны» (NDA), ее всё же придется создавать как полноценную внешнюю форму или через расширение.

  3. Печать непроведенных документов:

    Иногда возникает необходимость печатать документы, которые еще не проведены. Типовые конфигурации часто требуют проведения документа перед печатью. Мы можем изменить это поведение с помощью расширения. Для этого потребуется модифицировать процедуру ПриСозданииНаСервере формы документа и изменить параметр РежимПроведенияДокумента для соответствующих команд печати на РежимПроведенияДокумента.НеЗаписывать или РежимПроведенияДокумента.Записывать вместо Проводить. Однако следует помнить, что не все печатные формы смогут корректно работать с непроведенными документами, так как некоторые из них могут использовать данные, которые формируются только при проведении документа и записываются в регистры.

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

    Если мы хотим управлять выполнением внешних печатных форм через расширение, мы можем перехватить их вызов. Для этого можно добавить процедуру ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы в общий модуль ДополнительныеОтчетыИОбработкиКлиентПереопределяемый, который был добавлен в расширение. Установив в ней СтандартнаяОбработка = Ложь, мы сможем перехватить стандартное выполнение и реализовать свою логику.

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

← На главную