Собственно процесс расчета записей каждого поднабора состоит в получении всех необходимых данных для расчета каждой записи и вычислении значений ресурсов этой записи по формуле, определяемой способом расчета данной записи. Например, для расчета записи об окладе нужно будет получить данные графика этой записи, для расчета премии необходимо будет рассчитать базу и так далее.
Ниже приведен пример процедуры, осуществляющей расчет набора записей одного приоритета. Для каждой записи при помощи функции ПолучитьДанныеДляРасчета() возвращается структура данных, которая передается в процедуру РассчитатьЗапись().
Расчет набора записей одного приоритета
В функции ПолучитьДанныеДляРасчета() должны быть прописаны алгоритмы, при помощи которых можно получить данные для расчета записи с любым способом расчета, существующим в конфигурации. Ниже приведен пример функции, которая получает данные для трех способов расчета:
Получение данных для трех видов расчета
В данном случае для расчета записей со способом ПоМесячнойСтавке система получит данные графика за период действия и фактический период действия, для способа ПроцентомОтБазы будет получена расчетная база записи, а для способа ПоСдельнойВыработке будут рассчитаны обороты по соответствующему регистру накопления за интервал периода действия записи. Способ расчета ФиксированнойСуммой не требует получения данных.
Функция ПолучитьДанныеДляРасчета() возвращает структуру, содер- жащую различные поля в зависимости от способа расчета, применяемого в данной записи
Расчет значений ресурсов записи
После того как данные для расчета получены, необходимо прописать в модуле формулу для заполнения реквизитов каждой записи в соответствии со способом расчета. В данном случае эту функцию выполняет процедура РассчитатьЗапись(). В процедуре РассчитатьЗапись() для каждого возмож- ного способа расчета описывается формула, позволяющая из реквизитов записи и полученных данных рассчитать значения ресурсов этой записи.
Процедура расчета записей
При расчете записей следует учитывать, что сторно-записи рассчитываются в общем порядке. Поэтому в ресурсы сторно-записи должно попадать отрицательное значение результата расчета. Например, сторно- запись отменяет начисленный оклад за период 5 дней. При расчете такой записи по формуле система получит сумму оклада за 5 дней, например, 1200 руб. В ресурс сторно-записи в этом случае должно быть записано значение -1200.
Если в рассчитываемом регистре установлено свойство Период действия, в сформированном наборе могут присутствовать записи, у которых период действия принадлежит более раннему периоду, чем период регистрации. В этом случае они могут вступать в конкуренцию на этом периоде действия с записями более раннего периода регистрации. Чтобы такие записи могли иметь непустой фактический период действия, необходимо допол- нить сформированный набор соответствующими сторно-записями.
Добавление сторно-записей происходит с использованием метода ПолучитьДополнение() набора записей регистра. Ниже приведен текст модуля, позволяющий добавить в набор сторно-записи. Добавление записи происходит при помощи вызова процедуры ДобавитьСтрокуСторноОсновныхНачислений(), которая должна быть описана в процедуре РассчитатьОсновныеНачисления(). При этом для каждой сторно- записи необходимо добавить новую строку в табличную часть документа, чтобы при проведении эта запись попала в регистр
При формировании сторно-записей данные всех измерений и реквизитов записи указаны в строке дополнения. Также в этой строке содержатся данные о периоде регистрации и периоде действия сторно-записи. Ресурсы сторно-записи не заполняются, так как запись будет рассчитана в общем порядке
Сторно-записи, «прикрывающие» фактический период действия вводимой записи с более поздним периодом регистрации, могут быть сформированы вручную стандартными методами формирования записей регистра расчета. В этом случае разработчик должен самостоятельно предусмотреть алгоритм, по которому будут сформированы сторно-записи, исходя из первоначального набора записей. Это достаточно сложный путь, предполагающий самостоятельный анализ взаимодействия периодов действия конкурирующих записей.
Вместо формирования собственных алгоритмов можно воспользоваться методом ПолучитьДополнение() объекта РегистрРасчетаНаборЗаписей. Суть его состоит в том, что система самостоятельно анализирует возможные конфликты формируемого набора записей с записями, имеющими более ранний период регистрации. Если обнаруживается пересечение периодов действия с конкурирующими записями, на каждое такое пересечение система предложит сформировать сторно-запись, которая позволит вводимому набору записей сохранить фактический период действия. При этом система укажет, по каким видам расчета необходимо ввести сторно-записи и какой период действия они должны иметь.
Метод ПолучитьДополнение() применяется к набору записей регистра расчета, поддерживающего период действия, и не требует указания пара- метров. Данный метод возвращает значение типа ТаблицаЗначений, в котором содержатся все необходимые данные для формирования сторно-записей. Таблица включает значение всех полей записей, для которых должны быть введены сторно-записи (кроме полей Регистратор и НомерСтроки, которые не нужны для формирования сторно-записей), а также дополнительные поля – период регистрации сторно-записи и даты начала и окончания периода действия сторно-записи.
В приведенном примере для набора записей, состоящего из одной записи о больничном, метод ПолучитьДополнение() вернет таблицу следующего вида:
Период регистрации Вид расчета Период действия … Период регистрации сторно Период действия начало сторно Период действия конец сторно
01.03.2010 Дежурство 01.03.2010 01.04.2010 15.03.2010 22.03.2010
Полученная таблица позволяет ввести необходимые сторно-записи без дополнительных вычислений. Ниже приведен текст модуля, в котором используется метод ПолучитьДополнение() и формируются сторно-записи в регистре расчета:
;
Таким образом, сторно-записи имеют те же значения полей, что и исходные записи, за исключением периода регистрации и периода действия. Сторно-записи отличаются от обычных записей значением Истина в предопределенном поле Сторно.