Как адаптировать код при изменении логики хранения дополнительных реквизитов и сведений в 1С:ЗУП 3.1.10

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

При обновлении конфигураций, таких как Зарплата и управление персоналом (ЗУП) до версии 3.1.10 или выше, разработчики часто сталкиваются с критической ошибкой в работе доработанного функционала. Проблема проявляется при обращении к справочнику НаборыДополнительныхРеквизитовИСведений. Запросы, которые раньше работали исправно, начинают выдавать ошибку «Неверные параметры», а привычные предопределенные элементы внезапно получают префикс «Удалить». В этой статье мы подробно разберем, что изменилось в логике 1С, почему старый подход больше не работает и как правильно переписать код под актуальные требования Библиотеки стандартных подсистем (БСП).

Суть возникшей проблемы

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


ГДЕ
    ДополнительныеРеквизитыИСведения.НаборСвойств = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_Сотрудники)

После обновления система сообщает, что элемента Справочник_Сотрудники не существует. При анализе справочника выясняется, что все старые предопределенные элементы переименованы в УдалитьСправочник_Сотрудники, УдалитьСправочник_ПодразделенияОрганизаций и так далее. Это верный признак того, что в конфигурации обновилась версия БСП (до 3.0 и выше), и архитектура подсистемы «Свойства» претерпела глобальные изменения.

Почему 1С изменила механизм хранения наборов

Давайте проанализируем причины таких изменений. Основная цель разработчиков 1С — уйти от жесткой зависимости кода от метаданных. Ранее для каждого нового типа объекта, которому требовались доп. реквизиты, приходилось создавать новый предопределенный элемент в конфигураторе. Это затрудняло поддержку расширений, усложняло объединение конфигураций и ограничивало возможность динамического создания наборов свойств.

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

Как теперь идентифицируются наборы в системе

Выясним, как устроена новая структура. В справочнике НаборыДополнительныхРеквизитовИСведений теперь используется следующий механизм:

  1. Старые предопределенные элементы сохранены только для обратной совместимости данных в базе, чтобы существующие ссылки в старых документах не превратились в «Объект не найден». Использовать их в новом коде категорически запрещено.
  2. Введен новый строковый реквизит — ИмяПредопределенногоНабора.
  3. Для каждого стандартного объекта системы (Сотрудники, Контрагенты и т.д.) создается обычный (не предопределенный в понимании метаданных) элемент справочника, у которого в этом реквизите записан строковый идентификатор, например: "Справочник_Сотрудники".

Решение 1: Исправление запросов

Если вам необходимо получить список дополнительных реквизитов в запросе, мы должны отказаться от конструкции ЗНАЧЕНИЕ(...) в пользу фильтрации по новому реквизиту. Рассмотрим обновленный вариант запроса:


ВЫБРАТЬ
    ДополнительныеРеквизитыИСведения.Ссылка КАК Идентификатор,
    ДополнительныеРеквизитыИСведения.Заголовок КАК Заголовок
ИЗ
    ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
ГДЕ
    ДополнительныеРеквизитыИСведения.НаборСвойств.ИмяПредопределенногоНабора = "Справочник_Сотрудники"
    И НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления

Важный момент: Имя набора обычно соответствует шаблону ТипОбъекта_ИмяМетаданных. Однако, чтобы быть уверенным в правильности строки, рекомендуется заглянуть в пользовательский режим, открыть справочник «Наборы дополнительных реквизитов и сведений» и через «Изменить форму» вывести поле Имя предопределенного набора.

Решение 2: Использование программных методов БСП

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

Для получения ссылки на набор свойств конкретного объекта в программном коде используйте следующий метод:


// Получаем ссылку на набор свойств для справочника Сотрудники
СсылкаНаНабор = УправлениеСвойствами.НаборСвойств(Справочники.Сотрудники.ПустаяСсылка());

Этот метод самостоятельно определит нужный идентификатор и вернет актуальную ссылку на элемент справочника НаборыДополнительныхРеквизитовИСведений. Это защитит ваш код от поломок в будущем, если 1С снова решит изменить структуру хранения.

Что происходит с данными при обновлении?

Разберем ситуацию с обновлением существующих данных. У многих возникают опасения: не пропадут ли уже заполненные значения дополнительных реквизитов? При обновлении на ЗУП 3.1.10 автоматически запускаются обработчики обновления (БСП), которые выполняют следующие действия:

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

Советы для разработчика при работе в расширениях

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

  1. Программно или вручную создать запись в справочнике НаборыДополнительныхРеквизитовИСведений.
  2. Заполнить уникальное ИмяПредопределенногоНабора.
  3. Описать связь объекта с этим набором в общем модуле УправлениеСвойствамиПереопределяемый в процедуре ПриОпределенииНаборовСвойствОбъектов.

Таким образом, переход на новую архитектуру БСП 3.0+ делает систему более модульной и упрощает поддержку сложных внедрений. Использование прямых ссылок на предопределенные данные уходит в прошлое, уступая место гибким механизмам поиска по метаданным и программным интерфейсам общих модулей.

← На главную