Как скопировать структуру в 1с
например у ТЗ есть метод копировать, выгрузить
как скопировать структуру в 1с 8.1
Есть структура
АД = Новая Структура(. )
Как получить её копию, не преберая её?
почему попадает в ветку для 7ки, вроде на 8 отправлял.
стр1 = НОвый Структура;
стр1.Вставить(«Я»,»Умный»);
стр1.Вставить(«Хотя»,»Не очень»);
стр2 = стр1;
Сообщить(ТипЗнч(стр2));
(2) это не копирование структуры — это копирвоание ссылки на структуру — источник многих проблем.
(3) Уверен? Честно говоря, я то что написал в (2) не проверял отладчиком. Поэтому и написал попробуй. Но вообще-то мне кажется что скопируется вся структура
СтруктНовый = Новый Структура;
Для Каждого цСвойство Из СтруктСтарый Цикл
СтруктНовый.Вставить( цСвойство.Ключ , цСвойство.Значение );
ЗначениеВСтроку(ЗначениеИзСтроки)
(6) +5
ЗначениеВСтрокуВнутр()
попробуй так
Буфер = ЗначениеВСтрокуВнутр(ТвояСтруктура);
НоваяСтруктура = ЗначениеИзСтрокиВнутр(Буфер);
Копия=ВерниКопию(Стр);
Функция ВерниКопию(Источник)
Возврат Источник;
КонецФункции
(6) Это хня по-моему хреново работает в 8-ке
А че (2) не сработает.
(8) если это не будет вынесено в отдельный метод с именем СкопироватьСтруктуру — 80% 1Сников не смогут понять глубинного смысла этих операторов
(12) терли уже много раз на мисте про эту фичу.
Тока что попробовал
стр1 = НОвый Структура;
стр1.Вставить(«Я»,»Умный»);
стр1.Вставить(«Хотя»,»Не очень»);
стр2 = стр1;
Для Каждого Свойство Из стр2 Цикл
В окне сообщений
Я,Умный
Хотя,Не очень
о а я думал что все уже отмечают тяпницу, а структра не копируется проверял отладчиком если использовать =.
(10) + 5
Функция ВерниКопию(Знач Источник)
Возврат Источник;
КонецФункции
Может так не ссылка будет
Мля, тупанул. Действительно лажа 🙂
«Умный программист пишет тупым кодом гениальные вещи а не наоборот. «(с) http://bash.org.ru/quote/394359
(17) Тоже не катит.
а ЗначениеВСтрокуВнутр тоже не прокатывает
(21) Прокатывает
(23) о, исчо один Нижегородец. Вынеси в отдельный метод (5) и не страдай фигней, это не та тема, где нужно проявлять талант в программировании.
Процедура КнопкаВыполнитьНажатие(Кнопка)
стр1 = НОвый Структура;
стр1.Вставить(«Я»,»Умный»);
стр1.Вставить(«Хотя»,»Не очень»);
стр2 = ЗначениеИзСтрокиВнутр(Буфер);
стр3 = стр1;
стр4 = ВерниКопию(стр1);
стр1.Вставить(«Хотя»,»даже очень»);
стр1.Вставить(«так»,»себе»);
Для Каждого Свойство Из стр2 Цикл
Сообщить(Свойство.Ключ+»,»+СВойство.Значение);
КонецЦикла;
Сообщить(«копирование ссылки»);
Для Каждого Свойство Из стр3 Цикл
Сообщить(Свойство.Ключ+»,»+СВойство.Значение);
КонецЦикла;
Сообщить(«верни копию»);
Для Каждого Свойство Из стр4 Цикл
Сообщить(Свойство.Ключ+»,»+СВойство.Значение);
КонецЦикла;
Функция ВерниКопию(Знач Источник)
Возврат Источник;
КонецФункции
Я,Умный
Хотя,Не очень
копирование ссылки
Я,Умный
Хотя,даже очень
так,себе
верни копию
Я,Умный
Хотя,даже очень
так,себе
СкопироватьСтруктуру (БСП)

