Как добавить команды печати для своего документа в 1С:Бухгалтерия 3.0?

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

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

Шаг 1. Подготовка модуля менеджера документа

Первым делом нам необходимо описать саму команду и логику формирования печатной формы в модуле менеджера вашего документа (например, АТЛ_Заявка). Рассмотрим структуру обязательных процедур. Проанализируем процедуру ДобавитьКомандыПечати, которая сообщает системе, какие именно печатные формы доступны для объекта.

Вставьте следующий код в модуль менеджера:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт 
	
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ЗаявкаЗаказчику";
	КомандаПечати.Представление = "Заявка Заказчику";
	КомандаПечати.СписокФорм	= "ФормаСпискаУправляемая,ФормаДокументаУправляемая";
	КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь;
	КомандаПечати.СразуНаПринтер = Ложь;
	
КонецПроцедуры 

В этом блоке мы создаем описание команды. Обратите внимание на свойство СписокФорм — здесь указываются имена форм документа, на которых должна появиться кнопка. Если вы используете стандартные имена, убедитесь, что они совпадают с метаданными вашего документа.

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


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

Важный момент: для обеспечения высокой производительности в функцию формирования макета (например, СформироватьПечатнуюФормуЗаявки) следует передавать весь МассивОбъектов. Это позволит выполнить один запрос к базе данных вместо выполнения запросов в цикле, что критически важно при пакетной печати нескольких документов из списка.

Шаг 2. Настройка модуля формы документа

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

Рассмотрим код, который необходимо добавить в форму документа:


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

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

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

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

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

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

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

Во-первых, вернемся в модуль менеджера документа АТЛ_Заявка и добавим служебную процедуру ПриОпределенииНастроекПечати. Она сигнализирует системе, что документ использует стандартные механизмы добавления команд:


Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
	
	Настройки.ПриДобавленииКомандПечати = Истина;
	
КонецПроцедуры

Во-вторых, необходимо зарегистрировать ваш документ в общем модуле УправлениеПечатьюПереопределяемый. Найдите в нем процедуру ПриОпределенииНастроекПечати и добавьте в коллекцию ОбъектыПечати ваш новый документ.


Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
    // Добавляем ссылку на менеджер вашего документа
    Настройки.ОбъектыПечати.Добавить(Документы.АТЛ_Заявка);
КонецПроцедуры

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

Шаг 4. Обновление кэша команд печати

Проанализируем ситуацию: код написан, регистрация выполнена, но кнопки всё равно нет. Это происходит из-за того, что БСП кэширует список команд печати в специальных справочниках или регистрах (в зависимости от версии) для ускорения работы интерфейса. Чтобы система «увидела» изменения в коде, необходимо запустить процесс обновления.

Для этого можно выполнить одно из следующих действий:

  1. Обновить версию конфигурации (изменить номер версии в свойствах конфигурации на минимальное значение, например, с 3.0.165.21 на 3.0.165.22). При запуске система выполнит процедуры обновления и перечитает команды.
  2. Использовать обработку «Инструменты разработчика» или консоль кода для ручного вызова метода: УправлениеПечатью.ОбновитьКомандыПечати() — для этого подойдёт универсальный набор инструментов разработчика 1С.
  3. Если документ включен в состав подсистемы "Печать" в дереве метаданных, иногда помогает простое обновление конфигурации базы данных через F7 в конфигураторе, но в случае с БСП надежнее всего программное обновление или смена номера версии.

Дополнительные рекомендации

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

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

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

УправлениеПечатью.ЗаполнитьПараметрыОтправки(ОбъектыПечати, МассивОбъектов, КоллекцияПечатныхФорм);

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

← На главную