Почему после удаления записей из регистра ЗначенияСвойствОбъектов свойства всё равно отображаются в карточке номенклатуры?

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

Многие разработчики при работе с конфигурациями 1С:Управление производственным предприятием (УПП) 1.3 или 1С:Комплексная автоматизация (КА) 1.1 сталкиваются с ситуацией: программная очистка регистра сведений ЗначенияСвойствОбъектов для конкретной номенклатуры не приводит к исчезновению строк свойств из экранной формы. Мы видим пустые значения, но сами наименования свойств продолжают «висеть» в списке. В этой статье мы подробно разберем, как работает механизм дополнительных свойств, почему стандартный набор записей не решает задачу скрытия строк и как правильно управлять видимостью свойств для конкретных объектов.

Анализ механизма хранения и отображения свойств

Для начала проанализируем, откуда программа берет данные для построения списка свойств. В старых конфигурациях 1С используется двухуровневая система. Сами значения хранятся в регистре сведений ЗначенияСвойствОбъектов, однако список доступных свойств для объекта (например, для справочника Номенклатура) определяется настройками в Плане видов характеристик (ПВХ) СвойстваОбъектов и регистре сведений НазначенияСвойствОбъектов.

Когда мы открываем форму свойств номенклатуры, система запускает специальную обработку (обычно это встроенная обработка ЗначенияСвойствОбъектов), которая выполняет сложный запрос. Рассмотрим упрощенную логику этого процесса: система выбирает все свойства, которые теоретически могут быть назначены данному типу объекта, и делает ЛЕВОЕ СОЕДИНЕНИЕ с фактическими значениями из регистра. Если записи в регистре нет, свойство всё равно попадает в выборку, но с пустым (NULL) значением.

Разбор типового запроса формирования списка свойств

Давайте проанализируем структуру запроса, который используется в типовых решениях для вывода списка свойств. Понимание этого кода — ключ к решению проблемы «лишних» строк.


|ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ
| СвойстваОбъектов.Наименование КАК СвойстваОбъектовНаименование,
| СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления,
| СвойстваОбъектов.Ссылка КАК Свойство,
| РегистрСведений.ЗначенияСвойствОбъектов.Значение КАК Значение
|ИЗ
| (
| ВЫБРАТЬ
| ПланВидовХарактеристик.СвойстваОбъектов.Ссылка КАК Ссылка,
| ПланВидовХарактеристик.СвойстваОбъектов.Наименование КАК Наименование,
| ПланВидовХарактеристик.СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления
| ИЗ
| ПланВидовХарактеристик.СвойстваОбъектов
| ГДЕ
| ПланВидовХарактеристик.СвойстваОбъектов.НазначениеСвойства В ( &НазначениеСвойств )
| ) КАК СвойстваОбъектов
|ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
| РегистрСведений.ЗначенияСвойствОбъектов
|ПО
| РегистрСведений.ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
| И
| РегистрСведений.ЗначенияСвойствОбъектов.Объект = &ОбъектОтбораЗначений

Как мы видим, основным источником данных выступает ПланВидовХарактеристик.СвойстваОбъектов. Даже если мы полностью очистим регистр ЗначенияСвойствОбъектов следующим кодом:


Набор = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Номенклатура);
Набор.Записать(); // Удаляем все записи для конкретного объекта

Сами свойства из ПланВидовХарактеристик никуда не исчезнут. Они продолжат отображаться, так как условие ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ выведет все назначенные свойства, просто поле Значение будет пустым.

Как скрыть свойства для конкретной номенклатуры?

Выясним причину, по которой свойства считаются «назначенными». В системе существует механизм уточнения видимости свойств через регистр сведений НазначенияСвойствОбъектов. Рассмотрим варианты управления списком свойств:

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

Проблема «лишних» и удаленных свойств

Проанализируем ситуацию, когда в списке отображаются свойства, которые уже помечены на удаление или вообще не должны быть видны. В Сообщении 25 автор упоминает о 7 элементах, которые «видны везде». Это часто происходит по следующим причинам:

Во-первых, проверьте настройки самого Плана видов характеристик. Если свойство создано, но его поле НазначениеСвойства пустое (равно NULL) или содержит битую ссылку, алгоритм построения дерева в КА/УПП может ошибочно интерпретировать его как «общее» свойство.

Во-вторых, стоит обратить внимание на кэширование данных. При работе на сервере изменения в структуре свойств могут подхватываться не сразу. Рассмотрим шаги для очистки ситуации:

Отладка на сервере

Разберем ситуацию, когда отладчик «не видит» код, так как он выполняется на стороне сервера. В конфигурациях 1С 8.x (особенно на обычных формах) формирование наборов свойств часто выносится в общие модули с пометкой «Сервер». Для успешной отладки выполним следующие действия:

  1. Убедимся, что сервер 1С:Предприятия запущен с ключом -debug. Без этого отладка серверных вызовов невозможна.
  2. В конфигураторе перейдем в меню Отладка -> Подключение и проверим, включены ли «Фоновые задания» и «Серверные вызовы».
  3. Установим точку останова не в форме, а непосредственно в функции СформироватьЗапросПоСвойствам() или аналогичной в модуле обработки ЗначенияСвойствОбъектов.

Итоги и рекомендации

Подведем итог: если вам нужно не просто очистить значения, а именно **убрать строки свойств** из интерфейса, работайте не с регистром ЗначенияСвойствОбъектов, а с ПВХ СвойстваОбъектов и регистром НазначенияСвойствОбъектов. Помните, что в типовой логике 1С свойство либо доступно для всего класса объектов (или группы), либо недоступно совсем. Для реализации более тонкой настройки (например, фильтрации по конкретным условиям элемента) потребуется доработка запроса в механизме вывода свойств.

← На главную