Как настроить автоматический односторонний обмен номенклатурой между одинаковыми базами УТ 10.3?

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

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

В этой статье мы подробно разберем, как спроектировать и настроить надежный, полностью автоматический односторонний обмен данными без программирования сложных COM-соединений, используя штатные механизмы платформы 1С и Конвертацию Данных 2.1.

Почему не стоит использовать COM-подключение или классический РИБ?

Для начала проанализируем альтернативные варианты, которые часто предлагают на форумах, и выясним их недостатки:

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

Наиболее правильным и отказоустойчивым решением является использование планов обмена для регистрации изменений в сочетании с правилами конвертации данных (КД 2.1).

Шаг 1. Настройка правил конвертации в КД 2.1 и сопоставление по UUID

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

Разберем, как правильно настроить правила конвертации объектов (ПКО) в программе «Конвертация данных 2.1»:

  1. Для справочника Номенклатура и всех его подчиненных справочников создадим ПКО.
  2. В свойствах каждого ПКО обязательно установим флаг «Искать объект по уникальному идентификатору».
  3. Флаг «Продолжить поиск по полям поиска, если по идентификатору не найден» необходимо отключить. Если в базе-приемнике пользователь случайно создаст товар с аналогичным артикулом или наименованием, система принудительно создаст новый объект с UUID источника, а не затрет существующий чужой товар.

Шаг 2. Синхронизация подчиненных справочников и регистров

Справочник Номенклатура в УТ 10.3 не существует сам по себе. Он тесно связан с подчиненными объектами: единицами измерения, штрихкодами, свойствами, категориями и картинками (хранящимися в справочнике ХранилищеДополнительнойИнформации).

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

Рассмотрим два варианта решения этой проблемы:

Шаг 3. Реализация механизма «пустых правил» для квитирования

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

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

Важный нюанс: Если вы создадите абсолютно пустой XML-файл правил обмена в КД 2.1 (без единого ПКО), платформа 1С при попытке чтения этого файла в приемнике выдаст ошибку о неверной структуре метаданных правил.

Выполним настройку правильно:

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

Шаг 4. Настройка встроенного плана обмена в УТ 10.3

Для реализации обмена нам не нужно создавать новый план обмена в конфигураторе и снимать базы с поддержки. В типовой конфигурации УТ 10.3 уже присутствует предопределенный план обмена ОбменДаннымиУниверсальный.

Настроим его в режиме «1С:Предприятие»:

  1. Перейдем в меню: Сервис -> Прочие обмены данными -> Все настройки.
  2. Создадим новую настройку обмена. Программа предложит выбрать узел плана обмена ОбменДаннымиУниверсальный (в списке он может отображаться как "Универсальный обмен данными").
  3. В созданной настройке укажем разработанные нами правила конвертации данных (для выгрузки), а в качестве транспорта выберем удобный способ (локальный каталог, FTP-сервер или электронную почту).
  4. На вкладке настройки автоматического обмена определим расписание работы.

Если бы мы писали выгрузку изменений вручную (например, для внешней обработки), то базовый алгоритм обхода зарегистрированных изменений выглядел бы следующим образом:


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

Выборка = ПланыОбмена.ВыбратьИзменения(УзелСсылка, Квитанция);
Пока Выборка.Следующий() Цикл
    Данные = Выборка.Получить();
    // Здесь выполняется конвертация и запись данных в XML-файл
КонецЦикла;

Если ОшибкаВыгрузки Тогда
    Возврат;
КонецЕсли;

// Очищаем зарегистрированные изменения после успешной отправки
ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, Квитанция);

Шаг 5. Автоматизация процесса по расписанию

Для того чтобы обмен выполнялся полностью в автоматическом режиме без участия пользователей, настроим регламентные задания. Особенности настройки зависят от режима работы вашей базы данных:

Для клиент-серверного варианта (SQL):

Регламентные задания выполняются на сервере 1С автоматически. Достаточно зайти в консоль заданий (или использовать типовую форму настройки автообмена в УТ 10.3) и задать расписание для стандартного задания выполнения обменов.

Для файлового варианта базы данных:

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

Однако более надежным решением для файлового режима является запуск обмена через Планировщик задач Windows. Для этого настроим запуск 1С из командной строки со специальным параметром:

"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\UT_Source" /N"ExchangeUser" /P"MyPassword" /C"ВыполнитьОбменДанными"

А в модуле обычного приложения нашей конфигурации пропишем обработку этого параметра при запуске системы, чтобы программа выполнила выгрузку и сама корректно закрылась:


Процедура ПриНачалеРаботыСистемы()
    // Проверяем наличие параметра командной строки
    Если Найти(ПараметрЗапуска, "ВыполнитьОбменДанными") > 0 Тогда
        Попытка
            // Вызываем процедуру выполнения обменов по нашей настройке
            ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоРасписанию();
        Исключение
            ЗаписатьЛогСобытий("Ошибка при выполнении автоматического обмена: " + ОписаниеОшибки());
        КонецПопытки;
        
        // Завершаем работу сеанса после выполнения обмена
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

Используя данный подход, мы получаем стабильный, легко масштабируемый и независимый односторонний обмен номенклатурой, который не требует постоянного ручного контроля и не мешает обновлению измененных конфигураций 1С:УТ 10.3.

← На главную