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

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

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

Проанализируем причину. Платформа построена на принципах, схожих с бухгалтерским учетом, где у каждой хозяйственной операции (движения) должен быть первичный документ-основание. В 1С таким основанием является Документ-регистратор. Это обеспечивает целостность, последовательность и прослеживаемость данных. Записи в регистрах, не имеющие "хозяина", считаются некорректными и могут быть удалены, например, при выполнении процедуры Тестирования и Исправления информационной базы (ТИИ).

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

Решение 1: Использование штатного документа "Корректировка записей регистров"

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

Разберем по шагам, как это работает:

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

В результате вы получите корректные записи в регистре, где регистратором будет выступать сам документ "Корректировка записей регистров". Этот подход гарантирует сохранение целостности данных.

Решение 2: Создание технического (фиктивного) документа-регистратора

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

Суть подхода в том, чтобы создать в конфигурации специальный, "технический" вид документа, единственная цель которого — служить регистратором для таких операций. Рассмотрим два варианта реализации.

Вариант А: Один общий технический документ

Вы создаете один-единственный экземпляр технического документа (например, с датой начала ведения учета) и используете его для всех программных записей. Это простой в реализации способ, но у него есть существенный недостаток: при большом количестве одновременных записей в многопользовательском режиме могут возникать проблемы с блокировками данных, так как все операции будут пытаться захватить один и тот же документ. Это может серьезно замедлить работу системы.

Вариант Б: Новый технический документ на каждую операцию (рекомендуемый)

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

Посмотрим на пример кода, как это может выглядеть:


// Создаем новый технический документ
ТехническийДокумент = Документы.ТехническаяОперация.СоздатьДокумент();
ТехническийДокумент.Дата = ТекущаяДата();
ТехническийДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь;
ТехническийДокумент.Комментарий = "Техническая запись в регистр остатков";

// Формируем движения в регистре
Движение = ТехническийДокумент.Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = ТехническийДокумент.Дата;
Движение.Номенклатура = СсылкаНаНоменклатуру;
Движение.Склад = СсылкаНаСклад;
Движение.Количество = 10;

// Записываем документ вместе с движениями
ТехническийДокумент.Записать(РежимЗаписиДокумента.Проведение);

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

Решение 3: Эмуляция независимого регистра накопления

Иногда стоит задача создать хранилище данных, которое по своей логике похоже на регистр накопления (нужно быстро получать остатки и обороты), но при этом не должно быть привязано к документам. В таком случае можно эмулировать его поведение с помощью других объектов метаданных.

Использование периодического регистра сведений

Выясним, как это реализовать. Можно создать независимый (неподчиненный регистратору) периодический РегистрСведений. Его структура будет имитировать регистр накопления:

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

В итоге, хотя прямого способа записи в РегистрНакопления без регистратора не существует, платформа предоставляет гибкие и надежные механизмы для решения практически любой задачи. Главное — выбрать подход, который соответствует вашим требованиям к производительности и логике системы.

← К списку