Особенности применения метода ПолучитьДополнение() набора записей регистра расчета

Данный метод предназначен для получения данных, позволяющих выполнить сторнирование записей регистра расчета. Его рекомендуется использовать перед записью набора записей регистра расчета с поддержкой периода действия.
При его использовании следует помнить, что возвращаемая таблица значений – это не данные, "готовые к употреблению", – ее строки нельзя просто "дописать" в набор записей регистра расчета. Возвращаемая таблица значений содержит строки, представляющие собой данные тех записей регистра расчета, которые конкурируют по периоду действия с текущими записями набора.

Количество строк возвращаемой таблицы значений

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

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

Структура возвращаемой таблицы значений

Колонки таблицы значений – это все предопределенные поля записи регистра расчета (кроме регистратора и номера записи), все измерения, ресурсы и реквизиты. Кроме того, таблица содержит дополнительные поля – рекомендуемый период регистрации сторнирования ("ПериодРегистрацииСторно"), рекомендуемая дата начала и дата окончания для записи сторнирования ("ПериодДействияНачалоСторно" и "ПериодДействияКонецСторно"). Зачастую значения полей "ПериодДействияНачалоСторно" и "ПериодДействияНачало" в возвращаемой таблице значений совпадают, но в общем случае это не так.

Принцип формирования таблицы значений

Запись регистра расчета имеет ряд свойств, "привязывающих" ее к оси времени. Для темы настоящего раздела важны свойства ПериодДействияНачало, ПериодДействияКонец и ПериодРегистрации. ПериодРегистрации – дата, с которой запись влияет на учет. Начало и окончание периода действия – даты, которые ограничивают "обслуживаемый" данной записью промежуток времени. Так, например, вид расчета, обслуживающий расчет оплаты по больничному листу, может быть зарегистрирован в феврале (период регистрации) и при этом относится к периоду с 5-го по 15-ое января (границы периода действия). При записи набора записей регистра расчета с поддержкой периода действия, каждый раз формируется фактический период действия записей регистра. Это формирование выполняется исходя из настроек плана видов расчета, и в данной статье подробно обсуждаться не будет. Для нас важно, что фактический период действия записи того набора, который мы собираемся поместить в систему, может не соответствовать заданным для нее датам периода действия.

Рассмотрим на примере расчетов с персоналом

Пусть в регистре расчета уже имеется запись с видом расчета "Основной заработок", зарегистрированная в марте и имеющая период действия 1 марта – 20 марта (т.е. ранее – в марте – мы уже ввели в систему информацию, что начислен основной заработок за первые двадцать дней марта). Набор записей, который мы хотим записать, содержит единственную запись с видом расчета "Оплата болезни", периодом регистрации апрель и периодом действия 15 марта – 25 марта (т.е. мы сейчас – в апреле – хотим ввести в систему информацию, что за период с 15 по 25 марта нужно оплатить время болезни.
Если не предпринять дополнительных усилий, при записи нашего набора для его единственной записи будет сформирован фактический период действия с 21 по 25 марта, так как период по 20 марта включительно "занят" оплатой основного заработка.
Но перед записью нашего набора записей мы можем предпринять усилия для изменения этой ситуации – дополнить наш набор еще одной записью: сторно "Основного заработка" за период с 15 по 20 марта. Это приведет к тому, что при записи нашего набора в системе появится сторнирующая запись для основной оплаты и за счет этого фактический период действия записи "Оплата болезни" останется таким, которым мы его хотели сделать – с 15 по 25 марта.
На этом примере понятно, что для разрешения описанной проблемы нужно средство, позволяющее понять, какие дополнительные сторнирующие записи нужно ввести в набор, чтобы у текущих записей набора не исказился фактический период действия. Таким средством и является метод ПолучитьДополнение(). В нашем случае, при соответствующей настройке плана видов расчета, мы в результате работы этого метода получим таблицу значений с единственной строкой и следующими значениями колонок: 

Колонка Значение

ВидРасчета

Основной заработок

ПериодРегистрации

март

ПериодДействияНачало

1 марта

ПериодДействияКонец

20 марта

ПериодРегистрацииСторно

апрель

ПериодДействияНачалоСторно

15

ПериодДействияКонецСторно

20

...

 

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

  1. Ранее пользователь ввел недостоверные данные - не знал, что человек болеет, и оплатил ему период с 1-го по 20-ое. Значит, сейчас просто введем сторно-запись.
  2. Сейчас пользователь ошибся при вводе периода действия – значит, выдадим сообщение об ошибке и не запишем такой набор записей.
  3. Пользователь ввел противоречивые данные – спросим его что делать: провести документ со сторнированием, провести без сторнирования или не проводить.

Заметим, что для всех трех стратегий необходимо воспользоваться методом ПолучитьДополнение() для принятия решения.

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

Для реализации стратегии 1 нам придется дополнить набор записей и, следовательно, написать примерно следующий код:

Копировать в буфер обмена

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

    Движение.ПериодРегистрации = СтрокаСторно.ПериодРегистрацииСторно;
    Движение.ПериодДействияНачало = СтрокаСторно.ПериодДействияНачалоСторно;
    Движение.ПериодДействияКонец = СтрокаСторно.ПериодДействияКонецСторно;
    Движение.ВидРасчета = СтрокаСторно.ВидРасчета;
    Движение.Сторно = Истина;
    ...
КонецЦикла;

В случае применения стратегий 2 или 3 мы также будем использовать данные таблицы для формирования сообщения об ошибке или текста вопроса пользователю.

Почему  важен период регистрации

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

Сторно Вид расчета Период регистрации ПериодДействияНачало ПериодДействияКонец

Нет

Основной заработок

март

1 марта

20 марта

Да

Основной заработок

апрель

15 марта

20 марта

Нет

Оплата болезни

апрель

15 марта

25 марта

то мы получим, что фактический период действия первой записи не изменился (апрельские записи на него не повлияли), а фактический период действия записи "Оплата болезни" также не изменился, так как мешающий ей период с 15-го по 20-ое "прикрыт" сторнирующей записью.

Следовательно, и метод ПолучитьДополнение() возвращает данные только по тем затрагиваемым записям, которые имеют более ранний период регистрации, чем записи набора. В общем случае записи набора могут иметь разные периоды регистрации, поэтому возвращаемая таблица значений имеет такую колонку как "ПериодРегистрацииСторно".