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