База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как написать процедуру копирования иерархических справочников в 1С с сохранением
- В этой теме 1 ответ, 2 участника, последнее обновление 1 месяц, 1 неделя назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
20 января 2026 в 13:30 #35528
Напиши процедуру копирования двух иерархических справочников одинаковой структуры в одной информационной базе. Справочник СтатьиДвиженияДенежныхСредств в СтатьиДДС
-
20 января 2026 в 13:30 #35529
Navigator, привет!
Вот пример процедуры на 1С (язык встроенный), которая копирует иерархический справочник СтатьиДвиженияДенежныхСредств в другой справочник с такой же структурой — СтатьиДДС, в одной базе. При этом сохраняется иерархия, реквизиты копируются по именам.
Основная идея — сначала собрать все элементы исходного справочника в массив, потом пройтись по ним в порядке от корня к листьям, создавая элементы в целевом справочнике и устанавливая ссылки на родителей.
1С (Код)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859Процедура КопироватьИерархическийСправочник()// Словарь для сопоставления ссылок исходного справочника и новогоСоответствиеСсылок = Новый Соответствие;// Массив для хранения элементов исходного справочникаМассивЭлементов = Новый Массив;// Получаем все элементы исходного справочника с сортировкой по уровню иерархииЗапрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Стр.Ссылка КАК Ссылка,| Стр.Родитель КАК Родитель,| Стр.Код КАК Код,| Стр.Наименование КАК Наименование,| Стр.УровеньИерархии КАК УровеньИерархии|ИЗ| Справочник.СтатьиДвиженияДенежныхСредств КАК Стр|УПОРЯДОЧИТЬ ПО| Стр.УровеньИерархии";Результат = Запрос.Выполнить();Выборка = Результат.Выбрать();Пока Выборка.Следующий() ЦиклМассивЭлементов.Добавить(Выборка.ПолучитьОбъект());КонецЦикла;// Проходим по элементам в порядке иерархииДля Каждого Элемент Из МассивЭлементов Цикл// Создаем новый элемент целевого справочникаНовыйЭлемент = Справочники.СтатьиДДС.СоздатьЭлемент();// Копируем реквизиты по именам (пример для типовых реквизитов)НовыйЭлемент.Код = Элемент.Код;НовыйЭлемент.Наименование = Элемент.Наименование;// Устанавливаем родителя, если он естьЕсли ЗначениеЗаполнено(Элемент.Родитель) ТогдаЕсли СоответствиеСсылок.СодержитКлюч(Элемент.Родитель) ТогдаНовыйЭлемент.Родитель = СоответствиеСсылок.Получить(Элемент.Родитель);КонецЕсли;КонецЕсли;// Если есть дополнительные реквизиты, их тоже нужно скопировать здесь// Записываем новый элементНовыйЭлемент.Записать();// Запоминаем соответствие ссылокСоответствиеСсылок.Вставить(Элемент.Ссылка, НовыйЭлемент.Ссылка);КонецЦикла;Сообщить("Копирование справочника завершено.");КонецПроцедурыОбъяснения:
— Запрос выбирает все элементы с уровнем иерархии, чтобы гарантировать, что родители будут созданы раньше детей.
— В цикле создаются новые элементы, копируются основные реквизиты (код, наименование).
— Родитель устанавливается по сопоставлению ссылок.
— Если в справочниках есть дополнительные реквизиты — их нужно добавить в копирование.
— В конце выводится сообщение об успешном завершении.Если справочники имеют одинаковую структуру реквизитов, то можно расширить копирование, перебирая реквизиты динамически через Метаданные.
Если нужно — могу помочь с этим.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.