При обновлении платформы 1С:Предприятие до актуальных релизов (начиная с 8.3.22.1704 и 8.3.23.1681) разработчики часто сталкиваются с неприятным эффектом: команды и кнопки, добавленные через расширения, перестают отображаться в пользовательском интерфейсе. При этом само расширение остается активным, ошибок применения не выдает, а на более старых версиях платформы (например, 8.3.21) та же самая конфигурация работает корректно. Рассмотрим подробно, почему это происходит и как вернуть привычные элементы управления на форму.
Проанализируем ситуацию: платформа 1С постоянно оптимизирует механизмы построения управляемого интерфейса. В последних релизах были внесены изменения в логику работы Командного интерфейса. Теперь система более строго проверяет права и настройки видимости команд, добавленных в расширениях. Основными причинами проблемы могут быть:
Это самое простое и эффективное решение, которое помогает в большинстве случаев. Выясним, как правильно настроить заимствованную форму в конфигураторе расширения. Разберем по шагам:
Важно: В новых версиях платформы 8.3.23 недостаточно просто добавить команду в метаданные расширения. Если форма была заимствована, платформа ожидает, что разработчик явно определит место команды в интерфейсе этой формы.
Если автоматическое добавление через метаданные не срабатывает из-за особенностей рендеринга платформы, мы можем прибегнуть к гарантированному методу — программному созданию элемента формы. Этот способ обходит механизмы автоматического построения командной панели. Рассмотрим пример кода в расширении для процедуры ПриСозданииНаСервере:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверим, нет ли уже такой кнопки (чтобы избежать дублей)
Если Элементы.Найти("Расш_КнопкаЗагрузки") = Неопределено Тогда
// Создаем новую команду формы
НоваяКоманда = Команды.Добавить("Расш_КомандаЗагрузки");
НоваяКоманда.Действие = "Расш_ДействиеЗагрузки"; // Имя процедуры в модуле формы
НоваяКоманда.Заголовок = "Загрузить из файла";
// Добавляем кнопку на командную панель формы
Родитель = Элементы.КоманднаяПанель;
НовыйЭлемент = Элементы.Добавить("Расш_КнопкаЗагрузки", Тип("КнопкаФормы"), Родитель);
НовыйЭлемент.ИмяКоманды = "Расш_КомандаЗагрузки";
КонецЕсли;
КонецПроцедуры
Разберем, что мы здесь сделали: мы использовали метод Элементы.Добавить для принудительного внедрения кнопки в коллекцию элементов формы. Поскольку это происходит в коде, платформа обязана отрисовать этот элемент, независимо от того, как отработал автоматический сборщик командного интерфейса.
Иногда отсутствие кнопки связано не с багом отрисовки, а с тем, что расширение применилось с предупреждениями, которые не видны пользователю при запуске. Проанализируем ситуацию через Журнал регистрации:
Часто там можно встретить сообщения типа «Не удалось применить расширение... так как тип объекта не совпадает». В новых релизах платформы проверка типов в ТипЗнч и параметризуемых командах стала строже. Если команда в расширении привязана к типу документа, убедитесь, что в самом расширении этот тип документа также заимствован корректно.
Если вышеуказанные способы не помогают, проблема может крыться в «залипшем» кэше кластера серверов. Выясним, как выполнить глубокую очистку:
1C:Enterprise 8.3 Server Agent.C:\Program Files\1cv8\srvinfo).reg_1541), а внутри нее папку конкретной информационной базы.snccntx (это кэш сеансов и метаданных расширений).После этой процедуры платформа будет вынуждена заново скомпилировать все формы с учетом активных расширений, что часто решает проблему «невидимых» кнопок на платформе 8.3.23.
Мы рассмотрели основные причины исчезновения элементов управления в расширениях при переходе на новые релизы платформы 1С. Помните, что начиная с версии 8.3.22, работа с командным интерфейсом требует большей явности. Проверяйте настройки видимости в заимствованных формах и не бойтесь использовать программное создание элементов — это самый надежный способ обеспечить работоспособность вашего решения на любых версиях платформы.