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