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