Введение
Ниже приведены рассуждения о разработке структуры базы данных на платформе "1С:Предприятие". Все рассуждения приведены в обобщенном "типовом" для "1С:Предприятие" виде. Дополнительно приводятся некоторые встречающиеся на практике особенности применения.
Для описания структуры данных в 1С:Предприятия применяются:
Справочник - информация об однотипных объектах (Сотрудники, Склады, Номенклатура и т.д.).
В справочники записывается "статичная" информация об объекте, которая не меняется со временем.
Кроме того, справочники создаются для организации дополнительных классификаторов объектов (Виды номенклатуры, Группы доступа и т.д.)
Документы - информация о событиях, которые изменяют состояние ресурсов предприятия.
Проведенный документ - это отраженная в учете информация о событии.
С документом допускается следующие операции:
- Проведение документа - документ принимается к учету.
- Отмена проведения - документ исключается из учета.
- Перепроведение - обновление информации в учете.
Возможность отмены проведения и перепроведения документов приводит к тому, что информация о состоянии ресурсов предприятия может изменяться "задним числом".
Рассмотрим для примера "Договор поставки". Формально, договор - это документ (лист бумаги), но с точки зрения учетной системы - договор это справочник. Это связано с тем, что факт подписания договора не изменяет состояние ресурсов. Резервирование товаров под договор, оплата по договору и другие события, изменяющие состояние ресурсов фиксируются отдельными документами, а сам договор является объектом (аналитикой).
Регистр - таблица для накопления информации об изменении состояния ресурсов предприятия. Примеры изменяющихся во времени ресурсов: Остаток товаров на складах, Цены на товары, Состояние взаиморасчетов с контрагентами.
На основании информации содержащейся в разных документах формируются записи в регистры.
Уникальная комбинация значений, однозначно определяющее значение ресурса, образует измерения. Так, если вид цены (опт, розница) и номенклатура однозначно определяют цену, то в регистре необходимы два измерения: "Вид цены" и "Номенклатура". В случае если для однозначного определения цены надо еще знать упаковку, то потребуется добавить еще одно измерение: "Упаковка".
При агрегации (обработке) записей регистра возможно получение информации о состоянии ресурсов на произвольный момент времени. Разные способы агрегации (сумма, поиск последнего) требуют разной структуры данных для оптимизации скорости обработки записей регистра. В связи с этим в 1С:Предприятии реализовано несколько различных видов регистров.
Документ, на основании которого формируются записи в регистре, называется регистратором.
Совокупность справочников, документов и регистров обычно называют "архитектурой".
Для аналитика крайне важно уметь:
- Анализируя процессы предприятия, определить:
- Ресурсы предприятия, изменение состояния которых должна отслеживать информационная система.
- Измерения, позволяющие однозначно определить состояние ресурсов. Т.к. значениями измерений обычно являются элементы справочников, то в это же время определяются необходимые справочники.
- События (документы) при которых происходит изменение состояния ресурсов.
- Анализируя имеющуюся в типовых решениях регистры, справочники и документы, определить их пригодность для отражения состояния ресурсов предприятия.
Регистры сведений
Регистр сведений это таблица в базе данных, записи в которой представляют собой структуру "Ключ -> Значения".
Ключ (измерения) - это уникальная совокупность значений, которая однозначно определяет значение ресурсов и реквизитов.
Приведем пример регистра сведений:
Далее при описании регистров сведений будет использоваться слово "Ресурсы" вместо "Ресурсы и Реквизиты", т.к. технически в регистрах сведений ресурсы и реквизиты работают одинаково.
Регистр сведений - единственный регистр, в который могут вноситься записи как с привязкой к документу (регистратору), так и вручную.
Оба способа ввода данных одновременно использовать не допускается.
Непериодический регистр сведений
Таблица непериодического регистра сведений содержит следующие колонки:
- Регистратор (если записи вносятся в регистр через документ)
- Измерения
- Ресурсы
- Реквизиты
Рассмотрим пример анализа регистра "Разрешения операций с товарами" (структуру регистра смотри на картинке выше).
Пусть в справочнике "Номенклатура" есть флаг "Использовать упаковки при указании разрешений на операции с товарами".
В этом случае, аналитику по данному регистру требуется согласовать следующие утверждения:
- Объем данных, которые надо внести в регистр:
Для каждого Склада, Товара, Упаковки (если используются) надо указать разрешения отдельно.
Если на предприятии имеется 10 складов, 10 тыс. товаров, и для половины товаров планируется использовать упаковки по 3 шт. для каждого, то для описания разрешений в регистр надо внести 200 000 записей:
10 складов * 5000 товаров без упаковок = 50 000 записей.
10 складов * 5000 товаров * 3 упаковки = 150 000 записей.
При добавлении новой номенклатуры или складов так же придется добавлять записи в регистр. - Поведение при отсутствии данных:
Необходимо определить поведение по умолчанию: Если запись в регистре не найдена, то что? (можно / нельзя / ошибка). - Единство назначения:
Разрешение на продажу и разрешение на закупку находятся в одной записи, а значит будут всегда устанавливаться с одинаковыми правилами:- Если разрешения устанавливаются с использованием упаковки, то и разрешения на продажи и разрешения на покупку должны устанавливается в разрезе упаковок.
- В будущем правила работы со всеми разрешениями, хранящимися в данном регистре будут меняться одновременно и по единой причине - по решению единого ответственного (руководителя).
- Единство ответственности (прав):
Пользователь имеющий право записи записи в регистр должен обладать правами / обязанностями определить все значения ресурсов одновременно. По значениям измерений может быть настроены дополнительные ограничения. Например можно ограничить пользователя в правах по редактированию записей одного склада, но нельзя ограничить в правах по редактированию одного ресурса.
Периодический регистр сведений
В случае если значения ресурсов могут изменяться во времени, и необходимо хранить историю изменения значений ресурсов, то необходимо использовать периодический регистр сведений. Структура такого регистра полностью повторяет структуру непериодического регистра сведений, описанного выше. Дополнительно в таблице регистра добавляется колонка "Период", в которой хранится дата начиная с которой действует запись. Для определения значения ресурсов на произвольную дату используется "срез первых" или "срез последних".
Рассмотрим шаги по построению среза последних:
- Найти уникальные комбинации значений измерений, которые встречаются в записях регистра с периодом меньше или равным заданному.
- Для каждой найденной уникальной комбинации измерений найти запись с максимальным периодом.
* Фактические выполняемые алгоритмы отличаются от указанного, но данное описание более наглядно отражает логику построения среза.
Поиск уникальных комбинаций значений измерений приводит к следующей важной особенности: при построении срезов платформа 1С:Предприятие всегда используются все измерения. Игнорировать часть измерений можно только разработав "собственный" механизм построения среза.
Для периодического регистра сведений надо согласовать все утверждения непериодического регистра и дополнительно согласовать следующие утверждения:
- Значения всех ресурсов регистра фиксируются одной датой, т.е. нельзя одной датой установить разрешение только на продажу, а другой датой только разрешение на закупку. При проведении "нового" документа нельзя "просто продублировать" старое значение неизменяемого ресурса" в регистре, т.к. после отмены проведения или изменения "старого" документа данные в регистре могут стать не согласованными.
- Записи в регистре будут начинать действовать с указанного периода и будут действовать до следующей записи с такими же значениями измерений. Игнорировать часть измерений нельзя.
Периодичность регистра сведений
Регистры сведений могут иметь следующие виды периодичности:
- Год - новое значение начинает действовать с 01.01.ХХХХ 00:00:00.
- Месяц - новое значение начинает действовать с 01.ХХ.ХХХХ 00:00:00.
- День - новое значение начинает действовать с ХХ.ХХ.ХХХХ 00:00:00.
- Секунда - новое значение начинает действовать с ХХ.ХХ.ХХХХ ХХ:ХХ:ХХ
- По позиции регистратора - новое значение начинает действовать с ХХ.ХХ.ХХХХ ХХ:ХХ:ХХ, но в отличии от периодичности "Секунда" допускается ввод нескольких записей с одинаковыми значениями измерений и одинаковым периодом. Порядок следования записей "внутри" одной секунды определяется по ГУИДу регистратора. В связи с тем, что пользователь не работает с ГУИДами и не может их контролировать, то использование периодических регистров с периодичностью "по позиции регистратора" не рекомендуется.
Примеры выбора периодичности регистра сведений
Рассмотрим регистр сведений "Графики работ" из демонстрационной конфигурации БСП:
Данный регистр сведений сделан непериодическим т.к. указанное значение не должно действовать до тех пор пока не появится следующая запись, т.е. если последняя запись в регистре 31.12.2022 - сокращенный рабочий день, это не значит, что все дни 2023 года сокращенные и рабочие, а означает, что данные на 2023 год не внесены.
А вот регистр "Цена номенклатуры" - периодический, т.к. введенная последняя цена будет действовать до тех пор пока не введут "новую" цену.
Использование периодичности "Секунда" для реализации работы с периодом действия "День"
Рассмотрим регистр сведений "Цены номенклатуры"
Пусть необходимо обеспечить возможность установки цен на некоторый период с ... по ... в днях.
Рассмотрим запись Молоко в период с 01.01.2022 по 01.02.2022 должно стоить 1 руб.
Тогда мы можем договориться, что для прекращения действия цены мы будем заносить нулевую цену.
Если мы создадим регистр сведений с периодичностью "день", то не сможем отразить цены за смежные периоды.
Если внести данные так:
Период | Товар | Цена |
01.01.2022 | Молоко | 1 |
01.02.2022 | Молоко | 0 |
тогда на 31.01.2022 еще будет действовать цена 1 руб., но не получится установить новую цену с 01.02.2022 т.к. такая запись в регистре уже есть.
Если внести данные так:
Период | Товар | Цена |
01.01.2022 | Молоко | 1 |
31.01.2022 | Молоко | 0 |
то тогда на 31.01.2022 уже будет действовать нулевая цена.
Решением задачи будет использование периодичности "Секунда":
Период | Товар | Цена |
01.01.2022 00:00:00 | Молоко | 1 |
31.01.2022 23:59:59 | Молоко | 0 |
Оптимизация структуры регистра для чтения / записи
В некоторых случая анализ показывает необходимость создания разной структуры регистра для операций "Чтение" и "Запись".
Рассмотрим периодический регистр "Кадровые данные":
Такая структура регистра не пригодна для записи, т.к. не позволяет устанавливать значение каждого ресурса отдельно. Тем не менее должность и оклад очевидно меняются не одновременно. В связи с этим придется изменить структуру регистра:
Это позволит записывать каждое свойство (Должность, Подразделение и Оклад) отдельно, но читать из такого регистра станет не удобно, т.к. для каждый раз надо будет искать последнюю записью для каждого свойства каждого сотрудника.
Для оптимизации чтения создается дополнительный регистр, не периодический и не подчиненный регистратору. Имя такого регистра обычно содержит суффикс "Интервальный":
Записи в "Интервальном" регистре формируются при записи в "основной" регистр. Каждая запись создается с периодом с... по... в течении которого значения ресурсов не меняются, что позволяет без дополнительные операции агрегации получить значения ресурсов на произвольную дату.
Заключение
На этом на сегодня все, большое спасибо всем, кто дочитал до конца, возможно, приведенные рассуждения помогут в решении задач требующих разработки регистров сведений.