При интеграции и слиянии двух информационных баз 1С, которые велись параллельно и независимо друг от друга, разработчики регулярно сталкиваются с классической проблемой. Необходимо перенести документы (например, РеализацияТоваровУслуг, ПоступлениеТоваровУслуг) из старой базы в новую рабочую базу. При этом крайне важно соблюсти жесткое условие: справочники рабочей базы (номенклатура, контрагенты, склады) не должны изменяться, перезаписываться или дублироваться. Более того, элементы в базах имеют разные внутренние идентификаторы (GUID/UUID), а сопоставление возможно только по уникальным бизнес-ключам, например, по штрихкодам для товаров или ИНН/КПП для контрагентов.
В этой статье мы подробно рассмотрим, почему стандартные средства выгрузки здесь бессильны, как правильно настроить правила обмена в программе «1С:Конвертация данных 2.1» (КД 2) для поиска по штрихкодам и как защитить рабочую базу от нежелательных изменений.
Для начала разберем типичную ошибку начинающих специалистов. На форумах часто советуют использовать типовую обработку ИТС Выгрузка и загрузка данных XML.epf. Этот инструмент работает по принципу «зеркального» переноса: он считывает объект из источника и записывает его в приемник с сохранением уникального идентификатора (GUID).
Если базы велись независимо, то один и тот же товар (например, «Стол офисный») в базе-источнике имеет GUID a1b2c3d4..., а в базе-приемнике — f6e5d4c3.... При использовании стандартного XML-обмена произойдет следующее:
a1b2c3d4..., обработка попытается найти его в базе-приемнике.Номенклатура с GUID из источника.<Объект не найден...>.Следовательно, для успешного решения задачи нам необходимо использовать «1С:Конвертация данных 2.1», которая позволяет гибко управлять логикой поиска и перезаписи объектов при загрузке.
---
В современных конфигурациях 1С штрихкоды чаще всего хранятся не в самом справочнике Номенклатура, а в подчиненном регистре сведений (например, ШтрихкодыНоменклатуры или Штрихкоды). Из-за этого мы не можем просто сопоставить реквизиты в правилах конвертации свойств (ПКС). Нам потребуется передать штрихкод как параметр и описать алгоритм поиска запросом.
Рассмотрим пошагово, как это настроить в КД 2.1:
Номенклатура.Номенклатура:
Штрихкод.Перед выгрузкой для этого ПКС напишите код для получения штрихкода из базы-источника. Нам нужно обратиться к регистру штрихкодов и передать значение в переменную Значение:
// Пример для поиска штрихкода в базе-источнике
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Источник);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Значение = Выборка.Штрихкод;
Иначе
Значение = "";
КонецЕсли;
Поля поиска самого ПКО Номенклатура. Этот код будет выполняться на стороне базы-приемника при чтении XML-файла. Мы напишем запрос к регистру сведений приемника, чтобы найти товар по переданному штрихкоду:
// Обработчик "Поля поиска" в ПКО Номенклатура
Если НомерВариантаПоиска = 1 Тогда
// Извлекаем переданный нами параметр
ШКПараметр = ПараметрыОбъекта["Штрихкод"];
Если ЗначениеЗаполнено(ШКПараметр) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Владелец КАК Номенклатура
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод = &ШК";
Запрос.УстановитьПараметр("ШК", ШКПараметр);
Выборка = Запрос.Run().Выбрать(); // Для универсальности КД используется Запрос.Выполнить().Выбрать()
// В КД 2 пишем стандартный вызов:
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
СсылкаНаОбъект = Результат.Номенклатура;
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Благодаря этому коду система при чтении файла загрузки сначала получит штрихкод, выполнит запрос в приемнике и, если найдет совпадение в регистре, подставит найденную номенклатуру в загружаемый документ.
---
Даже если сопоставление настроено верно, всегда существует риск человеческого фактора (например, штрихкод товара забыли занести в базу-приемник). Чтобы гарантировать безопасность рабочей базы, проанализируем настройки ПКО.
Откройте свойства ПКО Номенклатура (и аналогично для Контрагенты, Склады) и установите следующие флаги:
Обратная сторона флага «Не создавать новые объекты» — появление в документах битых ссылок вида <Объект не найден...>. С такими ссылками документы не проведутся по регистрам учета.
Чтобы избежать этой проблемы, мы можем перенаправлять все ненайденные элементы на специально созданный служебный элемент (так называемую «заглушку»). Создайте в рабочей базе товар с наименованием «Неизвестный товар (перенос)» и кодом СЛУЖЕБНЫЙ_КОД.
В обработчике Поля поиска ПКО Номенклатура добавьте условие по умолчанию в самый конец алгоритма:
// Если поиск по штрихкоду не дал результатов, подставляем служебный элемент
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоКоду("СЛУЖЕБНЫЙ_КОД");
Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
Аналогично можно поступить со справочником Контрагенты, подставляя предопределенного контрагента «Неизвестный контрагент (перенос)» по ИНН/КПП, если соответствие не было найдено. Это позволит документам успешно записаться и провестись в базе-приемнике, а пользователи смогут вручную заменить заглушки на корректные позиции по мере выяснения деталей.
---
Проанализируем сопоставление других справочников, указанных в теме:
Контрагенты на поиск по связке ИНН + КПП. В обработчике Поля поиска реализуйте двухэтапный поиск: сначала ищем по совпадению ИНН и КПП одновременно (для юридических лиц), а если объект не найден (например, для ИП) — выполняем второй запрос только по ИНН.---
Если у вас нет достаточного опыта написания сложных обработчиков в «Конвертации данных 2.1», существует обходной, но очень надежный «жизненный» сценарий, который часто применяется на практике опытными архитекторами 1С. Он полностью исключает риск испортить рабочую базу некорректным кодом.
Рассмотрим этот алгоритм по шагам:
Выгрузка и загрузка данных XML.epf, выгрузить только документы из подготовленной копии и загрузить их напрямую в «живую» рабочую базу. Ни одного нового элемента справочника создано не будет, а документы встанут идеально.Резюме: Выберите наиболее подходящий для вас метод. Если вы уверенно владеете встроенным языком 1С и принципами работы КД 2.1 — используйте точечную настройку обработчиков Поля поиска. Если задача разовая, а цена ошибки на рабочей базе слишком высока — воспользуйтесь сценарием со слиянием дублей на тестовой копии. Перед любыми операциями импорта обязательно делайте резервную копию рабочей базы!