Домой /  Интернет / Как создать свой план обмена 1с 8.3. Организация обмена с базой филиала (розничного магазина) в торговой сети через XML (универсальный обмен). Распределенная информационная база

Как создать свой план обмена 1с 8.3. Организация обмена с базой филиала (розничного магазина) в торговой сети через XML (универсальный обмен). Распределенная информационная база

Технология распределенных информационных баз (РИБ) позволяет создать территориально распределенную систему на базе конфигураций 1С Предприятие. Это позволяет иметь общее информационное пространство даже с теми подразделениями, которые не имеют надежного канала связи, сочетая высокую автономность узлов с возможностью оперативного обмена информацией. В наших статьях мы рассмотрим особенности и практическую реализацию этого механизма на платформе 8.2

Прежде всего зададимся вопросом: почему именно автообмен? Современные технологии, в сочетании с недорогим и быстрым интернетом, позволяют организовать удаленную работу без каких либо затруднений. Выбор способов как никогда широк: RDP, тонкий и веб-клиенты, объединение сетей при помощи VPN - есть над чем задуматься. Однако все эти способы имеют один существенный недостаток - сильная зависимость от качества канала связи.

Даже при идеальной работе местного провайдера гарантировать 100% доступность канала связи невозможно. Проблемы у магистрального провайдера, отсутствие электроснабжения, физическое повреждение линии связи и многие другие факторы делают эту задачу неразрешимой. В тоже время недоступность информационной базы на удаленном складе или в розничном магазине приводит к вполне ощутимым убыткам. Ну и наконец не будем забывать, что есть места (например промзоны на окраине городов) в которые подвести качественный канал связи дорого и/или проблематично.

Механизм РИБ позволяет избавиться от указанных недостатков, каждое подразделение имеет собственный экземпляр информационной базы с которой можно работать автономно даже при полном отсутствии связи с внешним миром. А небольшой объем передаваемой информации позволяет использовать для обмена любой канал связи, в том числе мобильный интернет.

РИБ на платформе 8.2 не является чем-то принципиально новым, представляя собой дальнейшее развитие УРИБ платформы 7.7, только теперь эта технология стала доступней и проще. В отличии от компоненты УРИБ, которую нужно было приобретать отдельно, РИБ является неотъемлемой частью многих типовых конфигураций и работает полностью в пользовательском режиме, позволяя обойтись без Конфигуратора даже на этапе настройки.

На этом месте пора бы было перейти к практической части, но придется сделать еще одно отступление. Дело в том, что переход на платформу 8.2, который вроде бы уже произошел, по факту привел к появлению двух типов конфигураций: на основе управляемого приложения, "родные" для платформы 8.2, и адаптированные с 8.1, продолжая использовать устаревшие технологии и механизмы. Так как существенная часть конфигураций (Бухгалтерия предприятия, Зарплата и управление персоналом) являются адаптированными или переходными, то сбрасывать их со счетов нельзя, поэтому первая часть нашей статьи будет посвящена этим конфигурациям (по сути платформе 8.1), в то время как во второй мы разберем настройку автообмена для конфигураций на основе управляемого приложения (платформе 8.2).

Рассмотрим практическую задачу: настроить автообмен через FTP для конфигурации Бухгалтерия предприятия 2.0. Несмотря на то, что РИБ позволяет производить обмен с использованием электронной почты или общих файловых ресурсов, мы рекомендуем использовать именно FTP, как наиболее простой и надежный способ связи. Как настроить собственный FTP-сервер вы можете прочитать в , либо можно использовать FTP сервис любого хостинг провайдера.

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

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

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

Теперь перейдем Сервис - Распределенная информационная база (РИБ) - Настроить узлы РИБ .

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

Закладка Автоматический обмен позволяет настроить расписание обменов, обмен по событиям (начало и завершение работы и т.п.), данные настройки производятся для пользователя от чьего имени будет выполняться обмен, поэтому убедитесь в наличии у него прав для обмена данными.

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

На этом настройка центрального узла закончена, теперь нужно произвести аналогичные настройки для периферийного узла, подключив начальный образ как существующую ИБ. После чего можно приступать к обмену данными. Для контроля следует воспользоваться Монитором обмена данными , он позволяет не только контролировать успешность прохождения выгрузки/загрузки, но и показывает возникшие коллизии или отложенные движения (если пользователю производившему обмен не хватает прав для совершения каких либо действий в базе). Наличие данного инструмента позволяет быстро и эффективно решать различного рода проблемы, возникающие при автообмене.

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

Возникла необходимость настроить обмен между базами 1С центрального компании и торговых филиалов. РИБ не подошел, из-за чувствительности к изменениям конфигурации, особенно к динамическим обновлениям. А также из-за того, что требуется обмен по определенным правилам: вся информация должна идти в одну сторону - из центра в филиал. Т.е. если кто-то изменит в базе филиала справочник номенклатуры случайно, это не должно попадать в центральную базу.

Из центральной базы в филиал выгружаются:

  • каталог товаров,
  • цены только по некоторым видам цен,
  • заказы из интернет-магазина.

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

На основе этих требований было решено попробовать обмен через формат EnterpriseData.

Краткая справка по обмену в формате EnterpriseData

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

ПКС - правила конвертации свойств

Создание плана обмена

Для удобства создадим подсистему "ECom_ОбменСФилиалами". Все новые объекты будем добавлять в эту подсистему. Изменения в типовые модули будем выносить в расширение (при подключении расширения надо будет снять галочки "безопасный режим", т.к. будут затрагиваться серверные модули).

Копируем план обмена "СинхронизацияДанныхЧерезУниверсальныйФормат", называем новый план обмена "ECom_ОбменСФилиалами".

В настройках состава плана обмена делаем Действия - Выключить все, а потом добавляем справочники:

  • ВидыЦен
  • Номенклатура

и документы:

  • ЗаказКлиента
  • УстановкаЦенНоменклатуры

Заходим в модуль менеджера. В процедуре ПолучитьВерсииФорматаОбмена необходимо изменить название плана обмена в запросе.

Также удобно добавить возможность отладки модуля менеджера обмена (внешней обработки), как это сделать, описано тут:

Процедура ОпределитьНастройки определяет, как наш план обмена обмена будет появляться в меню настройки синхронизации.

Процедура ОпределитьНастройки

