Содержание:
2. Общая схема интеграций
3. Основные способы соединения с ИБ 1С для обмена данными
4. Схема интеграции систем: этапы обмена данными в синхронных вызовах
5. Реальные схемы интеграции: синхронные и асинхронные подходы в бизнес-обменах
6. Пример реализации файлового обмена
7. Примеры реализации WEB и HTTP обменов
8. Примеры процедур интеграции данных через WEB сервис и HTTP сервис в 1С: Предприятие
9. Универсальная структура обмена данными: подходы, нюансы и сравнение методов
1. Использование интеграций в 1С: Предприятие
Практически в любой информационной системе (ИС) появляется необходимость в получении или отправке данных из/в другие ИС.
Например:
· Коммерческим или бухгалтерским ИС необходимо получать ежедневные данные о курсах валют.
· Бухгалтерским системам необходимо отправлять в банк/получать из банка платежные документы.
· Данные по расчету заработной платы необходимо передавать в бухгалтерскую систему.
· Бизнес-партнерам необходимо обмениваться торговыми документами.
· Организациям необходимо отправлять отчетность в налоговую службу.
· И так далее…
2. Общая схема интеграций
Общая схема интеграций
На рисунке выше упрощенно показаны уровни интеграции. Давайте рассмотрим их с точки зрения этой статьи:
1. Система [N] – это информационная система, в моем примере это 1С: УТ и 1С: УНФ
2. Уровень адаптеров – это процедуры, преобразующие данные системы в формат обмена и полученную информацию из формата обмена в данные системы.
3. Транспортный уровень – это физическая среда для передачи данных. В наших примерах это файлы на диске или интернет для WEB сервиса и HTTP сервиса.
3. Основные способы соединения с ИБ 1С для обмена данными
· COM-соединение: Технология для Windows-систем, позволяющая внешним приложениям напрямую обращаться к объектам 1С и использовать её бизнес-логику.
Самый старый способ, ненадежный и медленный, не рекомендую использовать.
· Веб-сервисы и HTTP-сервисы: Современный способ, использующий протоколы HTTP для передачи данных в реальном времени, как правило, по интернет-соединению или локальной сети.
Наиболее часто используемый вариант, удобный и гибкий. Данные обрабатываются при отправке сервером, программно могут быть реализованы любые ограничения на состав отправляемых данных.
· OData: Протокол для запросов и обновления данных через HTTP-команды, позволяющий 1С выступать в роли поставщика данных.
Метод удобен для получения данных из таблиц 1С. Данные не обрабатываются при отправке сервером и их состав определяется настройками интерфейса OData и правами подключившегося пользователя.
4. Схема интеграции систем: этапы обмена данными в синхронных вызовах
Схема реализованных в данном примере интеграций
Для простоты реализации наши примеры были реализованы как синхронные вызовы. Это означает, что операция отправки/получения данных происходит в одной транзакции (за исключением файлового варианта).
Этапы обмена данными:
1. Система 1 подготавливает данные
2. Система 1 производит соединение с Системой 2 (за исключением файлового варианта)
3. Система 1 отправляет данные
4. Система 2 получает, обрабатывает, загружает данные
5. Система 2 отправляет ответ о получении данных (за исключением файлового варианта)
6. Система 1 разрывает соединение с Системой 2 (за исключением файлового варианта)
5. Реальные схемы интеграции: синхронные и асинхронные подходы в бизнес-обменах
В нагруженных системах вам придется использовать асинхронные схемы, где кроме отправки и получения будут выделены этапы обработки данных. Остановимся на этом подробнее.
В нашем примере обработка данных занимала небольшое время, и мы могли позволить сеансу связи ждать ответ от принимающей стороны о результате загрузки.
Но в реальных обменах подготовка, обработка и загрузка данных могут быть длительными процессами и WEB-сервер, обеспечивающий соединение не сможет ожидать окончания процесса обмена.
Так же, в бизнес-процессе обмена могут присутствовать многочисленные операции по передаче данных и необходимо обеспечить освобождение ресурсов WEB-сервера как можно быстрее.
В таких случаях, используют методику, в которой производится быстрая передача данных, принимающая система сразу выдает предварительный ответ о принятии данных и соединение закрывается. И уже на следующем этапе (или этапах) система производит обработку и загрузку полученных данных.
Для обеспечения такого обмена необходимо обеспечить быстрый временный буфер для хранения полученных данных и отдельный функционал оповещения второй системы о результатах загрузки полученных данных.
Схемы, реализуемые в реальных интеграциях
По сути, необходимо создать не один, а, по сути, два обмена со своими этапами:
1. Обмен 1
· Система 1 подготавливает данные
· Система 1 производит соединение с Системой 2
· Система 1 отправляет данные
· Система 2 получает данные и отправляет ответ о получении данных
· Система 2 разрывает соединение с Системой 1
· Система 2 записывает данные в буфер
· Система 2 обрабатывает и записывает данные из буфера
· Система 2 запоминает результат загрузки данных
2. Обмен 2
· Система 1 периодически опрашивает Систему 2 о результате загрузки
· Система 2 выдает ответ «обработка в процессе»
· После окончания загрузки Система 2 выдает ответ «загрузка успешна» или «ошибка загрузки»
· Далее, Система 1 производит действия, предусмотренные процессом обмена
Аналогично отправке данных, процесс получения данных из сервиса тоже может быть асинхронным, в случае, когда серверу необходимо время для подготовки выгружаемых данных. Для такого случая простейшая схема обмена будет выглядеть так:
3. Обмен 1
· Система 1 производит соединение с Системой 2
· Система 1 отправляет запрос на выгрузку данных
· Система 2 выдает ответ «запрос принят»
· Система 1 разрывает соединение с Системой 2
· Система 2 формирует данные
· Система 2 записывает данные в буфер отправки
4. Обмен 2
· Система 1 периодически опрашивает Систему 2 о готовности выгрузки
· Система 2 выдает ответ «обработка в процессе»
· После окончания выгрузки данных в буфер Система 2 выдает ответ «выгрузка подготовлена» или «ошибка выгрузки»
5. Обмен 3
· Система 1 при получении ответа «выгрузка подготовлена» запрашивает данные
· Система 2 отправляет подготовленные данные
· Система 1 разрывает соединение с Системой 2
Во всех приведенных схемах не предусмотрены операции обработки возможных ошибок формирования, обработки и передачи данных, в реальных системах вам придется разрабатывать такие операции обработки ошибок.
6. Пример реализации файлового обмена
Файловый обмен
Т.к. при обмене не используются функции API, обмен является асинхронным. Для простоты реализации обмен результатами загрузки не реализован.
Вариантом файлового обмена является обмен через FTP каталог, в 1С даже функции получения файлов из папки на диске и FTP каталога очень похожи.
&НаСервере
Процедура ПолучитьЧерезФайлНаСервере()
// получим все файлы из папки обмена
// для получения файлов из папки FTP можно использовать
// метод объекта FTPСоединение.НайтиФайлы(<Путь>, <Маска>, <ИскатьВПодкаталогах>)
МассивФайлов = НайтиФайлы("D:\1cTemplates\DemoWebinar", "*.cln");
Для Каждого Файл Из МассивФайлов Цикл
// читам содержание файла
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя);
Текст = ЧтениеТекста.Прочитать();
// если в файле есть данные - запишем
Если Текст <> Неопределено Тогда
Ответ = срв_Интеграции.ЗаписатьДанные(Текст);
// здесь надо сделать обработку ответа
// например, записать результат в лог интеграции
// мы просто выведем в область сообщений
Сообщить("Результат загрузки файла <" + Файл.Имя + "> :" + Символы.ПС + Ответ.Текст);
// отпустим захваченный файл
ЧтениеТекста.Закрыть();
// проверим результат записи,
// если успешно - файл можно удалить,
// чтобы не мешал при следующей загрузке
Если Ответ.Статус Тогда
// удаление файла рискованная операция с точки зрения операционной системы
// здесь большая вероятность получить ошибку
// поэтому надо делать обработку изключения
Попытка
УдалитьФайлы(Файл.ПолноеИмя);
Исключение
// удаление файла не критичная для загрузки операция
// поэтому просто выводим сообщение в лог интеграции
// в случае критичной ошибки вам надо будет
// выполнять более сложные операции
Сообщить("Ошибка при удалении файла <" + Файл.Имя + "> :" + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
7. Примеры реализации WEB и HTTP обменов
Реализация WEB и HTTP обменов
На рисунке показана общая схема подключения как для WEB, так и для HTTP сервисов.
В примере оба варианта реализованы как синхронные, но любой из них можно сделать асинхронным.
Обычно, WEB сервисы работаю синхронно, а HTTP сервисы более подходят для асинхронного обмена.
8. Примеры процедур интеграции данных через WEB сервис и HTTP сервис в 1С: Предприятие
Пример процедуры получения данных из файла:
&НаСервере
Функция ОтправитьЧерезWebНаСервере()
// получить данные для отправки
ИД = Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧДЦ=0; ЧГ=");
Данные = Новый Структура("ИД,Сообщение", ИД, Сообщение);
//преобразовать в строку JSON
Текст = ДанныеВJSON(Данные);
// создать подключение к серверу
Прокси = ПолучитьПрокси();
// выполнить метод сервера для отправки данных
Ответ = Прокси.WriteData(Текст);
Возврат Ответ;
КонецФункции
Функция WriteData(Message)
// загрузить данные и получить ответ для отправки
Данные = срв_Интеграции.ЗаписатьДанные(Message);
// преобразовать в строку
Текст = срв_Интеграции.ДанныеВJSON(Данные);
Возврат Текст;
КонецФункции
Также в приведенном коде виден фрагмент по реализации подключения к сервису
&НаКлиенте
Процедура ОтправитьЧерезHTTP(Команда)
Если ЗначениеЗаполнено(Сообщение) Тогда
// если сервис использует параметры
// подготавливаем параметры запроса
ПараметрыЗапроса = Новый Структура;
//ПараметрыЗапроса.Вставить("Параметр1", ЗначениеПараметра);
// получить данные для отправки
ИД = Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧДЦ=0; ЧГ=");
Данные = Новый Структура("ИД,Сообщение", ИД, Сообщение);
//преобразовать в строку JSON
Текст = ДанныеВJSON(Данные);
АдресСервиса = "http://148.251.120.70:80@Administrator:12345/rpirmuhamedov_ut_demo/hs/HTTPServiceDemo";
// выполнить запрос к серверу
Метод = Новый Структура("ИмяМетода,HTTPМетод,Данные", "WriteData", "PUT", Текст);
Результат = клн_КлиентHTTP.ВыполнитьЗапрос(АдресСервиса, Метод, ПараметрыЗапроса);
// при успехе - обработать результат
// при ошибке - вывести сообщение
Если Результат.Успешно Тогда
// восстановить данные из текста
Данные = ДанныеИзJSON(Результат.Ответ);
Если ТипЗнч(Данные) = Тип("Соответствие") Тогда
Сообщить(Данные.Получить("Текст"));
Иначе
Сообщить(Данные.Текст);
КонецЕсли;
Иначе
Сообщить(Результат.ТекстОшибки);
КонецЕсли;
Иначе
Сообщить("Нечего отправлять");
КонецЕсли;
КонецПроцедуры
Функция WriteData(Message)
// получить данные из запроса
Данные = Message.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
Попытка
// запишем данные
Результат = срв_Интеграции.ЗаписатьДанные(Данные);
// создать ответа с кодом 200 - все хорошо
Ответ = Новый HTTPСервисОтвет(200);
// расскажем клиентам в каком формате мы отправляем данные
Ответ.Заголовки.Вставить("Content-Type", "text/json");
// преобразовать в строку
Текст = срв_Интеграции.ДанныеВJSON(Результат);
// поместить данные в тело запроса
Ответ.УстановитьТелоИзСтроки(Текст);
Исключение
Ответ = Новый HTTPСервисОтвет(501);
// расскажем клиентам в каком формате мы отправляем данные
Ответ.Заголовки.Вставить("Content-Type", "text");
// поместить данные в тело запроса
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
Функция ПрочитатьДанные() Экспорт
// запрос выбирает все данные из регистра
// в реальной интеграции надо использовать
// обор по входящим параметрам
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| срв_ПримерДляИнтеграции.ИД КАК ИД,
| срв_ПримерДляИнтеграции.Дата КАК Дата,
| срв_ПримерДляИнтеграции.Сообщение КАК Сообщение
|ИЗ
| РегистрСведений.срв_ПримерДляИнтеграции КАК срв_ПримерДляИнтеграции
|
|УПОРЯДОЧИТЬ ПО
| Дата";
РезультатЗапроса = Запрос.Выполнить();
// получим результат в виде таблицы значений
ТаблицаСообщений = РезультатЗапроса.Выгрузить();
// для преобразования в строку надо преобразовать
// сложный тип данных "ТаблицаЗначений" в простой тип данных "Массив"
МассивЗначений = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаСообщений);
Возврат МассивЗначений;
КонецФункции
Функция ЗаписатьДанные(Message) Экспорт
Ответ = Новый Структура("Статус,Текст", Истина, "Все хорошо");
Попытка
// подготовим данные
Сообщение = ДанныеИзJSON(Message);
Менеджер = РегистрыСведений.срв_ПримерДляИнтеграции.СоздатьМенеджерЗаписи();
// заполним данные регистра
// при работе с JSON возможны различные распознавания данных
Если ТипЗнч(Сообщение) = Тип("Соответствие") Тогда
Менеджер.ИД = Сообщение.Получить("ИД");
Менеджер.Сообщение = Сообщение.Получить("Сообщение");
Иначе
ЗаполнитьЗначенияСвойств(Менеджер, Сообщение);
КонецЕсли;
Менеджер.Дата = ТекущаяДата();
//проверим, может быть данные уже есть в регистре?
Менеджер.Прочитать();
// если данных нет - запишем в регистр
Если Не Менеджер.Выбран() Тогда
// после операции чтения менеджер может быть очищен
// перед записью надо заполнить снова
Если ТипЗнч(Сообщение) = Тип("Соответствие") Тогда
Менеджер.ИД = Сообщение.Получить("ИД");
Менеджер.Сообщение = Сообщение.Получить("Сообщение");
Иначе
ЗаполнитьЗначенияСвойств(Менеджер, Сообщение);
КонецЕсли;
Менеджер.Дата = ТекущаяДата();
Менеджер.Записать(Истина);
КонецЕсли;
Исключение
// в случае ошибки - вернем статус
// для дальнейшей обработки
Ответ.Статус = Ложь;
Ответ.Текст = ОписаниеОшибки();
КонецПопытки;
Возврат Ответ;
КонецФункции
9. Универсальная структура обмена данными: подходы, нюансы и сравнение методов
Общий для всех вариантов обмена функционал был вынесен в отдельный модуль.
Обратите внимание, что схемы построения всех вариантов обмена имеют общую структуру:
1. Подготовка данных
2. Подключение к среде отмена
3. Передача данных
4. Получение ответа
Однако, в конкретных реализациях я сделал небольшие отличия в коде, чтобы показать возможность применения различных подходов к структурированию кода.
В примерах нет обработок возможных ошибок (кроме пары не критичных примеров), не учитывается ролевая модель доступа к данным (подключение делает пользователь с полными правами).
По моему опыту, проще всего реализуется файловый/FTP обмен (если не считать дополнительного обмена статусами выполнения операций), затем WEB и сложнее всего HTTP обмен.
Тем не менее, HTTP обмен — это самая новая и рекомендуемая к использованию методика от 1С.
Специалист компании ООО "Кодерлайн"
Рустам Пирмухамедов




