При разработке новой подсистемы или добавлении нестандартного документа в конфигурацию «1С:Предприятие» часто возникает дилемма: формировать ли отдельный регистр накопления (или сведений), если источником данных выступает всего один документ, или же строить аналитические отчеты напрямую по его табличным частям. Рассмотрим, как устроены механизмы хранения данных платформы, и разберем, почему создание регистра является архитектурным стандартом разработки.
На первый взгляд кажется, что создание регистра накопления с теми же реквизитами, что и в табличных частях (ТЧ) документа, — это избыточное дублирование информации. Однако обращение к табличным частям документа в аналитических отчетах несет в себе ряд серьезных технических ограничений:
Ссылка и НомерСтроки. В таблице ТЧ физически отсутствует дата документа. Чтобы отобрать записи за период, СУБД вынуждена выполнять соединение (JOIN) с таблицей шапки документа. Если в ТЧ отсутствуют специализированные индексы по аналитическим полям, построение выборки приводит к операциям полного сканирования таблицы (Table Scan или Index Scan), что кардинально замедляет выполнение отчетов при росте информационной базы.ПОЛНОЕ СОЕДИНЕНИЕ, вложенные запросы или группировки). Это создает дополнительную вычислительную нагрузку на процессор и оперативную память сервера СУБД при каждом формировании отчета пользователем.Проведен = Истина и ПометкаУдаления = Ложь. Ошибка в условиях выборки приведет к искажению аналитических данных.Оборотный регистр накопления решает описанные проблемы за счет механизмов оптимизации и предрассчитанных итогов:
Обороты платформа автоматически считывает готовые агрегированные значения за закрытые месяцы и вычисляет движения только за неполные граничные периоды. Это обеспечивает высокую скорость формирования отчетов даже на миллионах записей.УдалениеДвижений и ЗаписьДвиженийПриПроведении. В регистре всегда находятся только актуальные и подтвержденные данные.Проанализируем работу системы при одновременной работе нескольких пользователей. Для оборотного регистра накопления доступна опция «Разрешить разделение итогов». Данный механизм предотвращает взаимоблокировки (deadlocks) в СУБД при параллельном проведении документов несколькими пользователями, распределяя записи итогов со смещением.
В случае применения прямых запросов к табличным частям документов блокировки могут конфликтовать с операциями проведения, что негативно сказывается на общей отзывчивости системы.
Использование оборотного регистра накопления накладывает определенные требования к администрированию системы:
Обороты необходимо настроить регламентное задание пересчета итогов или использовать метод:
РегистрыНакопления.ИмяРегистра.УстановитьПериодРассчитанныхИтогов(КонецМесяца(ТекущаяДата()));
Прямые запросы к табличным частям документа оправданы в ограниченном числе сценариев:
Если же по данным предполагается строить регулярные сводные отчеты, графики, панели показателей или фильтровать информацию за произвольные периоды времени, создание оборотного регистра накопления является единственно верным архитектурным решением.