Как добавить кнопку вызова формы печати на форму документа в 1С:Предприятии (ERP, БСП)?

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

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

Как работает механизм печати в 1С:Предприятии на базе БСП?

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

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

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

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

  3. Предоставления сервисных возможностей: Помимо непосредственного формирования печатной формы, подсистема включает функционал предпросмотра, сохранения в различные форматы файлов (PDF, Excel и т.д.), отправки по электронной почте, формирования QR-кодов и других полезных опций — для вывода изображений и факсимиле подойдёт инструмент для интеграции факсимиле в формы БСП.

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

Основные шаги по добавлению кнопки печати на форму документа

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

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

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

    • ПриСозданииНаСервере: В этой процедуре мы инициализируем команды печати при создании формы.

    • ПриЧтенииНаСервере: Здесь происходит обновление команд печати при чтении данных объекта.

    • ПриОткрытии: В этой процедуре мы также можем обновить команды при открытии формы.

    • Подключаемый_ВыполнитьКоманду и Подключаемый_ВыполнитьКомандуНаСервере: Эти процедуры будут обрабатывать выполнение команд, которые были добавлены подсистемой печати.

    • Подключаемый_ОбновитьКоманды: Отвечает за обновление списка доступных команд.

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

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

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

  2. Реализация процедур печати в модуле менеджера документа

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

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

    • ПечатьДокумента: Это функция, которая непосредственно формирует табличный документ для выбранной печатной формы. Она принимает в качестве параметров массив ссылок на объекты печати, идентификатор команды печати и параметры печати.

    Давайте рассмотрим, как это может выглядеть в модуле менеджера документа:

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

    Обратите внимание, что функция ПечатьДокумента обычно делегирует непосредственное формирование табличного документа другим функциям, например, СформироватьТабличныйДокументНашаОсновнаяПечатнаяФорма, чтобы сохранить модульность и читаемость кода.

  3. Регистрация документа в общем модуле УправлениеПечатьюПереопределяемый

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

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

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

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

  4. Расположение кнопки на форме

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

    Мы можем проверить это, открыв форму документа в конфигураторе и посмотрев на элемент "КоманднаяПанельФормы". Обычно команды печати помещаются в стандартную группу "ВажныеКоманды" или "Подменю_Печать". Если вы не видите кнопку сразу, убедитесь, что в свойствах командной панели формы (или её элементах управления) установлена опция "Автозаполнение" или что у вас есть группа, куда БСП может поместить свои команды. Также удостоверьтесь, что форма документа не блокирует автоматическое размещение стандартных команд.

Добавление кнопки печати через расширения (как в случае автора)

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

Механизм расширений позволяет нам:

Когда мы добавляем печатную форму через расширение, процесс обычно включает следующие шаги:

  1. Создание расширения: В конфигураторе мы создаем новое расширение для нашей конфигурации.

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

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

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

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


// В модуле менеджера документа "НашДокумент" в расширении
// (В модуле расширения для данного объекта конфигурации)

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

    // Добавляем нашу новую команду печати
    НоваяКоманда = КомандыПечати.Добавить();
    НоваяКоманда.Идентификатор = "НашаНоваяПечатнаяФормаИзРасширения";
    НоваяКоманда.Представление = НСтр("ru = 'Печатная форма из расширения'");
    НоваяКоманда.Назначение = "Документ";
    НоваяКоманда.Обработчик = "МенеджерДокумента.ПечатьДокумента_Расширение"; // Наш обработчик в расширении
    НоваяКоманда.Картинка = БиблиотекаКартинок.Печать;
    
КонецПроцедуры

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

КонецФункции

// Пример функции, которая формирует табличный документ в рамках расширения
Функция СформироватьТабличныйДокументИзРасширения(СсылкаНаДокумент)
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИзРасширения";
    
    Макет = Расширения.НашеРасширение.ПолучитьМакет("МакетПечатнойФормыИзРасширения"); // Макет из расширения
    
    // ... Логика получения данных и заполнения макета ...
    // В данном примере мы просто выводим простой текст для демонстрации
    Область = Макет.ПолучитьОбласть("ОбластьТекста");
    Область.Параметры.Текст = "Это печатная форма, сформированная из расширения для документа: " + СсылкаНаДокумент.Представление;
    ТабличныйДокумент.Вывести(Область);
    
    Возврат ТабличныйДокумент;
КонецФункции

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

Дополнительные возможности подсистемы "Печать"

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

  1. Форма предпросмотра: Стандартная форма для предварительного просмотра печатных форм перед их выводом на принтер.

  2. Сохранение печатных форм: Возможность сохранять печатные формы в различные форматы файлов (PDF, Excel, HTML, MHT, TXT).

  3. Отправка по электронной почте: Интеграция с подсистемой работы с почтой для отправки печатных форм в виде вложений.

  4. Формирование QR-кодов: Возможность генерации QR-кодов, что особенно актуально для некоторых типов документов (например, чеков).

  5. Учет количества отпечатанных экземпляров: Механизм для отслеживания, сколько раз и когда был распечатан документ.

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

Заключение

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

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

← На главную