Интеграция 1С с интернет-магазинами — одна из наиболее частых прикладных задач. Часто возникает необходимость передавать данные напрямую из документов учетной системы (например, номенклатуру, цены, остатки из документа реализации или установки цен) во внешнюю систему через предоставленный сайтом веб-сервис. Разберем по шагам, как устроена архитектура такого взаимодействия, какие объекты платформы 1С используются для SOAP- и REST-сервисов, как правильно сформировать выборку данных и избежать зависаний интерфейса при вызове методов сервиса.
Перед тем как приступать к написанию кода в 1С, выясним тип протокола, по которому работает API интернет-магазина:
WS-ссылки, а также объекты WSОпределения и WSПрокси. Обмен данными строится на структурированных пакетах XML и типах XDTO.HTTPСоединение и HTTPЗапрос.Рассмотрим, как извлечь необходимые для выгрузки данные из табличной части документа. Для этого воспользуемся языком запросов 1С, отобрав нужный состав полей: номенклатуру, количество и сумму.
Посмотрим на пример запроса к документу реализации:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Ссылка КАК Документ,
| РеализацияТоваровУслугТовары.Номенклатура.Наименование КАК Наименование,
| РеализацияТоваровУслугТовары.Номенклатура.Артикул КАК Артикул,
| РеализацияТоваровУслугТовары.Количество КАК Количество,
| РеализацияТоваровУслугТовары.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &ТекущийДокумент";
Запрос.УстановитьПараметр("ТекущийДокумент", ДокументСсылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если в конфигурацию уже добавлена WS-ссылка (импортирована WSDL-схема сервиса сайта), подключение к сервису выполняется через генерацию прокси-объекта.
Разберем пример создания прокси и вызова операции сервиса:
// Создание WS-прокси на основе статической ссылки
Прокси = WSСсылки.WSСсылка1.СоздатьWSПрокси("http://site.ru/ws", "IrtService", "WS_IServiceSoap");
Прокси.Пользователь = "ЛогинAPI";
Прокси.Пароль = "ПарольAPI";
Пока Выборка.Следующий() Цикл
// Вызов удаленного метода для каждого товара
Ответ = Прокси.GetProductCountInName(Выборка.Наименование, Выборка.Количество);
Сообщить("Результат отправки по товару " + Выборка.Наименование + ": " + Строка(Ответ));
КонецЦикла;
Важно: Использование статических WS-ссылок имеет существенное ограничение. Если структура WSDL, методы или адреса на стороне интернет-магазина изменяются, в 1С требуется повторно обновлять схему через конфигуратор. Кроме того, статические ссылки жестко привязаны к конфигурации и усложняют переключение между тестовым и рабочим серверами.
Более гибким и надежным подходом является создание динамического подключения во время выполнения программы. В этом случае адрес WSDL и таймауты можно хранить в константах или настройках пользователя.
Рассмотрим пример создания динамического соединения с передачей учетных данных и параметров таймаута:
АдресWSDL = "https://site.ru/ws/service.wsdl";
Логин = "api_user";
Пароль = "secret_pass";
Таймаут = 30; // таймаут в секундах
// Настройка защищенного соединения для протокола HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Инициализация WSDL-определений
Определения = Новый WSОпределения(АдресWSDL, Логин, Пароль, , Таймаут, ЗащищенноеСоединение);
URIПространстваИмен = Определения.Сервисы[0].URIПространстваИмен;
ИмяСервиса = Определения.Сервисы[0].Имя;
ИмяТочкиПодключения = Определения.Сервисы[0].ТочкиПодключения[0].Имя;
// Создание динамического WS-прокси
Прокси = Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения, , Таймаут, ЗащищенноеСоединение);
Прокси.Пользователь = Логин;
Прокси.Пароль = Пароль;
Пока Выборка.Следующий() Цикл
Попытка
Результат = Прокси.UpdateProduct(Выборка.Артикул, Выборка.Количество, Выборка.Сумма);
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Часто веб-сервисы сайтов принимают не скалярные параметры (строка, число), а сложные составные структуры данных XML-схемы. В таком случае передача простых переменных вызовет ошибку сериализации.
Проанализируем, как создавать составные объекты через фабрику XDTO:
// Получение фабрики типов из определений или прокси
Фабрика = Прокси.ФабрикаXDTO;
// Определение типа объекта из схемы сервиса
ТипТовара = Фабрика.Тип(URIПространстваИмен, "ProductItem");
// Создание объекта XDTO и заполнение его свойств
ОбъектТовар = Фабрика.Создать(ТипТовара);
ОбъектТовар.Article = Выборка.Артикул;
ОбъектТовар.Name = Выборка.Наименование;
ОбъектТовар.Quantity = Выборка.Количество;
ОбъектТовар.Price = Выборка.Сумма;
// Передача готового XDTO-объекта в метод сервиса
Ответ = Прокси.SaveProductData(ОбъектТовар);
При тестировании выгрузки разработчики часто сталкиваются с ситуацией, когда обработка бесконечно ожидает ответа, блокируя интерфейс программы. Выясним основные причины такого поведения:
WSОпределения, WSПрокси или HTTPСоединение.Прокси.Пользователь и Прокси.Пароль постфактум может не сработать для первичного WSDL-запроса. Передавайте логин и пароль непосредственно в параметры конструкторов.ЗащищенноеСоединениеOpenSSL может завершиться сбоем или зависанием на этапе проверки SSL-рукопожатия.ФоновыеЗадания.Выполнить(), предварительно регистрируя измененные документы в планах обмена или служебных регистрах сведений.