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