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

10.02.12

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

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

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

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

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

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

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

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

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

   

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

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

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

Внутренний

зпЗапрос

Вход

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

Вход

ПапкаНовых

Вход

ТолькоНовые

Вход

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

Вход

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

Вход

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

Вход

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

Вход

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

Вход

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

Вход

 

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

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

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

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

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

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

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

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

Попытка

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

Исключение

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

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

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

КонецЦикла;

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

//Загрузка

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

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

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

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

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

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

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

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

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

Попытка

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

Исключение

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

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

 

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

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

Попытка

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

Исключение

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

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

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

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

Попытка

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

Исключение

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

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

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

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

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

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

КонецЕсли;

КонецЕсли;

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

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

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

Попытка

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

Исключение

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

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

Иначе

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

КонецЕсли;

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

Иначе

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

Продолжить;

КонецЕсли;

КонецЕсли;

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

Попытка

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

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

КонецЕсли;

Исключение

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

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

Попытка

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

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

КонецЕсли;

Исключение

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

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

Попытка

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

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

КонецЕсли;

Исключение

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

Попытка

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

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

КонецЕсли;

Исключение

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

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

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

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

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

Попытка

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

Исключение

Попытка

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

Исключение

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

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

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

Попытка

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

Исключение

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

Прервать;

КонецЕсли;

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

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

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

//Прервать;

КонецЦикла;

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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Информационная безопасность Поиск данных ServiceDesk, HelpDesk Журналы и реестры данных 8.3.14 Россия Бухгалтерский учет Бюджетный учет Налоговый учет Управленческий учет Платные (руб)

Полный контроль над изменениями в 1С без нагрузки на вашу базу. Мгновенный доступ к истории изменений, удобное сравнение и откат данных в один клик. Простой отчет с визуальным отображением изменений Откат на любую версию объекта в два клика История изменения данных хранится во внешней базе

180000 руб.

05.09.2025    1515    1    0    

3

Поиск данных Системный администратор Программист 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Платные (руб)

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

13200 руб.

14.05.2012    164653    352    253    

585

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

Расширение добавляет возможность в 1С в любых полях и отборах выбирать значения не только Код, Наименование или Номер, но и Уникальный идентификатор, Навигационную ссылку, Объект не найден, Представление документа.

2 стартмани

18.08.2025    6029    33    sapervodichka    14    

75

Поиск данных ЭДО и ОФД Подбор и обработка объектов 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Поиск номенклатуры при сопоставлении в ЭДО не интуитивный, не настраиваемый и просто неудобный. Данное решение - это альтернативный вариант расширенного поиска и сопоставления номенклатуры для 1С, который подключается в качестве расширения и решает эту проблему.

10000 руб.

10.04.2025    1399    1    1    

1

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

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

1 стартмани

30.01.2024    12160    stopa85    12    

42

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

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

1 стартмани

30.11.2023    7065    andreysidor4uk    21    

57

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

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

1 стартмани

09.06.2023    19197    11    SpaceOfMyHead    20    

64

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

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

1 стартмани

21.03.2022    11320    8    kalyaka    11    

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

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

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