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