Пример алгоритма синхронизации справочников по GUID

10.02.12

Задачи пользователя - Поиск данных

Порой при переводе систем с одной конфигурации на другую нужно часто переносить справочники из одних в другие.
При этом сложно завязываться на код или наименование.
Но! Можно завязаться на GUID элемента. 1С позволяет использовать один и тот же GUID в разных справочниках.

Порой при переводе систем с одной конфигурации на другую нужно часто переносить справочники из одних в другие.

При этом сложно завязываться на код или наименование.

Но! Можно завязаться на GUID элемента. 1С позволяет использовать один и тот же GUID в разных справочниках.

Причем в составных полях хранится не только GUID, но и тип, поэтому использование в одной базе ссылок с одинаковым GUID но разным типом безопасно!

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

Понятно, что его можно использовать многократно.

Алгоритм имеет следующие параметры:

   

Наименование

Направление передачи

ТипУчастникаКА

Внутренний

зпЗапрос

Вход

ИдентификаторРезСправочника

Вход

ПапкаНовых

Вход

ТолькоНовые

Вход

ГрузитьИерархию

Вход

ГрузитьПодчиненность

Вход

ВладелецНовых

Вход

ЧислоОбрабатываемых

Вход

ИерархияЭлементовВИерархиюГрупп

Вход

ПроставлятьСсылкуНаРезультатВРеквизите

Вход

 

//Запрос, которым получаем исходные элементы

Запрос = ПолучитьЗапрос(зпЗапрос);

ТЗ = Запрос.Выполнить().Выгрузить();

ТЗ.Колонки.Добавить("Уровень");

//Сортируем по уровню

//Чтобы группы создавались раньше элементов, в один проход тогда можно

Состояние("Индексация");

Для Каждого СтрокаТЧ ИЗ ТЗ Цикл

Попытка

СтрокаТЧ.Уровень = СтрокаТЧ.Ссылка.Уровень();

Исключение

Прервать; //Не индексируем

КонецПопытки;

ОбработкаПрерыванияПользователя();

КонецЦикла;

ТЗ.Сортировать("Уровень Возр");

//Загрузка

Состояние("Загрузка");

СчетчикСозданных= 0;

//Перебираем объекты

Для Каждого СтрокаТЧ ИЗ ТЗ Цикл

ОбработкаПрерыванияПользователя();

//Получаем GUID исходного элемента

СсылкаИсх = СтрокаТЧ.Ссылка;

МенеджерИсх = Справочники[СсылкаИсх.Метаданные().Имя];

ГуидИсх = СсылкаИсх.УникальныйИдентификатор();

Попытка

ГуидИсхРодитель = СсылкаИсх.Родитель.УникальныйИдентификатор();

Исключение

ГуидИсхВладелец = СсылкаИсх.Родитель.УникальныйИдентификатор();

КонецПопытки;

 

//Формируем GUID результирующего элемента и родителей, владельцев

СсылкаРез = Справочники[ИдентификаторРезСправочника].ПолучитьСсылку(ГуидИсх);

Попытка

СсылкаРезРодитель = Справочники[ИдентификаторРезСправочника].ПолучитьСсылку(ГуидИсхРодитель);

Исключение

СсылкаРезВладелец = Справочники[ИдентификаторРезСправочника].ПолучитьСсылку(ГуидИсхВладелец);

КонецПопытки;

//Находим элемент по GUID, если его нет, то формируем

ТекОбъект = СсылкаРез.ПолучитьОбъект();

Попытка

ЭтоГруппаИсх = СсылкаИсх.ЭтоГруппа;

Исключение

ЭтоГруппаИсх = ложь;

КонецПопытки;

Если ИерархияЭлементовВИерархиюГрупп Тогда

Выборка = МенеджерИсх.Выбрать(СсылкаИсх);

Если Выборка.Следующий() Тогда

ЭтоГруппаИсх = истина;

КонецЕсли;

КонецЕсли;

//Создаем объект или группу, в зависимости от того, был элемент группой или нет

Если ТекОбъект = Неопределено Тогда

Если ЭтоГруппаИсхТогда

Попытка

ТекОбъект = Справочники[ИдентификаторРезСправочника].СоздатьГруппу();

Исключение

ТекОбъект = Справочники[ИдентификаторРезСправочника].СоздатьЭлемент();

КонецПопытки;

Иначе

ТекОбъект = Справочники[ИдентификаторРезСправочника].СоздатьЭлемент();

КонецЕсли;

ТекОбъект.УстановитьСсылкуНового(СсылкаРез);

Иначе

Если ТолькоНовые Тогда

Продолжить;

КонецЕсли;

КонецЕсли;

//Устанавливаем папку

Попытка

Если ЗначениеЗаполнено(ПапкаНовых) Тогда

