Как правильно очистить остатки регистра накопления, если измерения заполнены не полностью?

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

Понимание архитектуры регистра накопления

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

Когда вы выполняете движения по регистру, вы работаете не с отдельными измерениями, а с уникальной комбинацией всей аналитики. Если в вашем регистре пять измерений, то для платформы 1С комбинация {А, Б, В, Пусто, Пусто} является уникальным ключом, отличным от {А, Б, В, Г, Д}. Это означает, что если вы попытаетесь списать остаток, заполнив только два измерения, система не «поймет», что вы хотите обнулить остатки по всей группе — она просто создаст новую запись с новой комбинацией ключей.

Почему возникает проблема «бардака» в остатках?

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

Чтобы избежать этой ошибки, придерживайтесь главного правила: списание всегда должно быть симметричным приходу. Если логика вашего учета предполагает, что аналитика может быть не заполнена (снята галочка «Запрет незаполненных»), то именно разработчик несет ответственность за контроль полноты данных при формировании движений документа.

Пошаговое решение задачи по списанию остатков

Для корректного обнуления остатков выполните следующие действия:

  1. Получите текущие остатки: Используйте запрос к виртуальной таблице Остатки. Этот метод позволяет автоматически получить свернутые данные по всем комбинациям измерений, по которым на текущий момент числится остаток.
  2. Сформируйте выборку: В запросе обязательно укажите все пять измерений регистра в секции ГРУППИРОВАТЬ ПО (или просто выберите их в списке полей).
  3. Создайте движения: Создайте документ КорректировкаЗаписейРегистров или программно сформируйте набор записей. Для каждой строки, полученной из виртуальной таблицы Остатки, создайте запись с противоположным знаком (минусовое количество), в точности повторяющую аналитику (набор измерений) исходной записи.

Пример алгоритма списания остатков

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


// Пример программного получения остатков для последующего списания
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    РН.Измерение1,
    |    РН.Измерение2,
    |    РН.Измерение3,
    |    РН.Измерение4,
    |    РН.Измерение5,
    |    РН.КоличествоОстаток КАК Количество
    |ИЗ
    |    РегистрНакопления.ВашРегистр.Остатки(&Период, ) КАК РН
    |ГДЕ
    |    РН.КоличествоОстаток <> 0";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

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

Пока Выборка.Следующий() Цикл
    Движение = НаборЗаписей.ДобавитьРасход();
    Движение.Период = ТекущаяДата();
    Движение.Измерение1 = Выборка.Измерение1;
    Движение.Измерение2 = Выборка.Измерение2;
    Движение.Измерение3 = Выборка.Измерение3;
    Движение.Измерение4 = Выборка.Измерение4;
    Движение.Измерение5 = Выборка.Измерение5;
    Движение.Количество = Выборка.Количество; // Списываем именно то, что есть
КонецЦикла;

НаборЗаписей.Записать();

Важные рекомендации

Никогда не пытайтесь «усреднить» или «выборочно очистить» измерения. Технически вы можете создать запись, где три измерения из пяти будут пустыми, но это не обнулит записи с заполненными измерениями, а лишь добавит в регистр новые «отрицательные» строки. Всегда проверяйте результат через виртуальную таблицу Остатки после проведения корректировки — если алгоритм верен, остаток по всей комбинации должен стать равным нулю.

Если вы новичок, помните: измерения регистра накопления — это основа вашей аналитической модели. Если логика задачи требует, чтобы у некоторых контрагентов учет велся по договорам, а у других — нет, то проектируйте структуру так, чтобы эти состояния были четко разграничены. Снятие признака «Запрет незаполненных» в конфигураторе — это инструмент для гибкости, но он требует от вас повышенного внимания к алгоритмам записи данных.

← На главную