Как скопировать структуру в 1с 8?
Существует несколько способов скопировать содержимое одной структуры в другую.
Самое простое решение, к которому прибегают начинающие программисты — это копирование всех свойств структуры с использованием цикла Для каждого :
НоваяСтруктура = Новый Структура; Для каждого Элемент Из Структура Цикл НоваяСтруктура.Вставить(Элемент.Ключ, Элемент.Значение); КонецЦикла;
Но он годится только для простых структур, которые не содержат вложенных структур и коллекций. Попробуйте ради интереса самостоятельно написать код для копирования следующей структуры:
Структура = Новый Структура; Структура.Вставить("Код", 100); Структура.Вставить("Наименование", "Стул деревянный"); Структура.Вставить("Остатки", Новый Структура); Структура.Остатки.Вставить("Основной", 10); Структура.Остатки.Вставить("Дополнительный", 3);
Согласитесь, накладно каждый раз продумывать и писать код для копирования)
Более универсальным будет использование встроенных функций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). К тому же, можно уложиться в одну строку:
НоваяСтруктура = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Структура));
Этот же способ можно использовать для копирования других коллекций (правда, в рамках одной информационной базы).
Читайте также:
Как скопировать структуру в 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 Цикл
Сообщить(Свойство.Ключ+»,»+СВойство.Значение);
КонецЦикла;
Функция ВерниКопию(Знач Источник)
Возврат Источник;
КонецФункции
Я,Умный
Хотя,Не очень
копирование ссылки
Я,Умный
Хотя,даже очень
так,себе
верни копию
Я,Умный
Хотя,даже очень
так,себе
Копирование структуры в 1С
В этой небольшой статье рассмотрим как можно получить копию созданной структуры.
Предположим имеем следующую структуру:
СозданнаяСтруктура = Новый Структура; СозданнаяСтруктура.Вставить("Ключ1", "ЗначениеКлюча1"); СозданнаяСтруктура.Вставить("Ключ2", "ЗначениеКлюча2");
Для копирования структуры в 1С 8 нельзя просто взять и написать такое: КопияСтруктуры = СозданнаяСтруктура. Вместо копии структуры мы просто получаем еще одну переменную КопияСтруктуры, которая указывает на тот же самый набор данных что и переменная СозданнаяСтруктура.
В этом случае поможет следующий цикл:
КопияСтруктуры = Новый Структура; Для Каждого ЭлементСтруктуры Из СозданнаяСтруктура Цикл КопияСтруктуры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); КонецЦикла;
Похожие записи
- Обращение к элементам с помощью JQuery
- Всплывающие подсказки
- Многостраничный Excel из 1С
- Работа с cookies на jQuery
Опубликовано Алексей
7 ответов к «Копирование структуры в 1С»
Функция КопияСтруктуры(СтруктураИсточник)
СтруктураПриемник = Новый Структура;
Для Каждого ЭлементСтруктуры Из СтруктураИсточник Цикл
Если ТипЗнч(ЭлементСтруктуры.Значение) = Тип(“Структура”) Тогда
СтруктураПриемник.Вставить(ЭлементСтруктуры.Ключ, КопияСтруктуры(ЭлементСтруктуры.Значение));
Иначе
СтруктураПриемник.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЕсли;
КонецЦикла;
Возврат СтруктураПриемник;
КонецФункции
DrLightman :
а Массив, Соответствие и остальные коллекции значений?
Егоров Михаил :
НовСтруктура2=ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(НовСтруктура1));
Михаил, данную функцию не рекомендуется использовать. Она нужна для совместимости с 7.7
DrLightman :
ИсходнаяСтруктура = Новый Структура(“ФИО”, “Иванов”);
//так
ФиксированнаяКопия = Новый Структура(ИсходнаяСтруктура);
Копия = Новый Структура(ФиксированнаяКопия);
//или так
Копия = Новый Структура(Новый Структура(ИсходнаяСтруктура));
Функция КопияСтруктуры(Знач Структура)
Возврат Структура;
КонецФункции
Дмитрий :
Бог МОЙ. Ну конечно же это НЕ работает.
Структура – это ссылка на структуру, а не сама структура.
От того, что вы копируете ссылку в другую ячейку – и от этого она не становится ссылкой на другой объект! Если вы измените “новую” структуру, “старая” так же изменится.
Скопировать структуру в конфигурации системы 1С: Предприятие
В данной статье будет рассмотрен относительно несложный вопрос, с которым могут столкнуться разработчики 1С в своей повседневной работе.
Сразу необходимо напомнить, что структура является особым типом данных в 1С, представляющим собой коллекцию пар «ключ» и «значение». В этом она крайне схожа с другим типом данных 1С — соответствием. Однако в структуре поле ключ всегда имеет строковый тип данных, а его название отвечает требованиям наименования переменных строки 1С. Поле же «значение» в структуре имеет любой тип данных.
Структура чаще всего применяется для значения процесса хранения информации, каждому из которых соответствует собственное имя, кроме того, многие типы встроенных функций и методы объектов 1С принимают в качестве одного или нескольких параметров именно структуру.
Для создания структуры в платформе системы 1С: Предприятие 8.3 и 8.2 используется 2 способа. Первый – создание пустой структуры и вставка в нее необходимого количества пар ключ-значение.
ДанныеСотрудника = Новый Структура;
ДанныеСотрудника.Вставить(«Фамилия», «Соколов»);
ДанныеСотрудника.Вставить(«Имя», «Дмитрий»);
Второй способ – создание информационной структуры сразу с необходимым количеством пар.
Дата = Новый Структура(«День, Месяц ,Год», 14, 03, 2022);
2. Способы копирования структуры в конфигурации системы 1С: Предприятие
После создания структуры одним из вышеуказанных способов может возникнуть необходимость создания ее копии. Необходимо сразу же отметить, что для копирования структуры в программе 1С: Предприятие 8 будет ошибкой использовать код:
В данном случае мы создаем еще одну переменную НоваяСтруктура, которая указывает на такой же набор данных 1С, что и переменная КопируемаяСтруктура. Соответственно при изменении КопируемаяСтруктура будет меняться и НоваяСтруктура.
Самым простым решением задачи скопировать структуру будет являться организация цикла учета по элементам копируемой структуры и их последовательная вставка во вновь созданную.
НоваяСтруктура = Новый Структура;
Для Каждого Элемент Из КопируемаяСтруктура Цикл
Есть еще одним встречающимся способом копирования структуры является применение функций ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр. Функция ЗначениеВСтрокуВнутр() возвращает строковое системное представление объекта переданного значения. Для обратного преобразования значения применяется функция ЗначениеИзСтрокиВнутр(). Пример кода приводится ниже.
НоваяСтруктура = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(КопируемаяСтруктура));
Однако синтакс-помощник не рекомендует использовать данный способ. В описании данных функций говорится о том, что они используются для сохранения функциональной совместимости с программой 1С:Предприятие 7.7, а использовать для других целей их не рекомендуется.
Таким образом, оптимальным решением задачи скопировать структуру является организация цикла по элементам копируемой структуры и их последовательная вставка во вновь созданную.
Специалист компании «Кодерлайн»
Инна Изотова