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

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

При работе с регистрами сведений в 1С разработчики часто сталкиваются с задачей массового изменения статуса записей, которые соответствуют определенному временному интервалу, например, «за текущий день». Однако стандартная архитектура непериодического регистра сведений с измерением типа Дата (содержащим время) накладывает определенные ограничения на использование объекта НаборЗаписей.

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

Почему не получается просто сделать отбор по дате?

Объект НаборЗаписей в 1С предназначен для работы с физическими строками таблицы. Его отбор работает по принципу полного соответствия значений измерений. Если в качестве измерения используется поле Дата, которое включает в себя время (часы, минуты, секунды), то при установке отбора, например, на 01.01.2021, 1С будет искать записи, у которых время строго равно 00:00:00. Поскольку ваши данные имеют разное время в течение дня, обычный отбор не захватит все нужные записи.

Решение 1: Добавление вспомогательного измерения «ДатаБезВремени»

Если мы можем изменить структуру регистра, самым элегантным и производительным решением будет добавление нового измерения, например, ДатаБезВремени типа Дата (без времени). При записи данных мы будем приводить текущую дату к началу дня с помощью функции НачалоДня().

В этом случае работа с данными станет прозрачной:

  1. Создаем НаборЗаписей для регистра.
  2. Устанавливаем отбор по новому измерению: НаборЗаписей.Отбор.ДатаБезВремени.Установить(НачалоДня(ТекущаяДата()));
  3. Вызываем НаборЗаписей.Прочитать(); — теперь в наборе будут все записи за выбранный день.
  4. В цикле обходим записи и меняем статус:

Для Каждого Запись Из НаборЗаписей Цикл
    Запись.Статус = Истина;
КонецЦикла;
НаборЗаписей.Записать();

Решение 2: Использование запроса и менеджера записи

Если структура регистра зафиксирована и мы не можем вносить изменения в конфигурацию, нам поможет связка Запрос и МенеджерЗаписи. Этот метод позволяет точечно работать с записями, даже если у них разное время.

Алгоритм действий:

  1. Выполняем запрос к регистру сведений, используя параметры начала и конца дня для фильтрации записей.
  2. В цикле обхода результата запроса получаем значение всех ключевых полей (измерений).
  3. Для каждой найденной строки создаем объект МенеджерЗаписи.
  4. Устанавливаем значения ключевых полей и считываем запись.
  5. Меняем необходимые ресурсы и сохраняем данные.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ИзмерениеДата, ИзмерениеТелефон ИЗ РегистрСведений.НашРегистр ГДЕ ИзмерениеДата МЕЖДУ &НачалоДня И &КонецДня";
// Установка параметров начала и конца дня...
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Менеджер = РегистрыСведений.НашРегистр.СоздатьМенеджерЗаписи();
    Менеджер.ИзмерениеДата = Результат.ИзмерениеДата;
    Менеджер.ИзмерениеТелефон = Результат.ИзмерениеТелефон;
    Менеджер.Прочитать();
    Если Менеджер.Выбран() Тогда
        Менеджер.Статус = Истина;
        Менеджер.Записать();
    КонецЕсли;
КонецЦикла;

Решение 3: Оптимизация работы и блокировки

При массовой обработке записей важно помнить о конкурентном доступе. Использование НаборЗаписей.Записать() блокирует все записи, которые попали под отбор. Если ваш отбор слишком широк, вы рискуете заблокировать работу других пользователей.

Советы по оптимизации:

Проанализировав описанные методы, выберите тот, который лучше всего подходит под вашу текущую бизнес-задачу. Если история изменений не критична — используйте МенеджерЗаписи, если же требуется высокая производительность при частых групповых операциях — подумайте о добавлении дополнительного измерения.

← На главную