ТекОбъект.Папка = ПапкаНовых;

КонецЕсли;

Исключение

КонецПопытки;

//Устанавливаем владельца

Попытка

Если ЗначениеЗаполнено(ВладелецНовых) Тогда

ТекОбъект.Владелец = ВладелецНовых;

КонецЕсли;

Исключение

КонецПопытки;

//Если переносим иерархию

Попытка

Если ГрузитьИерархию=истина Тогда

ТекОбъект.Родитель = СсылкаРезРодитель.ПолучитьОбъект().Ссылка;

КонецЕсли;

Исключение

КонецПопытки;

Попытка

Если ГрузитьПодчиненность=истина Тогда

ТекОбъект.Владелец = СсылкаРезВладелец.ПолучитьОбъект().Ссылка;

КонецЕсли;

Исключение

КонецПопытки;

//Устанавливаем наименование и код

ТекОбъект.Наименование = СсылкаИсх.Наименование;

//ТекОбъект.Код = СсылкаИсх.Код;

//Устанавливаем код синхронизации

Попытка

ТекОбъект.ИдВнешний = СсылкаИсх.Код6;

Исключение

Попытка

ТекОбъект.ИдВнешний = СсылкаИсх.ИдВнешний;

Исключение

КонецПопытки

КонецПопытки;

//Устанавливаем тип участника, если это справочник участников

Попытка

ТекОбъект.ТипУчастника = ТипУчастникаКА;

Исключение

КонецПопытки;

ТекОбъект.ПометкаУдаления = СсылкаИсх.ПометкаУдаления;

СчетчикСозданных= СчетчикСозданных + 1;

Сообщить(""+СчетчикСозданных+": "+ТекОбъект);

ТекОбъект.Записать();

Если СокрЛП(ПроставлятьСсылкуНаРезультатВРеквизите) <> "" Тогда

ОбъектИсх = СсылкаИсх.ПолучитьОбъект();

ОбъектИсх[СокрЛП(ПроставлятьСсылкуНаРезультатВРеквизите)] = ТекОбъект.Ссылка;

ОбъектИсх.Записать();

КонецЕсли;

Если ЧислоОбрабатываемых<>0 И СчетчикСозданных >= ЧислоОбрабатываемых Тогда

Прервать;

КонецЕсли;

//Обновляем элемент

//Ставим родителя

ОбработкаПрерыванияПользователя();

//Прервать;

КонецЦикла;

В коде используется функция ПолучитьЗапрос, которая получает объект запроса по его идентификатору (у нас в конфигурации ведется реестр запросов).
Есть также некоторые заточки по заполнению новых элементов определенного типа.

Но в целом, я использовал этот алгоритм достаточно универсально для переноса и синхронизации по ГУИД около пять-восьми справочников разного типа.
Надеюсь, вам тоже пригодится.

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

10800 руб.

14.05.2012    155655    327    252    

559

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

21600 руб.

15.05.2017    42649    10    24    

38

Кто такая Мантикора?

Поиск данных Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    3253    andreysidor4uk    16    

46

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

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

1 стартмани

09.06.2023    7701    4    SpaceOfMyHead    17    

56

Поиск и замена значений + Поиск дублирующихся элементов справочников с подключением к внешней базе

Поиск данных Корректировка данных Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для гибкого поиска и дальнейшей замены дублей справочников, документов, а также планов видов расчетов и планов видов характеристик. В обработку включена возможность проверки наличия ссылки во внешней базе (по УИДу), поиска дублей с предварительным отбором, а также произвольной обработки реквизитов перед поиском (например, возможно удалить определенные символы из наименования).

3600 руб.

30.03.2022    8615    3    0    

5

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7955    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pumbaE 10.02.12 13:28 Сейчас в теме
Гений1с конечно гениален, но перепечатывать старые статьи по мне неправильно.

Посмотрели бы уже в типовых на регистр сведений "СоответствиеОбъектовДляОбмена" и работу с ним.

Написал бы тогда и дополнительно как бороться с коллизиями.
2. fixin 4253 10.02.12 13:48 Сейчас в теме
(1) смотрел, знаю, но в нетиповых можно и такой метод юзать...
3. rus128 2 15.02.12 15:39 Сейчас в теме
Жаль, но код практически нечитабелен, поэтому "многабукф" и "ниасилил", то есть оценить полезность и применимость лично для себя затрудняюсь. А использование в статье слова "ГУИД" очень смутило.
4. fixin 4253 15.02.12 17:13 Сейчас в теме
(3) вы буквоед (по поводу ГУИД)
5. natarezn 20.10.16 11:18 Сейчас в теме
мне сложно завязываться на код и на наименование. надеюсь эта статья мне пригодится
Оставьте свое сообщение