0. linkov 222 26.10.16 12:48 Сейчас в теме

Обмен данными онлайн через Веб-сервис с использованием обработки "Универсальный обмен данными XML"

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

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. TODD22 17 31.10.16 14:04 Сейчас в теме
А какой объём данных можно передать за одно подключение?
У меня бывает пакеты по 30-40 Мб. На плохих каналах связи не всегда через ftp удаётся передать такой объём.
2. linkov 222 31.10.16 14:47 Сейчас в теме
(1) TODD22,

А какой объём данных можно передать за одно подключение?
У меня бывает пакеты по 30-40 Мб. На плохих каналах связи не всегда через ftp удаётся передать такой объём.

В представленной публикации алгоритм реализован именно для минимизации размера передаваемых данных через Веб-сервис.
Для этого:
- В одном пакете передается только один объект (элемент справочника или документ)
- Для документов в правилах конвертации отключена выгрузка объектов по ссылкам. Эта настройка существенно уменьшает размер передаваемых данных, исключая их избыточность. В случае необходимости, если подчиненный объект все же отсутствует в базе приемнике, то автоматически рекурсивно запускается его выгрузка в новых пакетах.
В итоге максимальный размер одного пакета в реальной схеме при синхронизации УПП 1.3 - УТ 10.3 для документа Поступление товаров и услуг (в среднем 10-20 строчек в табличной части) не превышает 0.5 Мб.

При стандартной установке для IIS максимальный размер обрабатываемого сообщения ~30 МБ

Если в Вашей схеме вес одного пакета зашкаливает за 30 Мб., то тогда Вам в помощь эта публикация: Передача больших пакетов через веб-сервисы
3. artbear 1124 02.11.16 20:13 Сейчас в теме
4. rash7wolf 05.11.16 20:08 Сейчас в теме
Приобрел оба файла. не жалею. все работает. спасибо ,нужная вещь . советую
5. a_titeev 9 09.12.16 10:46 Сейчас в теме
Зачем сервис для этого? Какие задачи это решает?
6. linkov 222 09.12.16 13:21 Сейчас в теме
(5)

Зачем сервис для этого? Какие задачи это решает?

Можно организовать онлайн обмен и без Веб-сервиса (в некоторых случаях), например используя COM-объект.
Здесь можно отметить преимущества и недостатки синхронизации через Веб-сервис в отличии от COM-объекта:

Недостатки COM-объекта:
1. Подключиться к базе через COM-объект вне локальной сети невозможно (хотя, если извратиться, то можно, но в любом случае, это вызовет хождение колоссального трафика). Через Веб-сервис можно легко обмениваться данными через интернет. В этом случае для безопасности необходимо подключаться используя SSL.

2. COM-объект - тяжелая штука. Ресурсы жрет немерено. Если у Вас работает несколько сотрудников, то скорее Вы этого не ощутите, а вот если 100-200 и все начнут что-то онлайн синхронить....

3. Для запуска COM-объекта требуется некоторое время.

4. Для COM-объекта обязательным условием для подключения является точное соответствие версии платформы базы Источника и базы Приемника. То есть, если Ваши базы находятся на разных серверах, обновление платформы 1С на обоих серверах необходимо производить одновременно!

Недостатки Веб-сервиса:
1. Стартует Веб-сервис быстро, даже при холодном старте, но пропускная способность http оставляет желать лучшего.

2. К недостаткам Веб-сервиса так же можно отнести необходимость заботиться о размере передаваемых данных, при стандартной настройке Веб-сервера IIS размер одного пакета данных не должен превышать 30Мб.
7. Ксакеп 58 20.01.17 10:54 Сейчас в теме
Разрабатываю похожий сервис, но несколько иного характера. Нет необходимости синхронизации "на лету". Столкнулся с проблемой подключения к веб-сервису с использованием шифрования. На клиенте все хорошо, 1с видит сертификат, считает ресурс надежным. На сервере же что только не перепробовал - "Удаленный узел не прошел проверку" и все. Хоть убей. Платформа 8.3.9.1818.

