При разработке в системе 1С:Предприятие 8.3 мы часто сталкиваемся с необходимостью создания печатных форм для различных документов. Если внешние печатные формы (ВПФ) имеют понятный механизм подключения через справочник «Дополнительные отчеты и обработки», то для печатных форм, которые реализованы непосредственно как объекты конфигурации типа «Обработка», процесс привязки к конкретному документу имеет свои особенности. Рассмотрим подробнее, как мы можем интегрировать такую внутреннюю обработку в механизм печати документа, обеспечив ее доступность для пользователей.
Эта задача требует от нас внесения изменений как в саму обработку, так и в модуль менеджера целевого документа. Мы разберем по шагам необходимые действия, а также рассмотрим особенности, связанные с использованием Библиотеки стандартных подсистем (БСП).
Первым и самым важным шагом является правильная реализация логики формирования печатной формы внутри вашей обработки. Для того чтобы система 1С могла вызвать вашу обработку как печатную форму, в модуле объекта этой обработки должна быть экспортная процедура с именем Печать. Эта процедура будет точкой входа для всей логики формирования табличного документа.
Типовая сигнатура экспортной процедуры Печать выглядит следующим образом:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// ... Ваш код формирования печатной формы ...
КонецПроцедуры
Давайте подробно рассмотрим каждый из параметров, передаваемых в эту процедуру:
МассивОбъектов: Это массив ссылок на те объекты (документы), для которых пользователь запросил печать. Чаще всего, при печати из формы одного документа, этот массив будет содержать одну ссылку на текущий документ.КоллекцияПечатныхФорм: Это таблица значений, в которую мы должны будем добавить информацию о сформированных нами печатных формах. Каждая строка этой таблицы должна описывать один табличный документ: его имя, сам табличный документ и другие параметры. Это критически важный параметр, так как через него система получит результат нашей работы.ОбъектыПечати: Список значений, где каждое значение представляет собой ссылку на объект, а представление — это имя области (например, если объекты были выбраны из какого-либо списка с группировкой). Этот параметр реже используется напрямую при формировании одной печатной формы, но полезен в более сложных сценариях.ПараметрыВывода: Это структура или произвольный объект, который может содержать дополнительные параметры, влияющие на процесс печати. Например, сюда могут быть переданы параметры из команды печати (например, "Печатать с подписями").Внутри этой процедуры Печать мы должны реализовать всю логику формирования табличного документа: получение макета, заполнение его данными из ссылки на документ, формирование областей и их вывод в табличный документ. В конце работы процедуры, сформированный табличный документ необходимо добавить в коллекцию КоллекцияПечатныхФорм.
Пример реализации процедуры Печать в модуле объекта обработки (например, "Обработка.ПФАкт"):
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// 1. Проверяем, что нам передали объекты для печати.
// Если массив пуст, нет смысла продолжать работу.
Если МассивОбъектов.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// 2. Получаем ссылку на первый документ из массива.
// В большинстве случаев пользователь печатает один документ за раз.
СсылкаНаДокумент = МассивОбъектов[0];
// 3. Получаем макет печатной формы, который должен быть встроен в нашу обработку.
// Предполагаем, что у нашей обработки 'ПФАкт' есть макет с именем "МакетАкт".
Макет = Обработки.ПФАкт.ПолучитьМакет("МакетАкт");
// 4. Создаем новый табличный документ для вывода печатной формы.
// Именно этот объект будет передан системе 1С для отображения или печати.
ТабличныйДокумент = Новый ТабличныйДокумент;
// Можно присвоить имя параметров печати, это полезно для сохранения настроек пользователя.
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПФАктИзОбработки";
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; // Установим ориентацию по умолчанию
// 5. Выводим заголовок печатной формы.
// Получаем область макета с именем "Заголовок".
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// Заполняем параметры области данными из документа (например, номер и дата).
// Важно, чтобы параметры области макета совпадали по именам с полями структуры документа.
ОбластьЗаголовок.Параметры.Заполнить(СсылкаНаДокумент);
ОбластьЗаголовок.Параметры.ТекстЗаголовка = НСтр("ru = 'Акт сверки из внутренней обработки'"); // Дополнительный параметр
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
// 6. Выводим табличную часть документа (пример).
// Допустим, у нашего документа есть табличная часть с именем "Товары".
// Мы пробегаемся по строкам табличной части и выводим каждую строку в табличный документ.
Если СсылкаНаДокумент.Метаданные().ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
Для КаждаяСтрокаТовары Из СсылкаНаДокумент.Товары Цикл
// Получаем область макета для строки товара.
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовара");
// Заполняем параметры области данными текущей строки табличной части.
ОбластьСтрока.Параметры.Заполнить(КаждаяСтрокаТовары);
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
КонецЕсли;
// 7. Добавляем итоговую информацию или подвал документа.
// Получаем область макета с именем "Подвал".
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Если есть итоговые суммы или подписи, заполняем их.
// ОбластьПодвал.Параметры.СуммаВсего = СсылкаНаДокумент.СуммаДокумента;
ТабличныйДокумент.Вывести(ОбластьПодвал);
// 8. Добавляем сформированный табличный документ в коллекцию печатных форм.
// Этот шаг является КРИТИЧЕСКИ важным, так как именно он передает результат нашей работы в систему 1С.
НоваяПечатнаяФорма = КоллекцияПечатныхФорм.Добавить();
// Имя макета - это уникальный идентификатор нашей печатной формы.
// Желательно, чтобы оно совпадало с Идентификатором, который мы укажем при регистрации команды.
НоваяПечатнаяФорма.ИмяМакета = "ПФАкт";
НоваяПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
НоваяПечатнаяФорма.КоличествоЭкземпляров = 1; // Указываем количество экземпляров для печати по умолчанию
НоваяПечатнаяФорма.ВывестиДляПросмотра = Истина; // Определяем, нужно ли открывать форму для просмотра после генерации
// Мы также можем установить другие свойства, например, ОриентацияСтраницы, ПолеСлева, ПолеСправа и т.д.
// НоваяПечатнаяФорма.ОриентацияСтраницы = ОриентацияСтраницы.Альбом;
КонецПроцедуры
После того как наша обработка готова к формированию печатной формы, нам необходимо "рассказать" целевому документу о существовании этой формы. Это делается путем регистрации команды печати в модуле менеджера документа. Каждый документ, который поддерживает команды печати, имеет экспортную процедуру ДобавитьКомандыПечати. Если такой процедуры нет, мы должны ее создать.
Процедура ДобавитьКомандыПечати принимает один параметр — КомандыПечати, который представляет собой коллекцию (обычно массив или таблицу значений), куда мы добавляем описания наших печатных форм.
Пример кода в модуле менеджера документа (например, "Документ.РеализацияТоваровУслуг"):
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Здесь обычно уже могут быть зарегистрированы стандартные команды печати документа.
// Мы добавляем нашу новую команду в эту же коллекцию.
// Создаем новую команду печати для нашей внутренней обработки.
КомандаПечати = КомандыПечати.Добавить();
// Свойство МенеджерПечати КРИТИЧЕСКИ важно.
// Оно указывает системе 1С, какой именно объект метаданных (обработка, отчет)
// содержит процедуру Печать для данной команды.
// В нашем случае это ПОЛНОЕ ИМЯ нашей внутренней обработки: "Обработка.ПФАкт".
КомандаПечати.МенеджерПечати = "Обработка.ПФАкт";
// Идентификатор - это уникальное строковое имя для нашей команды печати.
// Он должен быть уникален в рамках данного документа.
// Желательно, чтобы он совпадал с НоваяПечатнаяФорма.ИмяМакета, которое мы указывали в процедуре Печать.
КомандаПечати.Идентификатор = "ПФАкт";
// Представление - это текст, который пользователь увидит в меню "Печать" на форме документа.
// Используем НСтр для поддержки многоязычности.
КомандаПечати.Представление = НСтр("ru = 'Акт из внутренней обработки'");
// ПроверкаПроведенияПередПечатью - определяет, должна ли система 1С проверять
// проведение документа перед вызовом команды печати.
// Установите Истина, если печатная форма зависит от проведенных данных.
КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь; // Или Истина, в зависимости от требований
// Дополнительные свойства, которые могут быть полезны, особенно при работе с БСП:
// КомандаПечати.ПоказыватьНаПанелиДействий = Истина; // Если хотим, чтобы команда отображалась прямо на панели действий формы
// КомандаПечати.ИспользоватьМакетПоУмолчанию = Ложь; // Указывает, что макет формируется нашей процедурой
// КомандаПечати.Группа = "Печать"; // Группировка команд в подменю
КонецПроцедуры
Обратите особое внимание на свойство КомандаПечати.МенеджерПечати. Именно здесь мы указываем полное имя нашей внутренней обработки, которая содержит логику печати. Без этого свойства система не сможет найти нужную процедуру Печать.
В большинстве современных типовых конфигураций 1С используется Библиотека стандартных подсистем (БСП). БСП предоставляет унифицированный и гибкий механизм управления печатными формами, включая регистрацию команд, их отображение на форме и вызов. Если ваша конфигурация использует БСП, рекомендуется следовать ее стандартам для более корректной и стабильной работы.
Интеграция с БСП состоит из нескольких этапов:
Для того чтобы БСП знала, какие объекты метаданных (документы, справочники) имеют команды печати, необходимо зарегистрировать менеджер нашего документа в специальной экспортной процедуре общего модуля УправлениеПечатьюПереопределяемый (или аналогичного, название может немного отличаться в разных версиях БСП). Мы добавляем ссылку на менеджер нашего документа в коллекцию МенеджерыОбъектовСКомандамиПечати.
Пример кода в общем модуле УправлениеПечатьюПереопределяемый:
Процедура ПриОпределенииОбъектовСКомандамиПечати(МенеджерыОбъектовСКомандамиПечати) Экспорт
// ... существующие регистрации менеджеров документов ...
// Добавляем менеджер нашего документа.
// Укажите здесь полное имя вашего документа, например, "Документы.РеализацияТоваровУслуг".
МенеджерыОбъектовСКомандамиПечати.Добавить(Документы.ИмяВашегоДокумента);
КонецПроцедуры
ДобавитьКомандыПечати в модуле менеджера документаЭтот шаг остается таким же, как описано выше. Процедура ДобавитьКомандыПечати в модуле менеджера документа должна быть реализована точно так же, как мы рассмотрели, так как именно ее вызывает БСП для получения списка доступных печатных форм.
Повторим ключевые моменты:
ДобавитьКомандыПечати(КомандыПечати) Экспорт существует в модуле менеджера вашего документа.КомандыПечати новую команду, указывая МенеджерПечати = "Обработка.ПФАкт".Идентификатор и понятное Представление.Для того чтобы команды печати, зарегистрированные через БСП, корректно отображались на форме документа (обычно в подменю "Печать"), нам потребуется внести небольшие изменения в управляемую форму документа.
ПодменюПечать. Его тип должен быть установлен как "Подменю".ПриСозданииНаСервере: В модуле формы документа, в экспортной процедуре ПриСозданииНаСервере, необходимо вызвать стандартную процедуру БСП для инициализации подменю печати.Пример кода в модуле формы документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ... Ваш код инициализации формы ...
// Инициализация подменю печати через БСП.
// Эта процедура анализирует зарегистрированные команды печати и добавляет их в подменю.
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюПечать);
КонецПроцедуры
Чтобы команды, появившиеся в подменю, могли быть корректно выполнены, необходимо добавить обработчик клиентской команды. Этот обработчик будет передавать команду печати в БСП для дальнейшей серверной обработки.
Пример кода в модуле формы документа:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
// Эта процедура вызывается, когда пользователь выбирает команду печати.
// Она делегирует вызов серверной логики печати через клиентский модуль БСП.
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект);
КонецПроцедуры
Также важно убедиться, что свойство Действие у команд печати в подменю на форме документа установлено в Подключаемый_ВыполнитьКомандуПечати. Обычно БСП делает это автоматически при инициализации.
Привязка печатной формы, реализованной как внутренняя обработка в конфигурации 1С, к документу — это стандартная задача, которая требует понимания механизма работы платформы. Мы выяснили, что ключ к решению лежит в двух основных моментах:
Печать в модуле объекта вашей обработки, которая формирует табличный документ и добавляет его в коллекцию печатных форм.ДобавитьКомандыПечати модуля менеджера целевого документа, с обязательным указанием свойства МенеджерПечати, ссылающегося на вашу обработку.При использовании Библиотеки стандартных подсистем (БСП) процесс становится более стандартизированным и включает дополнительные шаги по регистрации документа в общих модулях БСП и инициализации элементов формы. Следуя этим инструкциям, мы сможем успешно интегрировать наши внутренние печатные формы, предоставляя пользователям удобный и привычный интерфейс для их формирования.