Процедура ОпределитьНастройки(Настройки, ИдентификаторНастройки = "") Экспорт Настройки.ПредупреждатьОНесоответствииВерсийПравилОбмена = Истина; Настройки.ПутьКФайлуКомплектаПравилНаПользовательскомСайте = "https://users.v8.1c.ru/distribution/project/Trade110"; Настройки.ПутьКФайлуКомплектаПравилВКаталогеШаблонов = "\1c\trade"; Настройки.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = "Обмен с филиалами"")); Настройки.Вставить("ЗаголовокПомощникаСозданияОбмена", НСтр("ru = "Обмен с филиалами"")); Настройки.Вставить("ЗаголовокУзлаПланаОбмена", НСтр("ru = "Обмен с филиалами"")); Настройки.Вставить("ЭтоПланОбменаXDTO", Истина); КонецПроцедуры

А также необходимо в общем модуле ОбменДаннымиУТУП в процедуре СписокПлановОбмена добавить наш план обмена

ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ECom_ОбменСФилиалами);

В результате появится возможность настраивать обмен по нашему плану обмена:

Чтобы запускать обмен типовыми средствами необходимо еще в общих командах

  • НастроитьПараметрыТранспортаСообщенийОбмена
  • Синхронизировать
  • СоставОтправляемыхДанных

В свойстве "Тип параметра" отметить наш план обмена

Копируем типовые подписки на события:

  • СинхронизацияДанныхЧерезУниверсальныйФорматРегистрация
  • СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияДокумента

Указываем наши объекты, входящие в состав нашего плана обмена.

Копируем типовой модуль ОбменДаннымиСобытияУТ, в полученном модуле в процедурах меняем имя плана обмена с СинхронизацияДанныхЧерезУниверсальныйФормат на наш ECom_ОбменСФилиалами.

В созданных подписках указываем обработчики - процедуры из нашего нового модуля.

Также добавим в этот модуль функцию ЭтоЦентральнаяБаза(), которая нам потребуется в дальнейшем. Признаком центральной базы будем считать код узла, соответствующего текущей базе ("этот узел"), равным "ЦБ".

Функция ЭтоЦентральнаяБаза() Экспорт

Функция ЭтоЦентральнаяБаза() Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВЫБОР | КОГДА ECom_ОбменСФилиалами.Код = ""ЦБ"" | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ЭтоЦентральнаяБаза |ИЗ | ПланОбмена.ECom_ОбменСФилиалами КАК ECom_ОбменСФилиалами |ГДЕ | ECom_ОбменСФилиалами.ЭтотУзел" ; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.ЭтоЦентральнаяБаза; Иначе Возврат Ложь; КонецЕсли; КонецФункции // ЭтоЦентральнаяБаза()

Т.к. эта функция будет вызываться постоянно, необходимо ее закэшировать с помощью модуля повторного использования.

Создание правил регистрации

Для создания правил регистрации нам потребуется конфигурация Конвертация Данных v2.

Я для изучения вопроса использовал вот эту статью:

С помощью обработки MD83Exp.epf, входящей в состав поставки Конвертации 2, необходимо выгрузить структуру нашей конфигурации в файл.

Затем необходимо загрузить полученную структуру конфигурации в Конвертацию 2.

Создаем правила регистрации.

Выбираем нашу конфигурацию и наш план обмена.

И заходим в настройку правил регистрации.

Создаем правила регистрации для наших объектов:

Т.к. мы хотим, чтобы у нас был односторонний обмен (только из центра в филил), в настройку правил по каждому объекту надо добавить в обработчик "Перед обработкой" наш фильтр:

Отказ = Не ECom_ОбменДаннымиПовтИсп.ЭтоЦентральнаяБаза();

На "Заказ клиента" накладываем дополнительный фильтр по организации и по дате начала выгрузки:

Для документа "Установка цен номенклатуры" так же добавляем отбор по дате. Плюс к этому в обработчик "При обработке" добавляем фильтр по виду цен.

ИспользоватьКэш = Ложь; ВидыЦен = Объект.ВидыЦен.ВыгрузитьКолонку("ВидЦены"); ПараметрыЗапроса.Вставить("ВидыЦен", ВидыЦен); ТекстЗапроса = "ВЫБРАТЬ | ECom_ОбменСФилиалами.Ссылка КАК Ссылка |ИЗ | ПланОбмена.ECom_ОбменСФилиалами.ВидыЦенНоменклатуры КАК ECom_ОбменСФилиаламиВидыЦенНоменклатуры | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланОбмена.ECom_ОбменСФилиалами КАК ECom_ОбменСФилиалами | ПО ECom_ОбменСФилиаламиВидыЦенНоменклатуры.Ссылка = ECom_ОбменСФилиалами.Ссылка | И (ECom_ОбменСФилиаламиВидыЦенНоменклатуры.ВидЦенНоменклатуры В (&СвойствоОбъекта_ВидыЦен)) | И (ECom_ОбменСФилиалами.ЭтотУзел = ЛОЖЬ)" ;

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

На справочник "Виды цен" также накладываем фильтр:

Сохраняем правила регистрации во внешний файл:

Полученный XML-файл необходимо загрузить в макет "Правила регистрации" нашего плана обмена:

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

Правила конвертации

Для создания правил конвертации нам потребуется конфигурация Конвертация Данных v3. Лучше пользоваться чистой базой. Например, разрабатывая конвертацию для формата данных EnterpriseData 1.3, для некоторых объектов почему-то требовалось задавать реквизиты (ПКС), не являющиеся казалось бы обязательными. Оказалось, что они обязательны в версии 1.2, и простое наличие в базе Конвертации загруженного описания этого формата уже сбивало логику работы программы. Поэтому берем чистую базу, и грузим в нее все "с нуля".

Очень здорово работа с конвертацией 3.0 описана тут:

Загружаем структуру конфигурации из файла, выгруженного ранее (в Конвертации 2).

Выгружаем из УТ 11 XDTO-пакет EnterpriseData_1_3_8 в файл

Загружаем полученный файл в Конвертацию 3

Создаем конвертацию

Версия формата менеджера обмена указывается в зависимости от конфигурации. Например для УТ 11.3 это "1", для УТ 11.4 - "2".

