Можно ли установить отбор по субконто в наборе записей регистра бухгалтерии 1С?

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

При работе с регистрами бухгалтерии в платформе 1С:Предприятие разработчики часто сталкиваются с необходимость модифицировать отдельные проводки в документе. Возникает логичный вопрос: можно ли наложить отбор на объект РегистрБухгалтерииНаборЗаписей не только по полю Регистратор, но и по другим реквизитам — например, по счету или субконто?

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

Архитектурное ограничение платформы 1С

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

Причина заключается в физической модели хранения данных на уровне СУБД:

  1. Перезапись целым блоком: Платформа не выполняет точечное изменение отдельной строки в таблице движений. При вызове метода Записать() платформа полностью удаляет все существующие записи регистра, принадлежащие данному регистратору, и записывает на их место новый набор.
  2. Пересчет итогов: Каждая перезапись движений документа приводит к пересчету таблиц итогов (остатков и оборотов) по задействованным счетам и аналитикам, а также требует блокировки соответствующих таблиц базы данных.

Способ редактирования отдельных проводок через Таблицу Значений

Если требуется изменить конкретные проводки (например, поменять значение субконто у пары строк), алгоритм работы строится через промежуточный объект ТаблицаЗначений. Проанализируем пошаговый процесс реализации:

  1. Прочитать весь набор записей регистра по конкретному документу-регистратору.
  2. Выгрузить набор в табличную часть или `ТаблицаЗначений`.
  3. Выполнить поиск и изменение нужных строк в памяти.
  4. Загрузить модифицированную таблицу обратно в набор записей и выполнить запись.

Рассмотрим пример программного кода для реализации этого подхода:


// Создаем набор записей и задаем единственно возможный отбор по регистратору
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();

// Выгружаем проводки в таблицу значений
ТаблицаПроводок = НаборЗаписей.Выгрузить();

// Индексируем колонку для ускорения поиска на больших объемах
ТаблицаПроводок.Индексы.Добавить("СубконтоДт1");

// Формируем условия поиска целевых строк
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("СубконтоДт1", СтароеСубконто);

НайденныеСтроки = ТаблицаПроводок.НайтиСтроки(ПараметрыПоиска);

// Модифицируем найденные проводки
Для Каждого СтрокаТЗ Из НайденныеСтроки Цикл
    СтрокаТЗ.СубконтоДт1 = НовоеСубконто;
КонецЦикла;

// Загружаем данные обратно и записываем набор
НаборЗаписей.Загрузить(ТаблицаПроводок);

// Отключаем лишние проверки для ускорения записи
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();

Рекомендации по работе с большими документами (десятки тысяч проводок)

Если документ содержит 10 000–20 000 и более проводок, выгрузка и полная перезапись всего набора ради нескольких строк создает колоссальную нагрузку на СУБД и таблицы итогов. Для оптимизации таких операций рекомендуется применять следующие архитектурные подходы:

  1. Разбиение на небольшие документы при загрузке: Если проводки формируются при интеграции с внешними системами, не следует создавать один документ на десятки тысяч строк. Рекомендуется логически разбивать данные на несколько регистраторов (оптимально до 500–1000 проводок на один документ). Это снижает объем единовременно перезаписываемого набора.
  2. Метод корректировочных проводок (дельта-изменения): Вместо перезаписи исходных проводок исторического документа создавайте отдельный документ-корректировку (например, «Операция» или «Сторно»), который вносит только дельту изменений. Это исключает перезапись гигантского набора записей и сохраняет историю операций.
  3. Использование свойства `ОбменДанными.Загрузка`: Всегда устанавливайте свойство НаборЗаписей.ОбменДанными.Загрузка = Истина при программной перезаписи. Это отключает выполнение тяжелых обработчиков событий модуля набора записей.
  4. Включение режима разделения итогов: Для уменьшения блокировок таблиц остатков и оборотов при массовой записи данных убедитесь, что в свойствах регистра бухгалтерии включен режим разделения итогов.
← На главную