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