Что такое конвертация? Для выгрузки и загрузки объекта нам нужно:

  1. Правило отправки данных - тут мы можем накладывать фильтр на объекты и применять разные правила конвертации (например, для папок номенклатуры и элементов указываются разные правила конвертации из-за разного набора реквизитов)
  2. Правило конвертации "из 1С в XML" - тут данные 1С преобразуются в данные формата EnterpriseData (например, можно документ "Реализация" сконвертировать в документ "Поступление")
  3. Правило конвертации "из XML в 1С"
  4. Правило получения данных

Если объект участвует в плане обмена - для него обязательно необходимо создать правило отправки данных. В нашем случае это:

  • Виды цен
  • Номенклатура
  • Заказ клиента
  • Установка цен номенклатуры

Как себя будут вести реквизиты этих объектов ссылочного типа? Например, реквизит "Организация". У каждого "объектных" типов в формате EnterpriseData (например, Справочник.Контрагенты) есть так называемые ключевые свойства. Так вот, когда мы выгружаем заказ, в правилах конвертации мы указываем реквизит "Организация". При выгрузке этого реквизита выгружаются и его ключевые свойства. Мы не будем создаваться создавать правила отправки для справочника "Организации", потому что эти данные в работающей системе меняются крайне редко, мы просто пропишем алгоритм, который при получении заказа правильно подставит уже существующую в базе филиала организацию.

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

Создаем правило конвертации для отправки номенклатуры.

Настраиваем "правила конвертации свойств". Суть в чем. EnterpriseData - это структура данных, по сути та же конфигурация 1С. Только скажем так чуть более упрощенная и универсальная. Она должна подходить для разных конфигураций 1С, поэтому состав и название объектов отличается от УТ 11. Поэтому нам нужно прописать соответствие - как реквизиты называются в УТ11, и как в EnterpriseData. Есть так называемые "ключевые свойства" - это обязательные реквизиты для данной версии формата. Их можно посмотреть в "Дереве объектов формата":

Итак, указываем правила конвертации свойство для номенклатуры:

Как видим, у нас появилось несколько реквизитов "сложного" типа, для них также необходимо создать "Правила конвертации объектов", иначе в при выгрузке будет выходить такое сообщение в ошибках: "Структура объекта "/ЕдиницаИзмерения" не соответствует типу".

Правила конвертации для перечислений, и прочих предопределенных (в конфигураторе) данных создаются на вкладке:

Для этих (и некоторых других) данных удобно, чтобы правило работало сразу и отправку, и на получение.

Указываем созданные правила в ПКС для номенклатуры:

Теперь создадим правило конвертации для "Заказа клиента".

Добавим правила конвертации для табличной части "Товары". Для начала укажем соответствие реквизитов в ПКС. Необходимо проставить галочку "Используется алгоритм", т.к. значения табличной части будут формироваться не "сами", нужно еще написать небольшой алгоритм. При использовании алгоритма нам не обязательно указывать реквизиты объекта из 1С, т.к. значения для выгрузки в файл XML все равно будут формироваться алгоритмом. Необходимо также указывать правило конвертации свойства для "сложных" типов.

Теперь нужно добавить алгоритм заполнения табличной части в обработчик "При отправке".

#Область Товары // Табличные части Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.НомерСтроки КАК НомерСтрокиДокумента, | Товары.Номенклатура КАК Номенклатура, | ВЫБОР | КОГДА НоменклатураСправочник.НаименованиеПолное = """" | ТОГДА НоменклатураСправочник.Наименование | ИНАЧЕ НоменклатураСправочник.НаименованиеПолное | КОНЕЦ КАК НоменклатураНаименование, | ЕСТЬNULL(НоменклатураСправочник.ЕдиницаИзмерения, ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)) КАК ЕдиницаИзмерения, | ВЫРАЗИТЬ(""СобственныеТовары"" КАК СТРОКА(18)) КАК ТипЗапасов, | Товары.Количество, | Товары.Цена КАК Цена, | Товары.Сумма, | Товары.СтавкаНДС, | Товары.СуммаНДС |ИЗ | Документ.ЗаказКлиента.Товары КАК Товары | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураСправочник | ПО Товары.Номенклатура = НоменклатураСправочник.Ссылка |ГДЕ | Товары.Ссылка = &Ссылка | И Товары.Отменено = ЛОЖЬ" ; Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка); ДанныеXDTO.Вставить("Товары", Запрос.Выполнить().Выгрузить()); #КонецОбласти

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

Алгоритм заполняет ПолученныеДанные.ДополнительныеСвойства.Товары, которые потом автоматически записываются в табличную часть "Товары" загружаемого объекта.

МассивСтрокТовары = Новый Массив; ПравилаЗаполнения = Новый Соответствие; ПравилаЗаполнения.Вставить("Номенклатура", "Номенклатура"); ПравилаЗаполнения.Вставить("Количество", "Количество"); ПравилаЗаполнения.Вставить("Сумма", "Сумма"); ПравилаЗаполнения.Вставить("Цена", "Цена"); ПравилаЗаполнения.Вставить("СтавкаНДС", "СтавкаНДС"); ПравилаЗаполнения.Вставить("СуммаНДС", "СуммаНДС"); ПравилаЗаполнения.Вставить("Склад", "Склад"); Если ДанныеXDTO.Свойство("Товары") И ЗначениеЗаполнено(ДанныеXDTO.Товары) Тогда Для Каждого Строка Из ДанныеXDTO.Товары Цикл СтруктураДанныхСтроки = Новый Структура; Для Каждого ПравилоЗаполнения Из ПравилаЗаполнения Цикл СтруктураДляПереносаЗначения = Новый Структура(ПравилоЗаполнения.Ключ, Неопределено); ЗаполнитьЗначенияСвойств(СтруктураДляПереносаЗначения, Строка); Значение = СтруктураДляПереносаЗначения[ПравилоЗаполнения.Ключ]; Если Значение <> Неопределено Тогда СтруктураДанныхСтроки.Вставить(ПравилоЗаполнения.Значение, Значение); КонецЕсли; КонецЦикла; СтруктураДанныхСтроки.Вставить("КоличествоУпаковок", СтруктураДанныхСтроки.Количество); Если ДанныеXDTO.Свойство("Склад") Тогда СтруктураДанныхСтроки.Вставить("Склад", ДанныеXDTO.Склад); КонецЕсли; МассивСтрокТовары.Добавить(СтруктураДанныхСтроки); КонецЦикла; КонецЕсли; Если МассивСтрокТовары.Количество() > 0 Тогда ПолученныеДанные.ДополнительныеСвойства.Вставить("Товары", МассивСтрокТовары); КонецЕсли;

