Что было в начале:
- Десяток различных баз с разными конфигурациями. Базы менялись данными. Было около 20 различных комбинаций баз в обменах
- Конфигурацию "Конвертация данных 2" для настройки правил обмена между ними.
- Полу-ручной процесс контроля за проведением синхронизаций. Было расширение модуля обработки КонвертацияОбъектовИнформационныхБаз, которое отсылало письмо в случае сбоя при обмене. Но это не всегда работало и не во всех базах было сделано. Поэтому приходилось периодически заглядывать в каждую базу и проверять синхронизацию. Что и надоело.
Что было сделано:
- Было проведено исследование баз. Выяснилось, что так как большая часть из них была сделана на БСП, то они содержали ВЕБ-сервис, который позволял запускать синхронизацию данных. В остальные БСП была внедрена.
- Было решено сделать единый центр, который бы контролировал все обмены между базами. За основу была взята конфигурация "Конвертация данных 2". В нее были включены нужные для работы автоматической синхронизации объекты.
Как это работает:
- У вас должны быть базы для обмена.
- Базы должны быть опубликованы на Веб-сервере. Должен быть опубликован сервис Exchange_2_0_1_6. Через него осуществляется обмен данными.
- Серверы 1С должны уметь работать с СОМ-контроллером comcntr.dll. Через него осуществляется обновление правил обмена.
- Надо создать правила обмена. Эта часть работы Конвертации данных не изменилась – смотрите документацию. Если правила уже есть, то необходимо их загрузить в Конвертацию.
В любом случае далее я предполагаю, что Синхронизация данных (хотя бы через Сетевой каталог, а лучше в Прямом подключении) уже выполняется. Эта конфигурация для контроля этого процесса.
Внимание! В обработчики конвертаций «Перед выгрузкой данных» и «После загрузки данных» должны быть добавлены строки кода (см. ниже).
- Надо описать базы обмена. Это делается в справочнике «(МАС) Информационные базы».
- Конфигурация – какая конфигурация используется.
- Строка соединения – строка соединения с БД. Берется из 1С-стартера.
- Строка соединение WSDL – строка соединения с ВЕБ-публикацией сервиса Exchange_2_0_1_6, включая параметр WSDL.
- Пользователь – пользователь 1С базы. Я обычно даю таким пользователям полные права.
- Пароль – пароль пользователя 1С.
- Код узла общий – код узла синхронизации в базе. Он же «префикс информационной базы». Можно посмотреть на настройках синхронизации:
- Надо описать какие правила обмена (конвертации) и регистрации используются. Это делается в справочнике «(МАС) Пакеты правил обмена».
- Конвертация – какие правила обмена используются при обмене из базы-А в базу-Б.
- Обратная конвертация - какие правила обмена используются при обмене из базы-Б в базу-А.
- Правила регистрации – какие правила регистрации используются для плана обмена в базе-А.
- Обратные правила регистрации - какие правила регистрации используются для плана обмена в базе-Б. - Надо описать работу для обмена. Это делается в справочнике «(МАС) Настройки обмена».
- База-источник и База-приемник – описания баз которые обмениваются данными. Постфикс «источник» и «приемник» в названии полей условны. Происходит полный обмен данными между базами (см ниже).
- Пакет правил – описание правил обмена.
- Отдельный код узла источника, Отдельный код узла приемника – заполняется, если при настройки синхронизации в момент описания узлов ввели коды узлов, отличных от префикса ИБ (лучше так не делать…)
- Не сохранять данные обмена – не используется.
В случае необходимости можно задать расписание обмена данных.
Разделение справочников «Пакеты обмена» и «Настройки обмена» обусловлена тем, что у меня есть несколько разных баз у которых конфигурация одинаковая. Т.е. можно на один пакет правил повесить несколько настроек обменов разных баз. - Проверяем настройки:
- В настройке пакета данных нажимаем «Создать новый пакет». Создается новые правила обмена между узлами.
- Записываем элемент.
- Нажимаем «Обновить правила обмена». Произойдет обновление правил обмена в базах, связанных с обменом. О результатах этой работы можно судить по логу, который выдается после окончания работы процедуры:
Правильный результат - должна быть строка «Правила установлены!». Если ее нет, значит произошли ошибки…
Наиболее частая ошибка на этом шаге – сервер 1С не может работать через COM-контроллером comcntr.dll. Вторая ошибка – коды узлов синхронизации данных отличны от заданных в настройках ИБ или настроек обмена. - В настройках обмена нажимаем «Запустить обмен». Запустится процедура обмена, о результатах которой можно судить по логу, который выдается после окончания работы процедуры.
- Обработка ошибок обмена. В случае неудачного обмена данными формируется информационное письмо и отправляется оператору, который следит за обменами. Настройки почтовой отправки находятся в константах Конвертации.
Используемая процедура обмена:
- При запуске процедуры происходит проверка доступности веб-сервисов Exchange_2_0_1_6. Если они не доступны, то процедура прерывается.
- Базе источнику по веб-сервису дается команда на создание файла выгрузки данных. Этот файл (точнее его содержимое) является результатом выполнения команды. Если возникла ошибка, то обмен прерывается, и мы смотрим файл лога.
- Базе приемнику по веб-сервису дается команда принять файл данных (из источника). Если возникла ошибка, то обмен прерывается, и мы смотрим файл лога.
- Базе приемнику по веб-сервису дается команда на создание файла выгрузки данных. Если возникла ошибка, то обмен прерывается, и мы смотрим файл лога.
- Базе источнику по веб-сервису дается команда принять файл данных (из приемника). Если возникла ошибка, то обмен прерывается, и мы смотрим файл лога.
- В файл лога добавляются данных о сообщениях при обмене.
- После обмена (не важно с ошибками или без) лог-файл сохраняется в регистре (МАС) Пакеты обмена.
Обработка результатов обмена
При обработке результатов обмена используются лог-файл, который генерируется в процессе обмена данными. При получении данных из базы к данному логу добавляется сообщения 1С, которые выходят клиенту обмена. Для того, чтобы наладить трансфер этих сообщений между базами и базой Конвертация существует каталог, куда сохраняются эти сообщения. Каталог настраивается в константе «(МАС) Каталог логов обмена» Конвертации. Каталог должен оканчиваться на «\» (обратный слеш)!
Об общих результатах работы можно судить, просто посмотрев данные регистра «(МАС) пакеты обмена»:
Красные – прерванные по каким-то причинам обмены.
Желтые – в результате приема данных вышли предупреждения.
Доработка правил обмена.
В обработчике «Перед выгрузкой данных» можно (по желанию) добавить программный код
//ЮМС++ для шины данных
текСеанс = НомерСеансаИнформационнойБазы();
сеансыИБ = ПолучитьСеансыИнформационнойБазы();
Для Каждого сеансИБ Из сеансыИБ Цикл
Если сеансИБ.НомерСеанса = текСеанс Тогда
чНомерСоединения = сеансИБ.НомерСоединения;
Прервать;
КонецЕсли;
КонецЦикла;
_соединенияИБ = ПолучитьСоединенияИнформационнойБазы();
Для Каждого _соединениеИБ Из _соединенияИБ Цикл
Если _соединениеИБ.НомерСоединения = чНомерСоединения Тогда
Если _соединениеИБ.ApplicationName = "COMConnection" Тогда
ВызватьИсключение("Данный обмен можно запускать только из базы Srvr=""srvr-68"";Ref=""conversion2"";");
КонецЕсли;
КонецЕсли;
КонецЦикла;
//ЮМС--
Данный код не позволяет выполнять синхронизацию через Прямое подключение. Это не обязательный код, но во время переходного периода он сохранил мне много нервных клеток.
В обработчике «После загрузки данных» НУЖНО добавить следующий код:
//ЮМС++ Для шины данных
Лог = Новый ТекстовыйДокумент();
//чтение соообщений
мсСообщения = ПолучитьСообщенияПользователю();
Лог.ДобавитьСтроку(">>>>>>>>>>>>>>>>>>> Сообщения пользователю");
Для каждого сообщение Из мсСообщения Цикл
Лог.ДобавитьСтроку(сообщение.Текст);
КонецЦикла;
Лог.ДобавитьСтроку("<<<<<<<<<<<<<<<<<<< Сообщения пользователю");
//чтение ошибок и предупреждений из журнала регистрации
Лог.ДобавитьСтроку(строка(ТекущаяДата())+": Получение данных сеансов");
чНомерСеанса = НомерСеансаИнформационнойБазы();
текСеанс = Неопределено;
мсСеансы = ПолучитьСеансыИнформационнойБазы();
Для каждого сеанс Из мсСеансы Цикл
Если сеанс.НомерСеанса = чНомерСеанса Тогда
текСеанс = сеанс;
Прервать;
КонецЕсли;
КонецЦикла;
Если текСеанс<>Неопределено Тогда
Лог.ДобавитьСтроку(строка(ТекущаяДата())+": Получение данных журнала регистрации");
тз = Новый ТаблицаЗначений();
стОтбор = Новый Структура();
стОтбор.Вставить("ДатаНачала", текСеанс.НачалоСеанса);
стОтбор.Вставить("Сеанс", текСеанс.НомерСеанса);
ВыгрузитьЖурналРегистрации(тз, стОтбор);
Лог.ДобавитьСтроку(строка(ТекущаяДата())+": Обработка данных журнала регистрации");
Лог.ДобавитьСтроку(">>>>>>>>>>>>>>>>>>> Журнал регистрации");
Для каждого стртз Из тз Цикл
Если стртз.Уровень = УровеньЖурналаРегистрации.Ошибка Тогда
Лог.ДобавитьСтроку("Ошибка! "+стртз.Дата+"; "+стртз.Событие+"; "+стртз.Комментарий);
ИначеЕсли стртз.Уровень = УровеньЖурналаРегистрации.Предупреждение Тогда
Лог.ДобавитьСтроку("Предупреждение! "+стртз.Дата+"; "+стртз.Событие+"; "+стртз.Комментарий);
КонецЕсли;
КонецЦикла;
Лог.ДобавитьСтроку("<<<<<<<<<<<<<<<<<<< Журнал регистрации");
Иначе
Лог.ДобавитьСтроку("Ошибка! Сеанса не найден (номер "+чНомерСеанса+")! Данные журнала регистрации не получены!");
КонецЕсли;
имяИБ = ВРЕГ(НСтр(СтрокаСоединенияИнформационнойБазы(), "Ref"));
имяФайла = "\\192.168.90.25\ExchangeLogs\"+Конвертация.Ид+"_"+имяИБ+".txt";
Лог.Записать(имяФайла);
//ЮМС--
Данный программный код собирает сообщения пользователю и ошибки и предупреждения в Журнале регистрации, которые могли быть выданы при приеме данных.
Путь «\\192.168.90.25\ExchangeLogs\» нужно поменять на путь, который указан в константе «(МАС) Каталог логов обмена»