Как правильно работать с дополнительными реквизитами в 1С при обновлении конфигурации

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

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

Разберем подробно, почему происходит переименование реквизитов, почему поиск по наименованию считается грубой ошибкой и как правильно организовать работу со свойствами объектов по стандартам Библиотеки стандартных подсистем (БСП).

Почему изменяются наименования дополнительных реквизитов при обновлении

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

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

Штатный способ: использование реквизита «Имя» для разработчиков

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

  1. Откроем карточку нужного дополнительного реквизита в пользовательском режиме.
  2. В группе настроек «Для разработчиков» укажем постоянное значение в поле Имя (например, НомерНакладнойТСД). Это строковый идентификатор, который не зависит от пользовательского заголовка, наименования набора и никогда не перезаписывается при типовых обновлениях.
  3. Используем поиск по этому реквизиту в программном коде.

Посмотрим на пример правильного программного поиска свойства:


ИмяРеквизита = "НомерНакладнойТСД";
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита);

Если Не ЗначениеЗаполнено(СвойствоСсылка) Тогда
    ВызватьИсключение "Не найден дополнительный реквизит с именем для разработчиков: " + ИмяРеквизита;
КонецЕсли;

В запросах обращение к свойству выполняется аналогичным образом через обращение к реквизиту Имя:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДокументТабЧасть.Ссылка КАК ДокументСсылка,
    |	ДокументТабЧасть.Значение КАК ЗначениеРеквизита
    |ИЗ
    |	Документ.ПеремещениеТоваров.ДополнительныеРеквизиты КАК ДокументТабЧасть
    |ГДЕ
    |	ДокументТабЧасть.Свойство.Имя = &ИмяРеквизита";

Запрос.УстановитьПараметр("ИмяРеквизита", "НомерНакладнойТСД");
РезультатЗапроса = Запрос.Выполнить();

Использование программного интерфейса модуля «УправлениеСвойствами»

Вместо прямого чтения табличных частей объектов и регистра сведений ДополнительныеСведения разработчикам рекомендуется использовать штатные экспортные методы БСП из общего модуля УправлениеСвойствами. Это гарантирует корректную работу с кэшем и правами доступа.

Рассмотрим основные методы, которые помогают решать типовые задачи:

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

Альтернативные подходы: идентификация по ссылке или GUID

Если по каким-то причинам заполнить реквизит Имя невозможно, существуют альтернативные варианты фиксации ссылки на свойство:

  1. Хранение Уникального Идентификатора (UUID): в коде внешней обработки или модуля прописывается строковый УникальныйИдентификатор свойства, по которому ссылка восстанавливается методом ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(). Ссылка и её UUID сохраняются при любых обновлениях конфигурации.
  2. Хранение ссылок в настройках: ссылка на дополнительный реквизит может быть вынесена в параметры подсистем, константы или общее хранилище настроек программы, где администратор единожды выбирает нужный элемент интерактивно.

Ограничения дополнительных реквизитов и архитектурные альтернативы

Выясним причину, почему перегружать документы и справочники большим количеством дополнительных реквизитов для тяжелой бизнес-логики (например, обменов с терминалами сбора данных) не рекомендуется:

  1. Снижение производительности: значения дополнительных реквизитов хранятся в табличной части объекта с составным типом данных Характеристика.ДополнительныеРеквизитыИСведения. При построении сложных отчетов и выборок требуется строить множественные левые соединения (LEFT JOIN), что сильно нагружает СУБД.
  2. Блокировки данных: для изменения даже одного дополнительного реквизита требуется полная перезапись всего объекта-владельца, что может приводить к конфликтам блокировок при высокой конкурентной нагрузке.

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

← На главную