Добрый день!
Есть ошибка в программе: элементу присваивается структура
ЕщеОднаСтруктура - это тоже структура.
Это все выполняется в цикле, ЕщеОднаСтруктура в каждой итерации заполняется своими значениями. Т.е. для каждой строки реквизит СтрокаТЗ.Поле1 должен иметь свое значение.
Но получается, что для всех строк устанавливается значение ЕщеОднаСтруктура, которое сформировалось для последней записи.
Насколько я понимаю, такое проявление программы происходит из-за того, что присваивании структуры через "=" - мы присваиваем ссылку на структуру. И получается, что все строки ссылаются на одну и туже структуру ЕщеОднаСтруктура - а она в конце цикла заполнена значениями для последней строки.
Не знаю... понятно ли написала?
Нужно как-то присвоить не ссылку на структуру, в содержимое структуры - чтобы для каждой строки были свои значения.
Подскажите, плиз, как это сделать?
Спасибо!
Есть ошибка в программе: элементу присваивается структура
СтрокаТЗ.Поле1 = Новый Структура("Поле1", ЕщеОднаСтруктура);
ЕщеОднаСтруктура - это тоже структура.
Это все выполняется в цикле, ЕщеОднаСтруктура в каждой итерации заполняется своими значениями. Т.е. для каждой строки реквизит СтрокаТЗ.Поле1 должен иметь свое значение.
Но получается, что для всех строк устанавливается значение ЕщеОднаСтруктура, которое сформировалось для последней записи.
Насколько я понимаю, такое проявление программы происходит из-за того, что присваивании структуры через "=" - мы присваиваем ссылку на структуру. И получается, что все строки ссылаются на одну и туже структуру ЕщеОднаСтруктура - а она в конце цикла заполнена значениями для последней строки.
Не знаю... понятно ли написала?
Нужно как-то присвоить не ссылку на структуру, в содержимое структуры - чтобы для каждой строки были свои значения.
Подскажите, плиз, как это сделать?
Спасибо!
По теме из базы знаний
- Всякие полезности
- Полная копия элемента справочника не своими руками
- Программное копирование узла/строки дерева значений на управляемой форме (УФ, ДанныеФормыДерево, ДанныеФормыЭлементДерева) в вариантах на клиенте и на сервере
- Обзор полезных методов БСП 3.1.4
- Несколько альтернативных универсальных способов подбора ссылок при переносах данных
Найденные решения
(23) Вот так:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
КопияСтруктуры = Новый Структура();
Для Каждого ЭлементСтруктуры Из ФорматСведенияОВычетах Цикл
КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
КопияСтруктуры.Значение = ТаблицаДляСтроки.Скопировать();
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
КонецЕсли;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) в вопросе я код упростила для понимания.
вот код 1С:
Ошибка в этой строке
некорректное присвоение значения. Присваивается ссылка на структуру. А нужно данные структуры присвоить.
Как это правильно сделать?
Спасибо!
вот код 1С:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
ФорматСведенияОВычетах.Значение = ТаблицаДляСтроки;
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
КонецЕсли;
Ошибка в этой строке
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
некорректное присвоение значения. Присваивается ссылка на структуру. А нужно данные структуры присвоить.
Как это правильно сделать?
Спасибо!
(15)
так не работает
Форма.ФормаДокумента.Форма(726)}: Ошибка при вызове метода контекста (Записать)
Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{Документ.СправкиНДФЛДляПередачиВНалоговыйОрган.МодульОбъекта(2407)}: Значение не является значением объектного типа (Вставить)
СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
так не работает
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
ФорматСведенияОВычетах.Значение = ТаблицаДляСтроки.Скопировать();
//+
//СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
НоваяСтруктура = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
Для Каждого ЭлементСтруктуры Из НоваяСтруктура Цикл
СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
//-
КонецЕсли;
ПоказатьФорма.ФормаДокумента.Форма(726)}: Ошибка при вызове метода контекста (Записать)
Записать();
по причине:
Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{Документ.СправкиНДФЛДляПередачиВНалоговыйОрган.МодульОбъекта(2407)}: Значение не является значением объектного типа (Вставить)
СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
(17) Лишнее закомментировали
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
ФорматСведенияОВычетах.Значение = ТаблицаДляСтроки.Скопировать();
//+
СтрокаТЗ.СвСумВыч = Новый Структура();
НоваяСтруктура = Новый Структура("СвСумВыч", ФорматСведенияОВычетах);
Для Каждого ЭлементСтруктуры Из НоваяСтруктура Цикл
СтрокаТЗ.СвСумВыч.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
//-
КонецЕсли;
Показать
(17) Если конфигурация типовая, можно воспользоваться функцией рекурсивного копирования структуры:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
СтруктураФормата = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(ФорматСведенияОВычетах);
СтруктураФормата.Значение = ТаблицаДляСтроки;
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", СтруктураФормата);
КонецЕсли;
Показать
(22) спасибо! да, выше по вашему сообщению исправила - убрала лишний комментарий - код заработал. но результат остался прежний.
Вы правильно говорите "учтите".... эти переменные сложные, там и ТЗ и внутри этих ТЗ другие структуры...
"Только учтите, что таблица в структуре тоже будет копировать. Возможно поэтому стоит сперва удалить из структуры ключ "Значение", скопировать ее, а затем вставить новое значение."
не поняла - можете подробнее описать или пример кода привести?
конфигурация типовая ЗУП - ошибка в типовом коде
Вы правильно говорите "учтите".... эти переменные сложные, там и ТЗ и внутри этих ТЗ другие структуры...
"Только учтите, что таблица в структуре тоже будет копировать. Возможно поэтому стоит сперва удалить из структуры ключ "Значение", скопировать ее, а затем вставить новое значение."
не поняла - можете подробнее описать или пример кода привести?
конфигурация типовая ЗУП - ошибка в типовом коде
(23) Т.к. таблицу мы всякий раз присваиваем новую, то ее нет смысла копировать из исходной структуры. Чтобы не делать лишнюю работу, таблицу можно исключить, скопировать, а потом вернуть обратно:
Но все это абстрактные примеры, которые Вам возможно могут помочь. Мне не знакома Ваша предметная область, а посему мои советы могут быть даже вредными. Например, если исходная структура очень сложная и Вам не нужна ее полная копия, включая копии всех вложенных полей. Если так, то лучше воспользоваться примером из (11).
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
// запоминаем таблицу и удаляем
ИсходнаяТаблица = ФорматСведенияОВычетах.Значение; // запоминаем и удаляем
ФорматСведенияОВычетах.Удалить("Значение");
// копируем структуру (без таблицы)
СтруктураФормата = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(ФорматСведенияОВычетах);
СтруктураФормата.Вставить("Значение", ТаблицаДляСтроки);
// восстанавливаем таблицу
ФорматСведенияОВычетах.Вставить("Значение", ИсходнаяТаблица);
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", СтруктураФормата);
КонецЕсли;
ПоказатьНо все это абстрактные примеры, которые Вам возможно могут помочь. Мне не знакома Ваша предметная область, а посему мои советы могут быть даже вредными. Например, если исходная структура очень сложная и Вам не нужна ее полная копия, включая копии всех вложенных полей. Если так, то лучше воспользоваться примером из (11).
(23) Вот так:
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
КопияСтруктуры = Новый Структура();
Для Каждого ЭлементСтруктуры Из ФорматСведенияОВычетах Цикл
КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
КопияСтруктуры.Значение = ТаблицаДляСтроки.Скопировать();
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
КонецЕсли;
Показать
(2) это и есть код
Если ТаблицаВычетовКДоходам.Количество() > 0 Тогда
ТаблицаДляСтроки = ТаблицаВычетовКДоходам.Скопировать();
ТаблицаДляСтроки.Колонки.КодВычетаСтрокой.Имя = "КодВычет";
ТаблицаДляСтроки.Колонки.СуммаВычета.Имя = "СумВычет";
КопияСтруктуры = Новый Структура();
Для Каждого ЭлементСтруктуры Из ФорматСведенияОВычетах Цикл
КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
КопияСтруктуры.Значение = ТаблицаДляСтроки.Скопировать();
СтрокаТЗ.СвСумВыч = Новый Структура("СвСумВыч", КопияСтруктуры);
КонецЕсли;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот