Как перенести документы в 1С без изменения справочников и настроить поиск по штрихкоду

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При интеграции и слиянии двух информационных баз 1С, которые велись параллельно и независимо друг от друга, разработчики регулярно сталкиваются с классической проблемой. Необходимо перенести документы (например, РеализацияТоваровУслуг, ПоступлениеТоваровУслуг) из старой базы в новую рабочую базу. При этом крайне важно соблюсти жесткое условие: справочники рабочей базы (номенклатура, контрагенты, склады) не должны изменяться, перезаписываться или дублироваться. Более того, элементы в базах имеют разные внутренние идентификаторы (GUID/UUID), а сопоставление возможно только по уникальным бизнес-ключам, например, по штрихкодам для товаров или ИНН/КПП для контрагентов.

В этой статье мы подробно рассмотрим, почему стандартные средства выгрузки здесь бессильны, как правильно настроить правила обмена в программе «1С:Конвертация данных 2.1» (КД 2) для поиска по штрихкодам и как защитить рабочую базу от нежелательных изменений.

Почему стандартная обработка «Выгрузка и загрузка данных XML» не решит задачу

Для начала разберем типичную ошибку начинающих специалистов. На форумах часто советуют использовать типовую обработку ИТС Выгрузка и загрузка данных XML.epf. Этот инструмент работает по принципу «зеркального» переноса: он считывает объект из источника и записывает его в приемник с сохранением уникального идентификатора (GUID).

Если базы велись независимо, то один и тот же товар (например, «Стол офисный») в базе-источнике имеет GUID a1b2c3d4..., а в базе-приемнике — f6e5d4c3.... При использовании стандартного XML-обмена произойдет следующее:

  1. Обработка перенесет документ реализации.
  2. Поскольку документ ссылается на товар с GUID a1b2c3d4..., обработка попытается найти его в базе-приемнике.
  3. Не найдя объекта с таким идентификатором, она создаст новый элемент справочника Номенклатура с GUID из источника.
  4. В базе-приемнике появится дубль товара «Стол офисный», что приведет к пересортице и грубым ошибкам в учете. Если же вы снимете галочку переноса справочников, документ просто не проведется, а в полях номенклатуры отобразится битая ссылка <Объект не найден...>.

Следовательно, для успешного решения задачи нам необходимо использовать «1С:Конвертация данных 2.1», которая позволяет гибко управлять логикой поиска и перезаписи объектов при загрузке.

---

Решение 1. Настройка поиска Номенклатуры по Штрихкоду в КД 2.1

В современных конфигурациях 1С штрихкоды чаще всего хранятся не в самом справочнике Номенклатура, а в подчиненном регистре сведений (например, ШтрихкодыНоменклатуры или Штрихкоды). Из-за этого мы не можем просто сопоставить реквизиты в правилах конвертации свойств (ПКС). Нам потребуется передать штрихкод как параметр и описать алгоритм поиска запросом.

Рассмотрим пошагово, как это настроить в КД 2.1:

  1. Откройте правила обмена в КД 2.1 и перейдите в Правило конвертации объектов (ПКО) для справочника Номенклатура.
  2. На вкладке «Настройки поиска» отключите флаг «Находить по уникальному идентификатору (GUID)». Поиск должен происходить исключительно по нашим правилам.
  3. Создайте новое Правило конвертации свойств (ПКС) внутри ПКО Номенклатура:
    • Поля «Источник» и «Приемник» оставьте пустыми.
    • В поле «Имя свойства» впишите вручную: Штрихкод.
    • Установите флаги «Передавать данные в параметр» и «Поиск объекта при загрузке по свойству».
  4. В обработчике события Перед выгрузкой для этого ПКС напишите код для получения штрихкода из базы-источника. Нам нужно обратиться к регистру штрихкодов и передать значение в переменную Значение:

// Пример для поиска штрихкода в базе-источнике
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |	РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |	Штрихкоды.Владелец = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", Источник);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Значение = Выборка.Штрихкод;
Иначе
    Значение = "";
КонецЕсли;
  1. Теперь перейдите в обработчик события Поля поиска самого ПКО Номенклатура. Этот код будет выполняться на стороне базы-приемника при чтении XML-файла. Мы напишем запрос к регистру сведений приемника, чтобы найти товар по переданному штрихкоду:

// Обработчик "Поля поиска" в ПКО Номенклатура
Если НомерВариантаПоиска = 1 Тогда
    // Извлекаем переданный нами параметр
    ШКПараметр = ПараметрыОбъекта["Штрихкод"];
    
    Если ЗначениеЗаполнено(ШКПараметр) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |	Штрихкоды.Владелец КАК Номенклатура
            |ИЗ
            |	РегистрСведений.Штрихкоды КАК Штрихкоды
            |ГДЕ
            |	Штрихкоды.Штрихкод = &ШК";
            
        Запрос.УстановитьПараметр("ШК", ШКПараметр);
        Выборка = Запрос.Run().Выбрать(); // Для универсальности КД используется Запрос.Выполнить().Выбрать()
        
        // В КД 2 пишем стандартный вызов:
        Результат = Запрос.Выполнить().Выбрать();
        Если Результат.Следующий() Тогда
            СсылкаНаОбъект = Результат.Номенклатура;
            ПрекратитьПоиск = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Благодаря этому коду система при чтении файла загрузки сначала получит штрихкод, выполнит запрос в приемнике и, если найдет совпадение в регистре, подставит найденную номенклатуру в загружаемый документ.

---

Решение 2. Защита рабочей базы от изменений и создание «заглушек»

Даже если сопоставление настроено верно, всегда существует риск человеческого фактора (например, штрихкод товара забыли занести в базу-приемник). Чтобы гарантировать безопасность рабочей базы, проанализируем настройки ПКО.

Откройте свойства ПКО Номенклатура (и аналогично для Контрагенты, Склады) и установите следующие флаги:

Борьба с «битыми» ссылками с помощью объектов-заглушек

Обратная сторона флага «Не создавать новые объекты» — появление в документах битых ссылок вида <Объект не найден...>. С такими ссылками документы не проведутся по регистрам учета.

Чтобы избежать этой проблемы, мы можем перенаправлять все ненайденные элементы на специально созданный служебный элемент (так называемую «заглушку»). Создайте в рабочей базе товар с наименованием «Неизвестный товар (перенос)» и кодом СЛУЖЕБНЫЙ_КОД.

В обработчике Поля поиска ПКО Номенклатура добавьте условие по умолчанию в самый конец алгоритма:


// Если поиск по штрихкоду не дал результатов, подставляем служебный элемент
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
    СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоКоду("СЛУЖЕБНЫЙ_КОД");
    Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
        ПрекратитьПоиск = Истина;
    КонецЕсли;
КонецЕсли;

Аналогично можно поступить со справочником Контрагенты, подставляя предопределенного контрагента «Неизвестный контрагент (перенос)» по ИНН/КПП, если соответствие не было найдено. Это позволит документам успешно записаться и провестись в базе-приемнике, а пользователи смогут вручную заменить заглушки на корректные позиции по мере выяснения деталей.

---

Решение 3. Настройка поиска для других аналитик

Проанализируем сопоставление других справочников, указанных в теме:

---

Альтернативный практический сценарий (без кодинга в Конвертации Данных)

Если у вас нет достаточного опыта написания сложных обработчиков в «Конвертации данных 2.1», существует обходной, но очень надежный «жизненный» сценарий, который часто применяется на практике опытными архитекторами 1С. Он полностью исключает риск испортить рабочую базу некорректным кодом.

Рассмотрим этот алгоритм по шагам:

  1. Создание копии: Сделайте полную копию рабочей базы-приемника. Все последующие манипуляции выполняйте только в ней.
  2. Перенос «как есть»: Перенесите документы и справочники из старой базы в созданную копию с помощью КД или стандартной обработки XML «как есть». На данном этапе в копии базы неизбежно появятся дубли номенклатуры и контрагентов. При этом новые элементы запишутся со своими штрихкодами и ИНН.
  3. Слияние дублей: Запустите в копии базы стандартную обработку «Поиск и замена дублей» (она встроена во все современные конфигурации в разделе «Администрирование — Обслуживание»).
    • Для номенклатуры настройте поиск дублей по совпадению штрихкодов.
    • Для контрагентов — по совпадению ИНН.
    • Запустите выполнение. Обработка автоматически найдет новые (перенесенные) дубли, перепривяжет их во всех загруженных документах к «правильным» старым элементам, которые изначально были в рабочей базе, а созданные дубли безвозвратно удалит.
  4. Финальный перенос в рабочую базу: Теперь в нашей копии базы документы очищены от дублей и ссылаются на те же самые GUID объектов, которые физически существуют в реальной рабочей базе. Теперь мы можем со спокойной душой запустить простую обработку Выгрузка и загрузка данных XML.epf, выгрузить только документы из подготовленной копии и загрузить их напрямую в «живую» рабочую базу. Ни одного нового элемента справочника создано не будет, а документы встанут идеально.

Резюме: Выберите наиболее подходящий для вас метод. Если вы уверенно владеете встроенным языком 1С и принципами работы КД 2.1 — используйте точечную настройку обработчиков Поля поиска. Если задача разовая, а цена ошибки на рабочей базе слишком высока — воспользуйтесь сценарием со слиянием дублей на тестовой копии. Перед любыми операциями импорта обязательно делайте резервную копию рабочей базы!

← На главную