Разработка в расширениях конфигурации на платформе 1С:Предприятие 8.3 — это удобный инструмент, позволяющий кастомизировать систему без изменения типовой конфигурации. Однако разработчики часто сталкиваются с неприятной ситуацией: в конфигураторе кнопка или элемент формы добавлены, действие назначено, но при запуске базы в режиме «1С:Предприятие» элемент на форме просто отсутствует.
В этой статье мы подробно разберем все возможные причины, по которым добавленные в расширение кнопки могут не отображаться, и рассмотрим пошаговые инструкции по устранению этой проблемы.
Это первоочередная причина, с которой столкнулся автор темы. Если в информационной базе установлено несколько расширений, и в двух или более из них заимствована одна и та же управляемая форма (например, форма документа), платформа 1С может обрабатывать их некорректно. Одно расширение может полностью перекрывать интерфейсные изменения другого.
Как решить проблему:
Платформа 1С:Предприятие запоминает индивидуальные настройки формы для каждого пользователя (расположение элементов, видимость колонок, измененный масштаб). Если пользователь уже открывал эту форму до того, как вы добавили кнопку в расширении, система загрузит старую структуру формы из кэша пользовательских настроек, проигнорировав ваши изменения в метаданных.
Как решить проблему:
ХранилищеСистемныхНастроек или через стандартный интерфейс администрирования («Настройки пользователей и прав» — «Очистка настроек»).По умолчанию при установке нового расширения в режиме «1С:Предприятие» для него автоматически взводится флаг «Безопасный режим». В этом режиме накладываются серьезные ограничения на выполнение программного кода: запрещены вызовы некоторых серверных процедур, работа с файловой системой, внешними компонентами и т.д. Если появление вашей кнопки или заполнение её команд завязано на серверный код, который блокируется безопасным режимом, платформа просто скроет элемент или сделает его недоступным.
Как решить проблему:
В механизме расширений 1С заложена важная логика работы с правами доступа, о которой часто забывают начинающие разработчики:
Как решить проблему:
ПолныеПрава) и выдать ей права на новые элементы управления.Если новая кнопка или команда привязана к реквизиту, который управляется какой-либо функциональной опцией в основной конфигурации, кнопка будет скрыта, если эта опция выключена в пользовательском режиме. Также кнопка может быть случайно помещена в группу формы, видимость которой зависит от ФО.
Как решить проблему:
При частой динамической конфигурации или обновлении расширений локальный кэш платформы на компьютере пользователя может «зависнуть». Новая форма просто не скачивается с сервера.
Как решить проблему:
dbg на сервере).Визуальное заимствование формы целиком в расширение (перенос элементов управления в дерево расширения) — это не самый лучший подход, часто называемый «варварским». При обновлении конфигурации поставщика структура формы может измениться, что приведет к конфликтам и ошибкам применения расширения. Кроме того, как мы выяснили, это часто вызывает конфликты с другими расширениями.
Давайте разберем наиболее надежный и современный способ — программное добавление кнопок. При таком подходе сама форма в расширение не переносится, заимствуется только её модуль.
Рассмотрим по шагам, как это сделать:
Шаг 1. Заимствуем в расширение только форму нужного документа или справочника. При заимствовании снимем галочки со всех элементов формы, оставив заимствованным только сам объект формы и её модуль.
Шаг 2. Откроем модуль формы в расширении и создадим обработчик события ПриСозданииНаСервере с аннотацией &После.
Шаг 3. Напишем код для программного создания команды и кнопки формы. Посмотрим на пример реализации:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// 1. Создаем новую команду формы
ИмяКоманды = "Расш1_МояСпециальнаяКоманда";
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "Расш1_МояСпециальнаяКомандаВыполнить";
НоваяКоманда.Заголовок = "Выполнить обработку";
НоваяКоманда.ИзменяетСохраняемыеДанные = Ложь;
// 2. Определяем, куда именно на форме мы хотим поместить кнопку.
// Например, добавим её на стандартную командную панель формы.
РодительскаяПанель = Элементы.ФормаКоманднаяПанель;
// 3. Создаем элемент формы типа "Кнопка"
ИмяКнопки = "Расш1_КнопкаВыполнить";
НоваяКнопка = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), РодительскаяПанель);
НоваяКнопка.ИмяКоманды = ИмяКоманды;
НоваяКнопка.Заголовок = "Выполнить обработку";
КонецПроцедуры
Шаг 4. Теперь добавим клиентский обработчик нашей команды на форму в расширении:
&НаКлиенте
Процедура Расш1_МояСпециальнаяКомандаВыполнить(Команда)
// Здесь описываем логику, которая должна выполняться при нажатии на кнопку
ПоказатьПредупреждение(, "Кнопка успешно нажата! Программный метод работает отлично.");
КонецПроцедуры
&После("ПриСозданииНаСервере"), и на форме отобразятся кнопки от обоих расширений.Используя данные рекомендации, мы сможем быстро локализовать проблему скрытых элементов интерфейса и создавать надежные, отказоустойчивые расширения для любых конфигураций 1С.