При разработке внешних печатных форм для 1С:ERP и других конфигураций на базе БСП (Библиотеки стандартных подсистем) часто возникает задача: одна и та же печатная форма (например, "Упаковочный лист" или "Спецификация") должна быть доступна сразу в нескольких видах документов. Рассмотрим подробнее, как правильно настроить программный код и на что обратить внимание при регистрации обработки в информационной базе.
Для того чтобы система понимала, к каким объектам относится ваша обработка, используется экспортная функция СведенияОВнешнейОбработке(). Именно здесь мы формируем МассивНазначений. Разберем по шагам, как добавить в него несколько документов.
Проанализируем пример кода, который позволяет зарегистрировать обработку для документов "Передача сырья переработчику", "Заказ поставщику" и "Реализация товаров и услуг":
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
// Добавляем типы документов, в которых должна появиться кнопка печати
МассивНазначений.Добавить("Документ.ПередачаСырьяПереработчику");
МассивНазначений.Добавить("Документ.ЗаказПоставщику");
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Упаковочный лист (внешний)");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Версия", "1.1");
// Настройка команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Упаковочный лист",
"УпаковочныйЛистКоманда",
"ВызовСерверногоМетода",
Истина,
"ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
В данном примере мы используем метод Добавить() для расширения списка целевых документов. Важно указывать полное имя метаданных объекта в формате Документ.ИмяОбъекта.
Когда одна команда печати вызывается из разных документов, в экспортную процедуру Печать() в параметре МассивОбъектов могут прийти ссылки разных типов. Выясним, как правильно обработать эту ситуацию, чтобы для каждого документа формировался корректный макет.
Рассмотрим пример типизации объектов внутри процедуры печати:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем наличие нашей команды в коллекции
НужнаяКоманда = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "УпаковочныйЛистКоманда");
Если НужнаяКоманда <> Неопределено Тогда
НужнаяКоманда.ТабличныйДокумент = Новый ТабличныйДокумент;
// Разделяем объекты по типам для разной логики формирования данных
Для Каждого Ссылка Из МассивОбъектов Цикл
МетаданныеОбъекта = Ссылка.Метаданные();
Если МетаданныеОбъекта = Метаданные.Документы.ПередачаСырьяПереработчику Тогда
// Вызываем функцию печати для конкретного документа
СформироватьПечатнуюФормуПередачи(НужнаяКоманда.ТабличныйДокумент, Ссылка);
ИначеЕсли МетаданныеОбъекта = Метаданные.Документы.ЗаказПоставщику Тогда
СформироватьПечатнуюФормуЗаказа(НужнаяКоманда.ТабличныйДокумент, Ссылка);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Использование проверки Ссылка.Метаданные() или функции ТипЗнч(Ссылка) позволяет избежать ошибок при обращении к реквизитам, которые есть в одном документе, но отсутствуют в другом.
Часто программисты сталкиваются с ситуацией: в код МассивНазначений добавлены новые документы, файл обновлен в справочнике "Дополнительные отчеты и обработки", но кнопка печати в новых документах так и не появилась. Разберем основные причины этой проблемы.
СведенияОВнешнейОбработке и записывает их в табличную часть "Размещение" карточки обработки. При простом обновлении файла (кнопка "Обновить из файла") система не всегда принудительно перезаписывает настройки размещения. Чтобы исправить это, необходимо зайти в карточку обработки, перейти в раздел "Размещение" и вручную проверить/обновить список документов.ДобавитьКомандыПечати(КомандыПечати). Если документ не поддерживает стандартную подсистему печати, внешняя обработка в нем не появится автоматически.ОбъектСКомандамиПечати.Если вам требуется, чтобы для одного документа кнопка называлась "Печать акта", а для другого — "Печать накладной", при этом используя одну обработку, мы можем зарегистрировать несколько команд в ТаблицаКоманд.
Посмотрим на пример формирования двух разных кнопок:
// В функции СведенияОВнешнейОбработке
ДобавитьКоманду(ТаблицаКоманд, "Печать акта", "КомандаАкт", "ВызовСерверногоМетода", Истина);
ДобавитьКоманду(ТаблицаКоманд, "Печать накладной", "КомандаНакладная", "ВызовСерверногоМетода", Истина);
В этом случае в процедуре Печать мы будем анализировать параметр ИдентификаторКоманды (он передается в коллекции или как отдельный параметр в зависимости от версии БСП) и выводить соответствующий макет. Это избавляет от необходимости плодить множество внешних файлов для похожих задач.
При работе в облачных сервисах или в базах с жестким контролем безопасности, обратите внимание на Безопасный режим. Если ваша печатная форма должна обращаться к внешним ресурсам (например, скачивать логотип с сайта или сохранять файл на диск), параметр БезопасныйРежим в структуре регистрации должен быть установлен в значение Ложь. Однако помните, что в современных версиях БСП это может потребовать дополнительного заполнения таблицы разрешений (запросы к профилям безопасности).
Таким образом, для успешного подключения одной обработки к нескольким объектам необходимо выполнить три условия: корректно заполнить МассивНазначений, обеспечить проверку типов в логике печати и убедиться, что в пользовательском интерфейсе (в справочнике дополнительных обработок) настройки размещения синхронизированы с вашим кодом.