Добрый день!

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

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

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

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

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

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

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

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

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

Спасибо!
---
Вот так:

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

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

    СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
    КонецЕсли;
```
---
код можно увидеть?
---
в вопросе я код упростила для понимания.

вот код 1С:

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

Ошибка в этой строке

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

некорректное присвоение значения. Присваивается ссылка на структуру. А нужно данные структуры присвоить.
Как это правильно сделать?
Спасибо!
---
какой-то треш))
Где переменные объявлены?)
Код на сервере?
Какая ссылка есть у вас реквизит = структура?
---
Это Модуль объекта документа. Код на сервере.
все переменные объявлены в этой функции.
---
возможно нужно назвать переменные по другому. Но без отладчика не понятно!
---
вся проблема в том, как этому СтрокаТЗ.СвСумВыч присвоить значение структуры?
я отладчиком все прошла. проблема в этой строке.
---
ФорматСведенияОВычетах замени, на то что написали в 11 в чем проблема?
---
пробовала - ошибки всякие выдает..... типа не тот параметр, тип...
может неправильно написала...
---
включайте голову, а лучше с утра поработайте))
---
спасибо!
---
так не работает

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

Форма.ФормаДокумента.Форма(726)}: Ошибка при вызове метода контекста (Записать)
 Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{Документ.СправкиНДФЛДляПередачиВНалоговыйОрган.МодульОбъекта(2407)}: Значение не является значением объектного типа (Вставить)
       СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
---
Лишнее закомментировали

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

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

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

    СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", СтруктураФормата);
    КонецЕсли;
```
---
Только учтите, что таблица в структуре тоже будет копировать. Возможно поэтому стоит сперва удалить из структуры ключ "Значение", скопировать ее, а затем вставить новое значение.
---
спасибо! да, выше по вашему сообщению исправила - убрала лишний комментарий - код заработал. но результат остался прежний.

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

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

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

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

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

    // запоминаем таблицу и удаляем
    ИсходнаяТаблица = ФорматСведенияОВычетах.Значение; // запоминаем и удаляем
    ФорматСведенияОВычетах.Удалить("Значение");

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

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

    СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", СтруктураФормата);
    КонецЕсли;
```

Но все это абстрактные примеры, которые Вам возможно могут помочь. Мне не знакома Ваша предметная область, а посему мои советы могут быть даже вредными. Например, если исходная структура очень сложная и Вам не нужна ее полная копия, включая копии всех вложенных полей. Если так, то лучше воспользоваться примером из (11).
---
Вот так:

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

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

    СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
    КонецЕсли;
```
---
спасибо! сейчас проверю!
---
Ооооо! Огромное спасибо, Вам! Заработало - правильно!
---
структура сложная, внутри нее еще может не одна структура...
---
это и есть код

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

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

    СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
    КонецЕсли;
```
---
уже исправленный
---
может вы бы сначало структуру сделали, а потом только присваивали?
Данной инфы мало!
---
а в чем разница? Если все равно через = присваивается ссылка на структуру?
---
вложенную структуру создавать внутри цикла
---
```1c
    КопияСтруктуры = Новый Структура;
    Для Каждого ЭлементСтруктуры Из СозданнаяСтруктура Цикл
    КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
    КонецЦикла;
```
---
да, этот код я видела, но не понимаю как его в данном случае применить....
можете написать?
---
Код на сервере?
---
это модуль объекта документа, на сервере