- добавлял сертификат в cacert.pem
- добавлял сертификат в доверенный центры
- подсовывал файл сертификата в ЗащищенноеСоединениеOpenSSL
- отключал проверку сертификата в ЗащищенноеСоединениеOpenSSL

Если зайти на сервер, открыть браузер, перейти по ссылке веб-сервиса, то браузер покажет что узел надежный.
8. linkov 222 20.01.17 12:04 Сейчас в теме
(7) Возможно при выпуске клиентского сертификата вы не указали политику применения - подтверждать подлинность клиента.
Если Вам не нужна проверка подлинности клиента, то в настройках Веб-сервера укажите - сертификат клиента игнорировать.
9. Ксакеп 58 20.01.17 12:29 Сейчас в теме
(8) я не выпускал клиентский сертификат. Был создан самоподписанный сертификат для сервера, и добавлен в системный список доверенных центров сертификации. И проблема именно в том, что сервер 1С не видит, что этот сертификат в доверенных, и, соответственно, не может доверять узлу, на котором расположен web-сервис.
10. linkov 222 20.01.17 13:00 Сейчас в теме
я не выпускал клиентский сертификат. Был создан самоподписанный сертификат для сервера, и добавлен в системный список доверенных центров сертификации. И проблема именно в том, что сервер 1С не видит, что этот сертификат в доверенных, и, соответственно, не может доверять узлу, на котором расположен web-сервис.

В моем случае все работало с использованием следующего кода, но сертификат был не самоподписанный:
ssl = Новый ЗащищенноеСоединениеOpenSSL();  
HTTPСоединение = Новый HTTPСоединение("gateway.*****.ru",, Логин, Пароль, ,, ssl);
HTTPЗапрос = Новый HTTPЗапрос("/base/hs/Exchange/info");
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
11. Ксакеп 58 20.01.17 13:51 Сейчас в теме
(10) Если сертификат имеет подпись поверенного центра сертификации, строка: "ssl = Новый ЗащищенноеСоединениеOpenSSL()" вообще не требуется.

Кстати, по заявлению 1С, в 8.3.9 внесенго исправление, согласно которому, если ЗащищенноеСоединениеOpenSSL создать без указания хранилища серверных сертификатов, то проверка сертификата вообще не должна выполнятся. Однако выполняется.
12. linkov 222 20.01.17 13:54 Сейчас в теме
Не помню на какой версии платформы, это было в 2015 году, но только так и работало.
Возможно с тех пор все поменялось...
Ксакеп; +1 Ответить
13. murenysh 15 02.03.18 10:34 Сейчас в теме
Можно ли настроить обмен, чтобы опубликовать только одну базу?
14. linkov 222 02.03.18 10:49 Сейчас в теме
Можно, соответственно, данные будут синхронизироваться только в одну сторону.
15. murenysh 15 02.03.18 19:50 Сейчас в теме
но подтверждение о доставке тогда не будет работать.
Наемному бухгалтеру на компьютере ведь не будешь веб-сервер устанавливать.
Придется мучить стандартный Прочий обмен данными и обмен через ftp.
16. linkov 222 02.03.18 23:21 Сейчас в теме
(15)
но подтверждение о доставке тогда не будет работать.

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

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

Для Вашего случая можно предложить переделать алгоритм следующим образом:
На веб-сервере публикуем только базу-источник.
В этом случае периферийная база должна выступать в роли инициатора обмена,
То есть, по инициативе пользователя или по регл.заданию выполняется запрос в базу-источник,
в ответ на который сервер должен передать данные очередного объекта.
Объект записывается в текущей базе, на сервер передается квитанция об успешности записи
и запрашивается очередной объект. До тех пор, пока сервер не ответит, что все объекты синхронизированы.
Этот вариант можно реализовать самостоятельно, используя те же методы получения данных объекта в формате XML
и обратного преобразования, описанных в публикации.
Не забудьте проконтролировать "фиктивные ссылки" и дополнительно запросить их данные с сервера.
17. murenysh 15 18.03.18 00:17 Сейчас в теме
К сожалению не смог применить к своей задаче данную разработку.
1. Если не выгружать подчиненные по ссылке, то база-приемник запросит недостающие объекты, но в будущем, если в источнике изменят например номенклатуру, то изменения не попадут в приемник.

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

Еще в коде непонятно, чем отличается
ОбъектРегистрации = Новый УдалениеОбъекта(Источник.Ссылка);
ПланыОбмена.ЗарегистрироватьИзменения(ТекущийУзел, ОбъектРегистрации);


от
ПланыОбмена.ЗарегистрироватьИзменения(ТекущийУзел, Источник.Ссылка);


ведь в первом случае все равно регистрируется просто ссылка из УдалениеОбъекта

"Но с данным кодом возникнет следующая проблема – при наличии строки Удаление.Записать(); будет удален объект в текущей базе (а это не нужно). При отсутствии строки Удаление.Записать(); в удаленной базе данные останутся, то есть задача не будет решена."
https://infostart.ru/public/188547/
18. linkov 222 19.03.18 21:29 Сейчас в теме
(17)
1. Если не выгружать подчиненные по ссылке, то база-приемник запросит недостающие объекты, но в будущем, если в источнике изменят например номенклатуру, то изменения не попадут в приемник.

Смотри внимательнее подписки:
Источник - СправочникОбъект, ДокументОбъект
то есть, при изменении Номенклатуры, так же запуститься синхронизация и данный элемент будет синхронизирован!

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

В данных алгоритмах целенаправленно была реализована выборочная регистрация измененных объектов в плане обмена только при интерактивной записи (по условиям задания).
В Вашем же случае все гораздо проще: убираем соответствующие подписки для регистрации объектов, активируем автоматическую регистрацию в плане обмена типовыми средствами, а после загрузки данных с сайта вызываем синхронизацию процедурой:
ЛУ_СинхронизацияВызовСервера.ПланОбменаСинхронизироватьАсинхронно(ПланОбменаМетаданные.Имя);
либо вешаем этот метод на регламентное задание с нужной периодичностью.

3. Еще в коде непонятно, чем отличается ... от ... ведь в первом случае все равно регистрируется просто ссылка из УдалениеОбъекта

Опять, читаем код более внимательно:
Объект УдалениеОбъекта в данном случае нужен исключительно для того, чтобы далее, при чтении изменений из плана обмена для отправки в кор. базу отличать измененные объекты от удаленных,
соответственно массив удаленных объектов отправляется в кор.базу собственным методом,
см.
Если ТипЗнч(Объект) = Тип("УдалениеОбъекта") Тогда
				МассивУдаляемыхОбъектов.Добавить(Объект);


Далее:
ВыгрузитьУдаляемыеОбъектыВБазуПриемник(ТекущийУзел, МассивУдаляемыхОбъектов, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала, Отказ);


Ну, и на стороне базы приемника:
Функция DeleteObject(TypeOf, UUID, ErrorMessage)
19. murenysh 15 20.03.18 01:39 Сейчас в теме
Если ТипЗнч(Объект) = Тип("УдалениеОбъекта") Тогда
                МассивУдаляемыхОбъектов.Добавить(Объект);

В этом коде МассивУдаляемыхОбъектов будет всегда пустым, так как УдалениеОбъекта без выполненного метода Записать попадает в УзелОбмена как ссылка на измененный объект, а не как объект УдалениеОбъекта.


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


Смотри внимательнее подписки:

Опять, читаем код более внимательно:

Лучше без этого
20. linkov 222 20.03.18 13:22 Сейчас в теме
(19)
Лучше без этого

- Согласен, действительно получилось не очень корректно.
Исправлюсь)

В этом коде МассивУдаляемыхОбъектов будет всегда пустым, так как УдалениеОбъекта без выполненного метода Записать попадает в УзелОбмена как ссылка на измененный объект, а не как объект УдалениеОбъекта.

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

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

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

