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