Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 июл 2022, 19:41

Как эффективно определить порядок видов расчетов при расчете начислений, и самое главное - как отловить зацикливание (код внутри)

Автор acces969, 27 сен 2017, 08:23

0 Пользователей и 1 гость просматривают эту тему.

acces969

Добрый день. Как можно автоматически выстроить виды расчета по порядку для расчетов, в зависимости от их базовых видов расчета? (Например, чтобы оклад рассчитывался первее, чем надбавка процентом от оклада). У меня в данный момент есть такой способ:

&НаСервере
Функция ОпределениеПорядкаВидовРасчетов(ТЗ)
   
   ИзмененПорядок = Ложь;
   Для каждого СтрокаВидаРасчета Из ТЗ Цикл
      
      Для каждого БазовыйВидРасчета Из СтрокаВидаРасчета.ВидРасчета.БазовыеВидыРасчета Цикл
         СтруктураПоиска = Новый Структура("ВидРасчета", БазовыйВидРасчета.ВидРасчета);
         БазовыеВидыРасчета = ТЗ.НайтиСтроки(СтруктураПоиска);
         Для каждого СтрокаБазовогоВидаРасчета Из БазовыеВидыРасчета Цикл
            Если СтрокаБазовогоВидаРасчета.Порядок < СтрокаВидаРасчета.Порядок + 1 Тогда
               СтрокаБазовогоВидаРасчета.Порядок = СтрокаВидаРасчета.Порядок + 1;   
               ИзмененПорядок = Истина;
            КонецЕсли;
            
         КонецЦикла;      
      КонецЦикла;   
   КонецЦикла;   
   
   Если ИзмененПорядок Тогда
      ТЗ = ОпределениеПорядкаВидовРасчетов(ТЗ);
   КонецЕсли;
   
   Возврат ТЗ;
      
КонецФункции


Но у этой системы существенный недостаток - из за применения рекурсии, в случае, если базовые виды расчета заполнены неправильно (Вид расчета А является базовым для вида расчета Б, который в свою очередь является базовым для вида расчета А), то происходит зацикливание, причем счетчики растут не только у неправильных видов расчетов, а у всех. Это кстати является вторым вопросом - как отловить неправильно заполненные вида расчета? Для определения прямой зависимости есть такой код:

// Проверка прямого конфликта видов расчетов. В случае, если конфликт не прямой, а через промежуточный вид расчета, проверка не подойдет
   "ВЫБРАТЬ
   |   БазовыеВидыРасчета1.Ссылка
   |ИЗ
   |   ПланВидовРасчета.ОсновныеНачисления.БазовыеВидыРасчета КАК БазовыеВидыРасчета1
   |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовРасчета.ОсновныеНачисления.БазовыеВидыРасчета КАК БазовыеВидыРасчета2
   |      ПО БазовыеВидыРасчета1.Ссылка = БазовыеВидыРасчета2.ВидРасчета
   |         И БазовыеВидыРасчета1.ВидРасчета = БазовыеВидыРасчета2.Ссылка"


Но он не работает при косвенной зависимости (в случае, если вид расчета А является базовым для вида расчета Б, который является базовым для вида расчета С, который является базовым для вида расчета А).

alex0402

в типовых у каждого вида расчета для этой цели есть специальный реквизит типа СправочникСсылка или ПеречислениеСсылка и этот порядок проверяется один раз ПриЗаписи объекта. Проверять при каждом расчете - зло...
Спасибо за Сказать спасибо

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск