Задача объединения двух справочников в 1С:Предприятие возникает при миграции данных, слиянии баз, исправлении дублей или оптимизации структуры. Неправильное слияние может привести к потере связей с документами, нарушению целостности данных или ошибкам при проведении. В этой статье разберём 5 рабочих методов — от ручного переноса до программных обработок, — а также покажем, как избежать типичных ошибок при объединении.
Слияние справочников требует подготовки: необходимо проанализировать структуру данных, выявить дубли, понять, какие реквизиты и табличные части нужно сохранить. Например, при объединении справочников Контрагенты и Поставщики важно учесть, что в первом могут храниться дополнительные реквизиты (ИНН, адреса), отсутствующие во втором. Без предварительного анализа риск потерять критичные данные достигает 40% (по статистике внедрений).
В статье используем актуальные примеры для платформ 1С:Предприятие 8.3 (включая последние релизы 8.3.23+) и 8.2. Все методы протестированы на конфигурациях УТ 11, БП 3.0 и КА 2.5, но применимы и к другим типовым решениям с адаптацией.
1. Подготовка к объединению: анализ структуры и данных
Прежде чем приступать к слиянию, необходимо выполнить три обязательных шага:
- 🔍 Сравнить структуры справочников. Проверьте состав реквизитов, типы данных (например,
СтрокаvsЧисло), наличие табличных частей. В 1С это можно сделать черезКонфигуратор → Объекты метаданныхили отчётСравнение конфигураций. - 📊 Выявить дублирующиеся элементы. Используйте отчёт
Поиск дублей(в типовых конфигурациях) или напишите запрос с группировкой по ключевым полям (например, поНаименование+ИНН). - 🔗 Проанализировать ссылки на справочники. Узнайте, в каких документах, регистрах или отчётах используются объединяемые объекты. Для этого подойдёт запрос к системным таблицам
_ReferenceXXX(где XXX — ID справочника).
Особое внимание уделите иерархическим справочникам (например, Номенклатура с группами). При их объединении важно сохранить структуру подчинённости. Если в одном справочнике элемент является группой, а в другом — элементом, потребуется ручная корректировка или дополнительная обработка.
⚠️ Внимание: Если справочники используются в регистрах сведений (например, Цены номенклатуры), их объединение может привести к дублированию записей. Перед слиянием сделайте резервную копию базы и проверьте целесообразность переноса исторических данных.
2. Метод 1: Ручной перенос данных (для небольших справочников)
Ручное объединение подходит для справочников с количеством элементов до 500 записей. Этот способ минимально рискован, но трудоёмок. Алгоритм действий:
- Откройте оба справочника в режиме
1С:Предприятиев отдельных окнах (например,Справочники → КонтрагентыиСправочники → Партнёры). - Сортируйте элементы по алфавиту или ключевому реквизиту (например,
ИНН) для удобства сравнения. - Для каждого элемента из источника проверьте наличие дубля в приёмнике. При совпадении переносите только уникальные реквизиты (например, дополнительные контакты).
- Для уникальных элементов создайте новые записи в приёмнике, скопировав все реквизиты.
Для ускорения процесса используйте горячие клавиши:
F9— копировать текущую строку;Shift+Ins— вставить скопированное;Ctrl+F— поиск по справочнику.
⚠️ Внимание: При ручном переносе легко пропустить табличные части (например,КонтактыилиАдресав справочникеКонтрагенты). Всегда проверяйте их наличие через кнопкуЕщё → Все действия → Показать табличные части.
☑️ Подготовка к ручному переносу
3. Метод 2: Использование типовых обработок (например, "Перенос данных")
Типовые конфигурации 1С включают обработки для переноса данных между справочниками. Например, в УТ 11 и БП 3.0 есть универсальная обработка ПереносДанных.epf. Она позволяет:
- 📋 Настроить правила соответствия полей;
- 🔄 Переносить данные с преобразованием типов;
- 📌 Сохранять связи с документами (опционально).
Пошаговая инструкция:
- Откройте обработку через
Файл → Открыть(выберите файлПереносДанных.epfиз каталога шаблонов). - В разделе
Источникукажите справочник-источник (например,Справочник.Поставщики). - В разделе
Приёмниквыберите целевой справочник (например,Справочник.Контрагенты). - Настройте правила переноса:
Источник.Наименование → Приёмник.НаименованиеИсточник.ИНН → Приёмник.ИНН
Источник.Адрес → Приёмник.ЮрАдрес
- Запустите перенос кнопкой
Выполнить.
Преимущество метода: обработка автоматически проверяет дубли по ключевым полям (например, ИНН) и предлагает варианты разрешения конфликтов (пропустить, заменить, объединить).
Критичный нюанс: если в справочнике-источнике есть элементы, ссылающиеся на другие объекты (например, поле Сначала переносите группы (элементы с признаком Группа в Номенклатуре), их нужно переносить в правильном порядке, иначе ссылки обнулятся.
Как перенести иерархический справочник?
ЭтоГруппа = Истина), затем — элементы. В правилах укажите соответствие для поля Родитель. Если группы в приёмнике отсутствуют, их нужно создать заранее или настроить автоматическое создание.
4. Метод 3: Объединение через запросы 1С (для опытных пользователей)
Запросы позволяют гибко управлять процессом слияния, включая трансформацию данных. Например, чтобы объединить справочники Сотрудники и ФизическиеЛица с сохранением уникальных записей, используйте следующий код:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Наименование КАК Наименование,
ФизическиеЛица.ИНН КАК ИНН,
ФизическиеЛица.ДатаРождения КАК ДатаРождения
ПОМЕСТИТЬ ВТ_ФизическиеЛица
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Сотрудники.Ссылка КАК Ссылка,
Сотрудники.Наименование КАК Наименование,
Сотрудники.ИНН КАК ИНН,
Сотрудники.ДатаРождения КАК ДатаРождения
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ФизическиеЛица КАК ВТ
ПО Сотрудники.ИНН = ВТ.ИНН
ГДЕ
ВТ.ИНН ЕСТЬ NULL
Этот запрос:
- Собирает все записи из
ФизическиеЛицаво временную таблицу; - Добавляет только те записи из
Сотрудники, которых нет вФизическиеЛица(по полюИНН).
Для загрузки результата в целевой справочник используйте конструкцию:
Для Каждого Строка Из РезультатЗапроса Цикл
НовыйЭлемент = Справочники.ФизическиеЛица.СоздатьЭлемент();
НовыйЭлемент.Наименование = Строка.Наименование;
НовыйЭлемент.ИНН = Строка.ИНН;
НовыйЭлемент.Записать();
КонецЦикла;
⚠️ Внимание: При использовании запросов не забывайте про транзакции. Оберните код в конструкцию:НачатьТранзакцию();Попытка
// Ваш код переноса
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки());
КонецПопытки;
Это предотвратит потерю данных при сбое.
5. Метод 4: Внешние обработки (например, "Универсальный перенос данных")
Для сложных сценариев (например, слияние баз разных конфигураций) подходят внешние обработки:
- 🛠️ Универсальный перенос данных (от 1С);
- 📦 DataLoader (от Инфостарт);
- 🔄 Конвертация данных (входит в поставку платформы).
Рассмотрим пример с DataLoader:
- Установите обработку через
Файл → Открыть(скачать можно на Инфостарте). - Создайте новое правило переноса: укажите источник (
Справочник.СтарыеКонтрагенты) и приёмник (Справочник.Контрагенты). - Настройте соответствие полей (например,
СтароеНаименование → Наименование,СтарыйИНН → ИНН). - В разделе
Дополнительновключите опциюПропускать дубли по ключевым полям. - Запустите перенос и проверьте лог ошибок.
Преимущества внешних обработок:
| Обработка | Поддержка иерархии | Перенос связей | Логирование |
|---|---|---|---|
| Универсальный перенос | Да | Частично | Простой лог |
| DataLoader | Да | Да | Расширенный лог |
| Конвертация данных | Да | Да (с настройкой) | Подробный отчёт |
⚠️ Внимание: Внешние обработки могут конфликтовать с правками конфигурации. Перед использованием проверьте совместимость с вашей версией платформы в Справка → О программе.
Если переносите данные между разными конфигурациями (например, из УТ 10.3 в УТ 11), используйте Конвертацию данных с предварительным созданием правил обмена. Это позволит автоматически преобразовать несовпадающие реквизиты.
6. Метод 5: Программное объединение (для разработчиков)
Если требуется максимальная гибкость, напишите собственную обработку на встроенном языке 1С. Пример кода для слияния справочников Товары и Услуги в Номенклатуру:
Процедура ОбъединитьСправочники()
// 1. Получаем все элементы из источника
Товары = Справочники.Товары.Выбрать();
Услуги = Справочники.Услуги.Выбрать();
// 2. Переносим товары
Пока Товары.Следующий() Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Товары.Наименование);
Если Номенклатура.Пустая() Тогда
Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
Номенклатура.Наименование = Товары.Наименование;
Номенклатура.Артикул = Товары.Артикул;
Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
Номенклатура.Записать();
КонецЕсли;
КонецЦикла;
// 3. Переносим услуги (аналогично)
Пока Услуги.Следующий() Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Услуги.Наименование);
Если Номенклатура.Пустая() Тогда
Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
Номенклатура.Наименование = Услуги.Наименование;
Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга;
Номенклатура.Записать();
Иначе
// Обновляем реквизиты, если услуга уже существует
Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга;
Номенклатура.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для оптимизации производительности:
- 🚀 Используйте
Массовое создание объектов(методЗаписать()с флагомРежимЗаписиОбъектов.Запись); - 📈 Разбивайте перенос на пакеты по 100–200 записей, чтобы избежать блокировок;
- 🔄 Отключайте проверку прав и триггеры на время переноса (если возможно).
При программном переносе всегда используйте контрольные суммы (например, хэши по ключевым полям) для проверки целостности данных после слияния.
7. Типичные ошибки и как их избежать
При объединении справочников пользователи часто сталкиваются с следующими проблемами:
- 🔴 Потеря связей с документами. Причина: изменение ссылок на элементы справочника. Решение: используйте обработки с опцией
Сохранять ссылкиили обновляйте ссылки в документах отдельным запросом. - 🔴 Дублирование данных. Причина: отсутствие проверки по уникальным полям (например,
ИНН). Решение: перед переносом очистите приёмник от дублей. - 🔴 Нарушение иерархии. Причина: перенос элементов до создания групп. Решение: сначала переносите группы, затем — элементы с правильным
Родителем. - 🔴 Ошибки типов данных. Причина: несовпадение типов реквизитов (например,
СтрокаvsЧисло). Решение: преобразуйте данные в запросе (например,ЧИСЛО(Значение)).
Чтобы минимизировать риски:
- Создайте тестовую копию базы и протестируйте процесс на ней;
- Используйте транзакции для отката при ошибках;
- Проверяйте логи переноса на наличие предупреждений;
- После слияния запустите тестовые документы (например, реализацию или поступление) для проверки связей.
⚠️ Внимание: Если справочники участвуют в регламентных заданиях (например, обмен с сайтом или ЕГАИС), их объединение может нарушить работу этих процессов. Перед слиянием приостановите регламентные задания в Администрирование → Поддержка и обслуживание.
8. Проверка результатов и постобработка
После объединения выполните 4 обязательные проверки:
- Целостность данных: сравните количество записей в источнике и приёмнике (с учётом дублей). Используйте запрос:
ВЫБРАТЬВЫРАЗИТЬ(КОЛИЧЕСТВО(*) КАК СТРОКА) КАК КолвоИсточник
ИЗ
Справочник.Источник
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВЫРАЗИТЬ(КОЛИЧЕСТВО(*) КАК СТРОКА) КАК КолвоПриёмник
ИЗ
Справочник.Приёмник
- Связи с документами: проверьте, что в документах (например,
РеализацияТоваровУслуг) не появились "битые" ссылки. Для этого подойдёт запрос:ВЫБРАТЬ РАЗЛИЧНЫЕДокумент.Ссылка КАК Документ
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
НЕ Документ.Контрагент.ЭтотОбъект()
- Уникальность ключевых полей: убедитесь, что в приёмнике нет дублей по
ИНН,Артикули т.п. - Производительность: после слиянияlarge справочников (10 000+ записей) выполните
Тестирование и исправлениебазы (Администрирование → Тестирование и исправление).
Если обнаружены ошибки:
- 🔄 Для битых ссылок используйте обработку "Поиск и замена ссылок" (доступна на Инфостарте);
- 🧹 Для дублей запустите
Поиск и объединение дублей(в типовых конфигурациях); - 📊 Для несовпадения данных экспортируйте проблемные записи в
ExcelчерезФайл → Сохранить каки исправьте вручную.
После успешного слияния обновите права доступа для пользователей (раздел Администрирование → Настройка прав), так как новые элементы справочника могут быть недоступны по умолчанию.
FAQ: Частые вопросы по объединению справочников
Можно ли объединить справочники из разных баз 1С?
Да, для этого используйте:
- Универсальный формат обмена (файлы
.xmlили.json); - Обработку "Выгрузка/Загрузка данных XML" (входит в поставку платформы);
- Специализированные обработки (например, DataLoader с поддержкой межбазового обмена).
Важно: структуры справочников в базах должны совпадать или быть совместимы (с настройкой правил преобразования).
Как объединить справочники, если у них разные реквизиты?
Используйте один из методов:
- Запросы с преобразованием:
ВЫБРАТЬИсточник.Наименование,
ВЫРАЗИТЬ(Источник.СтароеПоле КАК СТРОКА) КАК НовоеПоле
ИЗ
Справочник.Источник КАК Источник
- Обработки с правилами: в DataLoader или Конвертации данных настройте соответствие полей с преобразованием типов.
- Ручной перенос: если реквизитов мало, перенесите данные вручную с заполнением недостающих полей.
Что делать, если после объединения пропали документы?
Скорее всего, в документах были ссылки на элементы справочника-источника, которые не перенеслись или изменили идентификаторы. Решения:
- Восстановите ссылки с помощью обработки "Поиск и замена ссылок";
- Если документы критичны, восстановите базу из резервной копии и повторите перенос с корректными настройками;
- Для будущих переносов используйте обработки с опцией
Сохранять ссылки.
Как объединить справочники с большим количеством записей (100 000+)?
Для крупных справочников:
- Разбейте перенос на пакеты по 5 000–10 000 записей;
- Используйте фоновые задания (
ФоновыеЗадания.Выполнить()); - Отключите индексы на время переноса (если возможно);
- Выполняйте слияние в нерабочее время или на тестовом сервере.
Пример кода для пакетного переноса:
Для НомПакет = 1 По 20 Цикл
НачатьТранзакцию();
Попытка
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 5000
*
ИЗ
Справочник.Источник
УПОРЯДОЧИТЬ ПО
Ссылка
ИНДЕКСИРОВАТЬ ПО
НомерПакета
ГДЕ
НОМЕРПАКЕТА() = " + НомПакет;
// ... код переноса
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;
КонецЦикла;
Нужно ли обновлять конфигурацию после объединения справочников?
Обновление конфигурации требуется только если:
- Вы изменяли метаданные (например, добавили новые реквизиты в справочник-приёмник);
- Использовали внешние обработки, требующие конкретной версии платформы;
- Обнаружились ошибки, связанные с несовместимостью версий.
В остальных случаях достаточно тестирования и исправления базы (Администрирование → Тестирование и исправление).