При переносе данных между базами 1С:Предприятие 7.7 часто возникает ситуация, когда часть информации переносится корректно, а вложенные или подчиненные объекты остаются пустыми. Давайте разберем, почему это происходит и как эффективно перенести справочник «Контрагенты», подчиненный справочнику «Филиалы».
Основная причина того, что при использовании простых обработок переноса вы видите список «Филиалов», но не видите «Контрагентов», заключается в механизме подчинения. В 1С 7.7 объект «Контрагент» является зависимым от объекта «Филиал». При работе стандартных обработок типа TRANREF.ERT, если алгоритм не настроен на рекурсивный обход подчиненных элементов или не соблюдает ссылочную целостность, система переносит только «родительские» элементы.
Для успешного переноса необходимо выполнить два условия:
Наиболее профессиональным способом решения данной задачи является использование конфигурации «Конвертация данных». Этот инструмент позволяет описать правила обмена, которые гарантированно учитывают все связи между справочниками.
Рассмотрим порядок действий при работе с Конвертацией данных:
Если базы абсолютно идентичны, вы можете воспользоваться уже проверенными сообществом обработками, которые лучше справляются с иерархией, чем базовые инструменты. Рекомендуем обратить внимание на UNIVERSAM.ERT.
Почему стоит выбрать UNIVERSAM.ERT:
Если вы хотите полностью контролировать процесс, мы можем написать небольшой скрипт на встроенном языке 1С. Это самый надежный способ, если нужно гарантированно сохранить все связи. Разберем алгоритм такого переноса:
Для начала создадим объект СправочникОбъект и используем метод Записать(). Важно правильно определить владельца объекта.
Процедура ПеренестиДанные()
СпрИсточник = СоздатьОбъект("Справочник.Контрагенты");
СпрПриемник = СоздатьОбъект("Справочник.Контрагенты");
СпрИсточник.ВыбратьЭлементы();
Пока СпрИсточник.ПолучитьЭлемент() = 1 Цикл
Если СпрИсточник.ЭтоГруппа() = 0 Тогда
СпрПриемник.ИспользоватьВладельца(СпрИсточник.Владелец);
СпрПриемник.Новый();
СпрПриемник.Наименование = СпрИсточник.Наименование;
СпрПриемник.Код = СпрИсточник.Код;
// Перенос остальных реквизитов
СпрПриемник.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное примечание: При программном переносе убедитесь, что справочник-владелец («Филиалы») уже заполнен в базе-приемнике. Если владелец не будет найден, метод ИспользоватьВладельца() вызовет ошибку записи или приведет к созданию «сиротских» записей.
После завершения процесса переноса обязательно выполните следующие действия:
Использование вышеуказанных методов позволит вам избежать потерь данных и гарантирует, что список контрагентов будет отображаться в филиалах так же, как в исходной базе данных.