При работе с базами 1С часто возникает ситуация, когда вторая информационная база создается путем простого копирования файла первой (или восстановления из бэкапа). В дальнейшем в этой копии меняют название организации и начинают вести учет по новому юридическому лицу. Однако наступает момент, когда эти базы нужно слить в одну. Здесь программист сталкивается с проблемой: при использовании стандартных средств обмена (РИБ или универсальная выгрузка XML) данные не добавляются, а «сливаются» — документы новой организации привязываются к старой, а справочники затирают друг друга. Проанализируем, почему это происходит и как решить данную задачу.
Разберем внутреннюю структуру данных 1С. Каждый объект в базе (справочник, документ) имеет уникальный внутренний идентификатор — UUID (или GUID). Именно по нему система отличает один элемент от другого. Если мы создаем базу Б2 простым копированием Б1, то все объекты, которые были в базе на момент копирования, имеют абсолютно идентичные UUID в обеих базах.
Когда мы пытаемся загрузить данные из Б2 в Б1 через универсальную обработку ВыгрузкаЗагрузкаДанныхXML, система видит, что UUID организации в файле совпадает с UUID организации в базе-приемнике. Для программы это один и тот же объект, поэтому она просто обновляет реквизиты старой организации данными новой. В итоге вместо двух организаций мы получаем одну «испорченную». Рассмотрим основные способы обхода этой ситуации.
Этот метод считается наиболее профессиональным и правильным. Он позволяет гибко настроить правила поиска объектов, игнорируя их внутренние идентификаторы. Разберем этот процесс по шагам:
MD83Exp.epf.ИНН и КПП. Для справочника «Банковские счета» это может быть НомерСчета и Владелец.Благодаря этому при загрузке данных система не будет смотреть на «старый» UUID, а создаст новый элемент, если не найдет в базе организацию с таким ИНН.
Если нет времени на изучение «Конвертации данных», можно доработать стандартную обработку ВыгрузкаЗагрузкаДанныхXML. Проанализируем пример кода, который можно вставить в процедуру загрузки объектов, чтобы перехватить чтение XML и изменить логику поиска:
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
Попытка
ЗаписанноеЗначение = ПрочитатьXML(ЧтениеXML);
// Вставка: Логика подмены для конкретного типа объекта
Если ЧтениеXML.Имя = "CatalogObject.Организации" Тогда
// Пытаемся найти организацию по ИНН, а не по UUID
СсылкаНаОрг = Справочники.Организации.НайтиПоРеквизиту("ИНН", ЗаписанноеЗначение.ИНН);
Если Не СсылкаНаОрг.Пустая() Тогда
// Если нашли — можно либо пропустить, либо сопоставить
КонецЕсли;
КонецЕсли;
// Стандартная запись объекта
ЗаписанноеЗначение.ОбменДанными.Загрузка = Истина;
ЗаписанноеЗначение.Записать();
Исключение
// Обработка ошибок
КонецПопытки;
КонецЦикла;
Этот метод требует навыков программирования, но позволяет быстро решить проблему «на лету» без создания сложных правил обмена.
Рассмотрим «хитрый» способ, который помог автору вопроса. Если в базах пересекается только один ключевой объект (Организация), а остальные данные (документы) должны просто «долиться», можно сделать следующее:
Важно: Этот метод рискован, так как UUID может встречаться в ссылках других объектов, и простая замена текста может повредить структуру файла. Однако для простых случаев это рабочее решение.
Прежде чем приступать к объединению, проанализируем ситуацию с префиксами. Если в обеих базах документы создавались с одинаковыми номерами (например, Счет №1 в Б1 и Счет №1 в Б2), то при слиянии возникнет конфликт. Выясним, как этого избежать:
Во-первых, в базе-источнике (Б2) необходимо установить уникальный префикс организации и префикс информационной базы. Во-вторых, нужно запустить обработку «Групповое изменение реквизитов» и программно перенумеровать существующие документы, добавив к ним новый префикс. Только после этого данные можно выгружать для объединения.
После объединения баз крайне важно проверить не только справочники и документы, но и независимые регистры сведений. Например, такие регистры как УчетнаяПолитика, ОтветственныеЛицаОрганизаций или МетодыРаспределенияКосвенныхРасходов.
Поскольку в этих регистрах записи идентифицируются по набору измерений (Организация + Период), при одинаковых UUID организаций записи из базы Б2 могут просто перезаписать записи Б1. Если вы использовали метод с «Конвертацией данных», убедитесь, что в правилах для регистров сведений также настроено корректное сопоставление полей.
Завершающим этапом мы рекомендуем выполнить Тестирование и исправление информационной базы и полный пересчет итогов, чтобы исключить ошибки в регистрах бухгалтерии, которые могли возникнуть при массовой загрузке ссылочных данных.