во втором случае (при выгрузке по ссылкам) каждый раз при выгрузке документа вместе с ним выгружаются все подчиненные справочники.
21. murenysh 15 22.03.18 11:45 Сейчас в теме
(20)
Это достигается тем, что соответствующий участок кода выполняется асинхронно в фоновом задании, которое стартует с некоторой задержкой, после того, как отработает подписка ПередУдалением и транзакция удаления объекта уже завершилась.

Интересная комбинация. Протестировать затратно по времени, но раз работает, то работает.


(20)
во втором случае (при выгрузке по ссылкам) каждый раз при выгрузке документа вместе с ним выгружаются все подчиненные справочники.

Я предполагал третий вариант. Первичная выгрузка документов делается с выгрузкой подчиненных объектов по ссылкам, потом выгрузка подчиненных по ссылкам у документов отключается и подчиненные выгружаются только при их изменении и попадании в регистрацию узла обмена.
В таком случае и файл обмена небольшой и дополнительный механизм фиктивных ссылок не нужен.
22. xan333 37 26.04.18 16:31 Сейчас в теме
Добрый день! 12. Инструкция по внедрению Расширения конфигурации (ОбменДаннымиОнлайнЧерезВебСервис.cfe)
(в процессе, будет чуть позже) есть где то? Не хочется снимать конфигурацию с поддержки.
23. demart-omsk 17 23.06.18 00:32 Сейчас в теме
Спасибо, пригодилось! Все отлично работает.
24. mars207 27 25.07.18 16:56 Сейчас в теме
Все работает, большое спасибо!!!
25. Synoecium 620 24.02.19 21:00 Сейчас в теме
статья отличная, только пришлось хорошо допилить план обмена, чтобы взлетело на УФ. Плюс еще ошибка была с реквизитом "ЭтотУзел", не знаю в какой версии его убрали, но у меня на платформе в режиме совместимости 8.3.10 и 8.2.13 такая ошибка есть. Делал обмен ДО 2.1->УПП 1.3.115
Если возникнет такая ошибка, можно воткнуть перед использованием реквизита "ЭтотУзел" такой код:
ссылкаЭтотУзел = ПланыОбмена.ЛУ_WebСервис.ЭтотУзел();
ЭтотУзел = (Ссылка = ссылкаЭтотУзел);
26. linkov 222 24.02.19 21:20 Сейчас в теме
(25)
еще ошибка была с реквизитом "ЭтотУзел", не знаю в какой версии его убрали, но у меня на платформе в режиме совместимости 8.3.10 и 8.2.13 такая ошибка есть.

- Спасибо, буду иметь ввиду!
27. RBA1972 21.05.19 17:03 Сейчас в теме
Сергей, спасибо за публикацию! Где можно увидеть 12. Инструкция по внедрению Расширения конфигурации (ОбменДаннымиОнлайнЧерезВебСервис.cfe)?
29. linkov 222 21.05.19 20:46 Сейчас в теме
(27)

Сергей, спасибо за публикацию! Где можно увидеть 12. Инструкция по внедрению Расширения конфигурации (ОбменДаннымиОнлайнЧерезВебСервис.cfe)?

Инструкцию по внедрению расширения не писал. Здесь никаких особенностей нет. Нужно добавить в список расширений и прямо в коде исправить настройки на свои.
28. RBA1972 21.05.19 17:04 Сейчас в теме
Напишите в личку, пожалуйста.
30. RBA1972 22.05.19 09:20 Сейчас в теме
Сергей, а можно ли с вами связаться через альтернативные способы связи? Ответьте пожалуйста в личку, спасибо!
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата до 120 000 руб.
Полный день

Работа от Инфостарт
Санкт-Петербург
Временный (на проект)

Руководитель отдела внедрения 1С
Новосибирск
зарплата от 60 000 руб. до 160 000 руб.
Полный день

Ведущий программист 1С
Сочи
зарплата от 82 500 руб. до 99 000 руб.
Полный день