Скопировать структуру. Создает новый экземпляр объекта Структура, заполняет объект данными указанной структуры.
// Создает новый экземпляр объекта Структура, заполняет объект данными указанной структуры. // // Параметры: // СтруктураИсточник - Структура - структура, копию которой необходимо получить. // // Возвращаемое значение: // Структура - копия переданной структуры. // Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт СтруктураРезультат = Новый Структура; Для Каждого Элемент Из СтруктураИсточник Цикл Если ТипЗнч(Элемент.Значение) = Тип("ТаблицаЗначений") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение.Скопировать()); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("ДеревоЗначений") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение.Скопировать()); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Структура") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, СкопироватьСтруктуру(Элемент.Значение)); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("СписокЗначений") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение.Скопировать()); Иначе СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение); КонецЕсли; КонецЦикла; Возврат СтруктураРезультат; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
// Создает новый экземпляр объекта Структура, заполняет объект данными указанной структуры. // // Параметры: // СтруктураИсточник - Структура - структура, копию которой необходимо получить. // // Возвращаемое значение: // Структура - копия переданной структуры. // Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт СтруктураРезультат = Новый Структура; Для Каждого Элемент Из СтруктураИсточник Цикл Если ТипЗнч(Элемент.Значение) = Тип("ТаблицаЗначений") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение.Скопировать()); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("ДеревоЗначений") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение.Скопировать()); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Структура") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, СкопироватьСтруктуру(Элемент.Значение)); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("СписокЗначений") Тогда СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение.Скопировать()); Иначе СтруктураРезультат.Вставить(Элемент.Ключ, Элемент.Значение); КонецЕсли; КонецЦикла; Возврат СтруктураРезультат; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
Как скопировать структуру в 1с 8?
Существует несколько способов скопировать содержимое одной структуры в другую.
Самое простое решение, к которому прибегают начинающие программисты — это копирование всех свойств структуры с использованием цикла Для каждого :
НоваяСтруктура = Новый Структура; Для каждого Элемент Из Структура Цикл НоваяСтруктура.Вставить(Элемент.Ключ, Элемент.Значение); КонецЦикла;
Но он годится только для простых структур, которые не содержат вложенных структур и коллекций. Попробуйте ради интереса самостоятельно написать код для копирования следующей структуры:
Структура = Новый Структура; Структура.Вставить("Код", 100); Структура.Вставить("Наименование", "Стул деревянный"); Структура.Вставить("Остатки", Новый Структура); Структура.Остатки.Вставить("Основной", 10); Структура.Остатки.Вставить("Дополнительный", 3);
Согласитесь, накладно каждый раз продумывать и писать код для копирования)
Более универсальным будет использование встроенных функций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). К тому же, можно уложиться в одну строку:
НоваяСтруктура = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Структура));
Этот же способ можно использовать для копирования других коллекций (правда, в рамках одной информационной базы).
Читайте также:
Копирование структуры в 1С
В этой небольшой статье рассмотрим как можно получить копию созданной структуры.
Предположим имеем следующую структуру:
СозданнаяСтруктура = Новый Структура; СозданнаяСтруктура.Вставить("Ключ1", "ЗначениеКлюча1"); СозданнаяСтруктура.Вставить("Ключ2", "ЗначениеКлюча2");
Для копирования структуры в 1С 8 нельзя просто взять и написать такое: КопияСтруктуры = СозданнаяСтруктура. Вместо копии структуры мы просто получаем еще одну переменную КопияСтруктуры, которая указывает на тот же самый набор данных что и переменная СозданнаяСтруктура.
В этом случае поможет следующий цикл:
КопияСтруктуры = Новый Структура; Для Каждого ЭлементСтруктуры Из СозданнаяСтруктура Цикл КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); КонецЦикла;
Похожие записи
- Обработчик изменения окна браузера .resize()
- Работа с вертикальным скроллингом элементов .scrollTop()
- Обработка динамически добавленных в DOM элементов
- Сортировка массива “Пузырьком”
Опубликовано Алексей
7 ответов к «Копирование структуры в 1С»
Функция КопияСтруктуры(СтруктураИсточник)
СтруктураПриемник = Новый Структура;
Для Каждого ЭлементСтруктуры Из СтруктураИсточник Цикл
Если ТипЗнч(ЭлементСтруктуры.Значение) = Тип(“Структура”) Тогда
СтруктураПриемник.Вставить(ЭлементСтруктуры.Ключ, КопияСтруктуры(ЭлементСтруктуры.Значение));
Иначе
СтруктураПриемник.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЕсли;
КонецЦикла;
Возврат СтруктураПриемник;
КонецФункции
DrLightman :
а Массив, Соответствие и остальные коллекции значений?
Егоров Михаил :
НовСтруктура2=ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(НовСтруктура1));
Михаил, данную функцию не рекомендуется использовать. Она нужна для совместимости с 7.7
DrLightman :
ИсходнаяСтруктура = Новый Структура(“ФИО”, “Иванов”);
//так
ФиксированнаяКопия = Новый Структура(ИсходнаяСтруктура);
Копия = Новый Структура(ФиксированнаяКопия);
//или так
Копия = Новый Структура(Новый Структура(ИсходнаяСтруктура));
Функция КопияСтруктуры(Знач Структура)
Возврат Структура;
КонецФункции
Дмитрий :
Бог МОЙ. Ну конечно же это НЕ работает.
Структура – это ссылка на структуру, а не сама структура.
От того, что вы копируете ссылку в другую ячейку – и от этого она не становится ссылкой на другой объект! Если вы измените “новую” структуру, “старая” так же изменится.