Разработка и поддержка расширений в среде «1С:Предприятие 8.3» — удобный механизм, однако он таит в себе множество неочевидных нюансов. Одна из самых распространенных и неприятных проблем, с которой сталкиваются разработчики: общая команда или элемент формы добавлены в расширение, прекрасно видны в конфигураторе, но напрочь отсутствуют в режиме Предприятия.
Более того, попытка программного обращения к этой команде в модуле формы (например, в обработчике ПриСозданииНаСервере) вызывает критическую ошибку, сообщающую, что такого элемента управления не существует. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и рассмотрим пошаговые методы восстановления работоспособности команд.
Платформа «1С:Предприятие» имеет специфическую логику распределения прав на новые объекты, созданные внутри расширений. Рассмотрим этот механизм детально:
Эта особенность часто становится сюрпризом для разработчиков. Вы могли добавить общую команду, и она успешно работала. Но как только в расширение была добавлена какая-либо роль для решения смежной задачи, у всех пользователей (включая администраторов с полными правами) добавленная общая команда мгновенно пропадает с форм документов.
Для исправления этой ситуации выполним следующие действия:
ПолныеПрава).ПолныеПрава в расширении и перейдем к нашей общей команде.Также обратите внимание на свойство расширения «Основные роли». Начиная с версии платформы 8.3.14, при создании расширения автоматически генерируется ОсновнаяРоль. Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), наличие этой роли в свойствах расширения может приводить к конфликтам. Рекомендуется очищать свойство «Основные роли» в параметрах расширения, если вы настраиваете права вручную.
Если с правами доступа все в порядке, но команда так и не появилась (или наоборот, удаленная кнопка продолжает отображаться на форме), дело в кэше платформы. Механизм расширений очень чувствителен к актуальности кэшированных данных.
Кэш в 1С работает на двух уровнях:
rphost). При «динамическом» обновлении расширения серверный кэш часто не обновляется для уже запущенных сеансов. Платформа продолжает транслировать клиенту старую структуру метаданных, где вашей команды еще не существовало.Для гарантированного решения проблем с кэшем выполним комплексную очистку:
/ClearCache.При обновлении основной конфигурации (например, при накатывании типового обновления от поставщика) структура исходной формы документа могла измениться. Заимствованная в расширение форма теряет связь с оригиналом, из-за чего добавленные элементы управления (включая кнопку общей команды) могут перестать отображаться в режиме Предприятия.
Для синхронизации структуры задействуем специальный инструмент конфигуратора:
Важное предупреждение: В некоторых релизах платформы (в частности, ветках 8.3.15 и 8.3.16) существовал зарегистрированный баг. При использовании команды «Обновить расширение формы» у добавленных элементов управления сбрасывалось свойство DataPath (Путь к данным). Элемент визуально присутствовал в конфигураторе, но не выводился на экран в режиме Предприятия. Если вы столкнулись с подобным поведением, проверьте свойства пути к данным у всех проблемных реквизитов и кнопок на форме расширения и при необходимости пропишите их заново.
Если обновление формы не помогло, попробуйте радикальный, но действенный метод: полностью удалите форму документа из расширения, заимствуйте её заново и повторно разместите общую команду на форме.
Общая команда может быть параметризуемой. Если в свойствах вашей общей команды заполнено поле Тип параметра команды, платформа накладывает жесткие ограничения на ее отображение:
Проанализируем свойства общей команды. Если команда предназначена для выполнения общего действия без привязки к конкретному объекту на форме (например, открытие вспомогательного отчета или калькулятора), свойство Тип параметра команды должно быть пустым (не заполнено).
Если добавленная вами общая команда или заимствованный объект конфигурации, к которому она привязана, входят в состав какой-либо функциональной опции (ФО), видимость элемента будет напрямую зависеть от значения этой опции в режиме Предприятия.
Если функциональная опция выключена в константах или настройках программы, платформа автоматически исключает команду из командного интерфейса формы. Проверьте вкладку «Состав» у функциональных опций в расширении и основной конфигурации.
Для того чтобы точно определить, создается ли кнопка команды на форме в момент инициализации, мы можем написать простую диагностическую процедуру в модуле заимствованной формы. Это позволит локализовать проблему: дело в правах доступа (когда элемент вообще не создается платформой) или в настройках отображения (когда элемент создан, но скрыт).
Добавим в модуль формы документа следующий код:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Зададим имя элемента, под которым общая команда добавлена на форму.
// Обычно имя формируется по шаблону: "ФормаОбщаяКоманда[ИмяВашейКоманды]"
ИмяКнопкиКоманды = "ФормаОбщаяКомандаМояСпециальнаяКоманда";
НайденныйЭлемент = Элементы.Найти(ИмяКнопкиКоманды);
Если НайденныйЭлемент = Неопределено Тогда
// Если управление зашло сюда, значит элемента физически нет на форме в памяти сервера.
// Это явный признак отсутствия прав доступа на команду или проблем со структурой формы.
ЗаписьЖурналаРегистрации("Расширение.Диагностика",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Элемент '" + ИмяКнопкиКоманды + "' не найден в коллекции элементов формы!");
Иначе
// Элемент существует, проверим его текущие свойства видимости
ТекущаяВидимость = НайденныйЭлемент.Видимость;
ТекущаяДоступность = НайденныйЭлемент.Доступность;
ЗаписьЖурналаРегистрации("Расширение.Диагностика",
УровеньЖурналаРегистрации.Информация, , ,
"Элемент найден. Видимость: " + ТекущаяВидимость + ", Доступность: " + ТекущаяДоступность);
// Принудительно включим отображение для проверки
НайденныйЭлемент.Видимость = Истина;
НайденныйЭлемент.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Запустите сеанс под пользователем, у которого возникла проблема, и откройте форму документа. После этого обратитесь к Журналу регистрации (раздел Администрирование -> Обслуживание -> Журнал регистрации) и проанализируйте события с отбором по метаданным или по тексту «Расширение.Диагностика».
Если в журнале зафиксировано предупреждение «Элемент не найден...», то проблема гарантированно кроется в плоскости прав доступа (ролей) или в повреждении кэша метаданных. Если же элемент найден, но его видимость была ложна — проверьте настройки функциональных опций и свойства командного интерфейса формы в конфигураторе.