При разработке и внедрении дополнительных печатных форм в конфигурациях уровня ERP, Комплексная автоматизация или Управление Торговлей мы привыкли к стандартному механизму БСП (Библиотеки Стандартных Подсистем). Мы создаем обработку, описываем функцию СведенияОВнешнейОбработке, подключаем ее через справочник «Дополнительные отчеты и обработки», и кнопка «Печать» автоматически появляется в документе.
Однако, столкнувшись с документом «Заказ на производство», многие специалисты попадают в тупик: внешняя форма подключена корректно, ошибок нет, галочки использования стоят, но сама кнопка печати в командной панели формы документа просто не появляется. Разберем подробно, почему это происходит и как мы можем решить эту задачу, не снимая конфигурацию с поддержки.
Чтобы понять суть проблемы, нам необходимо заглянуть «под капот» типовой конфигурации. Механизм подключения внешних печатных форм работает через подсистему «Печать». Чтобы форма документа «узнала», что у нее есть доступные команды печати, в модуле менеджера этого документа должна присутствовать экспортная процедура ДобавитьКомандыПечати.
Как выяснилось в ходе анализа (и это подтверждается сообщением №8 из обсуждения), в некоторых релизах конфигураций (в частности ERP 2.x и КА 2.x) разработчики 1С в модуле менеджера документа ЗаказНаПроизводство либо не реализовали этот вызов, либо реализовали его нестандартно, ограничив список доступных команд только встроенными макетами (например, Маршрутная карта или Диаграмма графика).
Система просто не видит точки входа для «вживления» нашей внешней кнопки. Поскольку конфигурация находится на полной поддержке, мы не можем просто открыть модуль и дописать туда нужный код. Рассмотрим два основных варианта решения этой задачи.
Самый современный и правильный способ заставить кнопку появиться, не снимая основную конфигурацию с «замка», — это использование расширения конфигурации. Наша задача — добавить в модуль менеджера документа отсутствующую логику через аннотацию &После.
Разберем процесс по шагам:
ЗаказНаПроизводство (только сам объект, формы переносить не обязательно).ДобавитьКомандыПечати существует, но не вызывает общие механизмы, мы используем аннотацию &После. Если её нет вовсе — создаем её.Примерный код, который мы должны добавить в модуль менеджера расширения для интеграции с БСП:
&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
// Подключаем стандартный механизм поиска внешних печатных форм
// Это заставит систему опросить справочник доп. отчетов и обработок
// и добавить найденные команды в коллекцию КомандыПечати
Попытка
УправлениеПечатью.ДобавитьКомандыПечати(ЭтотОбъект, КомандыПечати);
Исключение
// Обработка исключения, если модуль УправлениеПечатью недоступен
КонецПопытки;
КонецПроцедуры
Важно: Обратите внимание, что метод УправлениеПечатью.ДобавитьКомандыПечати в разных версиях БСП может иметь разное количество параметров или называться иначе (например, вызываться через переопределяемый модуль). Рекомендуем проверить синтаксис в общем модуле вашей текущей конфигурации.
Если по каким-то причинам использование расширений запрещено (политика компании, старая платформа 8.3.10 и ниже и т.д.), существует проверенный «дедовский» метод. Мы можем обмануть систему, зарегистрировав нашу печатную форму не как ПечатнаяФорма, а как ДополнительныйОтчет.
В этом случае кнопка для запуска обработки появится не в меню «Печать», а в меню «Отчеты» (или на панели действий в группе «Отчеты»).
Для реализации этого метода нам потребуется внести изменения в модуль объекта самой внешней обработки:
1. В функции СведенияОВнешнейОбработке изменим вид обработки.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// Меняем вид с "ПечатнаяФорма" на "ДополнительныйОтчет"
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказНаПроизводство");
// ... остальной код заполнения команд
Возврат ПараметрыРегистрации;
КонецФункции
2. Поскольку это теперь отчет, система не будет автоматически передавать массив объектов в процедуру Печать так, как она делает это для печатных форм. Нам придется самостоятельно получить ссылку на текущий документ из формы владельца.
В модуле формы внешней обработки (или при инициализации команды) нам нужно будет считать параметр, который передает платформа. Обычно текущий объект находится в параметрах формы отчета.
// Пример получения объекта, если мы используем форму обработки
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОбъектыНазначения") И Параметры.ОбъектыНазначения.Количество() > 0 Тогда
// Получаем ссылку на заказ
СсылкаНаЗаказ = Параметры.ОбъектыНазначения[0];
КонецЕсли;
КонецПроцедуры
Также стоит упомянуть важный момент, затронутый в обсуждении. Иногда видимость команд печати зависит от функциональных опций. В последних версиях ERP логика производства может быть упрощенной (без графиков) или сложной.
Проверим настройки:
Однако, как показывает практика с документом ЗаказНаПроизводство, проблема чаще всего кроется именно в отсутствии программного вызова механизмов БСП в модуле менеджера, поэтому Решение №1 через расширение является наиболее технологичным и правильным в долгосрочной перспективе.