Как заменить встроенную печатную форму внешней в 1С без снятия конфигурации с поддержки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При сопровождении систем на базе 1С часто возникает необходимость изменить печатную форму стандартного документа (например, расходной накладной или счета на оплату). При этом крайне важно сохранить конфигурацию на поддержке, чтобы не усложнять последующие обновления системы. Традиционный подход с простой подменой идентификатора встроенной формы во внешней обработке в современных версиях Библиотеки стандартных подсистем (БСП) больше не работает напрямую — система начинает дублировать команды печати в меню вместо их замещения. В этой статье мы подробно разберем, почему так происходит, и рассмотрим все доступные способы решения этой задачи.

Выясняем причину: почему простая замена идентификатора больше не работает?

В ранних версиях БСП разработчики часто прибегали к простому трюку: регистрировали внешнюю печатную форму с тем же самым идентификатором, что и встроенная. БСП при построении меню печати сопоставляла их и заменяла стандартную команду внешней. Однако с развитием БСП (начиная с версий 2.x и далее) этот механизм был изменен в целях повышения стабильности и предсказуемости системы. Теперь, если зарегистрировать внешнюю обработку с идентичным кодом, БСП просто добавит ее как отдельную, дополнительную команду. Для явного указания замещения был введен специализированный механизм — колонка ЗаменяемыеКоманды в таблице команд регистрации.

Проанализируем типичные ошибки в программном коде регистрации, которые не дают механизму замещения сработать:

  1. Отсутствие указания версии БСП: Если в структуре параметров регистрации внешней обработки не указано свойство ВерсияБСП, система обрабатывает регистрацию по правилам обратной совместимости, часто игнорируя современные механизмы замещения команд.
  2. Ручное создание колонок таблицы команд: Разработчики часто описывают таблицу команд вручную через Новый ТаблицаЗначений. При этом легко ошибиться в типе данных колонки ЗаменяемыеКоманды или вовсе забыть ее добавить. Правильный способ — использовать стандартный интерфейс БСП для создания структуры.
  3. Неверный идентификатор заменяемой команды: В качестве заменяемой команды необходимо указывать не произвольную строку, а точный системный идентификатор встроенной печатной формы, который задан в модуле менеджера объекта.

Способ 1. Программная замена через механизм «ЗаменяемыеКоманды» в БСП

Это наиболее правильный и штатный способ подмены стандартной формы на внешнюю с использованием кода. Давайте разберем по шагам, как должен выглядеть шаблон функции СведенияОВнешнейОбработке во внешней обработке, чтобы БСП корректно распознала и заменила встроенную команду.

Рассмотрим пример реализации этой функции:


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

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    // Обратите внимание на колонку ЗаменяемыеКоманды — она должна быть строкового типа
    Команды.Колонки.Добавить("ЗаменяемыеКоманды", Новый ОписаниеТипов("Строка")); 
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "", ЗаменяемыеКоманды = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление; 
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
    НоваяКоманда.ЗаменяемыеКоманды = ЗаменяемыеКоманды;
КонецПроцедуры

Важное примечание: Чтобы узнать точный идентификатор заменяемой команды, откройте конфигуратор, перейдите к нужному документу, откройте его модуль менеджера и найдите процедуру ДобавитьКомандыПечати(КомандыПечати). Внутри этой процедуры будет заполняться список команд. Ищите строку вида Команда = КомандыПечати.Добавить(); Команда.Идентификатор = "...";. Именно это значение свойства Идентификатор необходимо передать в колонку ЗаменяемыеКоманды вашей внешней обработки.

Способ 2. Отключение стандартной команды через пользовательский интерфейс «Подменю Печать»

Если вам не хочется переписывать программный код внешней обработки или конфигурация использует специфическую сборку БСП, в которой программное замещение работает некорректно, можно воспользоваться стандартными интерактивными возможностями БСП. Механизм позволяет просто скрыть стандартную команду из меню печати, оставив видимой только внешнюю.

Давайте пошагово рассмотрим этот процесс:

  1. Войдите в базу данных 1С:Предприятие под учетной записью с правами администратора.
  2. Перейдите в раздел Администрирование, далее выберите пункт Печатные формы, отчеты и обработки.
  3. Найдите и откройте гиперссылку Подменю "Печать".
  4. Перед вами откроется дерево объектов метаданных. Найдите нужный документ (например, Реализация товаров и услуг) и разверните список связанных с ним печатных команд.
  5. В списке команд вы увидите как стандартные встроенные формы, так и подключенные внешние. Просто снимите флажок (галочку) видимости напротив стандартной команды печати, которую вы хотите заменить.
  6. Убедитесь, что напротив вашей внешней печатной формы флажок видимости установлен.
  7. Сохраните изменения. Теперь у пользователей в меню кнопки "Печать" документа будет отображаться только ваша новая внешняя форма, а стандартная будет скрыта.

Способ 3. Использование механизма «Пользовательские макеты печати»

Очень часто программисты начинают разрабатывать внешнюю печатную форму там, где это совершенно не требуется. Если ваша задача заключается исключительно в визуальном изменении бланка (например, нужно добавить логотип компании, поменять шрифт, изменить ширину колонок, добавить статическую надпись или предупреждение для клиентов), логика формирования данных в коде остается прежней. В таких случаях БСП предлагает прекрасную альтернативу — редактирование макета прямо в режиме предприятия.

Давайте разберем, как воспользоваться этим механизмом:

  1. Перейдите в раздел Администрирование -> Печатные формы, отчеты и обработки.
  2. Откройте ссылку Макеты печатных форм.
  3. В появившемся списке найдите макет нужного документа. Вы можете воспользоваться строкой поиска, чтобы быстро найти, например, "Расходная накладная".
  4. Выделите нужную строку и нажмите кнопку Изменить (или дважды кликните по строке).
  5. Система откроет встроенный редактор табличных документов 1С. Здесь вы можете свободно редактировать ячейки, менять шрифты, добавлять картинки, изменять формулы заполнения параметров.
  6. После внесения изменений нажмите Записать и закрыть. Измененный макет пометится специальной пиктограммой, указывающей на то, что используется пользовательская версия.

Система автоматически начнет выводить на печать измененный вами макет, используя стандартный программный код формирования данных. Это самый безопасный и быстрый способ кастомизации печатных форм, не требующий написания ни одной строчки кода.

Способ 4. Современное решение через расширение конфигурации

В современных реалиях разработки на платформе 1С v8.3 самым гибким и технологичным способом модификации системы является использование расширений конфигурации. Если подсистема печати БСП в вашей конфигурации ведет себя непредсказуемо, расширение позволит вам перехватить управление процессом печати без снятия основной конфигурации с поддержки.

Рассмотрим, как реализовать подмену печатной формы через расширение:

  1. Создайте новое расширение конфигурации (или используйте существующее) с назначением "Адаптация".
  2. Добавьте в расширение документ, печатную форму которого необходимо заменить (например, документ РеализацияТоваровУслуг).
  3. Добавьте в расширение модуль менеджера этого документа.
  4. В модуле менеджера перехватите процедуру ДобавитьКомандыПечати с помощью аннотации &После. Это позволит модифицировать список команд непосредственно перед выводом пользователю.

Посмотрим на пример кода в расширении для удаления стандартной команды:


&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
    
    // Ищем стандартную команду по ее известному идентификатору
    СтандартнаяКоманда = КомандыПечати.Найти("РеализацияТоваровУслуг", "Идентификатор");
    
    Если СтандартнаяКоманда <> Неопределено Тогда
        // Полностью удаляем стандартную команду из списка доступных для печати
        КомандыПечати.Удалить(СтандартнаяКоманда);
    КонецЕсли;
    
КонецПроцедуры

Используя этот подход совместно с подключением внешней печатной формы, вы гарантируете, что стандартная команда никогда не появится в интерфейсе, а пользователям будет доступен только ваш вариант. Более того, через механизм расширений с аннотацией &Вместо вы можете полностью переопределить саму процедуру формирования печатного листа (процедуру Печать в модуле менеджера), тем самым избавив себя от необходимости регистрировать внешние обработки в справочнике дополнительных отчетов и обработок.

Таким образом, платформа 1С и БСП предоставляют разработчику богатый арсенал инструментов для кастомизации печатных форм. Выбор конкретного метода зависит от сложности решаемой задачи и версии БСП вашей конфигурации.

← На главную