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