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

10.02.12

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

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

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

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

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

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

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

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

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

   

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

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

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

Внутренний

зпЗапрос

Вход

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

Вход

ПапкаНовых

Вход

ТолькоНовые

Вход

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

Вход

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

Вход

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

Вход

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

Вход

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

Вход

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

Вход

 

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

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

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

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

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

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

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

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

Попытка

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

Исключение

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

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

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

КонецЦикла;

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

//Загрузка

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

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

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

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

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

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

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

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

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

Попытка

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

Исключение

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

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

 

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

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

Попытка

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

Исключение

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

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

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

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

Попытка

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

Исключение

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

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

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

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

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

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

КонецЕсли;

КонецЕсли;

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

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

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

Попытка

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

Исключение

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

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

Иначе

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

КонецЕсли;

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

Иначе

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

Продолжить;

КонецЕсли;

КонецЕсли;

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

Попытка

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

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

КонецЕсли;

Исключение

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

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

Попытка

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

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

КонецЕсли;

Исключение

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

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

Попытка

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

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

КонецЕсли;

Исключение

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

Попытка

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

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

КонецЕсли;

Исключение

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

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

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

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

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

Попытка

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

Исключение

Попытка

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

Исключение

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

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

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

Попытка

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

Исключение

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

Прервать;

КонецЕсли;

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

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

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

//Прервать;

КонецЦикла;

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

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

См. также

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

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

10800 руб.

14.05.2012    159337    338    253    

572

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    4204    stopa85    12    

39

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

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

1 стартмани

30.11.2023    4858    andreysidor4uk    18    

53

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

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

1 стартмани

09.06.2023    11799    8    SpaceOfMyHead    19    

61

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

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

3600 руб.

30.03.2022    8997    3    0    

5

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

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

1 стартмани

21.03.2022    9219    7    kalyaka    11    

44

Математика и алгоритмы Программист Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    9850    John_d    73    

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

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

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