Скопировать структуру в элемент

1. user_2010 904 17.01.19 18:18 Сейчас в теме
Добрый день!

Есть ошибка в программе: элементу присваивается структура

СтрокаТЗ.Поле1 = Новый Структура("Поле1", ЕщеОднаСтруктура);

ЕщеОднаСтруктура - это тоже структура.

Это все выполняется в цикле, ЕщеОднаСтруктура в каждой итерации заполняется своими значениями. Т.е. для каждой строки реквизит СтрокаТЗ.Поле1 должен иметь свое значение.

Но получается, что для всех строк устанавливается значение ЕщеОднаСтруктура, которое сформировалось для последней записи.

Насколько я понимаю, такое проявление программы происходит из-за того, что присваивании структуры через "=" - мы присваиваем ссылку на структуру. И получается, что все строки ссылаются на одну и туже структуру ЕщеОднаСтруктура - а она в конце цикла заполнена значениями для последней строки.

Не знаю... понятно ли написала?

Нужно как-то присвоить не ссылку на структуру, в содержимое структуры - чтобы для каждой строки были свои значения.

Подскажите, плиз, как это сделать?

Спасибо!
По теме из базы знаний
Найденные решения
26. dhurricane 17.01.19 20:56 Сейчас в теме
(23) Вот так:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда 
   ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать(); 
   ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет"; 
   ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет"; 

   КопияСтруктуры = Новый Структура(); 
   Для Каждого ЭлементСтруктуры Из ФорматСведенияОВычетах Цикл 
      КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); 
   КонецЦикла;
   КопияСтруктуры.Значение = ТаблицаДляСтроки.Скопировать(); 

   СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
КонецЕсли;
Показать
Lion_LexXx; user_2010; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 17.01.19 18:25 Сейчас в теме
5. user_2010 904 17.01.19 19:32 Сейчас в теме
(2) в вопросе я код упростила для понимания.

вот код 1С:

Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
		ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
		ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
		ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
		ФорматСведенияОВычетах.Значение = ТаблицаДляСтроки;
		СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", ФорматСведенияОВычетах); 
	КонецЕсли;


Ошибка в этой строке
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);  

некорректное присвоение значения. Присваивается ссылка на структуру. А нужно данные структуры присвоить.
Как это правильно сделать?
Спасибо!
7. Xershi 1486 17.01.19 19:38 Сейчас в теме
(5) какой-то треш))
Где переменные объявлены?)
Код на сервере?
Какая ссылка есть у вас реквизит = структура?
9. user_2010 904 17.01.19 19:46 Сейчас в теме
(7) Это Модуль объекта документа. Код на сервере.
все переменные объявлены в этой функции.
10. Xershi 1486 17.01.19 19:52 Сейчас в теме
(9) возможно нужно назвать переменные по другому. Но без отладчика не понятно!
13. user_2010 904 17.01.19 20:05 Сейчас в теме
(10) вся проблема в том, как этому СтрокаТЗ.СвСумВыч присвоить значение структуры?
я отладчиком все прошла. проблема в этой строке.
14. Xershi 1486 17.01.19 20:06 Сейчас в теме
(13) ФорматСведенияОВычетах замени, на то что написали в 11 в чем проблема?
15. user_2010 904 17.01.19 20:09 Сейчас в теме
(14) пробовала - ошибки всякие выдает..... типа не тот параметр, тип...
может неправильно написала...
16. Xershi 1486 17.01.19 20:15 Сейчас в теме
(15) включайте голову, а лучше с утра поработайте))
18. user_2010 904 17.01.19 20:17 Сейчас в теме
17. user_2010 904 17.01.19 20:16 Сейчас в теме
(15)
так не работает

Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
	ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
	ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
	ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
	ФорматСведенияОВычетах.Значение = ТаблицаДляСтроки.Скопировать();
	//+
	//СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
	НоваяСтруктура = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
	Для Каждого ЭлементСтруктуры Из НоваяСтруктура Цикл 
		СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); 
	КонецЦикла;
	//-
КонецЕсли;
Показать

Форма.ФормаДокумента.Форма(726)}: Ошибка при вызове метода контекста (Записать)
Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{Документ.СправкиНДФЛДляПередачиВНалоговыйОрган.МодульОбъекта(2407)}: Значение не является значением объектного типа (Вставить)
СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
19. dhurricane 17.01.19 20:20 Сейчас в теме
(17) Лишнее закомментировали
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда 
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать(); 
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет"; 
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет"; 
ФорматСведенияОВычетах.Значение = ТаблицаДляСтроки.Скопировать(); 
//+ 
СтрокаТЗ.СвСумВыч = Новый Структура(); 
НоваяСтруктура = Новый Структура("СвСумВыч", ФорматСведенияОВычетах); 
Для Каждого ЭлементСтруктуры Из НоваяСтруктура Цикл 
СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); 
КонецЦикла; 
//- 
КонецЕсли;
Показать
20. dhurricane 17.01.19 20:24 Сейчас в теме
(17) Если конфигурация типовая, можно воспользоваться функцией рекурсивного копирования структуры:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда 
   ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать(); 
   ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет"; 
   ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет"; 
   
   СтруктураФормата = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(ФорматСведенияОВычетах);
   СтруктураФормата.Значение = ТаблицаДляСтроки;
 
   СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", СтруктураФормата); 
