Почему не сохраняется программно добавленный реквизит у групп справочника в 1С и как правильно с ним работать?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При доработке типовых конфигураций разработчики часто стремятся избежать изменения типовых форм, чтобы упростить последующие обновления. Для этого создаются общие модули, которые программно создают элементы интерфейса в событии ПриСозданииНаСервере. Однако при работе с иерархическими справочниками (например, Номенклатура) нередко возникает ситуация, когда у элементов значение реквизита сохраняется и считывается корректно, а у групп справочника данные не записываются.

Проанализируем причины такого поведения платформы 1С:Предприятие, разберем механизм автоматической синхронизации данных формы с объектом и рассмотрим способы реализации наследования значений от родительских папок.

Причина 1. Настройка свойства «Использование реквизита» в метаданных

Выясним главную причину, по которой данные не сохраняются в группах справочника. По умолчанию при добавлении нового реквизита в иерархический справочник платформа устанавливает для него ограничение по области применения.

Разберем по шагам, как это исправить в конфигураторе:

  1. Откроем дерево метаданных и найдем нужный справочник (например, Справочник.Номенклатура).
  2. Раскроем ветку Реквизиты и перейдем в свойства добавленного реквизита.
  3. Найдем свойство Использование реквизита (по умолчанию там установлено значение Для элемента).
  4. Изменим значение свойства на Для группы или Для элемента и группы в зависимости от стоящей задачи.

Если для реквизита установлено значение Для элемента, платформа на уровне СУБД блокирует запись данных в этот реквизит для строк, у которых признак ЭтоГруппа = Истина.

Причина 2. Раздельные формы для элементов и групп

В иерархических справочниках форма элемента и форма группы представляют собой два совершенно разных объекта конфигурации — ФормаЭлемента и ФормаГруппы.

Если программное добавление элементов формы вызывается через общий модуль, необходимо убедиться, что обработчик подключен к обоим типам форм, либо вызывается универсально. Если код создания элемента формы выполняется только в форме элемента, в форме группы поле ввода просто не появится.

Как правильно привязать программный элемент к реквизиту объекта

Рассмотрим, как правильно формировать визуальные элементы на управляемой форме. Если реквизит уже добавлен в метаданные справочника, платформа автоматически включает его в состав основного реквизита формы Объект.

В этом случае не требуется вызывать метод ИзменитьРеквизиты(). Достаточно создать поле ввода и связать его с данными через свойство ПутьКДанным:


&НаСервере
Процедура ДобавитьПолеСкладаНаФорму(Форма)
    
    ИмяЭлемента = "ОбъектОсновнойСклад";
    
    // Проверяем, не создан ли элемент ранее
    Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        
        // Создаем поле формы
        НовыйЭлемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Форма);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "Объект.ОсновнойСклад";
        НовыйЭлемент.Заголовок = "Основной склад";
        
    КонецЕсли;
    
КонецПроцедуры

При таком подходе чтение значения из базы данных и его сохранение при записи объекта платформа выполняет полностью автоматически, без необходимости писать дополнительный код чтения и записи.

Реализация автоматического наследования реквизита от группы к элементам

В платформе 1С отсутствует встроенный механизм, автоматически передающий значения реквизитов от родительской папки подчиненным элементам. Рассмотрим два основных варианта реализации такого наследования.

  1. Динамическое определение по иерархии (рекомендуемый способ):

    При этом подходе реквизит у подчиненного элемента заполняется только тогда, когда для него нужно задать индивидуальное значение (переопределение). Если реквизит у элемента пустой, в коде проведения документов, отчетов или алгоритмов значение определяется по цепочке родителей вверх. Это позволяет избежать массовой перезаписи тысяч позиций номенклатуры при смене склада у группы.

  2. Каскадная перезапись при изменении группы:

    В модуле объекта справочника в обработчике ПередЗаписью или ПриЗаписи проверяется условие: если объект является группой (ЭтоГруппа = Истина) и значение реквизита было изменено, выполняется выборка и перезапись всех подчиненных элементов.

    Важное ограничение: При наличии большой иерархии и десятков тысяч элементов в группе синхронная перезапись в транзакции может привести к длительным блокировкам и ошибкам тайм-аута. Для объемных баз такую процедуру рекомендуется выполнять в фоновом задании.

Альтернативное решение: использование расширений конфигурации

Чтобы не усложнять поддержку конфигурации программной генерацией элементов формы в общем модуле, целесообразно использовать механизм расширений конфигурации.

Добавив реквизит и разместив его на заимствованных формах элемента и группы в расширении, вы сохраняете возможность визуальной настройки интерфейса в конфигураторе. При этом основная конфигурация поставщика остается на полной поддержке и обновляется без конфликтов.

← На главную