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