Профессия — 1С

Рукопашный бой Карташ

Категории

Функция расчета начисления

рубрики: ЗУП 3.1 | Дата: 11 Январь, 2017

Рано или поздно каждый разработчик 1С:Предприятия 8 в конфигурации ЗУП сталкивается с ситуацией, когда надо разобраться почему неправильно расчитывается какое-либо начисление заданное определенной формулой. Чтобы это понять как правило надо в первую очередь в конфигураторе в режиме отладки найти строку кода в которой непосредственно происходит расчет.




И только тогда можно понять из-за какого параметра функции происходит неправильный расчет и далее уже смотреть как было получено значение этого параметра. Те кто сталкивался с этим знают, что механизм в котором формируются исходные данные для расчета по формуле очень большой и чтобы найти заветную строчку кода, где происходит непосредственно расчет, приходится потратить очень много времени. Надеюсь эта небольшая заметка позволит вам сократить время потраченное на отладку. Все, что будет написано далее справедливо для ЗУП 3.1.1.114. Надеюсь, что и в более поздних релизах местонахождение искомой функции не изменится.

Для эксперимента я использовал документ НачислениеЗарплаты и сотрудника с видом расчета Сдельный заработок. В результате выяснил, что искомая функция находится в общем модуле РасчетЗарплатыРасширенный и называется она ВычислитьРезультатПоФормуле(). Функция в общем то небольшая:



Функция ВычислитьРезультатПоФормуле(ИсходныеДанные, ФормулаДляВыполнения, ФормулаДляПредставления, СтрокаРасчета, ВызыватьИсключение)

	Попытка
		Возврат Вычислить(ФормулаДляВыполнения);
	Исключение
		.................................
	КонецПопытки;

КонецФункции

Параметр ФормулаДляВыполнения это строка, которая выглядит следующим образом:


Макс(ИсходныеДанные.СдельныйЗаработок, ИсходныеДанные.ТарифнаяСтавкаЧасовая * ИсходныеДанные.ВремяВЧасах)

А ИсходныеДанные это структура следующего вида:


Вроде бы все элементарно.
А теперь откроем стек вызовов и посмотрим какой путь был проделан программой, чтобы получить исходные данные, представленные на рисунке выше:


ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.ВычислитьРезультатПоФормуле()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.РассчитатьСтрокуНачисления()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.РассчитатьНачисленияОчередности()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.РассчитатьНачисления()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.РассчитатьДанныеФормыПоСотрудникам()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.ПодготовитьДанныеДляПерезаполнения()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.ПерезаполнитьДанныеФормы()
Документ.НачислениеЗарплаты.Форма.ФормаДокумента.Форма.ПерезаполнитьДанныеФормыНаСервере()
ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль.ПересчитатьСотрудникаНаСервере()
Документ.НачислениеЗарплаты.Форма.ФормаДокумента.Форма.ПересчитатьСотрудникаНаСервере()
Документ.НачислениеЗарплаты.Форма.ФормаДокумента.Форма.ПересчитатьСотрудника()
ОбщийМодуль.РасчетЗарплатыРасширенныйКлиент.Модуль.ПересчитатьСотрудника()
Документ.НачислениеЗарплаты.Форма.ФормаДокумента.Форма.Подключаемый_НачисленияПересчитатьСотрудника()

Как видим путь достаточно запутанный. И это еще без учета того, что в некоторых из этих функциях используются пакетные запросы состоящие из десятков подзапросов.




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

2 комментария на «“Функция расчета начисления”»

  1. uly:

    В версии 3.1.5.129 расчет вынесен в фоновое задание.
    Обработка МенеджерРасчетаЗарплаты, Функция РезультатПоФормуле(ИсходныеДанные, ФормулаДляВыполнения, ФормулаДляПредставления, СтрокаРасчета, ИмяПоляВидРасчета = «Начисление»)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С