Слияние двух информационных баз 1С 8.3 в одну без дублей
Содержание
Объединить базы 1С можно тремя путями: выгрузить данные одной базы в XML и загрузить в другую, перенести их по правилам обмена с сопоставлением объектов или написать перенос через COM-соединение. Для двух баз одной конфигурации и одного релиза быстрее всего первый путь, для разных конфигураций — второй, для выборочного переноса с собственной логикой — третий.
Главная боль при слиянии — не сам перенос, а то, что получается после него: два «ООО Ромашка» в справочнике, документы с одинаковыми номерами, ссылки <Объект не найден>. Ниже порядок, при котором базу не придётся потом чистить неделю.
Подготовка баз 1С к объединению
Перед первым запуском переноса решите три вопроса: какая база будет приёмником, что именно переносим и каким способом.
Приёмник — обычно база, где больше данных и где дальше будут работать. Источник после переноса уходит в архив.
Объём переноса определяет способ:
- 📁 только справочники (контрагенты, номенклатура, договоры) — самый частый и безопасный вариант;
- 📄 справочники и документы за период — нужно потом перепровести документы ;
- 📊 начальные остатки на дату — часто проще и чище, чем тащить всю историю.
Сравнительная таблица способов
| Способ | Когда подходит | Риски |
|---|---|---|
| Выгрузка/загрузка XML | Одна конфигурация, одинаковый релиз | Дубли справочников, конфликт номеров |
| Универсальный обмен по правилам | Разные конфигурации или нужна настройка поиска | Нужны правила из «Конвертации данных» |
| Типовая синхронизация | Пары конфигураций, у которых есть штатный обмен | Переносит только то, что заложено в обмене |
| COM-соединение | Выборочный перенос со своей логикой | Нужен программист, работает только в Windows |
Что сделать до переноса
- Сделайте копию обеих баз: в конфигураторе
Администрирование → Выгрузить информационную базу, файл.dtсохраните отдельно. - Сравните релизы:
Справка → О программев каждой базе. Для загрузки XML состав метаданных должен совпадать. Если релизы разные, обновите старую базу до релиза приёмника. - Задайте разные префиксы: в карточке организации поле «Префикс» и префикс самой базы в
Администрирование → Синхронизация данных. Тогда номера документов из двух баз не пересекутся. - Попросите пользователей выйти из обеих баз на время переноса и сообщите, когда работа возобновится.
Когда хватит остатков вместо истории
Если источник — база закрытой фирмы или филиала, который переходит на общий учёт, историю документов переносить не обязательно. Достаточно трёх шагов:
- Закройте период в источнике и сформируйте оборотно-сальдовую ведомость на дату перехода.
- Перенесите справочники любым из способов ниже.
- Введите остатки в приёмнике на ту же дату по ведомости источника.
Так приёмник не получит тысячи чужих документов, а старая база остаётся в архиве для справок и проверок.
Пробный перенос делайте на копии приёмника. Восстановить базу из .dt быстрее, чем выискивать по журналу, что именно загрузилось лишнего.
Как объединить базы через выгрузку и загрузку XML
Этот способ использует внешнюю обработку
«Выгрузка и загрузка данных XML» (файл ВыгрузкаЗагрузкаДанныхXML83.epf, распространяется на дисках ИТС). Она переносит объекты вместе с их внутренними идентификаторами.
Выгрузка из базы-источника
- Откройте источник,
Файл → Открытьи выберите обработку. - На вкладке выгрузки отметьте нужные объекты: справочники, документы, регистры.
- Для документов задайте период, иначе обработка выгрузит всю историю.
- Включите выгрузку связанных объектов по ссылкам — без этого в приёмнике останутся пустые ссылки.
- Укажите имя файла и нажмите выгрузку.
Загрузка в базу-приёмник
- Откройте приёмник под пользователем с полными правами.
- Запустите ту же обработку, перейдите на вкладку загрузки.
- Выберите XML-файл и запустите загрузку.
Обработка пишет объекты в режиме обмена данными: проверки заполнения и проведение при записи не выполняются. Документы после загрузки нужно перепровести групповой обработкой за весь перенесённый период.
У двух баз, созданных независимо, идентификаторы объектов разные. Один и тот же контрагент из двух баз превратится в два элемента справочника. Это нормально для этого способа — дубли убирают следующим шагом.
Универсальный обмен по правилам
Если конфигурации разные или нужно, чтобы контрагент находился по ИНН, а не создавался заново, используйте обработку «Универсальный обмен данными в формате XML». Она работает по файлу правил, который готовят в конфигурации «Конвертация данных ».
В правилах для каждого объекта задают:
- 🔍 поля поиска — по каким реквизитам искать объект в приёмнике;
- 🔄 режим записи — заменять найденный объект или не трогать его;
- 🔗 соответствие реквизитов — какое поле источника куда ложится.
Для пар конфигураций со штатным обменом (например, Бухгалтерия и Управление торговлей) правила уже есть: обмен настраивается в Администрирование → Синхронизация данных, отдельная разработка не нужна.
Правила сопоставления и поиск дублей после слияния
От того, как сопоставлены объекты, зависит, получится ли одна чистая база или база с двойниками.
По каким полям искать
| Справочник | Надёжный ключ поиска | Почему не наименование |
|---|---|---|
| Контрагенты | ИНН + КПП | У обособленных подразделений один ИНН, разные КПП |
| Номенклатура | Артикул, штрихкод | «Бумага А4» и «Бумага А4 офисная» — один товар |
| Договоры | Владелец + номер + дата | Названия договоров часто одинаковые |
| Физические лица | ИНН или СНИЛС | Полные тёзки встречаются |
| Банковские счета | Номер счёта + БИК | Наименование счёта пишут произвольно |
Если ключа нет (номенклатура без артикулов), сначала наведите порядок в источнике: проставьте артикулы, удалите явный мусор, пометьте лишнее на удаление.
Как убрать дубли в приёмнике
В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) есть обработка Администрирование → Обслуживание → Корректировка данных → Поиск и удаление дублей.
- Выберите справочник, например «Контрагенты».
- Задайте правило сравнения: ИНН «совпадает», наименование «похоже».
- В каждой группе найденных дублей отметьте оригинал — элемент, который останется.
- Запустите замену: ссылки на дубли во всех документах переключатся на оригинал, дубли будут помечены на удаление.
- Удалите помеченные объекты обработкой удаления помеченных.
Конфликты при совпадении
- 📝 Разные реквизиты у одного контрагента — оставьте как основной элемент запись из базы, где данные свежее, недостающие поля допишите вручную.
- 🔢 Совпали номера документов — решается префиксами из подготовки. Если их не задали, программа может отказать в записи из-за неуникального номера.
- 📅 Пересечение периодов — если обе базы вели учёт одной организации за один период, обороты задвоятся. Переносите один период только из одной базы.
Объединение данных 1С через COM-соединение
COM-соединение позволяет из одной базы открыть другую и читать её данные как свои. Это способ для программиста: поиск, сопоставление и запись описываются кодом.
Регистрация компоненты
COM-коннектор — библиотека comcntr.dll из каталога bin установленной платформы. Регистрируют её от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1342\bin\comcntr.dll"
Номер версии в пути подставьте свой. Разрядность коннектора должна совпадать с разрядностью процесса, который его вызывает: 64-битный процесс не увидит 32-битную регистрацию.
Пример переноса контрагентов
Код выполняется в приёмнике, в серверной процедуре внешней обработки. В клиент-серверном варианте коннектор нужно регистрировать на сервере 1С, а у пользователя, от которого работает служба, должен быть доступ к базе-источнику.
&НаСервере
Процедура ПеренестиКонтрагентовНаСервере()
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаСоединения = "File=""D:\Bases\Filial"";Usr=""Администратор"";Pwd=""123"";";
Источник = Коннектор.Connect(СтрокаСоединения);
Запрос = Источник.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ К.Наименование КАК Наименование, К.ИНН КАК ИНН, К.КПП КАК КПП
|ИЗ Справочник.Контрагенты КАК К
|ГДЕ НЕ К.ЭтоГруппа И НЕ К.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если ПустаяСтрока(Выборка.ИНН) Тогда
Продолжить;
КонецЕсли;
Найденный = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Выборка.ИНН);
Если Найденный.Пустая() Тогда
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.Наименование = Выборка.Наименование;
НовыйЭлемент.ИНН = Выборка.ИНН;
НовыйЭлемент.КПП = Выборка.КПП;
НовыйЭлемент.ОбменДанными.Загрузка = Истина;
НовыйЭлемент.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для серверной базы строка соединения выглядит так: Srvr="имя_сервера";Ref="имя_базы";Usr="...";Pwd="...";.
Что учесть
- ⚙️
НайтиПоРеквизитувозвращает первый найденный элемент. Если в приёмнике есть подразделения с одним ИНН, ищите запросом по паре ИНН и КПП. - 🐢 Каждое обращение к объекту источника — вызов через COM. Читайте данные одним запросом, а не обходом справочника с обращением к каждому реквизиту.
- 🔗 Ссылки из источника в приёмник напрямую не записываются: это объекты другой базы. Переносите значения (строки, числа, даты), а ссылочные реквизиты ищите в приёмнике.
- 🔒 Пароль в строке соединения не храните в коде обработки, которая лежит в общем доступе.
Ошибки при объединении баз 1С и что с ними делать
После загрузки прогоните приёмник через Конфигуратор → Администрирование → Тестирование и исправление с проверками логической и ссылочной целостности. Тестирование требует монопольного доступа: запускайте его, когда все пользователи вышли из базы.
Как ускорить перенос больших объёмов данных
Загрузка за несколько лет может идти часами. Ускоряют её не мощностью компьютера, а настройкой самого процесса.
- Работайте на сервере, а не по сети. Файловую базу
копируйте на локальный диск компьютера, где идёт загрузка. Обращение к файлу
1Cv8.1CDпо сетевой папке замедляет запись в разы. - Переносите частями. Справочники отдельно, документы — по месяцам или кварталам. Если упадёт один кусок, не придётся начинать заново.
- Пишите в режиме загрузки.
ОбменДанными.Загрузка = Истинаотключает проверки и подписки при записи. Типовые обработки XML делают это сами, в своём коде ставьте явно. - Группируйте записи в транзакции. В своём коде открывайте транзакцию на 500–1000 объектов. Одна транзакция на весь перенос раздувает журнал СУБД, транзакция на каждый объект замедляет запись.
- Отключите использование итогов. Для регистров с большим числом записей перед загрузкой вызовите
УстановитьИспользованиеИтогов(Ложь)у менеджера регистра, после — включите и пересчитайте итоги. - Перепроводите после, а не во время. Сначала загрузите все документы без проведения, затем проведите их групповой обработкой одним проходом по хронологии.
Перед загрузкой многолетней истории спросите себя, нужна ли она в рабочей базе. Часто достаточно перенести справочники и остатки на начало года, а старую базу оставить в архиве для справок.
Проверка результата после слияния
Сверяйте не «на глаз», а по цифрам из обеих баз за одну дату:
- 📊 оборотно-сальдовая ведомость по счетам расчётов, складу, кассе и банку — сумма по источнику плюс приёмник до переноса должна совпасть с приёмником после переноса;
- 🧾 количество документов каждого вида за период — в списке документов задайте отбор по периоду и сравните число строк;
- 👥 справочник контрагентов — отбор по пустому ИНН покажет элементы, которые пришли без ключа и могут оказаться дублями.
Расхождения ищите от крупного к мелкому: сначала вид документа, где разница, потом месяц, потом конкретный документ.
Частые вопросы
Можно ли объединить две файловые базы простым копированием файлов?
1Cv8.1CD — это вся база целиком, два таких файла не склеиваются. Данные переносят только через выгрузку и загрузку, обмен или COM.Чем объединение баз отличается от объединения конфигураций?
Сохранятся ли пользователи и их права?
Что делать, если базы двух разных организаций?
Как перенести базу в облако и одновременно объединить с другой?
.dt и загрузите в облачный сервис. Совмещать два этапа рискованно: ошибку будет труднее найти.