КонецЕсли;
Показать
22. dhurricane 17.01.19 20:29 Сейчас в теме
(20) Только учтите, что таблица в структуре тоже будет копировать. Возможно поэтому стоит сперва удалить из структуры ключ "Значение", скопировать ее, а затем вставить новое значение.
23. user_2010 904 17.01.19 20:38 Сейчас в теме
(22) спасибо! да, выше по вашему сообщению исправила - убрала лишний комментарий - код заработал. но результат остался прежний.

Вы правильно говорите "учтите".... эти переменные сложные, там и ТЗ и внутри этих ТЗ другие структуры...

"Только учтите, что таблица в структуре тоже будет копировать. Возможно поэтому стоит сперва удалить из структуры ключ "Значение", скопировать ее, а затем вставить новое значение."

не поняла - можете подробнее описать или пример кода привести?

конфигурация типовая ЗУП - ошибка в типовом коде
24. dhurricane 17.01.19 20:49 Сейчас в теме
(23) Т.к. таблицу мы всякий раз присваиваем новую, то ее нет смысла копировать из исходной структуры. Чтобы не делать лишнюю работу, таблицу можно исключить, скопировать, а потом вернуть обратно:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда 
   ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать(); 
   ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет"; 
   ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет"; 
   
   // запоминаем таблицу и удаляем
   ИсходнаяТаблица = ФорматСведенияОВычетах.Значение;  // запоминаем и удаляем
   ФорматСведенияОВычетах.Удалить("Значение");

   // копируем структуру (без таблицы)
   СтруктураФормата = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(ФорматСведенияОВычетах);
   СтруктураФормата.Вставить("Значение", ТаблицаДляСтроки);

   // восстанавливаем таблицу
   ФорматСведенияОВычетах.Вставить("Значение", ИсходнаяТаблица);
 
   СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", СтруктураФормата); 
КонецЕсли;
Показать

Но все это абстрактные примеры, которые Вам возможно могут помочь. Мне не знакома Ваша предметная область, а посему мои советы могут быть даже вредными. Например, если исходная структура очень сложная и Вам не нужна ее полная копия, включая копии всех вложенных полей. Если так, то лучше воспользоваться примером из (11).
26. dhurricane 17.01.19 20:56 Сейчас в теме
(23) Вот так:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда 
   ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать(); 
   ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет"; 
   ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет"; 

   КопияСтруктуры = Новый Структура(); 
   Для Каждого ЭлементСтруктуры Из ФорматСведенияОВычетах Цикл 
      КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); 
   КонецЦикла;
   КопияСтруктуры.Значение = ТаблицаДляСтроки.Скопировать(); 

   СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
КонецЕсли;
Показать
Lion_LexXx; user_2010; +2 Ответить
27. user_2010 904 17.01.19 21:01 Сейчас в теме
(26) спасибо! сейчас проверю!
28. user_2010 904 17.01.19 21:03 Сейчас в теме
(26) Ооооо! Огромное спасибо, Вам! Заработало - правильно!
8. user_2010 904 17.01.19 19:38 Сейчас в теме
(5) структура сложная, внутри нее еще может не одна структура...
29. user_2010 904 17.01.19 21:47 Сейчас в теме
(2) это и есть код
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда 
   ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать(); 
   ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет"; 
   ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет"; 

   КопияСтруктуры = Новый Структура(); 
   Для Каждого ЭлементСтруктуры Из ФорматСведенияОВычетах Цикл 
      КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); 
   КонецЦикла;
   КопияСтруктуры.Значение = ТаблицаДляСтроки.Скопировать(); 

   СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
КонецЕсли;
Показать
30. user_2010 904 17.01.19 21:47 Сейчас в теме
3. Xershi 1486 17.01.19 18:34 Сейчас в теме
(1) может вы бы сначало структуру сделали, а потом только присваивали?
Данной инфы мало!
alex-l19041; +1 Ответить
6. user_2010 904 17.01.19 19:34 Сейчас в теме
(3) а в чем разница? Если все равно через = присваивается ссылка на структуру?
4. pm74 199 17.01.19 18:37 Сейчас в теме
(1) вложенную структуру создавать внутри цикла
11. Sapiens_bru 4 17.01.19 19:55 Сейчас в теме
КопияСтруктуры = Новый Структура;
Для Каждого ЭлементСтруктуры Из СозданнаяСтруктура Цикл
  КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
12. user_2010 904 17.01.19 20:01 Сейчас в теме
(11) да, этот код я видела, но не понимаю как его в данном случае применить....
можете написать?
21. meriferi 17.01.19 20:28 Сейчас в теме
25. user_2010 904 17.01.19 20:52 Сейчас в теме
(21) это модуль объекта документа, на сервере
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот