14. Механизмы сложных периодических расчетов
#50

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

В механизме сложных периодических расчётов 1С при сторнировании результатов прошлых периодов (например, когда вводят «задним числом» больничный и нужно отменить часть ранее начисленного оклада) как может соотноситься количество создаваемых сторно-записей с количеством сторнируемых записей регистра расчёта?

Сторно-записей будет ровно столько же, сколько записей мы сторнируем: всегда 1 к 1
Неправильно: Сторнирование в расчётных регистрах формируется по конфликтующим интервалам периода действия, а не строго «по строкам». Одна исходная запись может давать несколько сторно-фрагментов, поэтому соответствие 1 к 1 не гарантируется.
Сторно-записей может получиться меньше, чем сторнируемых записей
Неправильно: Если записи действительно конфликтуют и требуют отмены, обычно для каждой затронутой части нужно сформировать сторно-движение. На практике механизм чаще приводит к разбиению на интервалы (то есть к увеличению количества строк), а не к «схлопыванию» нескольких отмен в одну запись.
Сторно-записей может быть больше, чем исходных сторнируемых записей
Правильно: При конкуренции/вытеснении по периоду действия одна сторнируемая запись может быть «порезана» на несколько непересекающихся интервалов, и для каждого интервала формируется отдельная сторно-запись. Поэтому итоговое число сторно-строк способно превысить количество исходных записей, которые корректируются.

Пояснение

В сложных периодических расчётах сторнирование чаще всего используют, когда данные вводят в текущем периоде, но период действия относится к прошлому (классический пример: в декабре обнаружили больничный за ноябрь). Из-за приоритета по периоду регистрации «поздняя» запись не может вытеснить «раннюю» напрямую, и тогда формируют сторно-записи, которые отменяют ранее рассчитанные результаты на конфликтующем участке периода действия. Ключевой момент: сторно формируется не «одна строка на одну строку», а по интервалам пересечения (конфликтам) фактического периода действия. Если исходная запись длинная, а конкурирующих записей несколько или они перекрывают её частями, то отменять придётся отдельные куски - и каждый кусок будет отдельной сторно-записью. Практический пример: - Есть запись «Оклад» на 01-30.11 (одна строка). - В декабре вводят два документа за ноябрь: «Больничный» на 10-12.11 и «Отгул» на 20-21.11 (оба должны вытеснить оклад в своих интервалах). - Чтобы дать действовать этим записям, оклад нужно сторнировать на двух интервалах: 10-12 и 20-21. В итоге из одной сторнируемой записи получится две сторно-записи (то есть сторно-строк больше, чем исходных). Как обычно делают в коде: 1) Формируют набор записей регистра расчёта по новому документу. 2) Вызывают метод получения «дополнения» (таблицы данных для сторнирования) для выявления конфликтующих записей прошлых периодов регистрации. 3) В цикле добавляют движения-сторно в набор: копируют ключевые измерения/ресурсы, устанавливают признак «Сторно», задают период регистрации текущим, а период действия - равным интервалу сторнирования (начало/конец сторно из таблицы). Проверка себя: если при одном «длинном» окладе и нескольких «коротких» вытесняющих событиях вы видите несколько строк сторно - это нормальное и ожидаемое поведение механизма.