Перейти к содержимому

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

  • автор:

1С 8.x : Функция создает КОПИЮ переданного Массива, Структуры или Соответствия

Распечатать

Как удалить повторяющиеся элементы массива?  7
Функция УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт ТекущийИндекс = 0; ВсегоЭлементов = Массив.Количество(); Пока ТекущийИндекс ВсегоЭлементов Цикл Индекс2 = ТекущийИндекс + 1; Пока Индекс2 ВсегоЭлементов Цикл Если Массив = Структура

Создать структуру и добавить элементы  4
// Создание структуры СозданнаяСтруктура = Новый Структура; // Создание структуры и добавление элементов СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить(» Качество» , Качество); СтруктураОтбора.Вставить(» Номенклатура» , Номенкла Структура

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

Перебор элементов Структуры  3
Для Каждого Элемент из СтруктураПараметров Цикл Сообщить(Элемент.Ключ + » : » + Элемент.Значение); КонецЦикла; Посмотреть все в категории Работа с Массивом, Структурой, Соответствием

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

Существует несколько способов скопировать содержимое одной структуры в другую.

Самое простое решение, к которому прибегают начинающие программисты — это копирование всех свойств структуры с использованием цикла Для каждого :

Но он годится только для простых структур, которые не содержат вложенных структур и коллекций. Попробуйте ради интереса самостоятельно написать код для копирования следующей структуры:

Согласитесь, накладно каждый раз продумывать и писать код для копирования)

Более универсальным будет использование встроенных функций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). К тому же, можно уложиться в одну строку:

Этот же способ можно использовать для копирования других коллекций (правда, в рамках одной информационной базы).

Читайте также:

Поделиться страницей в соц.сетях

4 мысли на “ Как скопировать структуру в 1с 8? ”

Есть решение гораздо проще и элегантнее — Копировать через преобразование в «Новый ФиксированнаяСтруктура()».

// Оригинал
Оригинал_Стр = Новый Структура;
Оригинал_Стр.Вставить( «Ключ1», «Значение1» );
Оригинал_Стр.Вставить( «Ключ2», «Значение2» );
Оригинал_Стр.Вставить( «Ключ3», «Значение3» );
……
// ЛайфХак
Оригинал_Стр = Новый ФиксированнаяСтруктура( Оригинал_Стр );

// Копирование
Копия_1 = Новый Структура( Оригинал_Стр );
Копия_2 = Новый Структура( Оригинал_Стр );
….

Как вариант — возможно! Элегантный!? — под вопросом!
Еще есть куда оптимизироваться)) Тот же конструктор ФиксированнаяСтруктура(Ключи, Значения)

Оба решения, к сожалению не корректны. Надо именно проверять вложенные коллекции и копировать их. Нормального способа рекурсивно скопировать все содержимое коллекции нет
Копирование через ФиксированнаяСтруктура — точно так же, как первый вариант автора, скопирует лишь ссылки на вложенные коллекции и любая попытка поменять, например, вложенный массив в копии приведет к его изменению в источнике.
ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() — фирма 1С не рекомендует использовать эти функции: https://its.1c.ru/db/metod8dev/content/2612/hdoc

Дельное замечание, но по поводу функций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() дословно там сказано так:

Использовать их в большинстве случаев не рекомендуется

Т.е. это вовсе не означает, что пользоваться ими нельзя: не рекомендуется использовать их для хранения значений в базе на длительном отрезке времени, т.к. при архивации\разархивации базы изменятся идентификаторы метаданных и ссылки при восстановлении скорее всего слетят. Но для копирования сложной структуры — лучше варианта не найти…

Копирование структуры в 1С

В этой небольшой статье рассмотрим как можно получить копию созданной структуры.

Предположим имеем следующую структуру:

Для копирования структуры в 1С 8 нельзя просто взять и написать такое: КопияСтруктуры = СозданнаяСтруктура. Вместо копии структуры мы просто получаем еще одну переменную КопияСтруктуры, которая указывает на тот же самый набор данных что и переменная СозданнаяСтруктура.
В этом случае поможет следующий цикл:

Похожие записи

Опубликовано Алексей

7 ответов к «Копирование структуры в 1С»

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

а Массив, Соответствие и остальные коллекции значений?

Михаил, данную функцию не рекомендуется использовать. Она нужна для совместимости с 7.7

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

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

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

Скопировать структуру в конфигурации системы 1С: Предприятие

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

Сразу необходимо напомнить, что структура является особым типом данных в 1С, представляющим собой коллекцию пар «ключ» и «значение». В этом она крайне схожа с другим типом данных 1С — соответствием. Однако в структуре поле ключ всегда имеет строковый тип данных, а его название отвечает требованиям наименования переменных строки 1С. Поле же «значение» в структуре имеет любой тип данных.

Структура чаще всего применяется для значения процесса хранения информации, каждому из которых соответствует собственное имя, кроме того, многие типы встроенных функций и методы объектов 1С принимают в качестве одного или нескольких параметров именно структуру.

Для создания структуры в платформе системы 1С: Предприятие 8.3 и 8.2 используется 2 способа. Первый – создание пустой структуры и вставка в нее необходимого количества пар ключ-значение.

ДанныеСотрудника = Новый Структура;
ДанныеСотрудника.Вставить(«Фамилия», «Соколов»);
ДанныеСотрудника.Вставить(«Имя», «Дмитрий»);

Второй способ – создание информационной структуры сразу с необходимым количеством пар.
Дата = Новый Структура(«День, Месяц ,Год», 14, 03, 2022);

2. Способы копирования структуры в конфигурации системы 1С: Предприятие

После создания структуры одним из вышеуказанных способов может возникнуть необходимость создания ее копии. Необходимо сразу же отметить, что для копирования структуры в программе 1С: Предприятие 8 будет ошибкой использовать код:

В данном случае мы создаем еще одну переменную НоваяСтруктура, которая указывает на такой же набор данных 1С, что и переменная КопируемаяСтруктура. Соответственно при изменении КопируемаяСтруктура будет меняться и НоваяСтруктура.

Самым простым решением задачи скопировать структуру будет являться организация цикла учета по элементам копируемой структуры и их последовательная вставка во вновь созданную.

НоваяСтруктура = Новый Структура;

Для Каждого Элемент Из КопируемаяСтруктура Цикл

Есть еще одним встречающимся способом копирования структуры является применение функций ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр. Функция ЗначениеВСтрокуВнутр() возвращает строковое системное представление объекта переданного значения. Для обратного преобразования значения применяется функция ЗначениеИзСтрокиВнутр(). Пример кода приводится ниже.

НоваяСтруктура = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(КопируемаяСтруктура));
Однако синтакс-помощник не рекомендует использовать данный способ. В описании данных функций говорится о том, что они используются для сохранения функциональной совместимости с программой 1С:Предприятие 7.7, а использовать для других целей их не рекомендуется.

Таким образом, оптимальным решением задачи скопировать структуру является организация цикла по элементам копируемой структуры и их последовательная вставка во вновь созданную.

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

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