Теперь реализуем такой механизм обмена контрагентами (покупателями): при загрузке заказа в базу филиала ищем существующего клиента по телефону (например, клиент что-то купил в филиале, зарегистрировался, а потом решил приобрести что-то в интернет-магазине, и заказ попал в центральную базу). Если клиент по телефону найден, то подставляем в заказ его, если же нет - создаем нового. Для этого нам необходимо будет вмести с заказом передавать номер телефона клиента. В типовые поля заказа в формате EnterpriseData телефон не входит, чтобы его передать, можно воспользоваться полем AdditionalInfo, куда можно записывать дополнительную информацию. Мы будем передавать дополнительную информацию в виде структуры с необходимыми полями. Через AdditionalInfo можно передавать и структуры, и таблицы значений. В обработчик "При отправке" в правила конвертации заказа при отправке

добавляем код:

Текст обработчика "При отправке"

СтруктДопДанные = Новый Структура; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПартнерыКонтактнаяИнформация.НомерТелефона |ИЗ | Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация |ГДЕ | ПартнерыКонтактнаяИнформация.Ссылка = &Партнер | И ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонПартнера)" ; Запрос.УстановитьПараметр("Партнер", ДанныеИБ.Партнер); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда структДопДанные.Вставить("НомерТелефона", Выборка.НомерТелефона); КонецЕсли; ДанныеXDTO.Вставить("Additionalinfo", структДопДанные);

Соответственно, в обработчик "При конвертации данных XDTO" в найстройку конвертации при получении

Добавляем код:

Текст обработчика "При конвертации данных XDTO"

Если ДанныеXDTO.Свойство("AdditionalInfo") Тогда Если ДанныеXDTO.AdditionalInfo.Свойство("НомерТелефона") Тогда НомерТелефона = ДанныеXDTO.AdditionalInfo.НомерТелефона; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПартнерыКонтактнаяИнформация.Ссылка КАК Партнер, | Контрагенты.Ссылка КАК Контрагент |ИЗ | Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты | ПО ПартнерыКонтактнаяИнформация.Ссылка = Контрагенты.Партнер | И (ПартнерыКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонПартнера)) | И (ПартнерыКонтактнаяИнформация.НомерТелефона = &НомерТелефона)" ; Запрос.УстановитьПараметр("НомерТелефона", НомерТелефона); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ПолученныеДанные.Партнер = Выборка.Партнер; ПолученныеДанные.Контрагент = Выборка.Контрагент; Иначе ПартнерОбъект = Справочники.Партнеры.СоздатьЭлемент(); ПартнерОбъект.Наименование = ДанныеXDTO.Контрагент.Наименование; ПартнерОбъект.НаименованиеПолное = ПартнерОбъект.Наименование; ПартнерОбъект.Клиент = Истина; ПартнерОбъект.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.ЧастноеЛицо; НоваяСтрока = ПартнерОбъект.КонтактнаяИнформация.Добавить(); НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон; НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера; НоваяСтрока.НомерТелефона = НомерТелефона; НоваяСтрока.Представление = НомерТелефона; НоваяСтрока.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.КонтактнаяИнформацияXMLПоПредставлению(НоваяСтрока.Представление, Перечисления.ТипыКонтактнойИнформации.Телефон); ПартнерОбъект.ОбменДанными.Загрузка = Истина; ПартнерОбъект.Записать(); КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент(); КонтрагентОбъект.Наименование = ПартнерОбъект.Наименование; КонтрагентОбъект.НаименованиеПолное = КонтрагентОбъект.Наименование; КонтрагентОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо; КонтрагентОбъект.Партнер = ПартнерОбъект.Ссылка; КонтрагентОбъект.ОбменДанными.Загрузка = Истина; КонтрагентОбъект.Записать(); ПолученныеДанные.Партнер = ПартнерОбъект.Ссылка; ПолученныеДанные.Контрагент = КонтрагентОбъект.Ссылка; КонецЕсли; КонецЕсли; КонецЕсли;

В выгрузке цен номенклатуры есть несколько интересных моментов:

  • документ установки цен может содержать несколько видов цен, а нам нужно выгружать только те, которые подпадают под фильтр.
  • В формате EnterpriseData документ "Установка цен номенклатуры" имеет только один тип цен. Т.е. один документ в 1С должен выгружаться как несколько объектов EnterpriseData.

Для реализации фильтра нам потребуется где-то хранить выгружаемые виды цен, установленные в настройках узла обмена. Для этого нам потребуются "Параметры конвертации":

А также обработка события "Перед конвертацией":

В правилах обработки данных для документа "Установка цен номенклатуры" нам необходимо отключить использование конвертации "в типовом" варианте, а вместо этого генерировать объект XDTO "на ходу":

Для этого мы обратимся напрямую к методу ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки. Преобразуем документ в массив необходимых нам структур с одним типом цен, и уже каждую эту структуру отдельно выгрузим через правила конвертации. Выглядит, конечно, запутанно.

Текст обработчика "При обработке"

Если ТипЗнч(ДанныеИБ) = Тип("Структура") Тогда Возврат; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатуры.ВидЦены КАК ТипЦен, | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Цена КАК Цена |ИЗ | Документ.УстановкаЦенНоменклатуры.Товары КАК ЦеныНоменклатуры |ГДЕ | ЦеныНоменклатуры.Ссылка = &Ссылка | И ЦеныНоменклатуры.Цена <> 0 | И ЦеныНоменклатуры.ВидЦены В(&ВидыЦенНоменклатуры) |ИТОГИ ПО | ТипЦен"; Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка); Запрос.УстановитьПараметр("ВидыЦенНоменклатуры", КомпонентыОбмена.ПараметрыКонвертации.ВидыЦенНоменклатуры); ТаблицаТоваров = Новый ТаблицаЗначений(); ТаблицаТоваров.Колонки.Добавить("Номенклатура"); ТаблицаТоваров.Колонки.Добавить("Цена"); ВыборкаВидЦены = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ПравилоУстановкаЦенОтправка = КомпонентыОбмена.ПравилаОбработкиДанных.Найти("Документ_УстановкаЦенНоменклатуры", "Имя"); Если Не ПравилоУстановкаЦенОтправка = Неопределено Тогда Пока ВыборкаВидЦены.Следующий() Цикл Если НЕ ЗначениеЗаполнено(ВыборкаВидЦены.ТипЦен) Тогда Продолжить; КонецЕсли; ДанныеИБСтруктура = Новый Структура("Дата, Номер, Ссылка"); ЗаполнитьЗначенияСвойств(ДанныеИБСтруктура, ДанныеИБ); ВыборкаДетали = ВыборкаВидЦены.Выбрать(); ТаблицаТоваров.Очистить(); Пока ВыборкаДетали.Следующий() Цикл СтрокаТовары = ТаблицаТоваров.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТовары, ВыборкаДетали); КонецЦикла; ДанныеИБСтруктура.Вставить("ТипЦен", ВыборкаВидЦены.ТипЦен); ДанныеИБСтруктура.Вставить("Товары", ТаблицаТоваров); ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки(КомпонентыОбмена, ДанныеИБСтруктура, ПравилоУстановкаЦенОтправка); КонецЦикла; КонецЕсли; ИспользованиеПКО.Документ_УстановкаЦенНоменклатуры = Ложь;

В правило конвертации в ПКС необходимо добавить свойство "ТипЦен". При этом надо выбирать способ выбора свойств "Вручную".

Настройка синхронизации

Необходимо задать значение константы "Префикс информационной базы" - "ЦБ":

Создаем новую настройку синхронизации

Зададим в настройках фильтр по дате документов, организации, виду цен:

Чтобы подключить нашу внешнюю обработку, содержащую модуль менеджера обмена, необходимо в настройках формы указать отображение вкладки "служебная информация":

Создадим вторую чистую базу (для филиала) из cf-ника центральной базы. Также не забываем подключить наше расширение. При создании базы автоматически создаются справочники "Валюта" и "Единицы измерения". Чтобы при загрузке данных из центральной базы не произошло задвоение этих данных, необходимо в конвертации по этим справочникам идентификацию сделать не по UID, а по коду.

Префикс информационной базы задаем "ФЛ" и настраиваем синхронизацию, аналогично центральной базе.

Дополнительные файлы со сквозным примером.

Состав файлов, приложенных к данной статье:

  • cf-файл "Доп. объекты конфигурации.cf" для объединения с основной конфигурацией УТ 11, содержащий разработанный план обмена
  • cfe-файл с расширением конфигурации, для корректировки модулей конфигурации
  • xml-файл "Правила регистрации.xml"
  • epf-файл "МенеджерДемо.epf"

Порядок установки плана обмена. В конфигураторе запускаем операцию сравнения и объединения с "Доп. объекты конфигурации.cf". Снимаем галочки со всех объектов:

Выбираем "Действия - отметить по подсистемам файла", отмечаем только "ECom_ОбменСФилиалами"

Добавляем расширение из файла "ECom_ОбменДаннымиСФилиалами.cfe", снимаем галочки про безопасность:

Для корректировки правил регистрации вложенный файл "Правила регистрации.xml" можно загрузить в Конвертацию 2. Предварительно необходимо загрузить структуру конфигурации, как описано .

Для корректировки правил конвертации вложенный файл "МенеджерДемо.epf" можно загрузить в Конвертацию 3. Предварительно необходимо создать описание конвертации, как описано .


Ключевые слова: распределенная, УРБД, XML, регистрация, узел, узла, авторегистрация, начальный, образ, POP3, SMTP, ПочтовоеСообщение, периферийная, центральная, репликация, обмен

Дисклеймер и условия использования

Все случайно упомянутые в статье торговые марки принадлежат своим владельцам.
Статья опубликована под лицензией Creative Commons Attribution-Share Alike 3.0 Unported License.
http://creativecommons.org/licenses/by-sa/3.0/

Сразу замечу, что все нижеследующее относится к релизу платформы 8.0.7.36 и выше.

Шаг 1. Создание плана обмена

Создаем в конфигурации план обмена. Называем его, например "РаспределеннаяБаза". Обязательно в
свойствах плана обмена ставим флажок "Распределенная информационная база".

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

Замечание: при добавлении новых объектов в конфигурацию, они не включаются в план обмена. Т.е. после
добавления объекта его необходимо добавить в состав плана обмена.

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

В принципе, этих действий достаточно, чтобы РБД заработала в "ручном" режиме. Для этого запускаем
Предприятие, открываем наш план обмена через меню "Операции". В плане обмена всегда присутствует
предопределенный узел "с точкой". Это описание текущего узла. Его нужно открыть и заполнить. В нашем
случае будут доступны поля "Код" и "Наименование". Присвоим нашему узлу код "AA" и назовем
"Центральная". Добавим в план обмена один узел. Присвоим ему код "ВВ" и назовем "Периферийная".

Теперь мы можем создать образ периферийной базы. Делается это нажатием кнопки "Создать начальный
образ". В списке узлов должна быть выбрана периферийная база. Образ базы создается в виде готовой ИБ
в каталоге или на сервере 1С:Предприятия. (в отличие от 7.7, где образ ИБ создавался как файл
выгрузки). Далее созданную базу можно перенести в нужное место, просто скопировав файлик 1CV8.1CD
(для файлового варианта), либо через Конфигуратор через выгрузку-загрузку данных.

Если Вы откроете план обмена в периферийной ИБ, то Вы увидите, что узлом "с точкой", т.е. текущим
узлом стал узел "Периферийная", а иконка у узла "Центральная" стала красного цвета, т.е. узел
"Центральная" является главным узлом по отношению к текущему.

Обмен в "ручном" режиме можно производить при помощи кнопок "Записать изменения" и "Прочитать
изменения". В первом случае будет предложено выбрать файл, куда изменения будут записаны, во втором
- файл, откуда изменения будут считаны. Обмен ведется в формате xml. Изменения записываются для
выбранного узла.

Шаг 2. Выгрузка изменений в XML-файл и отправка по электронной почте

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

Добавляем в план обмена два реквизита: ЭлектронныйАдрес типа "строка" и "ВыполнятьОбмен" типа
"булево". В реквизите ЭлектронныйАдрес будем хранить email узла, т.е. тот адрес, на который будем
посылать сообщения обмена. Реквизит ВыполнятьОбмен нужен, чтобы быстро отключить автоматическую
посылку-отправку сообщений.

