Слияние двух информационных баз 1С 8.3 в одну без дублей

· 9 мин

Содержание

Объединить базы 1С можно тремя путями: выгрузить данные одной базы в XML и загрузить в другую, перенести их по правилам обмена с сопоставлением объектов или написать перенос через COM-соединение. Для двух баз одной конфигурации и одного релиза быстрее всего первый путь, для разных конфигураций — второй, для выборочного переноса с собственной логикой — третий.

Главная боль при слиянии — не сам перенос, а то, что получается после него: два «ООО Ромашка» в справочнике, документы с одинаковыми номерами, ссылки <Объект не найден>. Ниже порядок, при котором базу не придётся потом чистить неделю.

Подготовка баз 1С к объединению

Перед первым запуском переноса решите три вопроса: какая база будет приёмником, что именно переносим и каким способом.

Приёмник — обычно база, где больше данных и где дальше будут работать. Источник после переноса уходит в архив.

Объём переноса определяет способ:

  • 📁 только справочники (контрагенты, номенклатура, договоры) — самый частый и безопасный вариант;
  • 📄 справочники и документы за период — нужно потом перепровести документы ;
  • 📊 начальные остатки на дату — часто проще и чище, чем тащить всю историю.

Сравнительная таблица способов

СпособКогда подходитРиски
Выгрузка/загрузка XMLОдна конфигурация, одинаковый релизДубли справочников, конфликт номеров
Универсальный обмен по правиламРазные конфигурации или нужна настройка поискаНужны правила из «Конвертации данных»
Типовая синхронизацияПары конфигураций, у которых есть штатный обменПереносит только то, что заложено в обмене
COM-соединениеВыборочный перенос со своей логикойНужен программист, работает только в Windows

Что сделать до переноса

  1. Сделайте копию обеих баз: в конфигураторе Администрирование → Выгрузить информационную базу, файл .dt сохраните отдельно.
  2. Сравните релизы: Справка → О программе в каждой базе. Для загрузки XML состав метаданных должен совпадать. Если релизы разные, обновите старую базу до релиза приёмника.
  3. Задайте разные префиксы: в карточке организации поле «Префикс» и префикс самой базы в Администрирование → Синхронизация данных. Тогда номера документов из двух баз не пересекутся.
  4. Попросите пользователей выйти из обеих баз на время переноса и сообщите, когда работа возобновится.

Когда хватит остатков вместо истории

Если источник — база закрытой фирмы или филиала, который переходит на общий учёт, историю документов переносить не обязательно. Достаточно трёх шагов:

  1. Закройте период в источнике и сформируйте оборотно-сальдовую ведомость на дату перехода.
  2. Перенесите справочники любым из способов ниже.
  3. Введите остатки в приёмнике на ту же дату по ведомости источника.

Так приёмник не получит тысячи чужих документов, а старая база остаётся в архиве для справок и проверок.

Пробный перенос делайте на копии приёмника. Восстановить базу из .dt быстрее, чем выискивать по журналу, что именно загрузилось лишнего.

Как объединить базы через выгрузку и загрузку XML

Этот способ использует внешнюю обработку «Выгрузка и загрузка данных XML» (файл ВыгрузкаЗагрузкаДанныхXML83.epf, распространяется на дисках ИТС). Она переносит объекты вместе с их внутренними идентификаторами.

Выгрузка из базы-источника

  1. Откройте источник, Файл → Открыть и выберите обработку.
  2. На вкладке выгрузки отметьте нужные объекты: справочники, документы, регистры.
  3. Для документов задайте период, иначе обработка выгрузит всю историю.
  4. Включите выгрузку связанных объектов по ссылкам — без этого в приёмнике останутся пустые ссылки.
  5. Укажите имя файла и нажмите выгрузку.

Загрузка в базу-приёмник

  1. Откройте приёмник под пользователем с полными правами.
  2. Запустите ту же обработку, перейдите на вкладку загрузки.
  3. Выберите XML-файл и запустите загрузку.

Обработка пишет объекты в режиме обмена данными: проверки заполнения и проведение при записи не выполняются. Документы после загрузки нужно перепровести групповой обработкой за весь перенесённый период.

У двух баз, созданных независимо, идентификаторы объектов разные. Один и тот же контрагент из двух баз превратится в два элемента справочника. Это нормально для этого способа — дубли убирают следующим шагом.

Универсальный обмен по правилам

Если конфигурации разные или нужно, чтобы контрагент находился по ИНН, а не создавался заново, используйте обработку «Универсальный обмен данными в формате XML». Она работает по файлу правил, который готовят в конфигурации «Конвертация данных ».

В правилах для каждого объекта задают:

  • 🔍 поля поиска — по каким реквизитам искать объект в приёмнике;
  • 🔄 режим записи — заменять найденный объект или не трогать его;
  • 🔗 соответствие реквизитов — какое поле источника куда ложится.

Для пар конфигураций со штатным обменом (например, Бухгалтерия и Управление торговлей) правила уже есть: обмен настраивается в Администрирование → Синхронизация данных, отдельная разработка не нужна.

Правила сопоставления и поиск дублей после слияния

От того, как сопоставлены объекты, зависит, получится ли одна чистая база или база с двойниками.

