Почему не выводится добавленная команда печати через расширение в 1С:УТ 11 и как это исправить

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

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

Шаг 1. Регистрация команды в модуле менеджера

Первым делом проанализируем, где именно должна регистрироваться команда. В типовых конфигурациях за это отвечает процедура ДобавитьКомандыПечати. Рассмотрим пример кода, который добавляет новую команду «УПД с факсимиле» для документа РеализацияТоваровУслуг. Важно понимать, что в некоторых локализованных версиях (например, для РФ) этот метод может быть вынесен в специализированные модули, такие как РеализацияТоваровУслугЛокализация.

Для добавления команды в расширении мы должны перехватить эту процедуру. Разберем пример реализации:


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати, Параметры)
    
    // Проверим контекст, чтобы не добавлять лишнего, если менеджер используется для разных объектов
    ЭтоПартнер = Ложь;
    Параметры.Свойство("ЭтоПартнер", ЭтоПартнер);

    Если НЕ ЭтоПартнер Тогда
        КомандаПечати = КомандыПечати.Добавить();
        КомандаПечати.МенеджерПечати = "Обработка.ПечатьОбщихФорм"; // Указываем объект, где лежит метод "Печать"
        КомандаПечати.Идентификатор = "УПДФаксимиле";
        КомандаПечати.Представление = НСтр("ru = 'Универсальный передаточный документ с факсимиле(УПД)'");
        КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
        КомандаПечати.Порядок = 38; // Определяет положение в списке
    КонецЕсли;

КонецПроцедуры

Проанализируем структуру КомандаПечати. Поле МенеджерПечати критически важно: если вы планируете использовать стандартные алгоритмы печати УПД, то указывается Обработка.ПечатьОбщихФорм. Если же ваша логика полностью уникальна и находится в модуле менеджера вашего расширения, необходимо указывать имя объекта с учетом префикса расширения.

Шаг 2. Проблема кэширования и обновления интерфейса

Часто программисты сталкиваются с тем, что код в отладчике выполняется, команда в таблицу КомандыПечати добавляется, но в подменю «Печать» документа её нет. Выясним основную причину: БСП кэширует список команд печати.

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

  1. Обновите версию расширения. При изменении номера версии расширения система инициирует процедуры обновления конфигурации, в ходе которых кэш команд печати обычно сбрасывается.
  2. Используйте программный сброс кэша. В консоли кода можно вызвать метод УправлениеПечатью.ОбновитьКомандыПечати(). Это принудительно пересоберет дерево команд для всех объектов.
  3. Проверьте настройки функциональных опций. Если в описании команды вы указали ФункциональныеОпции, убедитесь, что они включены в константах системы. Если поле не заполнено, команда считается доступной всегда.

Шаг 3. Внимание к объектам и формам

Рассмотрим ситуацию, когда команда добавлена, кэш сброшен, но кнопки все равно нет. Проанализируем типичную ошибку: путаница в типах документов. В конфигурации УТ 11 документы РеализацияТоваровУслуг и СчетФактураВыданный тесно связаны, и печатная форма УПД может выводиться из обоих. Если вы добавили команду только в менеджер реализации, а проверяете кнопку в списке счетов-фактур — вы её не увидите.

Также важно проверить свойства ДоступнаВФормеСписка и ДоступнаВФормеОбъекта. По умолчанию они установлены в Истина, но при программном добавлении стоит явно убедиться, что вы не ограничиваете видимость команды.

Шаг 4. Корректный перехват формирования печатной формы

Когда кнопка появилась, возникает следующая задача: заставить систему вызвать ваш код для формирования макета. Здесь важно правильно использовать директивы расширения. Рассмотрим случай, когда метод СформироватьПечатнуюФормуУПД находится в основной конфигурации, а мы хотим изменить его логику.

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

Пример правильного перехвата:


&Вместо("СформироватьПечатнуюФормуУПД")
Функция Расш1_СформироватьПечатнуюФормуУПД(ПараметрыПечати, ДанныеПечати, ОбъектыПечати)
    
    // Если нам нужно вызвать стандартную логику, используем ПродолжитьВызов
    // Результат = ПродолжитьВызов(ПараметрыПечати, ДанныеПечати, ОбъектыПечати);
    
    // Если мы реализуем свою логику (например, с факсимиле):
    ТабличныйДокумент = Новый ТабличныйДокумент;
    // ... логика заполнения документа ...
    
    Возврат ТабличныйДокумент;

КонецФункции

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

Шаг 5. Современный подход через переопределяемые модули

Чтобы сделать ваше расширение более устойчивым к обновлениям, рекомендуется использовать «точки входа», предусмотренные разработчиками БСП. Вместо изменения локализационных модулей конкретных документов, рассмотрим использование общего модуля УправлениеПечатьюПереопределяемый.

В этом модуле существует процедура ПриДобавленииКомандПечати. Она вызывается для всех объектов метаданных. В ней можно централизованно управлять командами:


&После("ПриДобавленииКомандПечати")
Процедура Расш1_ПриДобавленииКомандПечати(СписокОбъектов, КомандыПечати)
    
    Для Каждого Объект Из СписокОбъектов Цикл
        Если Объект = Метаданные.Документы.РеализацияТоваровУслуг Тогда
            // Добавляем нашу команду именно для этого типа документа
            НоваяКоманда = КомандыПечати.Добавить();
            // Настройка свойств команды...
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Этот метод считается более «чистым», так как он меньше зависит от изменений во внутренних модулях конкретных документов, которые фирма «1С» может переименовать или реструктуризировать при очередном обновлении.

Итоги и рекомендации

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

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

Применяя эти шаги, вы сможете гибко настраивать печатные формы в УТ 11, сохраняя при этом конфигурацию на поддержке и обеспечивая легкое обновление системы в будущем.

← На главную