Процедуру для работы с электронной почтой сделаем универсальной, т.е. сделаем возможным
использование как MAPI (отправка-получение через почтового клиента, например, MS Outlook), так и
прямое обращение к SMTP/POP3 серверам.

Добавим в конфигурацию несколько констант:

где-нибудь в общей форме обеспечиваем редактирование значений этих констант.

Добавим общий модуль, назовем его "рбРаспределеннаяБаза". В нем пишем:

Процедура рбОтправитьСообщенияОбмена() Экспорт ИспользоватьSMTP = Константы.ИспользоватьОбменПоSMTP.Получить(); //Сначала создаем объект Почта, который в зависимости от настроек будет типа ИнтернетПочта, //если используется прямое обращение к серверам, либо Почта если используется MAPI. Если ИспользоватьSMTP Тогда //Для объекта типа ИнтернетПочта создаем и заполняем почтовый профиль. ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль; ПочтовыйПрофиль.АдресСервераSMTP = Константы.АдресСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПортSMTP = Константы.ПортСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПользовательSMTP = Константы.ПользовательСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПарольSMTP = Константы.ПарольПользователяSMTPОбмена.Получить(); ПочтовыйПрофиль.ВремяОжидания = Константы.ВремяОжиданияСервера.Получить(); Почта = Новый ИнтернетПочта(); Попытка Почта.Подключиться(ПочтовыйПрофиль); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! Обмен не выполнен! " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; Иначе Почта = Новый Почта(); Попытка Почта.Подключиться(); Исключение Сообщить("" + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; КонецЕсли; //Далее выбираем все узлы из плана обмена, за исключением текущего, //у которых установлен реквизит ВыполнятьОбмен. ВыборкаУзлов = ПланыОбмена.РаспределеннаяБаза.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл Если Не ВыборкаУзлов.ВыполнятьОбмен Тогда Продолжить; КонецЕсли; Если ВыборкаУзлов.Ссылка = ПланыОбмена.РаспределеннаяБаза.ЭтотУзел() Тогда Продолжить; КонецЕсли; ЭлектронныйАдрес = СокрЛП(ВыборкаУзлов.ЭлектронныйАдрес); Если ЭлектронныйАдрес = "" Тогда Продолжить; КонецЕсли; //С помощью объектов ЗаписьXML и ЗаписьСообщения выполняем запись изменений //для выбранного узла в xml-файл. Узел = ВыборкаУзлов.Ссылка; ЗаписьXML = Новый ЗаписьXML(); ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_ " + СокрЛП(ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код) + "_ " + СокрЛП(Узел.Код) + ".xml "; ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел); ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения); ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); //Затем создаем новое письмо, прикрепляем к нему полученный xml-файл и //отправляем по адресу, указанному в реквизите ЭлектронныйАдрес узла. Файл = Новый Файл(ИмяФайлаСообщения); ТемаСообщения = "1С:Обмен " + СокрЛП(ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код) + "_ " + СокрЛП(Узел.Код); Если ИспользоватьSMTP Тогда ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; ПочтовоеСообщение.Тема = ТемаСообщения; ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаСообщения, Файл.Имя); ПочтовоеСообщение.Получатели.Добавить(ЭлектронныйАдрес); Почта.Послать(ПочтовоеСообщение); Иначе ПочтовоеСообщение = Новый ПочтовоеСообщение; ПочтовоеСообщение.Тема = ТемаСообщения; ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаСообщения); ПочтовоеСообщение.Получатели.Добавить(ЭлектронныйАдрес); Почта.Послать(ПочтовоеСообщение, Ложь); КонецЕсли; Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда Сообщить("ОБМЕН: Сообщение обмена для узла " + Узел.Наименование + " отправлено! ", СтатусСообщения.Информация); КонецЕсли; УдалитьФайлы(ИмяФайлаСообщения); КонецЦикла; Почта.Отключиться(); КонецПроцедуры

Рекомендую в интерфейс добавить дополнительную панель, на одну из кнопок которой повесить вызов этой
процедуры. Теперь осталось запустить Предприятие, настроить электронный адрес периферийной ИБ,
поставить галку "Выполнять обмен", нажать на кнопку процедуры на панели и бежать получать почту для
указанного эл. адреса. Должно придти письмо с темой "1С:Обмен AA_BB" и вложенным файлом
"Message_AA_BB.xml".

Итак, половина дела сделана: мы научили "восьмерку" отправлять сообщения обмена РБД по электронной
почте.

Шаг 3. Получение обновлений по электронной почте и запись их в ИБ

Теперь займемся обратной процедурой: получение обновлений по электронной почте и запись их в ИБ.

В параметры сеанса добавим параметр "ИдетОбменРаспределеннойБазы" типа Булево. Ниже я объясню его
назначение.

Добавим в общий модуль рбРаспределеннаяБаза такую процедуру:

