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