При работе в двух доработанных, но идентичных базах 1С:Управление торговлей 10.3 часто возникает задача регулярного переноса справочника Номенклатура вместе со всеми подчиненными данными (картинками, единицами измерения, свойствами) строго в одном направлении. При этом базы ведутся разными организациями, поэтому полноценный распределенный обмен (РИБ) не подходит, так как он накладывает жесткие ограничения на изменение конфигурации и миграцию всех остальных данных.
В этой статье мы подробно разберем, как спроектировать и настроить надежный, полностью автоматический односторонний обмен данными без программирования сложных COM-соединений, используя штатные механизмы платформы 1С и Конвертацию Данных 2.1.
Для начала проанализируем альтернативные варианты, которые часто предлагают на форумах, и выясним их недостатки:
Com.Справочники.Номенклатура.СоздатьЭлемент()) кажется простым решением только на первый взгляд. На практике вам придется вручную описывать перенос картинок, штрихкодов, единиц измерения и свойств. Более того, при таком подходе крайне сложно отслеживать изменения объектов (изменили наименование, добавили картинку). Придется либо каждый раз перегружать весь справочник, либо писать собственную сложную систему регистрации измененных объектов.Наиболее правильным и отказоустойчивым решением является использование планов обмена для регистрации изменений в сочетании с правилами конвертации данных (КД 2.1).
Поскольку наши конфигурации абсолютно идентичны, перенос объектов должен осуществляться строго по их внутренним идентификаторам. Это исключит дублирование и затирание данных при совпадении кодов или наименований.
Разберем, как правильно настроить правила конвертации объектов (ПКО) в программе «Конвертация данных 2.1»:
Номенклатура и всех его подчиненных справочников создадим ПКО.Справочник Номенклатура в УТ 10.3 не существует сам по себе. Он тесно связан с подчиненными объектами: единицами измерения, штрихкодами, свойствами, категориями и картинками (хранящимися в справочнике ХранилищеДополнительнойИнформации).
Если мы настроим авторегистрацию только для самой номенклатуры, то при изменении, например, только веса в единице измерения или добавлении нового изображения, элемент номенклатуры не будет изменен, и система не зарегистрирует его для выгрузки.
Рассмотрим два варианта решения этой проблемы:
ЕдиницыИзмерения, ХранилищеДополнительнойИнформации) и регистры сведений (например, Штрихкоды) в состав используемого плана обмена. В правилах конвертации для единиц измерения настроим ПКО с обязательным указанием связи по владельцу. При их изменении они будут регистрироваться независимо и корректно обновляться в приемнике.Для того чтобы база-источник понимала, что данные успешно дошли до приемника, и очищала регистрацию изменений (чтобы не гонять одни и те же данные по кругу), используется механизм подтверждения получения (квитирование).
При одностороннем обмене нам нужно, чтобы из базы-приемника в базу-источник возвращался только номер принятого сообщения, но никакие данные из приемника обратно не заносились. Для этого нам понадобятся специальные правила обратного обмена.
Важный нюанс: Если вы создадите абсолютно пустой XML-файл правил обмена в КД 2.1 (без единого ПКО), платформа 1С при попытке чтения этого файла в приемнике выдаст ошибку о неверной структуре метаданных правил.
Выполним настройку правильно:
Для реализации обмена нам не нужно создавать новый план обмена в конфигураторе и снимать базы с поддержки. В типовой конфигурации УТ 10.3 уже присутствует предопределенный план обмена ОбменДаннымиУниверсальный.
Настроим его в режиме «1С:Предприятие»:
ОбменДаннымиУниверсальный (в списке он может отображаться как "Универсальный обмен данными").Если бы мы писали выгрузку изменений вручную (например, для внешней обработки), то базовый алгоритм обхода зарегистрированных изменений выглядел бы следующим образом:
УзелПло = УзелСсылка.ПолучитьОбъект();
Квитанция = УзелПло.НомерОтправленного;
УзелПло.НомерОтправленного = Квитанция + 1;
УзелПло.Записать();
Выборка = ПланыОбмена.ВыбратьИзменения(УзелСсылка, Квитанция);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
// Здесь выполняется конвертация и запись данных в XML-файл
КонецЦикла;
Если ОшибкаВыгрузки Тогда
Возврат;
КонецЕсли;
// Очищаем зарегистрированные изменения после успешной отправки
ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, Квитанция);
Для того чтобы обмен выполнялся полностью в автоматическом режиме без участия пользователей, настроим регламентные задания. Особенности настройки зависят от режима работы вашей базы данных:
Для клиент-серверного варианта (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.