С выходом платформы 8.3.23 (а также последних релизов ветки 8.3.22) многие разработчики столкнулись с неприятной ситуацией: команды печати, добавленные через расширения в метаданные документов, внезапно перестали отображаться в пользовательском интерфейсе. Пункт подменю "Печать" просто исчезает, хотя права настроены корректно, а в старых версиях платформы все работало без нареканий. Проанализируем эту ситуацию и разберем по шагам, как вернуть функциональность вашим печатным формам.
Традиционно новички в 1С добавляют печатную форму в расширение самым простым способом: создают команду в дереве метаданных расширения, привязывают её к документу и пишут код открытия формы печати. Однако в новых версиях платформы механизмы отрисовки управляемых форм и объединения интерфейса основной конфигурации с расширениями претерпели изменения.
Проанализируем ситуацию: большинство современных конфигураций (БП 3.0, УТ 11, ERP) построены на базе БСП (Библиотеки стандартных подсистем). БСП использует динамическое формирование командной панели. Если платформа при построении формы видит конфликт между жестко заданными командами расширения и динамически генерируемым меню БСП, приоритет отдается последнему. В итоге ваши "статические" команды просто вытесняются из интерфейса. Рассмотрим, как решить эту проблему, следуя методике разработки 1С.
Единственным надежным способом обеспечить видимость команды в меню "Печать" на актуальных платформах является использование стандартного программного интерфейса БСП. Вместо добавления объекта "Команда" в дерево метаданных расширения, мы будем использовать расширение модуля менеджера документа.
Разберем этот процесс по шагам.
СчетНаОплатуПокупателю).&После для процедуры ДобавитьКомандыПечати.Рассмотрим пример кода, который необходимо разместить в модуле менеджера документа в расширении:
&После("ДобавитьКомандыПечати")
Процедура расш_ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Регистрируем новую команду печати
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "СпецификацияКДоговору";
КомандаПечати.Представление = НСтр("ru = 'Спецификация к договору'");
КомандаПечати.ПроверкаПроведенностиПередПечатью = Ложь;
КомандаПечати.Порядок = 10; // Определяет место в списке
КонецПроцедуры
Теперь система знает о существовании нашей команды, и БСП сама "нарисует" её в нужном подменю, используя стандартные алгоритмы построения формы. Это гарантирует видимость кнопки вне зависимости от версии платформы.
После того как кнопка появилась, нам нужно научить систему реагировать на её нажатие. Для этого мы расширяем основную процедуру Печать в том же модуле менеджера. Посмотрим на пример реализации:
&Вместо("Печать")
Процедура расш_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// Проверяем, наша ли это команда
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СпецификацияКДоговору") Тогда
// Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
// Вызываем процедуру формирования (её можно вынести в отдельный метод модуля)
СформироватьСпецификацию(ТабДок, МассивОбъектов);
// Выводим результат в коллекцию печатных форм
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СпецификацияКДоговору",
"Спецификация к договору",
ТабДок);
КонецЕсли;
КонецПроцедуры
В данном коде мы используем метод УправлениеПечатью.НужноПечататьМакет, чтобы определить, какую именно кнопку нажал пользователь. Если идентификатор совпадает с нашей спецификацией, мы формируем документ и передаем его обратно подсистеме печати через ВывестиТабличныйДокументВКоллекцию.
Если после реализации программного интерфейса команда всё равно не видна, проанализируем настройки безопасности. В платформе 8.3.23 ужесточились правила работы с ролями в расширениях.
Обратите внимание на следующие моменты:
Безопасный режим. Если он включен, платформа может блокировать некоторые вызовы серверных процедур из расширения. Для проверки гипотезы попробуйте временно его отключить.Основные роли. Если в расширении создана хотя бы одна роль, но она не назначена пользователю или в ней не проставлены права на использование объектов расширения, пункты меню могут скрываться. Независимые права подчиненных объектов. Это критично для корректного объединения прав основной конфигурации и расширения на новых платформах.Если по каким-то причинам вы не можете переписать код под стандарты БСП прямо сейчас, рассмотрим временные решения, которые помогали коллегам на форумах:
Программное управление видимостью: В модуле формы документа, в процедуре ПриСозданииНаСервере (после вызова стандартных обработчиков БСП), можно попробовать принудительно найти элемент формы вашей команды и установить Элементы.ИмяВашейКоманды.Видимость = Истина;. Однако, как показывает практика, если команда "вымыта" механизмом БСП, её может просто не оказаться в коллекции Элементы.
Изменение режима совместимости: Иногда проблема решается установкой режима совместимости расширения в точном соответствии с режимом совместимости основной конфигурации. Если основная конфигурация стоит в режиме 8.3.21, а расширение — "Не использовать" (что фактически означает 8.3.23), интерфейсные механизмы могут конфликтовать.
Подведем итог: исчезновение команд печати в 8.3.23 — это не просто досадный баг, а следствие эволюции платформы и библиотек. Переход на программную регистрацию команд в модуле менеджера — это единственный правильный путь, который обеспечит стабильную работу вашего решения в будущем. Используя методы ДобавитьКомандыПечати и Печать, вы встраиваетесь в стандартный жизненный цикл БСП, и платформа перестает конфликтовать с вашими изменениями.