Как правильно организовать хранение данных документа в регистре сведений?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке систем учета задач или Service Desk в среде 1С часто возникает вопрос: достаточно ли хранить все данные в реквизитах документа или необходимо создавать вспомогательный Регистр сведений? Рассмотрим этот вопрос подробно, проанализируем архитектурные подходы и разберем, как правильно спроектировать структуру регистра для эффективной работы системы.

Зачем нужен регистр сведений, если есть документ?

На первый взгляд кажется, что создание регистра — это дублирование данных. Однако в профессиональной разработке 1С регистры используются для решения конкретных задач, которые документ сам по себе решить не может или делает это неэффективно. Проанализируем основные причины использования регистра:

  1. Хранение истории изменений: Документ хранит только текущее состояние. Если вам нужно знать, когда заявка перешла из статуса "Новая" в статус "В работе", вам необходим периодический регистр сведений.
  2. Скорость получения данных: Запросы к виртуальным таблицам регистра (например, СрезПоследних) работают значительно быстрее, чем сложные выборки по документам с группировками по датам.
  3. Изменение данных без перепроведения: Если статус задачи или ответственный меняется в закрытом периоде, редактирование документа может быть запрещено. Независимый регистр сведений позволяет обновлять информацию, не затрагивая сам документ.
  4. Разделение прав доступа: Вы можете ограничить доступ к истории статусов или техническим деталям исполнения через права на регистр, оставляя сам документ доступным для широкого круга пользователей.

Проектирование структуры регистра: Измерения, Ресурсы, Реквизиты

Разберем, как правильно распределить данные по полям регистра на примере задачи управления ИТ-заявками. Рассмотрим структуру, где основным объектом является документ Заявка.

Измерения регистра

Измерения определяют уникальность записи. В 1С нельзя записать две строки с одинаковыми значениями измерений (и одинаковым периодом, если регистр периодический). Рассмотрим ключевые правила:

Ресурсы регистра

В ресурсы мы помещаем данные, которые составляют "содержимое" записи. Это те значения, которые мы хотим получить в результате запроса к регистру.

Реквизиты регистра

Реквизиты служат для хранения дополнительной информации, которая не участвует в уникальности и редко используется в отборах, но важна для понимания контекста записи (например, КомментарийКИзменению).

Выбор периодичности и режима записи

Рассмотрим, какой режим записи и периодичность выбрать для системы заявок. Проанализируем два основных варианта:

  1. Периодический регистр с режимом "Подчинение регистратору":

    Этот вариант идеален, если запись в регистр происходит строго в момент проведения документа. Периодичность лучше установить По позиции регистратора. Это гарантирует, что история изменений будет выстроена в строгом хронологическом порядке, даже если несколько документов проведены в одну секунду.

  2. Независимый регистр сведений:

    Позволяет менять данные программно без привязки к проведению документа. Это удобно для оперативного изменения статусов исполнителями. В этом случае периодичность устанавливается В пределах секунды.

Пример реализации записи в регистр

Рассмотрим программный код для записи состояния заявки в независимый периодический регистр сведений. Это позволяет фиксировать историю переходов между этапами выполнения.


Процедура ЗаписатьСтатусЗаявки(ТекущийДокумент, НовыйСтатус)
    
    МенеджерЗаписи = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьМенеджерЗаписи();
    
    // Устанавливаем ключ записи
    МенеджерЗаписи.Период = ТекущаяДата();
    МенеджерЗаписи.Заявка = ТекущийДокумент;
    
    // Заполняем ресурсы
    МенеджерЗаписи.Статус = НовыйСтатус;
    МенеджерЗаписи.Исполнитель = ПараметрыСеанса.ТекущийПользователь;
    
    // Записываем данные
    Попытка
        МенеджерЗаписи.Записать();
    Исключение
        Сообщить("Ошибка при фиксации статуса: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Как использовать данные регистра в отчетах?

Для получения текущего состояния всех заявок проанализируем работу с виртуальной таблицей СрезПоследних. Это самый эффективный способ узнать, "кто сейчас работает над задачей и в каком она статусе".

Пример запроса на языке 1С:


ВЫБРАТЬ
    ИсторияСтатусовСрезПоследних.Заявка КАК Заявка,
    ИсторияСтатусовСрезПоследних.Статус КАК ТекущийСтатус,
    ИсторияСтатусовСрезПоследних.Исполнитель КАК Исполнитель
ИЗ
    РегистрСведений.ИсторияСтатусовЗаявок.СрезПоследних(&Период, ) КАК ИсторияСтатусовСрезПоследних
ГДЕ
    ИсторияСтатусовСрезПоследних.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаявок.Завершена)

Что такое версионирование и стоит ли его использовать?

Выясним причину, по которой иногда вместо регистров упоминают версионирование объектов. Версионирование (часть БСП) сохраняет снимок всего документа целиком при каждом сохранении. Рассмотрим отличия:

Итоговые рекомендации

Проанализировав ситуацию, можно сделать следующие выводы для построения качественной архитектуры:

← На главную