Приветствую вас, друзья! Сегодня я хочу поделиться с вами опытом работы с WS (Web-Servis).
Для работы веб-сервиса должен быть установлен Apache, либо iis.
Для примера, выгрузим таблицу остатков.
1. Создаем Web -Service в удаленной базе , и назовем его "ObmenWS".
2. После этого необходимо заполнить свойства Web -Сервиса, (Вкладка "Прочее"):
1) URL Пространства имен - Требуется для идентификации веб-сервиса, по сочетанию его имени и пространству имен, укажем для примера "1.1.1.1";
2) Пакеты XDTO - это механизм, разработанный фирмой “1С” для обмена данными с другими программными системами посредством XML, позволяющий на уровне языка 1С оперировать не узлами XML, а прикладными понятиями “Сотрудник”, “Счет” и привычными встроенными типами (“ТаблицаЗначений”, “СправочникСсылка” и т.п.). В данном примере не будем создавать собственные пакеты, а будем использовать встроенные пакеты 1С (а именно - "http://v8.1c.ru/8.1/data/core"). Данный пакет содержит формат "Двоичные данные" - что поможет нам передавать любые типы через хранилище данных.
3) Имя файла публикации - название файла *.1CWS, имя файла публикации может быть любым, но желательно латинским шрифтом и обязательно с расширением 1cws и желательно должно совпадать с именем каталога на web-сервере. Назовем его как и наш WS - "ObmenWS".
Наш Web Сервис готов к работе! Осталось добавить операции в WS для загрузки и выгрузки данных.
2. Создаем операцию с названием "ОстаткиТоваровНаСкладах", и с типом значение -ХранилищеДанных (ValueStorage):
Создаем параметры для нашей операции. Для примера я создам 3 параметра :
1) НачалоПериода - с типом Дата (Date);
2) КонецПериода - с типом Дата (Date);
3) Склад - С типом Строка (String);
Количество параметров не ограничено, можно создавать сколько необходимо для конкретной задачи (Добавить Организацию например или контрагента и тд.)
После добавления параметров, приступаем к добавлению программного кода к нашей операции "ОстаткиТоваровНаСкладах". Нажимаем в свойствах операции на "ИмяПроцедуры" и открываем модуль WS.
Необходимые данные мы получим запросом, и программный код будет иметь следующий вид:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Наименование КАК НоменклатураНаименование,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Запись, , Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты";
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию(Склад,истина));
ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
Хранилище = новый ХранилищеЗначения(ТаблицаРезультата);
Возврат Хранилище;
На этом наш Web Сервис готов! Публикуем наш web сервис и можно подключаться к нему из другой базы.
3. Пример подключения из другой базы для получения остатков за период по определенному складу:
1) Создаем внешнюю обработку, в модуле обработки прописываем следующий код:
Процедура ПолучитьТаблицуСДругойБазы()
НачалоПериода = ТекущаяДата();
КонецПериода = ДобавитьМесяц(ТекущаяДата(),-3); //3 месяца назад
Склад = "Основной склад";
Таблица = ПолучениеДанных(НачПериод,КонПериод,Склад); //Первый вариант,
//Если операций станет много, что бы не писать для каждую операцию свою функцию можно создать одну универсальную
Таблица = ПолучениеДанныхОптимизированно("ОстаткиТоваровНаСкладах",НачПериод,КонПериод,Склад); //Второй вариант - оптимизированно!)
КонецПроцедуры
Функция ПодключениеКWS()
МестоположениеWSDL = "http://localhost/ObmenWS/ws/ObmenWS.1cws?wsdl" ; //localhost - указываем ваш ip-адрес, где опубликован ws
ИмяПользователя = "Администратор";
Пароль= "Пароль";
URIПространстваИменСервиса = "1.1.1.1 ";
ИмяСервиса= "ObmenWS";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
ВСОпределение = Новый WSОпределения(МестоположениеWSDL, ИмяПользователя, Пароль,,,ЗащищенноеСоединение);
ВСПрокси = Новый WSПрокси(ВСОпределение,URIПространстваИменСервиса , ИмяСервиса,ИмяСервиса+"Soap" );
ВСПрокси.Пользователь = ИмяПользователя;
ВСПрокси.Пароль = Пароль;
Возврат ВСПрокси;
КонецФункции
Функция ПолучениеДанныхОптимизированно(ИмяФункцииWS, П1 = Неопределено,
П2 = Неопределено,
П3 = Неопределено,
П4 = Неопределено,
П5 = Неопределено,
П6 = Неопределено,
П7 = Неопределено,
П8 = Неопределено)
Подключение = ПодключениеКWS();
Данные = Вычислить("Подключение."+ИмяФункцииWS+"("+?(П1=Неопределено,"","П1")
+?(П2=Неопределено,"",",П2")
+?(П3=Неопределено,"",",П3")
+?(П4=Неопределено,"",",П4")
+?(П5=Неопределено,"",",П5")
+?(П6=Неопределено,"",",П6")
+?(П7=Неопределено,"",",П7")
+?(П8=Неопределено,"",",П8") + ")");
Ответ = Данные;
Возврат Ответ;
КонецФункции
Функция ПолучениеДанных(НачПериод,КонПериод,Склад)
Подключение = ПодключениеКWS();
Хранилище = Подключение.ОстаткиТоваровНаСкладах(НачПериод,КонПериод,Склад);
Таблица = Хранилище.Получить();
Возврат Таблица;
КонецФункции
На этом всё, Спасибо за внимание!
Открыт для критики и наиболее изящных методов ! (=