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, а использовать для других целей их не рекомендуется.
Таким образом, оптимальным решением задачи скопировать структуру является организация цикла по элементам копируемой структуры и их последовательная вставка во вновь созданную.