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