По каким полям искать

СправочникНадёжный ключ поискаПочему не наименование
КонтрагентыИНН + КППУ обособленных подразделений один ИНН, разные КПП
НоменклатураАртикул, штрихкод«Бумага А4» и «Бумага А4 офисная» — один товар
ДоговорыВладелец + номер + датаНазвания договоров часто одинаковые
Физические лицаИНН или СНИЛСПолные тёзки встречаются
Банковские счетаНомер счёта + БИКНаименование счёта пишут произвольно

Если ключа нет (номенклатура без артикулов), сначала наведите порядок в источнике: проставьте артикулы, удалите явный мусор, пометьте лишнее на удаление.

Как убрать дубли в приёмнике

В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) есть обработка Администрирование → Обслуживание → Корректировка данных → Поиск и удаление дублей.

  1. Выберите справочник, например «Контрагенты».
  2. Задайте правило сравнения: ИНН «совпадает», наименование «похоже».
  3. В каждой группе найденных дублей отметьте оригинал — элемент, который останется.
  4. Запустите замену: ссылки на дубли во всех документах переключатся на оригинал, дубли будут помечены на удаление.
  5. Удалите помеченные объекты обработкой удаления помеченных.

Конфликты при совпадении

  • 📝 Разные реквизиты у одного контрагента — оставьте как основной элемент запись из базы, где данные свежее, недостающие поля допишите вручную.
  • 🔢 Совпали номера документов — решается префиксами из подготовки. Если их не задали, программа может отказать в записи из-за неуникального номера.
  • 📅 Пересечение периодов — если обе базы вели учёт одной организации за один период, обороты задвоятся. Переносите один период только из одной базы.

Объединение данных 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С и что с ними делать

Диагностика: выберите симптом

После загрузки прогоните приёмник через Конфигуратор → Администрирование → Тестирование и исправление с проверками логической и ссылочной целостности. Тестирование требует монопольного доступа: запускайте его, когда все пользователи вышли из базы.

Как ускорить перенос больших объёмов данных

Загрузка за несколько лет может идти часами. Ускоряют её не мощностью компьютера, а настройкой самого процесса.

  1. Работайте на сервере, а не по сети. Файловую базу копируйте на локальный диск компьютера, где идёт загрузка. Обращение к файлу 1Cv8.1CD по сетевой папке замедляет запись в разы.
  2. Переносите частями. Справочники отдельно, документы — по месяцам или кварталам. Если упадёт один кусок, не придётся начинать заново.
  3. Пишите в режиме загрузки. ОбменДанными.Загрузка = Истина отключает проверки и подписки при записи. Типовые обработки XML делают это сами, в своём коде ставьте явно.
  4. Группируйте записи в транзакции. В своём коде открывайте транзакцию на 500–1000 объектов. Одна транзакция на весь перенос раздувает журнал СУБД, транзакция на каждый объект замедляет запись.
  5. Отключите использование итогов. Для регистров с большим числом записей перед загрузкой вызовите УстановитьИспользованиеИтогов(Ложь) у менеджера регистра, после — включите и пересчитайте итоги.
  6. Перепроводите после, а не во время. Сначала загрузите все документы без проведения, затем проведите их групповой обработкой одним проходом по хронологии.

Перед загрузкой многолетней истории спросите себя, нужна ли она в рабочей базе. Часто достаточно перенести справочники и остатки на начало года, а старую базу оставить в архиве для справок.

Проверка результата после слияния

Сверяйте не «на глаз», а по цифрам из обеих баз за одну дату:

  • 📊 оборотно-сальдовая ведомость по счетам расчётов, складу, кассе и банку — сумма по источнику плюс приёмник до переноса должна совпасть с приёмником после переноса;
  • 🧾 количество документов каждого вида за период — в списке документов задайте отбор по периоду и сравните число строк;
  • 👥 справочник контрагентов — отбор по пустому ИНН покажет элементы, которые пришли без ключа и могут оказаться дублями.

Расхождения ищите от крупного к мелкому: сначала вид документа, где разница, потом месяц, потом конкретный документ.

Частые вопросы

Можно ли объединить две файловые базы простым копированием файлов?
Нет. Файл 1Cv8.1CD — это вся база целиком, два таких файла не склеиваются. Данные переносят только через выгрузку и загрузку, обмен или COM.
Чем объединение баз отличается от объединения конфигураций?
Объединение конфигураций — это слияние программного кода и метаданных в конфигураторе, данные пользователей оно не трогает. Объединение баз — перенос документов и справочников между базами.
Сохранятся ли пользователи и их права?
Пользователи информационной базы (логины, пароли, роли) хранятся отдельно от прикладных данных и при загрузке XML не переносятся. Пользователей источника создайте в приёмнике заново и назначьте им группы доступа.
Что делать, если базы двух разных организаций?
Если конфигурация поддерживает учёт нескольких организаций, переносите данные в одну базу со своей организацией в каждом документе. Префикс у каждой организации должен быть свой.
Как перенести базу в облако и одновременно объединить с другой?
Сначала объедините базы локально и проверьте результат, затем выгрузите итоговую базу в .dt и загрузите в облачный сервис. Совмещать два этапа рискованно: ошибку будет труднее найти.