Процедура рбПолучитьСообщенияОбмена() Экспорт ИспользоватьSMTP = Константы.ИспользоватьОбменПоSMTP.Получить(); //так же, как в процедуре рбОтправитьСообщенияОбмена(), сначала создаем объект Почта Если ИспользоватьSMTP Тогда ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль; ПочтовыйПрофиль.АдресСервераPOP3 = Константы.АдресСервераPOP3Обмена.Получить(); ПочтовыйПрофиль.ПортPOP3 = Константы.ПортСервераPOP3Обмена.Получить(); ПочтовыйПрофиль.Пользователь = Константы.ПользовательСервераPOP3Обмена.Получить(); ПочтовыйПрофиль.Пароль = Константы.ПарольПользователяPOP3Обмена.Получить(); ПочтовыйПрофиль.ВремяОжидания = Константы.ВремяОжиданияСервера.Получить(); Почта = Новый ИнтернетПочта(); Попытка Почта.Подключиться(ПочтовыйПрофиль); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! |Обмен не выполнен! ", СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; Иначе Почта = Новый Почта(); Попытка Почта.Подключиться(); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю пользователя! |Обмен не выполнен! ", СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; КонецЕсли; МассивСообщений = Новый Массив; Если ИспользоватьSMTP Тогда ВсеСообщения = Почта.Выбрать(Ложь); Иначе ВсеСообщения = Почта.Выбрать(Ложь, Ложь); КонецЕсли; //Отбираем среди всех писем те, которые имеют тему "1С:Обмен". //Маленькое, но важное замечание: //считаем, что все полученные письма с темой "1С:Обмен" предназначены //именно для текущего узла, //т.е. что у разных узлов в плане обмена РАЗНЫЕ электронные адреса. Для Каждого Сообщение Из ВсеСообщения Цикл Если Лев(Сообщение.Тема, 8 ) <> "1С:Обмен " Тогда Продолжить; КонецЕсли; Попытка МассивСообщений.Добавить(Сообщение); //Вложение письма сохраняем на диске. //Аккуратную проверку вложения оставим пока "за кадром." Вложение = Сообщение.Вложения; ИмяФайлаСообщения = КаталогВременныхФайлов() + Вложение.Name; ДанныеОбмена = Вложение.Данные; ДанныеОбмена.Записать(ИмяФайлаСообщения); //С помощью объектов ЧтениеXML и ЧтениеСообщения читаем данные //обновления из сохраненного файла. Перед записью обновлений в ИБ //устанавливаем параметр сеанса ИдетОбменРаспределеннойБазы в Истина. //Затем читаем изменения в ИБ: ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения). //Попутно сохраняем сообщения в массиве, чтобы потом их все сразу удалить. ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения); ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеXML); ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина; ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда Сообщить("ОБМЕН: Данные обмена приняты ",СтатусСообщения.Информация); КонецЕсли; Исключение Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; //После того, как чтение данных обмена закончено, возвращаем //параметру сеанса ИдетОбменРаспределеннойБазы значение Ложь. ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь; Попытка УдалитьФайлы(ИмяФайлаСообщения); Исключение //если не получилось, ну и ладно КонецПопытки; КонецЦикла; Если ИспользоватьSMTP Тогда Почта.УдалитьСообщения(МассивСообщений); КонецЕсли; Почта.Отключиться(); КонецПроцедуры

Теперь про то, для чего нужен параметр сеанса ИдетОбменРаспределеннойБазы.
Дело в том, что при чтении данных методом ПланыОбмена.ПрочитатьИзменения() происходит вызов
процедур-обработчиков события ПередЗаписью() изменяемых/добавляемых объектов. И если при записи
какого-либо объекта в процедуре обработчике параметр Отказ будет установлен в значение Истина, то
при выполнении ПланыОбмена.ПрочитатьИзменения() возникнет исключение, и, соответственно, обмен
выполнен не будет. Значение параметра сеанса ИдетОбменРаспределеннойБазы может быть
проанализированно в процедурах-обработчиках, дабы избежать подобной ситуации.
С выходом редакции 12 (хотя я могу ошибаться в версиях), актуальность этого метода несколько
устарелаА, поскольку у объектов появилось свойство ПараметрыОбмена , у которого, в свою . Это свойство принимает значение Истина, когда идет
сохранение данных через план обмена.

Теперь в интерфейсе на нашей панели добавляем еще одну кнопку, на которую вешаем вызов этой
процедуры. Запускаем Предприятие и наслаждаемся.
Почти все сделано, осталась малость: заставить наши процедуры выполняться в автоматическом режиме.
Шаг 4. Настройка автоматического обмена

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

Добавим константу ИнтервалАвтообменаРаспределеннойБазы типа Число(5,0).

В настройки пользователя добавим параметр ВыполнятьОбменРаспределенныхБаз. Для конфигурации
"Управление торговлей" это делается так:

* В план видов характеристик "НастройкиПользователей" добавим предопределенную
характеристику ВыполнятьОбменРаспределенныхБаз типа Булево.
* В форме элемента справочника "Пользователи" настраиваем изменение этого параметра (как это
сделать можно посмотреть в модуле формы, по аналогии с остальными параметрами).

В модуль рбРаспределеннаяБаза добавляем процедуру:

Процедура рбВыполнитьОбмен(прПользователь) Экспорт Если нпПолучитьЗначениеПоУмолчанию(прПользователь, "") Тогда рбПолучитьСообщенияОбмена(); рбОтправитьСообщенияОбмена(); КонецЕсли; КонецПроцедуры

в модуль приложения:

Процедура ПроверитьПодключениеАвтообмена() Экспорт Если нпПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ВыполнятьОбменРаспределенныхБаз ") И Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить() > 0 Тогда ПодключитьОбработчикОжидания("ВыполнитьАвтообмен ", Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить()); Иначе ОтключитьОбработчикОжидания("ВыполнитьАвтообмен "); КонецЕсли; КонецПроцедуры Процедура ВыполнитьАвтообмен() Экспорт рбВыполнитьОбмен(глТекущийПользователь); ОтключитьОбработчикОжидания("ВыполнитьАвтообмен "); Если нпПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ВыполнятьОбменРаспределенныхБаз ") И Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить() > 0 Тогда ПодключитьОбработчикОжидания("ВыполнитьАвтообмен ", Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить()); КонецЕсли; КонецПроцедуры Процедура ОтключитьАвтообмен() Экспорт ОтключитьОбработчикОжидания("ВыполнитьАвтообмен "); КонецПроцедуры

в процедуру ПриНачалеРаботыСистемы() модуля приложения добавим такие строки:

(после подключения торгового оборудования)
...
ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь; ПроверитьПодключениеАвтообмена();

Добавим на нашу панель еще пару кнопок для управления процессом: на одну вешаем процедуру
ПроверитьПодключениеАвтообмена(), на другую - ОтключитьАвтообмен()

Запускаем предприятие, настраиваем свойства пользователя и интервал автообмена и все!

Теперь при заходе в базу под этим-самым-настроенным пользователем будет запускаться обработчик
ожидания ВыполнитьАвтообмен(). Естественно, в периферийной базе тоже нужно настроить пользователя
для обмена.

Еще одно маленькое, но важное замечание:

Во всей, созданной нами прелести, присутствует одна неприятность: изменение конфигурации. При
получении периферийной базой сообщения, в котором будут содержаться изменения конфигурации, оно
будет принято, но возникнет исключительная ситуация. При этом измененная конфигурация будет
загружена. Для обновления конфигурации БД необходимо выгнать всех пользователей, зайти в
конфигуратор и выполнить обновление конфигурации БД (перед этим неплохо сделать выгрузку данных). К
сожалению, это неизбежное зло. Можно немного облегчить себе жизнь, написав коротенький bat-файл
примерно такого содержания:

