Разработка расширений в среде «1С:Предприятие» — это мощный инструмент кастомизации прикладных решений без изменения типовой конфигурации. Однако разработчики часто сталкиваются с крайне неприятной проблемой: в конфигураторе расширения на форму добавляются новые элементы (кнопки, поля ввода, декорации или группы), при проверке формы по кнопкам Ctrl+P всё выглядит корректно, программный код в модуле расширения успешно отрабатывает, но в режиме «1С:Предприятие» добавленные визуальные элементы просто не отображаются.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем основные причины ее появления и рассмотрим практические методы устранения — от простых манипуляций с кэшем до продвинутого программного создания элементов формы, которое гарантирует стабильную работу интерфейса после любых обновлений.
Самая частая причина, по которой новые элементы формы «пропадают» в пользовательском режиме, — это сохраненные настройки интерфейса конкретного пользователя. Платформа «1С:Предприятие» автоматически сохраняет любые изменения формы, выполненные пользователем (например, изменение ширины колонок, перетаскивание полей или скрытие элементов через меню «Изменить форму»).
Когда вы добавляете новый элемент в расширении, платформа сопоставляет новую структуру формы с уже сохраненными настройками пользователя в базе данных. Если настройки уже существуют, система может заблокировать отображение новых элементов или выставить им флаг видимости в значение Ложь по умолчанию.
Как решить эту проблему:
Для проверки этой гипотезы необходимо сбросить настройки формы к первоначальному (системному) виду. Выполним следующие шаги в режиме «1С:Предприятие»:
После сброса настроек платформа заново перечитает структуру формы из расширения, и добавленные элементы управления должны появиться на экране.
Иногда обычный запуск клиента 1С с параметром \ClearCache не приносит результатов. Это связано с тем, что данный параметр очищает далеко не все области кэша метаданных. Кэширование может происходить как на уровне локального компьютера пользователя, так и на стороне сервера приложений 1С.
Как решить проблему с кэшем полностью:
Рассмотрим по шагам процесс глубокой очистки кэша:
%userprofile%\AppData\Local\1C\1Cv8 и %userprofile%\AppData\Roaming\1C\1Cv8). Удалим все папки с длинными шестнадцатеричными именами (вида 1a2b3c4d-....).1C:Enterprise Server или временно удалить расширение из списка, запустить базу без него, закрыть сеанс и загрузить расширение заново.Если основная конфигурация была обновлена (например, при установке очередного релиза от вендора), оригинальная форма могла претерпеть изменения. Заимствованная форма в вашем расширении сохраняет старую структуру метаданных, что может приводить к конфликтам при отрисовке элементов платформой.
Как решить проблему обновления формы:
Выясним, как обновить метаданные формы в конфигураторе:
Откроем конфигуратор расширения, найдем заимствованную форму в дереве метаданных, кликнем по ней правой кнопкой мыши и выберем команду «Обновить расширение формы». Платформа сопоставит структуру оригинальной формы и формы в расширении, актуализирует связи и сохранит ваши доработки без их удаления.
Если добавленная кнопка или поле ввода связаны с новыми реквизитами или командами, которые вы создали непосредственно в расширении, обычные пользователи могут не увидеть их из-за ограничений прав доступа.
Проанализируем две важные настройки:
Начиная с версии платформы 8.3.14, изменился механизм заимствования объектов. Теперь при переносе формы в расширение связанные с ней родительские объекты (например, документ или справочник) не заимствуются автоматически.
Если вы вывели на форму поле, путь к данным которого (свойство ПутьКДанным) ведет к реквизиту объекта, который отсутствует в расширении или не был заимствован корректно, платформа визуально скроет это поле в режиме Предприятия без вывода каких-либо предупреждений или ошибок.
Решение: Убедитесь, что сам объект метаданных (документ, справочник) и все реквизиты, к которым обращаются новые элементы управления формы, заимствованы в ваше расширение.
Чтобы раз и навсегда обезопасить себя от проблем с кэшем, сбросом настроек пользователей, обновлением конфигураций и конфликтами нескольких расширений, опытные разработчики рекомендуют полностью отказаться от визуального редактирования заимствованных форм.
Вместо перетаскивания элементов мышкой в конфигураторе, форму заимствуют в расширение в исходном виде, а все доработки интерфейса выполняют программно в модуле формы. Проанализируем, как это сделать правильно.
Для этого используется обработчик события ПриСозданииНаСервере с аннотацией &После. Рассмотрим подробный пример кода, который динамически добавляет на форму новую команду, кнопку для ее вызова и новое поле ввода:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Шаг 1. Создаем команду формы для будущей кнопки
ИмяКоманды = "Расш1_ПоказатьСообщениеКоманда";
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "Расш1_ПоказатьСообщениеОбработчик";
НоваяКоманда.Заголовок = "Выполнить действие";
НоваяКоманда.ИзменяетСохраняемыеДанные = Ложь;
// Шаг 2. Находим родительскую группу для размещения кнопки.
// Если группа "ГруппаКоманднаяПанель" не найдена, добавим кнопку в корень формы.
РодительКнопки = ЭтаФорма.Элементы.Найти("ФормаКоманднаяПанель");
Если РодительКнопки = Неопределено Тогда
РодительКнопки = ЭтаФорма;
КонецЕсли;
// Шаг 3. Добавляем кнопку на форму и связываем ее с созданной командой
ИмяКнопки = "Расш1_КнопкаДействия";
НоваяКнопка = ЭтаФорма.Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), РодительКнопки);
НоваяКнопка.ИмяКоманды = ИмяКоманды;
НоваяКнопка.Заголовок = "Нажми меня!";
НоваяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
// Шаг 4. Программное добавление нового поля ввода на форму.
// Поле будет связано с реквизитом расширения "Расш1_КомментарийПрограммиста",
// который предварительно добавлен в заимствованный объект метаданных.
ИмяПоля = "Расш1_ПолеКомментария";
РодительПоля = ЭтаФорма.Элементы.Найти("ГруппаОсновныеРеквизиты");
Если РодительПоля = Неопределено Тогда
РодительПоля = ЭтаФорма;
КонецЕсли;
НовоеПоле = ЭтаФорма.Элементы.Добавить(ИмяПоля, Тип("ПолеФормы"), РодительПоля);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Объект.Расш1_КомментарийПрограммиста";
НовоеПоле.Заголовок = "Комментарий разработчика";
НовоеПоле.Подсказка = "Введите дополнительную информацию по задаче";
КонецПроцедуры
// Обработчик действия для созданной команды
&НаКлиенте
Процедура Расш1_ПоказатьСообщениеОбработчик(Команда)
ПоказатьПредупреждение(, "Программная кнопка из расширения успешно сработала!");
КонецПроцедуры
Преимущества программного подхода: