Как в Конвертации данных 2.0 настроить подмену складов, удаление префиксов и решить проблемы с обменом?

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

При настройке обменов между типовыми или нетиповыми конфигурациями (например, между «Управление торговым предприятием» и «Бухгалтерия предприятия») разработчики часто сталкиваются с задачами несимметричного переноса данных. Типичный сценарий — когда в базе-источнике ведется детальный складской учет по множеству складов, а в базе-приемнике учет свернут до одного основного склада. В процессе реализации таких правил нередко возникают сопутствующие вопросы: как правильно сопоставлять коды без префиксов, почему установка флага «Не замещать существующие объекты» может приводить к неожиданным результатам и из-за чего накапливаются зависшие изменения в планах обмена. Разберем детально каждый из этих вопросов.

Способ 1. Сопоставление нескольких складов в один («многие к одному») через ПКО

Рассмотрим классическую задачу: в источнике существует разветвленная структура складов, а в приемнике все документы должны оформляться строго на один «Основной склад». При этом нельзя допустить создания новых дублирующих складов в базе-приемнике.

Для реализации этой схемы настроим правило конвертации объекта (ПКО) для справочника «Склады»:

  1. В свойствах ПКО для справочника «Склады» перейдем на вкладку «Настройки» и отключим флаг «Искать объект приемника по внутреннему идентификатору (GUID)». Это необходимо, чтобы система не пыталась найти соответствие по уникальному идентификатору источника.
  2. Установим флаги «Не создавать новый объект в приемнике, если он не найден» и «Не замещать существующие объекты», чтобы защитить справочник приемника от нежелательных модификаций.
  3. Перейдем в правила конвертации свойств (ПКС) данного объекта:

    — В ПКС для свойства Наименование снимем признак передачи источника и в поле «Значение» укажем строку: "Основной склад".

    — Установим для свойства Наименование флаг «Поле поиска».

    — Для свойства ЭтоГруппа также установим флаг «Поле поиска» и зафиксируем значение Ложь (чтобы поиск выполнялся строго среди элементов, а не групп).

Альтернативный и более точный способ — принудительно определить параметры сопоставления в обработчике «Поля поиска» на стороне приемника в ПКО складов:


// В обработчике "Поля поиска" ПКО Склады
СвойстваПоиска.Вставить("Наименование", "Основной склад");
СвойстваПоиска.Вставить("ЭтоГруппа", Ложь);
ПрекратитьПоиск = Ложь;

Способ 2. Подмена склада непосредственно в правилах документов (ПКС)

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

Разберем по шагам, как это сделать:

  1. В ПКО документа (например, «РеализацияТоваровУслуг») найдем ПКС «Склад» (или «СкладОрдер»).
  2. Очистим в этом ПКС привязку к правилу конвертации объекта (оставим поле пустым).
  3. Отключим передачу реквизита из источника.
  4. В обработчике «Перед выгрузкой» или «При выгрузке» данного ПКС пропишем передачу наименования или фиксированного значения:

Значение = "Основной склад";

На стороне приемника при загрузке строковое значение будет сопоставлено со справочником по наименованию, что полностью исключает риск создания лишних элементов.

Удаление префиксов и сопоставление кодов при загрузке

Часто в базе-источнике коды или номера содержат префиксы (например, «УТ-00001» или «Т0000114»), которые требуется удалить или трансформировать перед записью в базу-приемник.

Важно помнить: вызывать метод Объект.Записать() в обработчике «После загрузки» крайне не рекомендуется, так как это вызывает двойную запись объекта, существенно замедляет обмен и может приводить к блокировкам. Правильнее выполнять модификацию реквизитов в обработчике «При загрузке» (OnLoad) — в этот момент объект уже создан в оперативной памяти, но еще не зафиксирован в базе данных механизмом конвертации.

Посмотрим на пример удаления префикса до разделителя «-» в обработчике «При загрузке» соответствующего ПКО:


КодСПрефиксом = СокрЛП(Объект.Код);
РазделительПрефикса = "-";
Позиция = Найти(КодСПрефиксом, РазделительПрефикса);

Если Позиция > 0 Тогда
    Объект.Код = Сред(КодСПрефиксом, Позиция + 1);
КонецЕсли;
// Метод Объект.Записать() вызывать не нужно — КД запишет объект автоматически.

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

  1. В глобальном обработчике правил «Инициализация» сформируем таблицу соответствий:

Параметры.Вставить("ТаблицаКодов", Новый Соответствие);
Параметры.ТаблицаКодов.Вставить("00001", "Т000114");
Параметры.ТаблицаКодов.Вставить("00002", "Т000115");
  1. В ПКС «Код» в обработчике «Перед выгрузкой» применим сопоставление:

НовыйКод = Параметры.ТаблицаКодов.Получить(Источник.Код);
Если НовыйКод <> Неопределено Тогда
    Значение = НовыйКод;
КонецЕсли;

Нюансы работы с флагом «Не замещать существующие объекты»

При использовании флага «Не замещать существующие объекты» в ПКО важно учитывать специфику работы алгоритмов загрузки:

  1. Защита шапки и очистка табличных частей: если для объекта-родителя (например, справочника «Организации») установлен признак «Не замещать», его реквизиты шапки при сопоставлении не перезаписываются. Однако подчиненные объекты (например, банковские счета) или табличные части могут перезаписываться или очищаться, если для них передаются правила и включена опция «Очищать табличные части перед загрузкой».
  2. Режим проведения документов: если требуется, чтобы уже существующие и проведенные в приемнике документы не перепроводились заново, в ПКО документа необходимо проверить настройки на вкладке «Настройки»: переключить «Режим проведения» в значение «Не проводить» или управлять процессом через обработчик ПередЗаписьюПолученныхДанных:

Если Не Объект.ЭтоНовый() И Объект.Проведен Тогда
    РежимЗаписи = РежимЗаписиДокумента.Запись;
КонецЕсли;

Причины «зависания» изменений в плане обмена и их устранение

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

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

Если обмен настроен через прямое подключение (COM) или файловый каталог, но обратная загрузка пакета-ответа в источник не выполняется (или завершается аварийно), таблица регистрации изменений не очищается. В результате за недели и годы работы накапливаются сотни тысяч записей, которые раз за разом выгружаются в приемник.

Разберем порядок исправления ситуации:

  1. С помощью типовой обработки «Регистрация изменений для обмена» удалим неактуальные зависшие регистрации документов прошлых периодов.
  2. Проверим соответствие номеров сообщений в узлах обмена обеих баз.
  3. Если счетчики номеров сообщений рассинхронизированы, выровняем их программно во внешнем соединении или через обработку:

УзелОбъекта = УзелОбмена.ПолучитьОбъект();
УзелОбъекта.НомерПринятого = УзелОбъекта.НомерОтправленного;
УзелОбъекта.Записать();

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

← На главную