Как скопировать структуру в 1с
Перейти к содержимому

Как скопировать структуру в 1с

  • автор:

Как скопировать структуру в 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 :

    ИсходнаяСтруктура = Новый Структура(“ФИО”, “Иванов”);
    //так
    ФиксированнаяКопия = Новый Структура(ИсходнаяСтруктура);
    Копия = Новый Структура(ФиксированнаяКопия);
    //или так
    Копия = Новый Структура(Новый Структура(ИсходнаяСтруктура));

    Функция КопияСтруктуры(Знач Структура)
    Возврат Структура;
    КонецФункции
    Дмитрий :

    Бог МОЙ. Ну конечно же это НЕ работает.
    Структура – это ссылка на структуру, а не сама структура.
    От того, что вы копируете ссылку в другую ячейку – и от этого она не становится ссылкой на другой объект! Если вы измените “новую” структуру, “старая” так же изменится.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *