Имя: Пароль:
1C
1С v8
ДанныеФормаКоллекция. ЗУП.
0 Target1025
 
11.06.21
12:55
Вызывается внешняя дополнительная обработка табличной части документа Премия, которая должна распихать результаты расчета в таблицу НАчисления, а распределение по долям по территориями в таблицу РаспределениеПоТерриториямУсловиямТруда. Код такой:

        ПремияОбъект = ВладелецФормы.Объект;
        Для Каждого Стр из ПремияОбъект.Начисления Цикл
            Стр.Результат = МассивДанных[Стр.НомерСтроки-1];
            НомерТекСтроки = Стр.номерСтроки;
            Отбор = новый Структура;
            Строки = ПремияОбъект.РаспределениеПоТерриториямУсловиямТруда.НайтиСтроки(Отбор);
            Если Строки.Количество() > 0 Тогда
                МаксДоля = 0;
                МаксРяд = 0;
                Итог = 0;
                Для Каждого Стр2 Из Строки Цикл
                    Стр2.результат = МассивДанных[Стр.НомерСтроки-1]*Стр2.ДоляРаспределения;
                    Итог = Итог + Стр2.результат;
                    Если МаксДоля < Стр2.ДоляРаспределения Тогда
                        МаксДоля = Стр2.ДоляРаспределения;
                        МаксРяд = Стр2;
                    КонецЕсли;    
                КонецЦикла;    
                Дельта = Стр.Результат - Итог;
                МаксРяд.Результат = МаксРяд.Результат + Дельта;
                Сообщить("Максряд = "+ МаксРяд.Результат);
            КонецЕсли;    
        Конеццикла;    


Начисления заполняется, а вот РаспределениеПоТерриториямУсловиямТруда уже - нет. Сообщить("Максряд = "+ МаксРяд.Результат) = всегда равно нулю, как и остальные значения таблицы. Может кто-то ошибку видит в работе с данными формы?
1 Momus
 
11.06.21
13:22
Отбор = новый Структура;
Строки = ПремияОбъект.РаспределениеПоТерриториямУсловиямТруда.НайтиСтроки(Отбор);
Хороший отбор
2 Target1025
 
11.06.21
13:23
(0)(1) Там в коде строка с заполнением отбора пропущена.
        ПремияОбъект = ВладелецФормы.Объект;
        Для Каждого Стр из ПремияОбъект.Начисления Цикл
            Стр.Результат = МассивДанных[Стр.НомерСтроки-1];
            НомерТекСтроки = Стр.номерСтроки;
            Отбор = новый Структура;
            Сообщить("НомерТекСтроки = "+НомерТекСтроки );
            Отбор.Вставить("ИдентификаторСтроки",НомерТекСтроки);
            Строки = ПремияОбъект.РаспределениеПоТерриториямУсловиямТруда.НайтиСтроки(Отбор);
            Если Строки.Количество() > 0 Тогда
                МаксДоля = 0;
                МаксРяд = 0;
                Итог = 0;
                Для Каждого Стр2 Из Строки Цикл
                    Сообщить("1. Стр2.результат = " + Стр2.результат);
                    Стр2.результат = МассивДанных[Стр.НомерСтроки-1]*Стр2.ДоляРаспределения;
                    Итог = Итог + Стр2.результат;
                    Если МаксДоля < Стр2.ДоляРаспределения Тогда
                        МаксДоля = Стр2.ДоляРаспределения;
                        МаксРяд = Стр2;
                    КонецЕсли;    
                    Сообщить("2. Стр2.результат = " + Стр2.результат);
                КонецЦикла;    
                Дельта = Стр.Результат - Итог;
                Сообщить("Дельта = " + Дельта );
                МаксРяд.Результат = МаксРяд.Результат + Дельта;
                Сообщить("Максряд.результат = "+ МаксРяд.Результат);
            КонецЕсли;    
        Конеццикла;    
        ВладелецФормы.Записать();

Вывод проги (данные левые):

НомерТекСтроки = 1
1. Стр2.результат = 0
2. Стр2.результат = 3 051
Дельта = 0
Максряд.результат = 3 051 // тут распределять не надо, доля = 1
НомерТекСтроки = 2
1. Стр2.результат = 0
2. Стр2.результат = 4 616,86
1. Стр2.результат = 0
2. Стр2.результат = 12 696,14
Дельта = 0
Максряд.результат = 12 696,14 // распределил, сделал корректировку копеек самой большой доли

Ну и как бы на этом все! Если таблица начислений заполнена, то вот таблица РаспределениеПоТерриториямУсловиямТруда имеет нулевые значения (если смотреть из одкумента).