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