Перенос элементов справочника Контрагенты между двумя абсолютно одинаковыми базами данных 1С — это классическая задача, с которой регулярно сталкиваются разработчики и администраторы. Однако при ее реализации часто возникают две критические проблемы: появление дубликатов из-за несовпадения уникальных идентификаторов (GUID) и перенос лишних связанных объектов (документов, договоров, банковских счетов), которые тянутся «хвостом» за основным справочником.
В этой статье мы подробно разберем, как решить эту задачу максимально быстро, безопасно и строго с соблюдением условия: сопоставлять контрагентов по ИНН и КПП, а при отсутствии совпадений — создавать новые элементы.
Если вам требуется перенести плоский список контрагентов без связанных документов и сложных иерархий, оптимальным решением будет использование встроенного помощника 1С. В современных конфигурациях, созданных на базе БСП (например, 1С:ERP, 1С:Комплексная автоматизация 2, 1С:Управление торговлей 11, 1С:Бухгалтерия 3.0), присутствует замечательный инструмент «Загрузка данных из файла».
Выполним этот процесс по шагам:
Контрагенты в базе-источнике. Настроим список так, чтобы в нем выводились только нужные колонки (обязательно: Наименование, ИНН, КПП, а также телефон, адрес или тип контрагента при необходимости). Сохраним этот список в формате Excel или CSV через стандартное меню 1С (кнопка «Еще» — «Вывести список» — «Сохранить как...»).ИНН и КПП. Если система находит совпадение, элемент обновляется (или пропускается, в зависимости от выбранной настройки), а новые контрагенты создаются «с нуля».Главное преимущество метода: Полное отсутствие риска утащить за собой «хвосты» в виде старых договоров, контактных лиц или движений по документам из базы-источника.
Если обе информационные базы находятся в пределах одной локальной сети и у вас есть навыки программирования, задачу можно решить написанием внешней обработки буквально за 10 минут. Мы подключимся к базе-источнику напрямую через COM-соединение, выберем нужные данные запросом и перенесем их в приемник.
Рассмотрим пример кода, реализующего этот алгоритм:
ПараметрыПодключения = "Srvr=""MyServer"";Ref=""SourceBase"";Usr=""Admin"";Pwd=""Password123"";";
Connector = Новый COMОбъект("V83.COMConnector");
Попытка
БазаИсточник = Connector.Connect(ПараметрыПодключения);
Исключение
Сообщить("Не удалось подключиться к базе-источнику: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Формируем запрос к базе-источнику через COM
ЗапросИсточник = БазаИсточник.NewObject("Запрос");
ЗапросИсточник.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН,
| Контрагенты.КПП КАК КПП,
| Контрагенты.ЮридическоеФизическоеЛицо КАК ЮридическоеФизическоеЛицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления";
ТаблицаДанных = ЗапросИсточник.Выполнить().Выгрузить();
Для Каждого СтрокаИсточника Из ТаблицаДанных Цикл
ТекущийИНН = СтрокаИсточника.ИНН;
ТекущийКПП = СтрокаИсточника.КПП;
// Пропускаем незаполненные ИНН во избежание некорректного поиска
Если ПустаяСтрока(ТекущийИНН) Тогда
Продолжить;
КонецЕсли;
// Ищем контрагента в текущей базе-приемнике
НайденнаяСсылка = Справочники.Контрагенты.ПустаяСсылка();
ЗапросПриемник = Новый Запрос;
ЗапросПриемник.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП";
ЗапросПриемник.УстановитьПараметр("ИНН", ТекущийИНН);
ЗапросПриемник.УстановитьПараметр("КПП", ТекущийКПП);
Выборка = ЗапросПриемник.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
НайденнаяСсылка = Выборка.Ссылка;
КонецЕсли;
Если НайденнаяСсылка.Пустая() Тогда
// Создаем новый элемент справочника
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = СтрокаИсточника.Наименование;
НовыйКонтрагент.ИНН = ТекущийИНН;
НовыйКонтрагент.КПП = ТекущийКПП;
НовыйКонтрагент.ЮридическоеФизическоеЛицо = СтрокаИсточника.ЮридическоеФизическоеЛицо;
Попытка
НовыйКонтрагент.Записать();
Сообщить("Успешно создан контрагент: " + ТекущийИНН + " - " + СтрокаИсточника.Наименование);
Исключение
Сообщить("Ошибка при записи контрагента с ИНН " + ТекущийИНН + ": " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Контрагент с ИНН " + ТекущийИНН + " уже существует. Пропускаем.");
КонецЕсли;
КонецЦикла;
Данный код гарантирует, что в базу-приемник будут добавлены только те контрагенты, которых там физически нет (сравнение идет жестко по ИНН и КПП), без генерации дублей.
Если конфигурации действительно идентичны, мы можем воспользоваться конфигурацией «Конвертация данных 2.1» для создания правил обмена за считанные минуты.
Проанализируем процесс быстрой настройки правил поиска:
MD83Exp.epf.Контрагенты. Воспользуемся автогенерацией свойств.ИНН и КПП как поля поиска. Обязательно установим признак «Искать объект по полям поиска, если не найден по внутреннему идентификатору» (или снимем галочку поиска по GUID вообще, если базы ранее велись независимо).Контрагенты.ВыгрузкаЗагрузкаДанныхРегламентированныйОтчет.epf (или аналогичной универсальной выгрузки XML).Важный нюанс: В правилах конвертации свойств (ПКС) для реквизитов справочника (например, ОсновнойБанковскийСчет, ОсновнойДоговорКонтрагента) лучше отключить автоматическую генерацию правил конвертации, чтобы при выгрузке XML не потащились связанные объекты, создавая избыточный мусор в базе-приемнике.
Участники обсуждений часто предлагают использовать стандартную обработку «Выгрузка и загрузка данных XML» (из состава инструментов разработчика 1С). Однако при ее использовании нужно быть крайне осторожными:
В современных конфигурациях 1С, поддерживающих БСП, встроен механизм синхронизации данных через формат **EnterpriseData**. Этот способ отлично подходит, если вы не хотите писать код и использовать сторонние обработки.
Алгоритм действий следующий:
Контрагенты.ИНН и КПП, предотвращая задвоение.Выбор оптимального инструмента зависит от ваших задач и технических условий: