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