Имя: Пароль:
1C
1С v8
ЗаполнитьЗначенияСвойств() при работе с ТЗ
, , ,
0 2S
 
11.11.18
23:37
Откройте глаза на проблему
Кусок кода
        Для Каждого СтрокаПоказателей Из СтрокиНачисления Цикл
            Если СтрокаПоказателей.Показатели.Количество() = 0 Тогда
                ТекущийПроцентСН = 0;
            Иначе    
                ТекущийПроцентСН = СтрокаПоказателей.Показатели[0].Значение;
            КонецЕсли;    
            
            НовоеНачисление = Начисления.Добавить();
            
            ЗаполнитьЗначенияСвойств(НовоеНачисление, СтрокаПоказателей);
            НовоеНачисление.ИдентификаторСтроки = СледующийИдентификатор;
            НовоеНачисление.Категория = Перечисления.КатегорииНачисленийИНеоплаченногоВремени.ПовременнаяОплатаТруда;
            НовоеНачисление.Начисление = ПерсональнаяНадбавка;
            
            НовоеНачисление.Показатели[0].ИдентификаторСтроки = СледующийИдентификатор;
            НовоеНачисление.Показатели[0].Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Персональная надбавка", Истина);

У ТЗ источника есть поле с типом ТаблицаЗначений, называется "Показатели". Казалось бы добавил новую строку, заполним данными от донора. Но почему-то две последние строки кода также меняют значение и в ТЗ источнике. ЗаполнитьЗначенияСвойств() ссылку тоже что ли передает?
1 Полбатона
 
11.11.18
23:43
а где ты в НовоеНачисление.Показатели строку добавляешь?
2 Casey1984
 
11.11.18
23:46
(0) Потому что ТЗ надо копировать (читай создавать) и присваивать, а не просто присваивать.
3 2S
 
11.11.18
23:48
(1)
и так было
            НовыйПоказатель = НовоеНачисление.Показатели.Добавить();
            НовыйПоказатель.ИдентификаторСтроки = СледующийИдентификатор;
            НовыйПоказатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Персональная надбавка", Истина);

Добавляет и в Источник
4 2S
 
11.11.18
23:50
(2) ТЗ уже есть, задача добавить новые строки. Уже и копию ТЗ создал, чтобы с него читать, а писать в основное, та же херня
5 Casey1984
 
11.11.18
23:51
(4) Покажи как создавал?)
6 Полбатона
 
11.11.18
23:53
обожаю, когда топикстартер чего-то недоговаривает или как всегда забывает скопировать кусок кода.

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

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


КонецЦикла

КонецЦикла;
7 Casey1984
 
11.11.18
23:53
(4) У тебя вот тут вот что думаешь с ТЗ происходит?
8 Полбатона
 
11.11.18
23:54
(6) сорян
Для Каждого табСтрокаПоказателей из СтрокаПоказателей.Показатели Цикл
9 2S
 
11.11.18
23:54
(6) ок )
    //1. удалим текущие строки персональной надбавки, т.к. записи должны быть привязаны только к СН. Сколько записей СН, столько и ПН
    //2. Заполним показатели относительно регистра соответствий шкал
    
    ПерсональнаяНадбавка = ПланыВидовРасчета.Начисления.НайтиПоКоду("ПН");
    СевернаяНадбавка = ПланыВидовРасчета.Начисления.НайтиПоКоду("СН");
    
    СтрокиНачисленияПерсональнойНадбавки = Начисления.НайтиСтроки(Новый Структура("Начисление", ПерсональнаяНадбавка));
    
    СледующийИдентификатор = Начисления[Начисления.Количество() - 1].ИдентификаторСтроки + 1;
    Если СтрокиНачисленияПерсональнойНадбавки.Количество() > 0 Тогда
        //1.
        Для Каждого Строка Из СтрокиНачисленияПерсональнойНадбавки Цикл
            Начисления.Удалить(Строка);
        КонецЦикла;
        
        //2.
        НачисленияОбработка = Начисления.Скопировать();
        СтрокиНачисленияСевернойНадбавки = НачисленияОбработка.НайтиСтроки(Новый Структура("Начисление", СевернаяНадбавка));
        Для Каждого СтрокаПоказателей Из СтрокиНачисленияСевернойНадбавки Цикл
            Если СтрокаПоказателей.Показатели.Количество() = 0 Тогда
                ТекущийПроцентСН = 0;
            Иначе    
                ТекущийПроцентСН = СтрокаПоказателей.Показатели[0].Значение;
            КонецЕсли;    
            
            НовоеНачисление = Начисления.Добавить();
            
            НовоеНачисление.ИдентификаторСтроки = СледующийИдентификатор;
            НовоеНачисление.Категория = Перечисления.КатегорииНачисленийИНеоплаченногоВремени.ПовременнаяОплатаТруда;
            НовоеНачисление.Начисление = ПерсональнаяНадбавка;
            
            //НовоеНачисление.Показатели.Очистить();
            //НовыйПоказатель = НовоеНачисление.Показатели.Добавить();
            НовоеНачисление.Показатели[0].ИдентификаторСтроки = СледующийИдентификатор;
            НовоеНачисление.Показатели[0].Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Персональная надбавка", Истина);
                    
            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    ШкалаПерсональныхНадбавок.ПроцентПерсональнойНадбавки КАК ПроцентПерсональнойНадбавки
                |ИЗ
                |    РегистрСведений.ШкалаПерсональныхНадбавок КАК ШкалаПерсональныхНадбавок
                |ГДЕ
                |    ШкалаПерсональныхНадбавок.ПроцентСевернойНадбавки = &ПроцентСевернойНадбавки";
            
            Запрос.УстановитьПараметр("ПроцентСевернойНадбавки", ТекущийПроцентСН);
            РезультатЗапросаВыборка = Запрос.Выполнить().Выбрать();
            Если РезультатЗапросаВыборка.Следующий() Тогда
                НовоеНачисление.Показатели[0].Значение = РезультатЗапросаВыборка.ПроцентПерсональнойНадбавки;
            Иначе    
                НовоеНачисление.Показатели[0].Значение = 0;
            КонецЕсли;
            СледующийИдентификатор = СледующийИдентификатор + 1;
        КонецЦикла;
    КонецЕсли;
10 Casey1984
 
11.11.18
23:54
(7) -> ЗаполнитьЗначенияСвойств(НовоеНачисление, СтрокаПоказателей);
11 Casey1984
 
11.11.18
23:57
(9) и тут я не вижу откуда у тебя строка появилась... НовоеНачисление.Показатели[0] ?
12 2S
 
11.11.18
23:58
(9) Строку ЗаполнитьЗначенияСвойств(НовоеНачисление, СтрокаПоказателей); видите?
А она там есть ) случайно удалил,
13 2S
 
11.11.18
23:59
(11) вот это меня и смущает,
после ЗаполнитьЗначенияСвойств(НовоеНачисление, СтрокаПоказателей); она уже есть
Ощущение, что со ссылкой работаю
14 Casey1984
 
11.11.18
23:59
(12) так вот она все и портит. сделай Показатели = Новый ТаблицаЗначений
15 Casey1984
 
11.11.18
23:59
(13) да! все, я спать)
16 Casey1984
 
12.11.18
00:02
(13) ты же объект присваиваешь, с чего он новый будет?) доброй ночи)
17 2S
 
12.11.18
00:02
(15) тьфу млин, туплю на ночь , спасибо
18 Мимохожий Однако
 
12.11.18
07:22
Для остроты восприятия всегда помогает отладчик.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан