Как добавить кнопку печати со списком печатных форм в документ 1С:ERP

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

В современных конфигурациях на базе 1С:ERP и актуальных версий БСП (Библиотеки стандартных подсистем) механизм печати претерпел значительные изменения. Старые методы, которые работали в ранних версиях, теперь вызывают ошибки типа «Метод объекта не обнаружен». Разберем подробно, как правильно реализовать вывод списка из нескольких печатных форм на кнопку печати, используя актуальные механизмы подключаемых команд. При переходе на новую версию системы или миграции накопленной информации используются различные решения для переноса данных в 1С:ERP.

Почему возникает ошибка УправлениеПечатью.ПриСозданииНаСервере

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

Шаг 1. Подготовка формы документа

Для того чтобы подсистема печати «увидела» вашу форму и смогла программно добавить на нее кнопки, выполним следующие действия на уровне формы документа:

  1. Создадим на форме группу команд. Установим имя ПодменюПечать.
  2. В свойствах группы выберем вид — Подменю.
  3. Убедимся, что в модуле формы прописаны вызовы необходимых стандартных процедур.

Разберем пример кода, который должен быть в модуле формы:


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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Обновление доступности команд при чтении данных
    ПодключаемыеКоманды.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры

Также важно добавить клиентский обработчик, который будет отвечать за само нажатие на пункт меню:


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

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

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

Рассмотрим структуру заполнения команд:


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

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

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

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


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

Шаг 4. Глобальная регистрация в системе

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

Найдем процедуру ПриОпределенииОбъектовСКомандамиПечати и добавим туда наш документ:


Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    СписокОбъектов.Добавить(Документы.ЗапросНаБГ);
КонецПроцедуры

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

Дополнительные советы по сортировке и оформлению

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

Используя данный алгоритм, вы обеспечите стабильную работу печати в 1С:ERP, соответствующую стандартам разработки 1С и БСП. При избыточном росте объема базы для поддержания производительности системы выполняется многопоточная свёртка 1С:ERP.

← На главную