Почему пропадает пункт меню "Печать" в расширении на платформе 8.3.23 и как это исправить?

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

С выходом платформы 8.3.23 (а также последних релизов ветки 8.3.22) многие разработчики столкнулись с неприятной ситуацией: команды печати, добавленные через расширения в метаданные документов, внезапно перестали отображаться в пользовательском интерфейсе. Пункт подменю "Печать" просто исчезает, хотя права настроены корректно, а в старых версиях платформы все работало без нареканий. Проанализируем эту ситуацию и разберем по шагам, как вернуть функциональность вашим печатным формам.

Выясним причину: почему старый подход перестал работать?

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

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

Решение: Переход на программное добавление команд через БСП

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

Разберем этот процесс по шагам.

  1. Удаление старой команды: Первым делом стоит отказаться от использования команды, созданной непосредственно в объектах метаданных расширения, так как она конфликтует с механизмами платформы.
  2. Расширение модуля менеджера: Нам необходимо создать расширение для модуля менеджера того документа, в который мы добавляем печатную форму (например, СчетНаОплатуПокупателю).
  3. Перехват процедуры добавления команд: Мы будем использовать аннотацию &После для процедуры ДобавитьКомандыПечати.

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


&После("ДобавитьКомандыПечати")
Процедура расш_ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    // Регистрируем новую команду печати
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "СпецификацияКДоговору";
    КомандаПечати.Представление = НСтр("ru = 'Спецификация к договору'");
    КомандаПечати.ПроверкаПроведенностиПередПечатью = Ложь;
    КомандаПечати.Порядок = 10; // Определяет место в списке
    
КонецПроцедуры

Теперь система знает о существовании нашей команды, и БСП сама "нарисует" её в нужном подменю, используя стандартные алгоритмы построения формы. Это гарантирует видимость кнопки вне зависимости от версии платформы.

Реализация обработчика печати на сервере

После того как кнопка появилась, нам нужно научить систему реагировать на её нажатие. Для этого мы расширяем основную процедуру Печать в том же модуле менеджера. Посмотрим на пример реализации:


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

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

В данном коде мы используем метод УправлениеПечатью.НужноПечататьМакет, чтобы определить, какую именно кнопку нажал пользователь. Если идентификатор совпадает с нашей спецификацией, мы формируем документ и передаем его обратно подсистеме печати через ВывестиТабличныйДокументВКоллекцию.

Проверка прав и ролей в расширении

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

Обратите внимание на следующие моменты:

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

Дополнительные способы исправления (костыльные методы)

Если по каким-то причинам вы не можете переписать код под стандарты БСП прямо сейчас, рассмотрим временные решения, которые помогали коллегам на форумах:

Программное управление видимостью: В модуле формы документа, в процедуре ПриСозданииНаСервере (после вызова стандартных обработчиков БСП), можно попробовать принудительно найти элемент формы вашей команды и установить Элементы.ИмяВашейКоманды.Видимость = Истина;. Однако, как показывает практика, если команда "вымыта" механизмом БСП, её может просто не оказаться в коллекции Элементы.

Изменение режима совместимости: Иногда проблема решается установкой режима совместимости расширения в точном соответствии с режимом совместимости основной конфигурации. Если основная конфигурация стоит в режиме 8.3.21, а расширение — "Не использовать" (что фактически означает 8.3.23), интерфейсные механизмы могут конфликтовать.

Заключение

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

← На главную