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