Как подключить команды печати БСП в самописном документе?

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

При обновлении конфигураций на новые версии Библиотеки стандартных подсистем (БСП), например, при переходе на новые релизы 1С:ЗУП 3, 1С:ERP или 1С:КА, разработчики часто сталкиваются с ситуацией, когда в самописных документах пропадает кнопка «Печать» или сформированные команды перестают реагировать на нажатия. Это связано с переходом подсистемы печати на универсальный механизм подключаемых команд.

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

Шаг 1. Регистрация объекта в общем модуле

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

Откроем общий модуль УправлениеПечатьюПереопределяемый и найдем экспортную процедуру ПриОпределенииОбъектовСКомандамиПечати. Добавим наш документ в переданный массив объектов:


Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    
    // Добавление ссылки на менеджер самописного документа
    СписокОбъектов.Добавить(Документы.ДополнительноеСоглашение);
    
КонецПроцедуры

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

Шаг 2. Описание команд и логики вывода в модуле менеджера

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

1. Регистрация команд:

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


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ДополнительноеСоглашение";
    КомандаПечати.Представление = НСтр("ru = 'Дополнительное соглашение'");
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    КомандаПечати.Порядок = 1;
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "СменаГрафика";
    КомандаПечати.Представление = НСтр("ru = 'Смена графика'");
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    КомандаПечати.Порядок = 2;
    
КонецПроцедуры

2. Формирование печатной формы:

Стандартная процедура печати БСП принимает коллекцию печатных форм и массив объектов. Проверяем необходимость вывода конкретного макета с помощью функции УправлениеПечатью.НужноПечататьМакет:


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

Шаг 3. Встраивание подключаемых команд в модуль формы документа

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

Посмотрим на пример корректного кода в модуле формы документа:


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

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

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
    
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
    
КонецПроцедуры

Типичные ошибки при адаптации

Рассмотрим частые причины, по которым кнопки не нажимаются или макеты не формируются после обновления:

  1. Неверное имя клиентской процедуры: В старых версиях БСП обработчик назывался Подключаемый_ВыполнитьКомандуПечати. В актуальных версиях по умолчанию генерируется вызов процедуры Подключаемый_ВыполнитьКоманду. Если оставить старое имя, форма не сможет перехватить нажатие кнопки.
  2. Жесткая проверка имени команды: Попытки сравнивать Команда.Имя с предопределенными строками (например, ФормаКоманднаяПанельПодменюПечатьКомандаПечати1) приводят к ошибкам, так как имена элементов генерируются динамически. Всю обработку следует делегировать методу ПодключаемыеКомандыКлиент.ВыполнитьКоманду.
  3. Отсутствие свойства Идентификатор: Если при заполнении коллекции в ДобавитьКомандыПечати не указать идентификатор команды, вызов процедуры печати не сможет сопоставить команду с макетом.
  4. Кастомная обработка на клиенте: Если для формирования печатной формы требуется интерактивное действие на клиенте (например, сохранение во внешний DOC/PDF файл с открытием диалога), в структуре команды печати следует явно задать свойство КомандаПечати.Обработчик = "ИмяОбщегоМодуляКлиент.ИмяПроцедуры".
← На главную