Многие разработчики при работе с конфигурациями 1С:Управление производственным предприятием (УПП) 1.3 или 1С:Комплексная автоматизация (КА) 1.1 сталкиваются с ситуацией: программная очистка регистра сведений ЗначенияСвойствОбъектов для конкретной номенклатуры не приводит к исчезновению строк свойств из экранной формы. Мы видим пустые значения, но сами наименования свойств продолжают «висеть» в списке. В этой статье мы подробно разберем, как работает механизм дополнительных свойств, почему стандартный набор записей не решает задачу скрытия строк и как правильно управлять видимостью свойств для конкретных объектов.
Для начала проанализируем, откуда программа берет данные для построения списка свойств. В старых конфигурациях 1С используется двухуровневая система. Сами значения хранятся в регистре сведений ЗначенияСвойствОбъектов, однако список доступных свойств для объекта (например, для справочника Номенклатура) определяется настройками в Плане видов характеристик (ПВХ) СвойстваОбъектов и регистре сведений НазначенияСвойствОбъектов.
Когда мы открываем форму свойств номенклатуры, система запускает специальную обработку (обычно это встроенная обработка ЗначенияСвойствОбъектов), которая выполняет сложный запрос. Рассмотрим упрощенную логику этого процесса: система выбирает все свойства, которые теоретически могут быть назначены данному типу объекта, и делает ЛЕВОЕ СОЕДИНЕНИЕ с фактическими значениями из регистра. Если записи в регистре нет, свойство всё равно попадает в выборку, но с пустым (NULL) значением.
Давайте проанализируем структуру запроса, который используется в типовых решениях для вывода списка свойств. Понимание этого кода — ключ к решению проблемы «лишних» строк.
|ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ
| СвойстваОбъектов.Наименование КАК СвойстваОбъектовНаименование,
| СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления,
| СвойстваОбъектов.Ссылка КАК Свойство,
| РегистрСведений.ЗначенияСвойствОбъектов.Значение КАК Значение
|ИЗ
| (
| ВЫБРАТЬ
| ПланВидовХарактеристик.СвойстваОбъектов.Ссылка КАК Ссылка,
| ПланВидовХарактеристик.СвойстваОбъектов.Наименование КАК Наименование,
| ПланВидовХарактеристик.СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления
| ИЗ
| ПланВидовХарактеристик.СвойстваОбъектов
| ГДЕ
| ПланВидовХарактеристик.СвойстваОбъектов.НазначениеСвойства В ( &НазначениеСвойств )
| ) КАК СвойстваОбъектов
|ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
| РегистрСведений.ЗначенияСвойствОбъектов
|ПО
| РегистрСведений.ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
| И
| РегистрСведений.ЗначенияСвойствОбъектов.Объект = &ОбъектОтбораЗначений
Как мы видим, основным источником данных выступает ПланВидовХарактеристик.СвойстваОбъектов. Даже если мы полностью очистим регистр ЗначенияСвойствОбъектов следующим кодом:
Набор = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Номенклатура);
Набор.Записать(); // Удаляем все записи для конкретного объекта
Сами свойства из ПланВидовХарактеристик никуда не исчезнут. Они продолжат отображаться, так как условие ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ выведет все назначенные свойства, просто поле Значение будет пустым.
Выясним причину, по которой свойства считаются «назначенными». В системе существует механизм уточнения видимости свойств через регистр сведений НазначенияСвойствОбъектов. Рассмотрим варианты управления списком свойств:
НазначениеСвойства заполнено типом СправочникСсылка.Номенклатура, и при этом в регистре НазначенияСвойствОбъектов нет никаких записей для этого свойства, оно будет отображаться у всех элементов справочника Номенклатура без исключения.НазначенияСвойствОбъектов, указав в качестве объекта конкретную группу (папку) номенклатуры. В этом случае свойство будет «привязано» только к товарам внутри этой группы.ЗначенияСвойствОбъектов.Проанализируем ситуацию, когда в списке отображаются свойства, которые уже помечены на удаление или вообще не должны быть видны. В Сообщении 25 автор упоминает о 7 элементах, которые «видны везде». Это часто происходит по следующим причинам:
Во-первых, проверьте настройки самого Плана видов характеристик. Если свойство создано, но его поле НазначениеСвойства пустое (равно NULL) или содержит битую ссылку, алгоритм построения дерева в КА/УПП может ошибочно интерпретировать его как «общее» свойство.
Во-вторых, стоит обратить внимание на кэширование данных. При работе на сервере изменения в структуре свойств могут подхватываться не сразу. Рассмотрим шаги для очистки ситуации:
НазначенияСвойствОбъектов. Если там пусто, значит оно назначено всему справочнику через тип значения в ПВХ.ГДЕ ПометкаУдаления = ЛОЖЬ. В некоторых доработанных конфигурациях этот фильтр может отсутствовать.Разберем ситуацию, когда отладчик «не видит» код, так как он выполняется на стороне сервера. В конфигурациях 1С 8.x (особенно на обычных формах) формирование наборов свойств часто выносится в общие модули с пометкой «Сервер». Для успешной отладки выполним следующие действия:
-debug. Без этого отладка серверных вызовов невозможна.СформироватьЗапросПоСвойствам() или аналогичной в модуле обработки ЗначенияСвойствОбъектов.Подведем итог: если вам нужно не просто очистить значения, а именно **убрать строки свойств** из интерфейса, работайте не с регистром ЗначенияСвойствОбъектов, а с ПВХ СвойстваОбъектов и регистром НазначенияСвойствОбъектов. Помните, что в типовой логике 1С свойство либо доступно для всего класса объектов (или группы), либо недоступно совсем. Для реализации более тонкой настройки (например, фильтрации по конкретным условиям элемента) потребуется доработка запроса в механизме вывода свойств.