1cv8.exe CONFIG /F<путь к ИБ> /N<Пользователь> /P<Пароль> /UpdateIBCfg

И еще одно замечание:

К сожалению, xml-файлы не отличаются компактностью, но, к счастью, прекрасно сжимаются. Можно в
процедуры отправки и получения сообщений добавить упаковку-распаковку файлов. COLOR="#666666">Делать это можно либо внешним архиватором, либо используя ВК, например Wheel.AddIn
(http://1c.proclub.ru/modules/mydownloads/personal.php?cid=81&lid=2714) .
С выходом 10 (кажется) редакции, предыдущее предложение несколько устарело, поскольку в платформу
были встроенны средства сжатия файлов по алгоритму ZIP. Т.е. теперь есть возможность сжимать файлы
без использования ВК.

Отправить эту статью на мою почту

Основные причины потребности внедрения обмена между базами 1С - это наличие филиалов и разделение видов учета, т.к. зачастую компании работают в нескольких информационных базах. Настройка обмена 1С 8.3 позволяет исключить ведение двойной работы – ввода одних и тех же документов и справочников в двух программах, а так же оперативно поставлять нужные объекты системы для различных филиалов и отделов.

В случае, когда нужно осуществлять обмен между филиалами, используется РИБ (Распределенная информационная база). Это механизм обмена между идентичными конфигурациями. Он представляем собой дерево, сверху которой находится самый главный корневой узел, ниже пары связанных между собой узлов. Вносить изменения можно в любом узле этой системы, и они будут переданы другим связанным узлам. Выполняется так же распространение не только данных, но и изменений конфигурации от корневого узла к подчиненным.

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

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

Реализацию обмена данными на предприятии можно представить в виде последовательных процедур.

В первую очередь следует определить между какими базами должен быть обмен; будет это двусторонний или односторонний обмен; если односторонний, то какая база будет передавать информацию, а какая только получать; если это сложная филиальная сеть, то надо прописать схему построения баз.

Затем выбираем подходящий формат: РИБ, универсальный формат; обмен по правилам обмена; обмен без правил обмена.

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

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

И в заключении прописывается расписание периодичности обмена

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

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

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

Ниже приведем подробный пример настройки обмена 1С 8.3 в одностороннем порядке между типовыми конфигурациями Управление торговлей 11 (УТ) и Бухгалтерия предприятия 3.0 (БП). Пример актуален для многих компаний ведущих оптовую и розничную торговлю. В УТ ведется управленческий учет, в БП - регламентированный, обмен необходим для облегчения работы пользователей.

Такой алгоритм подходят и для других типовых конфигураций на платформе 1С 8.3

В первую очередь проведем подготовительную работу для приемника информации, т.е. для БП. Запускаем программу в режиме Предприятие. Надо установить константу Синхронизация данных (раздел Администрирование → Синхронизация данных).

Обратите внимание на поле Префикс, здесь требуется указать значение, которое позволит впоследствии различить (по значению кода справочника или номеру документа) в какой программе изначально были созданы объекты. В нашем примере подойдет обычное сокращение – БП и УТ, если настройка обмена 1С 8.3 выполняется для сложного обмена между большим количеством баз, а так же одинаковых конфигураций потребуется ввести каждой базе свое понятное обозначение.

Так как БП является только приемником информации, переходим к настройке УТ.

Здесь, так же как и в БП требуется включить синхронизацию и указать префикс. Доступны эти сведения в разделе НСИ и администрирование → Настройки синхронизации данных.

Выбираем способ настройки Указать настройки вручную. Далее.

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

Система проверит правильность указанных данных и в случае положительного результата выведет окно настройки обмена 1С 8.3.

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

Внесенные правила записываем и закрываем.

Так как в примере речь идет об односторонней передачи информации, то в следующем окне настроек для получения данных из другой программы следует установить значения Не отправлять. Записать и закрыть. Далее.

Теперь надо проверить введенные параметры и если они верны нажать Далее, в противном случае вернуться к предыдущему шагу нажав Назад.

Затем будет предложено провести синхронизацию. Жмем Готово.

При необходимости выполнить соотнесение одинаковых объекты двух конфигураций откроется окно для сопоставления данных. Выполняем сопоставление и жмем Далее.

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

После выполнения синхронизации будет выведено окно с подтверждением успешного завершения этого процесса.

Здесь же по команде Настроить или после, в сценарии синхронизации можно настроить расписание автоматического выполнения обмена.

Возможны различные ситуации, когда нужно добавить в типовую конфигурацию новый план обмена. Например:

  • Нужно настроить обмен стандартными средствами с конфигурацией, с которой нет типового обмена.
  • Есть несколько информационных баз с одинаковыми конфигурациями, нужно настроить с ними обмен по разным правилам. А как известно, обмен с продуктами на платформе 8.2 не позволяет загружать разные правила для разных узлов.

Как добавить новый план обмена с продуктами на платформе 1С:Предприятие 8.2 (с поддержкой библиотеки стандартных подсистем 2.0/3.0)

Рассмотрим эту процедуру на примере интеграции нескольких национальных Бухгалтерий (российской, украинской и казахстанской) с конфигурацией Финансист, разработанной компанией WiseAdvise .

Добавлением новых планов обмена мы будем решать сразу 2 проблемы:

  1. В типовых Бухгалтериях вообще нет плана обмена для конфигурации Финансист (хорошо, что этот план обмена идет в самой поставке Финансиста).
  2. Версии Бухгалтерий для России, Украины и Казахстана отличаются достаточно существенно, следовательно должны быть разные правила обмена под каждую из Бухгалтерий. А так как одному плану обмена можно задать только одни правила, то придется делать несколько планов обмена под каждую из национальных Бухгалтерий. Можно, конечно, изменить конфигурацию Финансиста таким образом, чтобы дать возможность загружать свои правила для каждого узла в одном плане обмена, но это, на мой взгляд, будет несколько сложнее само по себе и, к тому же, осложнит дальнейшие обновления конфигурации.

Итак, алгоритм действий:

На этом добавление плана обмена завершено. При переходе в режим 1С:Предприятие и настройке обмена данными в списке доступных планов должен появится добавленный нами план.

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