From e4ca93623aca27b9b7f9bc29e7270455b48a53ad Mon Sep 17 00:00:00 2001 From: ZheLeZ0 Date: Thu, 22 Dec 2022 10:02:14 +0900 Subject: [PATCH] 123 --- HTTPServices.cfe | Bin 0 -> 35395 bytes .../ОплатаСчетовПокупателями.xml | 105 +++ .../Catalogs/ВидыСостоянийДокументов.xml | 34 + .../Catalogs/ДоговорыКонтрагентов.xml | 34 + src/HTTPServices/Catalogs/КонтактныеЛица.xml | 34 + src/HTTPServices/Catalogs/Контрагенты.xml | 95 +++ .../CommonModules/HS_ОбработкаМетодовHTTP.xml | 23 + .../HS_ОбработкаМетодовHTTP/Ext/Module.bsl | 240 ++++++ .../HS_ОбработкаУниверсальныхМетодов.xml | 23 + .../Ext/Module.bsl | 795 ++++++++++++++++++ .../HS_ОбщиеПроцедурыИФункции.xml | 23 + .../HS_ОбщиеПроцедурыИФункции/Ext/Module.bsl | 375 +++++++++ src/HTTPServices/ConfigDumpInfo.xml | 57 ++ src/HTTPServices/Configuration.xml | 83 ++ .../ВладелецСостоянияДокумента.xml | 17 + src/HTTPServices/Documents/ЗаказКлиента.xml | 48 ++ src/HTTPServices/Documents/Заявка.xml | 35 + .../Documents/СчетНаОплатуПокупателю.xml | 60 ++ .../Enums/ЮридическоеФизическоеЛицо.xml | 45 + src/HTTPServices/HTTPServices/HS_CSM_API.xml | 49 ++ .../HTTPServices/HS_CSM_API/Ext/Module.bsl | 30 + .../HS_ПолучитьКонтрагентаПоИНН.xml | 49 ++ .../Ext/Module.bsl | 30 + .../СостоянияДокументов.xml | 84 ++ src/HTTPServices/Languages/Русский.xml | 13 + 25 files changed, 2381 insertions(+) create mode 100644 HTTPServices.cfe create mode 100644 src/HTTPServices/AccumulationRegisters/ОплатаСчетовПокупателями.xml create mode 100644 src/HTTPServices/Catalogs/ВидыСостоянийДокументов.xml create mode 100644 src/HTTPServices/Catalogs/ДоговорыКонтрагентов.xml create mode 100644 src/HTTPServices/Catalogs/КонтактныеЛица.xml create mode 100644 src/HTTPServices/Catalogs/Контрагенты.xml create mode 100644 src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP.xml create mode 100644 src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP/Ext/Module.bsl create mode 100644 src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов.xml create mode 100644 src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов/Ext/Module.bsl create mode 100644 src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции.xml create mode 100644 src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции/Ext/Module.bsl create mode 100644 src/HTTPServices/ConfigDumpInfo.xml create mode 100644 src/HTTPServices/Configuration.xml create mode 100644 src/HTTPServices/DefinedTypes/ВладелецСостоянияДокумента.xml create mode 100644 src/HTTPServices/Documents/ЗаказКлиента.xml create mode 100644 src/HTTPServices/Documents/Заявка.xml create mode 100644 src/HTTPServices/Documents/СчетНаОплатуПокупателю.xml create mode 100644 src/HTTPServices/Enums/ЮридическоеФизическоеЛицо.xml create mode 100644 src/HTTPServices/HTTPServices/HS_CSM_API.xml create mode 100644 src/HTTPServices/HTTPServices/HS_CSM_API/Ext/Module.bsl create mode 100644 src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН.xml create mode 100644 src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН/Ext/Module.bsl create mode 100644 src/HTTPServices/InformationRegisters/СостоянияДокументов.xml create mode 100644 src/HTTPServices/Languages/Русский.xml diff --git a/HTTPServices.cfe b/HTTPServices.cfe new file mode 100644 index 0000000000000000000000000000000000000000..8832316a3f8fea9ab95fdb4ca8bf09d0b74143d5 GIT binary patch literal 35395 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 + + + + + 6c72f4be-3f13-45cb-94c8-5bfd2fc185c0 + 8c91e54e-dad6-4957-b03f-de41960d6ef8 + + + f5ce07e9-5f3f-404d-9eca-f255459af970 + 925c2f30-26f9-4155-a875-70467e093c4b + + + bdfd0f16-4493-4e55-b327-a8ed368c387e + 1263aace-04c6-4aa4-9336-c8047bb3d972 + + + a3f934fe-6f5f-4190-a22d-7ff79e952ed0 + 1e8d85f4-7778-4ac9-b5e6-ee1dd3aaad47 + + + 96a081b5-d915-4c71-af41-fd9c616eb857 + d5cee097-854c-43ec-bd0b-1883f39e20ff + + + 99eb7dea-f6e2-4a95-8456-89ff375ecb99 + e5d0b6b6-54b9-470b-805d-aeb15ed31ad7 + + + + ОплатаСчетовПокупателями + + Adopted + 8e90ac11-805d-438c-b32a-facebade49b7 + Turnovers + + + + + + Сумма + + Adopted + 13d2dd1d-c68f-4c24-9be4-f865d15c01d7 + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + + + Заявка + + Adopted + 00ef2eb1-460a-4797-895b-86e096fa1bc3 + + cfg:DocumentRef.Заявка + + + + + + + Счет + + Adopted + 7588f7db-3fe5-4ae7-8096-856b4cff78ee + + cfg:DocumentRef.СчетНаОплатуПокупателю + + + + + + + Контрагент + + Adopted + e8194c0b-3910-432e-a22e-ea01cbd572b4 + + cfg:CatalogRef.Контрагенты + + + + + + + Договор + + Adopted + 789600ae-6177-445e-a532-a8c442ef715d + + cfg:CatalogRef.ДоговорыКонтрагентов + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/Catalogs/ВидыСостоянийДокументов.xml b/src/HTTPServices/Catalogs/ВидыСостоянийДокументов.xml new file mode 100644 index 0000000..4830f60 --- /dev/null +++ b/src/HTTPServices/Catalogs/ВидыСостоянийДокументов.xml @@ -0,0 +1,34 @@ + + + + + + cb361177-b21c-4ab1-a6a5-9e3c8d1fd760 + 27a16c9e-fe03-46b0-be9b-106874ad49f8 + + + 0c3011a3-7912-436e-babc-d4425acd9579 + 6602194a-7535-4cef-ba7e-ef01d50eba1d + + + bb53fe48-9c2b-43a7-a999-a84e4ee6fc32 + ce5ac7d3-fea0-45cb-85c1-239d33419a8a + + + 9da09cf3-5f57-42fe-93b4-ef1c9317aeaf + 0986cc05-6272-4d22-9f7f-57b1e56576c2 + + + 3f5b7603-14c1-4c2f-9c89-95940f65405c + d000f8da-fbe1-4276-b359-d55c380eacf3 + + + + ВидыСостоянийДокументов + + Adopted + 2e8c8a8a-ddd2-448c-aa77-c03c0eeda546 + + + + \ No newline at end of file diff --git a/src/HTTPServices/Catalogs/ДоговорыКонтрагентов.xml b/src/HTTPServices/Catalogs/ДоговорыКонтрагентов.xml new file mode 100644 index 0000000..21fd431 --- /dev/null +++ b/src/HTTPServices/Catalogs/ДоговорыКонтрагентов.xml @@ -0,0 +1,34 @@ + + + + + + cf2c4510-e89b-4193-ab3f-8fd9ba5ae1ad + 358f946d-2059-4301-ae2c-8906e6d175b7 + + + dea403b5-3ed2-4b46-8747-283b13c4b694 + 5ea939cd-3090-4a75-a5fb-d3ff5b3ebd2a + + + 92ae3764-7183-4974-a28a-b84aae955db7 + 5f802291-9dec-4e4f-a529-71628530e9f4 + + + 2e5788f5-9e88-4a32-bab5-b3c43aecbe95 + 400f1893-6e0c-4413-a74c-1d1c7ad2af81 + + + d3231d83-a172-4eb5-8825-9e518def13d0 + b49bf44b-74ac-4255-9989-3765ed40a7bf + + + + ДоговорыКонтрагентов + + Adopted + b9e5871f-258c-4beb-bed7-481bf362ae45 + + + + \ No newline at end of file diff --git a/src/HTTPServices/Catalogs/КонтактныеЛица.xml b/src/HTTPServices/Catalogs/КонтактныеЛица.xml new file mode 100644 index 0000000..090d24e --- /dev/null +++ b/src/HTTPServices/Catalogs/КонтактныеЛица.xml @@ -0,0 +1,34 @@ + + + + + + b026c9a0-f67f-47b4-9c92-8b827c5308aa + 82fb1cc8-01fb-4f04-b306-c94e6eb1418b + + + c888905e-3760-4e0e-99d0-f762fbaa0254 + 8b17266c-b9d8-4747-adca-f346425150b9 + + + da2c622c-474f-49c9-9ded-8a585845df83 + cdab6d79-f3e9-4a49-8d8c-3eb3a634d983 + + + 857dde7c-9ed2-4d97-8f88-9c64425bdc6c + b0787fff-0f9d-429f-99d9-e2748b2e37bd + + + d4ab5202-fb9c-4160-bf07-16739d5ace22 + 815a8a3d-99eb-4208-8ce8-e1e41b6fcfc1 + + + + КонтактныеЛица + + Adopted + 2281dd81-7741-48df-8ab3-c7e314f7c359 + + + + \ No newline at end of file diff --git a/src/HTTPServices/Catalogs/Контрагенты.xml b/src/HTTPServices/Catalogs/Контрагенты.xml new file mode 100644 index 0000000..bdf4eb5 --- /dev/null +++ b/src/HTTPServices/Catalogs/Контрагенты.xml @@ -0,0 +1,95 @@ + + + + + + ff9c73e3-d721-4d68-b87d-0213ab967f8b + d7380155-7ff3-4d9c-87f1-c63579a7c459 + + + a9d72f83-9fde-46e7-8437-0b376ab0a30f + cefb908c-00f7-4d76-ab30-fb47e682b0b7 + + + 54bd62fb-6758-46c2-b0e2-3b4992b02c7f + 15678ab3-7f8a-423e-8732-6082ef2472e8 + + + b1a47bd2-953e-43f7-bc94-83dc42698758 + 528f9de9-4435-4cc5-954b-36a89d493eeb + + + cbf10534-d33c-4e9d-892b-2fc8c9e921e2 + 0eb500d1-518d-414a-9851-b585805f4d53 + + + + Контрагенты + + Adopted + 51b9a2d4-bd53-4f40-824e-e3b4e323279e + + + + + + НаименованиеСокращенное + + Adopted + 01f8d118-20c1-4624-bf18-f79cb42b3b76 + + xs:string + + 160 + Variable + + + + + + + + ИНН + + Adopted + 0cecf59e-c7cc-4803-a3fb-387554cb4307 + + xs:string + + 50 + Variable + + + + + + + + НаименованиеПолное + + Adopted + 128e969b-e420-4894-9c2e-e10e63963d75 + + xs:string + + 1000 + Variable + + + + + + + + ЮридическоеФизическоеЛицо + + Adopted + 56ba8e3c-152e-472e-978c-1c8a27110815 + + cfg:EnumRef.ЮридическоеФизическоеЛицо + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP.xml b/src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP.xml new file mode 100644 index 0000000..5460364 --- /dev/null +++ b/src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP.xml @@ -0,0 +1,23 @@ + + + + + HS_ОбработкаМетодовHTTP + + + ru + Обработка методов HTTP + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP/Ext/Module.bsl b/src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP/Ext/Module.bsl new file mode 100644 index 0000000..663c612 --- /dev/null +++ b/src/HTTPServices/CommonModules/HS_ОбработкаМетодовHTTP/Ext/Module.bsl @@ -0,0 +1,240 @@ +#Область МетодыPost + +//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc) +//Так и через внешнюю обработку +Функция HS_ОбработкаМетодовPOST(СтруктураВхПараметров) Экспорт + //структура ответа. Собственна нужна для формирования ответа + СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200); + + //Переправляем на нужный метод +#Область ПримерыЧасть3 +//Получаем список заданий за период (БСП) + Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров); +#КонецОбласти +//Получаем количество элементов + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров); + +//Порционно получаем элементы в формате JSON + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров); + + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("StatusDoc") Тогда + HS_ОбработкаУниверсальныхМетодов.ПолучитьДанныеПоСпискуНомеровДокументов(СтруктураОтвет,СтруктураВхПараметров); + ИначеЕсли Врег(СтруктураВхПараметров.ИмяМетода) = ВРег("ListZakazFromINN") Тогда + HS_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаказовПоИННКонтрагента(СтруктураОтвет,СтруктураВхПараметров); + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),ложь,""); + КонецЕсли; + + Возврат СтруктураОтвет; +КонецФункции + +#КонецОбласти + +#Область МетодыGet + +//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc) +//Так и через внешнюю обработку +Функция HS_ОбработкаМетодовGET(СтруктураВхПараметров) Экспорт + //структура ответа. Собственна нужна для формирования ответа + СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200); + + //Операцию нужно выполнить используя БСП:Базовая функциональность\Длительные операции++ +#Область ПримерыЧасть3 + ВФоне = СтруктураВхПараметров.ПараметрыЗапроса.Получить("BTask"); + Если не ВФоне = Неопределено Тогда + ВФоне = Булево(ВФоне); + Если ВФоне = Истина Тогда + УникальныйИдентификатор = Новый УникальныйИдентификатор; + + //Уникальный адрес результата + АдресРезультата = СтруктураВхПараметров.ИмяМетода+"_"+Строка(УникальныйИдентификатор); + + //Подгатавливаем параметры для Длительной операции + ПараметрыЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыЗапуска.НаименованиеФоновогоЗадания = "Выполнение_" + АдресРезультата; + ПараметрыЗапуска.ОжидатьЗавершение = Ложь; + ПараметрыЗапуска.КлючФоновогоЗадания = УникальныйИдентификатор; + ПараметрыЗапуска.ЗапуститьВФоне = Истина; + + //Добавляем адрес в структуру + СтруктураВхПараметров.Вставить("АдресРезультата",АдресРезультата); + + //Запускаем метод в фоне + РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне( + "HS_АсинхронныеОперации.ФЗ_ВыполнитьМетод_ДлительнаяОперация", + СтруктураВхПараметров, + ПараметрыЗапуска); + + //Проверяем что задание запустилось + Если РезультатФоновогоЗадания.Статус = "Ошибка" Тогда + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Ошибка при формировании: "+Строка(РезультатФоновогоЗадания.КраткоеПредставлениеОшибки),Ложь,""); + Возврат СтруктураОтвет; + КонецЕсли; + + ФоновоеЗаданиеИдентификатор = РезультатФоновогоЗадания.ИдентификаторЗадания; + + АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" + + "Result_Key=" + АдресРезультата + "&" + + "Task_Key=" + Строка(ФоновоеЗаданиеИдентификатор); + + //Формируем html ответ + СтруктураОтвет.ДанныеОтвета = " + | + | Задание отправлено на выполнение!
+ |

Идентификатор фонового задания = " + Строка(ФоновоеЗаданиеИдентификатор) + "
+ | Адрес хранилища результата = " + АдресРезультата + "

+ |

Ссылка на получение результата

+ | + |"; + + Возврат СтруктураОтвет; + КонецЕсли; + КонецЕсли; +#КонецОбласти + //Операцию нужно выполнить используя БСП:Базовая функциональность\Длительные операции-- + +#Область ПримерыЧасть1 + //Переправляем на нужный метод + Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Список") Тогда + + ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров); + + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Документ") Тогда + + ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров); + +#КонецОбласти +#Область ПримерыЧасть2 +//Получаем доступные остатки по складу в формате JSON (ERP, УТ, КА) + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ОстаткиИДоступностьТоваровПоСкладу") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров); +#КонецОбласти +#Область ПримерыЧасть3 +//Получаем список заданий за период (БСП) + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров); + +//Проверяем фоновое задание. Если Выполнено забираем результат + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ФоновоеЗаданиеПроверить") Тогда + + ПроверитьФоновоеЗадание(СтруктураОтвет,СтруктураВхПараметров); + +#КонецОбласти + +//Получаем количество элементов + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров); + +//Порционно получаем элементы в формате JSON + ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда + + HS_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров); + + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),Ложь,""); + КонецЕсли; + Возврат СтруктураОтвет; +КонецФункции + +#Область Методы +#Область ПримерыЧасть1 +Процедура ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров) + Результат = "Расходная накладная, 1, 01.01.2014 + |Расходная накладная, 2, 01.01.2014"; + СтруктураОтвет.ДанныеОтвета = Результат; +КонецПроцедуры + +Процедура ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров) + //ПраметрыЗапроса - number + ПарНомер = СтруктураВхПараметров.ПараметрыЗапроса.Получить("number"); + + Номер = Число(?(ПарНомер=Неопределено,0,ПарНомер)); + Если Номер > 2 Тогда + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует документ с номером: " + Номер,ложь,""); + Иначе + Если Номер = 1 Тогда + Результат = "Расходная накладная, 1, 01.01.2014"; + Иначе + Результат = "Расходная накладная, 2, 01.01.2014"; + КонецЕсли; + СтруктураОтвет.ДанныеОтвета = Результат; + КонецЕсли; +КонецПроцедуры +#КонецОбласти +#Область ПримерыЧасть3 +Процедура ПроверитьФоновоеЗадание(СтруктураОтвет,СтруктураВхПараметров) + перФоновоеЗаданиеИдентификатор = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Task_Key"); + АдресРезультата = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Result_Key"); + + //Проверяем фоновое задание + Если перФоновоеЗаданиеИдентификатор = Неопределено Тогда + Задание = HS_ОбщиеПроцедурыИФункции.НайтиЗадание(Неопределено); + Иначе + //Получаем Уникальный идентификатор задания + ФоновоеЗаданиеИдентификатор = Новый УникальныйИдентификатор(перФоновоеЗаданиеИдентификатор); + + Задание = HS_ОбщиеПроцедурыИФункции.НайтиЗадание(ФоновоеЗаданиеИдентификатор); + КонецЕсли; + + //При отсутствии адреса результата прерываем + Если АдресРезультата = Неопределено Тогда + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Result_Key""",Ложь,""); + Возврат; + КонецЕсли; + + Если Не Задание.Выполняется Тогда + Попытка + НайденнаяСсылка = Справочники.HS_ХранилищеРезультатов.НайтиПоРеквизиту("АдресРезультата",АдресРезультата); + + Если НайденнаяСсылка = Справочники.HS_ХранилищеРезультатов.ПустаяСсылка() Тогда + //Можно вынести в отдельную функцию + АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" + + "Result_Key=" + АдресРезультата + ?(ЗначениеЗаполнено(перФоновоеЗаданиеИдентификатор), + "&Task_Key=" + перФоновоеЗаданиеИдентификатор,""); + + //Формируем html ответ + СтруктураОтвет.ДанныеОтвета = " + | + | Задание еще выполняется, попробуйте получить результат позже!
+ |

Идентификатор фонового задания = " + перФоновоеЗаданиеИдентификатор + "
+ | Адрес хранилища результата = " + АдресРезультата + "

+ |

Ссылка на получение результата

+ | + |"; + Иначе + СтруктураОтвет = НайденнаяСсылка.Результат.Получить(); + КонецЕсли; + + Исключение + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Ошибка при формировании: "+ОписаниеОшибки(),Ложь,""); + КонецПопытки; + Иначе + //Задание еще в процессе + АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" + + "Result_Key=" + АдресРезультата + ?(ЗначениеЗаполнено(перФоновоеЗаданиеИдентификатор), + "&Task_Key=" + перФоновоеЗаданиеИдентификатор,""); + + //Формируем html ответ + СтруктураОтвет.ДанныеОтвета = " + | + | Задание еще выполняется, попробуйте получить результат позже!
+ |

Идентификатор фонового задания = " + перФоновоеЗаданиеИдентификатор + "
+ | Адрес хранилища результата = " + АдресРезультата + "

+ |

Ссылка на получение результата

+ | + |"; + КонецЕсли; +КонецПроцедуры +#КонецОбласти +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов.xml b/src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов.xml new file mode 100644 index 0000000..141ce07 --- /dev/null +++ b/src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов.xml @@ -0,0 +1,23 @@ + + + + + HS_ОбработкаУниверсальныхМетодов + + + ru + Обработка универсальных методов + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов/Ext/Module.bsl b/src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов/Ext/Module.bsl new file mode 100644 index 0000000..0f92e0a --- /dev/null +++ b/src/HTTPServices/CommonModules/HS_ОбработкаУниверсальныхМетодов/Ext/Module.bsl @@ -0,0 +1,795 @@ +#Область Методы +//Пример из Части 2. Метод написан под ERP, будет работать в УТ и КА +#Область ПримерыЧасть2 +Процедура ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров) Экспорт + //ПраметрыЗапроса - number + Склад_Key = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Ref_Key"); + + Если не Склад_Key = Неопределено Тогда + //Получаем Склад + Попытка + Склад = XMLЗначение(Тип("СправочникСсылка.Склады"), Склад_Key); + Исключение + Склад = Неопределено; + КонецПопытки; + + Если ЗначениеЗаполнено(Склад) Тогда + //Получаем схему компоновки и вариант отчета + //СхемаКомпоновки = Отчеты.ОстаткиИДоступностьТоваров.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); + //ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваров"); + СхемаКомпоновки = Отчеты.HS_ХранилищеМакетов.ПолучитьМакет("СКД_ОстаткиИДоступностьТоваров_HTTP"); + ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваровНеТаблица"); + НастройкиКомпоновки = ВариантНастроеки.Настройки; + + //Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"++ + ТекстЗапроса = СхемаКомпоновки.НаборыДанных.Основной.Запрос; + + ТекстЗапроса = СтрЗаменить( + ТекстЗапроса, + "&ТекстЗапросаВесНоменклатуры", + Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура")); + + ТекстЗапроса = СтрЗаменить( + ТекстЗапроса, + "&ТекстЗапросаОбъемНоменклатуры", + Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура")); + + СхемаКомпоновки.НаборыДанных.Основной.Запрос = ТекстЗапроса; + //Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"-- + + ПрараметрОтбора = НастройкиКомпоновки.Отбор.Элементы; + СкладПолеКомпоновки = Новый ПолеКомпоновкиДанных("Склад"); + Для Каждого СтрокаОтбора из ПрараметрОтбора Цикл + Если СтрокаОтбора.ЛевоеЗначение = СкладПолеКомпоновки Тогда + СтрокаОтбора.Использование = Истина; + СтрокаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + СтрокаОтбора.ПравоеЗначение = Склад; + КонецЕсли; + КонецЦикла; + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + + МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + + ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина); + + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + ДеревоЗначений = Новый ДеревоЗначений; + ПроцессорВывода.УстановитьОбъект(ДеревоЗначений); + ПроцессорВывода.Вывести(ПроцессорКомпоновки); + + //Обходим дерево и формируем РезультатОтвет + РезультатОтвет = Новый Массив; + Для Каждого ВерхнийУровеньДерева Из ДеревоЗначений.Строки Цикл + Для Каждого ПодчиненныйУровеньДерева Из ВерхнийУровеньДерева.Строки Цикл + Если ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Номенклатура) + И ТипЗнч(ПодчиненныйУровеньДерева.Номенклатура) = Тип("СправочникСсылка.Номенклатура") + Тогда + РезультатОтвет.Добавить(Новый Структура("ИмяЗначение,Артикул,Guid,ДоступноСейчас,Остаток", + ПодчиненныйУровеньДерева.Номенклатура.Наименование + + ?(ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Характеристика), + ","+Строка(ПодчиненныйУровеньДерева.Характеристика),""), + ПодчиненныйУровеньДерева.НоменклатураАртикул, + XMLСтрока(ПодчиненныйУровеньДерева.Номенклатура), + ПодчиненныйУровеньДерева.ДоступноСейчас, + ПодчиненныйУровеньДерева.ВНаличии)); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + //РезультатОтвет в JSON + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + СтруктураОтвет.ДанныеОтвета = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет); + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не заполнен или неверно заполнен параметр ""Ref_Key""",ложь,""); + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Ref_Key""",ложь,""); + КонецЕсли; +КонецПроцедуры + +Процедура ПолучитьДанныеПоСпискуНомеровДокументов(СтруктураОтвет,СтруктураВхПараметров) Экспорт + //ВидДокументов - получаем для идентификации того, что будем искать изначально + //Должен принимать вид Schet или Zakaz + + //ЗаписьЖурналаРегистрации("HTTP-Service",,,СтруктураВхПараметров,"ВАЖНОЕ",); + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса); + СтруктураJSON = ПрочитатьJSON(ЧтениеJSON); + + ВидКонтрагента = СтруктураJSON.urfiz;//принимаем данные по клиенту, если urfiz = ur то юр.лицо; + + //СтрокаСпискаНомеровДокументов - Строка с номерами документов, разделенными запятыми без пробелов. + //Только цифры и кирилические символы в верхнем регистре. + СтрокаСпискаНомеровДокументов = СтруктураJSON.strNumDoc; //СтруктураВхПараметров.ПараметрыЗапроса.Получить("StrDocNumbers"); + СтрокаСпискаНомеровДокументов = Врег(СтрЗаменить(СтрокаСпискаНомеровДокументов," ","")); //Убираем все пробелы и переводим в верхний регистр + МассивНомеровДокументов = СтрРазделить(СтрокаСпискаНомеровДокументов,",",ЛОЖЬ); + + ИННКонтрагента = СтруктураJSON.INN; + + Если НЕ ВидКонтрагента = Неопределено Тогда + Если ВидКонтрагента = "ur" Тогда //отрабатываем с ИНН по Юр.Лицу + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | СчетНаОплатуПокупателю.ЗаявкаОснование КАК ЗаявкаОснование + |ИЗ + | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю + |ГДЕ + | СчетНаОплатуПокупателю.Номер В(&МассивНомеров) + | И СчетНаОплатуПокупателю.Контрагент.ЮридическоеФизическоеЛицо = ЗНАЧЕНИЕ(Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо) + | И СчетНаОплатуПокупателю.Контрагент.ИНН = &ИННКонтрагента"; + Запрос.УстановитьПараметр("МассивНомеров",МассивНомеровДокументов); + Запрос.УстановитьПараметр("ИННКонтрагента",ИННКонтрагента); + Выполнение = Запрос.Выполнить(); + ТЗВыгрузка = Выполнение.Выгрузить(); + Запрос = ""; + + //Здесь получаем ТЗ Заявок. Теперь нужно из ТЗ выдернуть Номера Заявок и добавить эти номера к МассивуНомеровДокументов + Для каждого СтрокаТЗ Из ТЗВыгрузка Цикл + МассивНомеровДокументов.Добавить(СтрокаТЗ.ЗаявкаОснование.Номер); + КонецЦикла; + + //Все Номера Счетов Отработали. + //Теперь можно просто собрать данные по заявкам. + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЗаказКлиента.Ссылка КАК Заявка, + | ВЫБОР + | КОГДА ЗаказКлиента.Контрагент.НаименованиеСокращенное = NULL + | ИЛИ ЗаказКлиента.Контрагент.НаименованиеСокращенное = """" + | ТОГДА ЗаказКлиента.Контрагент.НаименованиеПолное + | ИНАЧЕ ЗаказКлиента.Контрагент.НаименованиеСокращенное + | КОНЕЦ КАК Контрагент, + | ВЫБОР + | КОГДА НЕ СостоянияДокументов.Состояние ЕСТЬ NULL + | ТОГДА СостоянияДокументов.Состояние.Представление + | ИНАЧЕ ""Без статуса"" + | КОНЕЦ КАК Статус + |ПОМЕСТИТЬ Заявки + |ИЗ + | Документ.ЗаказКлиента КАК ЗаказКлиента + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияДокументов КАК СостоянияДокументов + | ПО ЗаказКлиента.Ссылка = СостоянияДокументов.Документ + |ГДЕ + | ЗаказКлиента.Номер В(&МассивНомеров) + | И ЗаказКлиента.Контрагент.ЮридическоеФизическоеЛицо = ЗНАЧЕНИЕ(Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо) + | И ЗаказКлиента.Контрагент.ИНН = &ИННКонтрагента + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СчетНаОплатуПокупателю.Ссылка КАК Счет, + | ВЫБОР + | КОГДА ОплатаСчетовПокупателями.Сумма > 0 + | ТОГДА ""Оплата есть"" + | ИНАЧЕ ""Оплаты нет"" + | КОНЕЦ КАК НаличиеОплаты, + | ЕСТЬNULL(ОплатаСчетовПокупателями.Сумма, 0) КАК СуммаОплаты, + | СчетНаОплатуПокупателю.ЗаявкаОснование КАК ЗаявкаОснование + |ПОМЕСТИТЬ Счета + |ИЗ + | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОплатаСчетовПокупателями КАК ОплатаСчетовПокупателями + | ПО СчетНаОплатуПокупателю.Ссылка = ОплатаСчетовПокупателями.Счет + |ГДЕ + | СчетНаОплатуПокупателю.ЗаявкаОснование В + | (ВЫБРАТЬ + | Заявки.Заявка КАК ЗаказКлиента + | ИЗ + | Заявки КАК Заявки) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Заявки.Контрагент КАК Контрагент, + | Заявки.Заявка КАК Заявка, + | Заявки.Статус КАК Статус, + | Счета.Счет КАК Счет, + | Счета.НаличиеОплаты КАК НаличиеОплаты, + | Счета.СуммаОплаты КАК Оплата + |ИЗ + | Заявки КАК Заявки + | ЛЕВОЕ СОЕДИНЕНИЕ Счета КАК Счета + | ПО Заявки.Заявка = Счета.ЗаявкаОснование"; + Запрос.УстановитьПараметр("МассивНомеров",МассивНомеровДокументов); + Запрос.УстановитьПараметр("ИННКонтрагента",ИННКонтрагента); + Выполнение = Запрос.Выполнить(); + ТЗЗапроса = Выполнение.Выгрузить(); + + Если НЕ ТЗЗапроса.Количество()=0 Тогда + ИтоговаяТЗ = Новый ТаблицаЗначений; + ИтоговаяТЗ.Колонки.Добавить("Контрагент"); + ИтоговаяТЗ.Колонки.Добавить("Счет"); + ИтоговаяТЗ.Колонки.Добавить("Наличие_оплаты"); + ИтоговаяТЗ.Колонки.Добавить("Заявка"); + ИтоговаяТЗ.Колонки.Добавить("Статус"); + //ИтоговаяТЗ.Колонки.Добавить("Сумма_оплаты"); + + Для каждого СтрТЗ Из ТЗЗапроса Цикл + НовСтрИтоговойТЗ = ИтоговаяТЗ.Добавить(); + НовСтрИтоговойТЗ["Контрагент"] = СтрТЗ.Контрагент; + Если ЗначениеЗаполнено(СтрТЗ.Заявка) Тогда + НомерЗаявки = СокрЛП(Строка(СтрТЗ.Заявка.Номер)); + ДатаЗаявки = Строка(Формат(СтрТЗ.Заявка.Дата,"ДФ=dd.MM.yyyy; ДЛФ=D; ДП='Нет даты'")); + НовСтрИтоговойТЗ["Заявка"] = Строка("№ " + НомерЗаявки + " от " + ДатаЗаявки); + Иначе + НовСтрИтоговойТЗ["Заявка"] = СтрТЗ.Заявка; + КонецЕсли; + Если ЗначениеЗаполнено(СтрТЗ.Счет) Тогда + НомерСчета = СокрЛП(Строка(СтрТЗ.Счет.Номер)); + ДатаСчета = Строка(Формат(СтрТЗ.Счет.Дата,"ДФ=dd.MM.yyyy; ДЛФ=D; ДП='Нет даты'")); + НовСтрИтоговойТЗ["Счет"] = Строка("№ " + НомерСчета + " от " + ДатаСчета); + Иначе + НовСтрИтоговойТЗ["Счет"] = ?(ЗначениеЗаполнено(СтрТЗ.Счет),СтрТЗ.Счет,"Счет не оформлен"); + КонецЕсли; + + НовСтрИтоговойТЗ["Статус"] = СтрТЗ.Статус; + НовСтрИтоговойТЗ["Наличие_оплаты"] = ?(ЗначениеЗаполнено(СтрТЗ.НаличиеОплаты),СтрТЗ.НаличиеОплаты,"Оплаты нет"); + //НовСтрИтоговойТЗ["Сумма_оплаты"] = Формат(СтрТЗ.Оплата,"ЧЦ=12; ЧДЦ=2; ЧРД=,; ЧН=Пусто"); + //НовСтрИтоговойТЗ[""] = ; + КонецЦикла; + Иначе + ИтоговаяТЗ = Новый ТаблицаЗначений; + ИтоговаяТЗ.Колонки.Добавить("Результат"); + + НовСтрИтоговойТЗ = ИтоговаяТЗ.Добавить(); + НовСтрИтоговойТЗ.Результат = "По вашему запросу ничего не найдено."; + КонецЕсли; + + РезультатЗапроса = HS_ОбщиеПроцедурыИФункции.ПреобразоватьТаблицуЗначенийВМассивСтруктур(ИтоговаяТЗ); + + //РезультатОтвет в JSON + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + СтруктураОтвет.ДанныеОтвета = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатЗапроса); + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + ИначеЕсли ВидКонтрагента = "fiz" Тогда //работаем по физику, инн не важен, условие только Контрагент - Физ.Лицо + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | СчетНаОплатуПокупателю.ЗаявкаОснование КАК ЗаявкаОснование + |ИЗ + | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю + |ГДЕ + | СчетНаОплатуПокупателю.Номер В(&МассивНомеров) + | И СчетНаОплатуПокупателю.Контрагент.ЮридическоеФизическоеЛицо = ЗНАЧЕНИЕ(Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо)"; + Запрос.УстановитьПараметр("МассивНомеров",МассивНомеровДокументов); + Выполнение = Запрос.Выполнить(); + ТЗВыгрузка = Выполнение.Выгрузить(); + Запрос = ""; + + //Здесь получаем ТЗ Заявок. Теперь нужно из ТЗ выдернуть Номера Заявок и добавить эти номера к МассивуНомеровДокументов + Для каждого СтрокаТЗ Из ТЗВыгрузка Цикл + МассивНомеровДокументов.Добавить(СтрокаТЗ.ЗаявкаОснование.Номер); + КонецЦикла; + + //Все Номера Счетов Отработали. + //Теперь можно просто собрать данные по заявкам. + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЗаказКлиента.Ссылка КАК Заявка, + | ""Физическое лицо"" КАК Контрагент, + | ВЫБОР + | КОГДА НЕ СостоянияДокументов.Состояние ЕСТЬ NULL + | ТОГДА СостоянияДокументов.Состояние.Представление + | ИНАЧЕ ""Без статуса"" + | КОНЕЦ КАК Статус + |ПОМЕСТИТЬ Заявки + |ИЗ + | Документ.ЗаказКлиента КАК ЗаказКлиента + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияДокументов КАК СостоянияДокументов + | ПО ЗаказКлиента.Ссылка = СостоянияДокументов.Документ + |ГДЕ + | ЗаказКлиента.Номер В(&МассивНомеров) + | И ЗаказКлиента.Контрагент.ЮридическоеФизическоеЛицо = ЗНАЧЕНИЕ(Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СчетНаОплатуПокупателю.Ссылка КАК Счет, + | ВЫБОР + | КОГДА ОплатаСчетовПокупателями.Сумма > 0 + | ТОГДА ""Оплата есть"" + | ИНАЧЕ ""Оплаты нет"" + | КОНЕЦ КАК НаличиеОплаты, + | ЕСТЬNULL(ОплатаСчетовПокупателями.Сумма, 0) КАК СуммаОплаты, + | СчетНаОплатуПокупателю.ЗаявкаОснование КАК ЗаявкаОснование + |ПОМЕСТИТЬ Счета + |ИЗ + | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОплатаСчетовПокупателями КАК ОплатаСчетовПокупателями + | ПО СчетНаОплатуПокупателю.Ссылка = ОплатаСчетовПокупателями.Счет + |ГДЕ + | СчетНаОплатуПокупателю.ЗаявкаОснование В + | (ВЫБРАТЬ + | Заявки.Заявка КАК ЗаказКлиента + | ИЗ + | Заявки КАК Заявки) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Заявки.Контрагент КАК Контрагент, + | Заявки.Заявка КАК Заявка, + | Заявки.Статус КАК Статус, + | Счета.Счет КАК Счет, + | Счета.НаличиеОплаты КАК НаличиеОплаты, + | Счета.СуммаОплаты КАК СуммаОплаты + |ИЗ + | Заявки КАК Заявки + | ЛЕВОЕ СОЕДИНЕНИЕ Счета КАК Счета + | ПО Заявки.Заявка = Счета.ЗаявкаОснование"; + Запрос.УстановитьПараметр("МассивНомеров",МассивНомеровДокументов); + Выполнение = Запрос.Выполнить(); + ТЗЗапроса = Выполнение.Выгрузить(); + + Если НЕ ТЗЗапроса.Количество()=0 Тогда + ИтоговаяТЗ = Новый ТаблицаЗначений; + ИтоговаяТЗ.Колонки.Добавить("Контрагент"); + ИтоговаяТЗ.Колонки.Добавить("Счет"); + ИтоговаяТЗ.Колонки.Добавить("Наличие_оплаты"); + ИтоговаяТЗ.Колонки.Добавить("Заявка"); + ИтоговаяТЗ.Колонки.Добавить("Статус"); + //ИтоговаяТЗ.Колонки.Добавить("Сумма_оплаты"); + + Для каждого СтрТЗ Из ТЗЗапроса Цикл + НовСтрИтоговойТЗ = ИтоговаяТЗ.Добавить(); + НовСтрИтоговойТЗ["Контрагент"] = СтрТЗ.Контрагент; + Если ЗначениеЗаполнено(СтрТЗ.Заявка) Тогда + НомерЗаявки = СокрЛП(Строка(СтрТЗ.Заявка.Номер)); + ДатаЗаявки = Строка(Формат(СтрТЗ.Заявка.Дата,"ДФ=dd.MM.yyyy; ДЛФ=D; ДП='Нет даты'")); + НовСтрИтоговойТЗ["Заявка"] = Строка("№ " + НомерЗаявки + " от " + ДатаЗаявки); + Иначе + НовСтрИтоговойТЗ["Заявка"] = СтрТЗ.Заявка; + КонецЕсли; + Если ЗначениеЗаполнено(СтрТЗ.Счет) Тогда + НомерСчета = СокрЛП(Строка(СтрТЗ.Счет.Номер)); + ДатаСчета = Строка(Формат(СтрТЗ.Счет.Дата,"ДФ=dd.MM.yyyy; ДЛФ=D; ДП='Нет даты'")); + НовСтрИтоговойТЗ["Счет"] = Строка("№ " + НомерСчета + " от " + ДатаСчета); + Иначе + НовСтрИтоговойТЗ["Счет"] = ?(ЗначениеЗаполнено(СтрТЗ.Счет),СтрТЗ.Счет,"Счет не оформлен"); + КонецЕсли; + + НовСтрИтоговойТЗ["Статус"] = СтрТЗ.Статус; + НовСтрИтоговойТЗ["Наличие_оплаты"] = ?(ЗначениеЗаполнено(СтрТЗ.НаличиеОплаты),СтрТЗ.НаличиеОплаты,"Оплаты нет"); + //НовСтрИтоговойТЗ["Сумма_оплаты"] = Формат(СтрТЗ.Оплата,"ЧЦ=12; ЧДЦ=2; ЧРД=,; ЧН=Пусто"); + //НовСтрИтоговойТЗ[""] = ; + КонецЦикла; + Иначе + ИтоговаяТЗ = Новый ТаблицаЗначений; + ИтоговаяТЗ.Колонки.Добавить("Результат"); + + НовСтрИтоговойТЗ = ИтоговаяТЗ.Добавить(); + НовСтрИтоговойТЗ.Результат = "По вашему запросу ничего не найдено."; + КонецЕсли; + + РезультатЗапроса = HS_ОбщиеПроцедурыИФункции.ПреобразоватьТаблицуЗначенийВМассивСтруктур(ИтоговаяТЗ); + + //РезультатОтвет в JSON + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + СтруктураОтвет.ДанныеОтвета = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатЗапроса); + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не заполнен или неверно заполнен параметр ""urfiz""",ложь,""); + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не указан параметр ""urfiz""",ложь,""); + КонецЕсли; +КонецПроцедуры + +Процедура ПолучитьСписокЗаказовПоИННКонтрагента(СтруктураОтвет,СтруктураВхПараметров) Экспорт + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса); + СтруктураJSON = ПрочитатьJSON(ЧтениеJSON); + + ИННКонтрагента = СокрЛП(СтруктураJSON.INNContragent); + + Если НЕ ИННКонтрагента = Неопределено И СтрДлина(ИННКонтрагента)<>0 Тогда + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЗаказКлиента.Представление КАК Заявка, + | ВЫБОР + | КОГДА ЗаказКлиента.Контрагент.ЮридическоеФизическоеЛицо = ЗНАЧЕНИЕ(Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо) + | ТОГДА ВЫБОР + | КОГДА ЗаказКлиента.Контрагент.НаименованиеСокращенное = NULL + | ИЛИ ЗаказКлиента.Контрагент.НаименованиеСокращенное = """" + | ТОГДА ЗаказКлиента.Контрагент.НаименованиеПолное + | ИНАЧЕ ЗаказКлиента.Контрагент.НаименованиеСокращенное + | КОНЕЦ + | ИНАЧЕ ""Физическое лицо"" + | КОНЕЦ КАК Контрагент, + | ВЫБОР + | КОГДА НЕ СостоянияДокументов.Состояние ЕСТЬ NULL + | ТОГДА СостоянияДокументов.Состояние.Представление + | ИНАЧЕ ""Без статуса"" + | КОНЕЦ КАК СтатусЗаявки, + | ЗаказКлиента.Ссылка КАК ЗаявкаЗаказ + |ПОМЕСТИТЬ Заявки + |ИЗ + | Документ.ЗаказКлиента КАК ЗаказКлиента + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияДокументов КАК СостоянияДокументов + | ПО ЗаказКлиента.Ссылка = СостоянияДокументов.Документ + |ГДЕ + | ЗаказКлиента.Контрагент.ИНН = &ИННКонтрагента + | И ЗаказКлиента.Проведен = ИСТИНА + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СчетНаОплатуПокупателю.Представление КАК Счет, + | ВЫБОР + | КОГДА ОплатаСчетовПокупателями.Сумма > 0 + | ТОГДА ""Оплата есть"" + | ИНАЧЕ ""Оплаты нет"" + | КОНЕЦ КАК НаличиеОплаты, + | ЕСТЬNULL(ОплатаСчетовПокупателями.Сумма, 0) КАК СуммаОплаты, + | СчетНаОплатуПокупателю.ЗаявкаОснование КАК ЗаявкаОснование + |ПОМЕСТИТЬ Счета + |ИЗ + | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОплатаСчетовПокупателями КАК ОплатаСчетовПокупателями + | ПО СчетНаОплатуПокупателю.Ссылка = ОплатаСчетовПокупателями.Счет + |ГДЕ + | СчетНаОплатуПокупателю.ЗаявкаОснование В + | (ВЫБРАТЬ + | Заявки.ЗаявкаЗаказ КАК ЗаказКлиента + | ИЗ + | Заявки КАК Заявки) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Заявки.Контрагент КАК Контрагент, + | Заявки.Заявка КАК Заявка, + | Заявки.СтатусЗаявки КАК СтатусЗаявки, + | ЕСТЬNULL(Счета.Счет, """") КАК Счет, + | ЕСТЬNULL(Счета.НаличиеОплаты, ""Оплаты нет"") КАК НаличиеОплаты, + | ЕСТЬNULL(Счета.СуммаОплаты, 0) КАК СуммаОплаты + |ИЗ + | Заявки КАК Заявки + | ЛЕВОЕ СОЕДИНЕНИЕ Счета КАК Счета + | ПО Заявки.ЗаявкаЗаказ = Счета.ЗаявкаОснование"; + Запрос.УстановитьПараметр("ИННКонтрагента",ИННКонтрагента); + Выполнение = Запрос.Выполнить(); + + РезультатЗапроса = HS_ОбщиеПроцедурыИФункции.ПреобразоватьТаблицуЗначенийВМассивСтруктур(Выполнение.Выгрузить()); + + //РезультатОтвет в JSON + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + СтруктураОтвет.ДанныеОтвета = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатЗапроса); + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не указан параметр ""INNContragent""",ложь,""); + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +//Пример из Части 3. Метод написан под Демо БСП, следовательно будет работать в конфигурациях с БСП +#Область ПримерыЧасть3 +Процедура ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров) Экспорт + //Проверяем входящие параметры + Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда + + перНачалоПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("StartPeriod"); + НачалоПериода = ?(перНачалоПериода = Неопределено, + Неопределено,HS_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перНачалоПериода)); + + перКонецПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("EndPeriod"); + КонецПериода = ?(перКонецПериода = Неопределено, + Неопределено,HS_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перКонецПериода)); + + ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса); + + Попытка + ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON); + Исключение + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Не удалось получить данные!",Ложь,""); + КонецПопытки; + + Если СтруктураОтвет.Отработало Тогда + Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда + + НачалоПериода = ?(ТелоЗапросаJSON.Свойство("StartPeriod"), + HS_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.StartPeriod),Неопределено); + + КонецПериода = ?(ТелоЗапросаJSON.Свойство("EndPeriod"), + HS_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.EndPeriod),Неопределено); + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Передана не структура!",Ложь,""); + КонецЕсли; + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,""); + КонецЕсли; + + //Проверяем была ли ошибка + Если СтруктураОтвет.Отработало Тогда + //Получаем схему компоновки и вариант отчета + СхемаКомпоновки = Отчеты.Задания.ПолучитьМакет("Макет"); + ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("СписокЗаданий"); + НастройкиКомпоновки = ВариантНастроеки.Настройки; + + //Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"++ + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + СрокИсполнения = СхемаКомпоновки.НаборыДанных[0].Поля.Найти("СрокИсполнения"); + СрокИсполнения.Оформление.УстановитьЗначениеПараметра("Формат", ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D")); + //Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"-- + + Параметр = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти("Период"); + Если Параметр <> Неопределено Тогда + Параметр.Использование = ?(ЗначениеЗаполнено(НачалоПериода) + ИЛИ ЗначениеЗаполнено(КонецПериода),Истина,Ложь); + + ПериодВрем = Новый СтандартныйПериод; + Если ЗначениеЗаполнено(НачалоПериода) Тогда + ПериодВрем.ДатаНачала = НачалоДня(НачалоПериода); + КонецЕсли; + Если ЗначениеЗаполнено(КонецПериода) Тогда + ПериодВрем.ДатаОкончания = КонецДня(КонецПериода); + КонецЕсли; + Если Параметр.Использование Тогда + Параметр.Значение = ПериодВрем; + КонецЕсли; + КонецЕсли; + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + + МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + + ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина); + + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + ТЗ = Новый ТаблицаЗначений; + ПроцессорВывода.УстановитьОбъект(ТЗ); + ПроцессорВывода.Вывести(ПроцессорКомпоновки); + + //Обходим ТЗ и формируем РезультатОтвет + РезультатОтвет = Новый Массив; + Для Каждого СтрокаТЗ Из ТЗ Цикл + Если ЗначениеЗаполнено(СтрокаТЗ.Ссылка) + И ТипЗнч(СтрокаТЗ.Ссылка) = Тип("БизнесПроцессСсылка.Задание") + Тогда + РезультатОтвет.Добавить(Новый Структура("Задание,Guid,Автор,Дата,Выполнено", + СтрокаТЗ.Ссылка.Наименование, + XMLСтрока(СтрокаТЗ.Ссылка), + СтрокаТЗ.Автор.Наименование, + СтрокаТЗ.Дата, + СтрокаТЗ.Выполнено)); + КонецЕсли; + + КонецЦикла; + + //РезультатОтвет в JSON + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + СтруктураОтвет.ДанныеОтвета = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет); + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + + КонецЕсли; +КонецПроцедуры +#КонецОбласти + +#Область ПримерыЧасть4 +//Пример из Части 4. Метод написан получения количество элементов по типу объекта +Процедура ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров) Экспорт + //Проверяем входящие параметры + Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда + + перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName"); + НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта); + + перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top"); + Порция = ?(перПорция = Неопределено,0,Число(перПорция)); + + ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса); + + Попытка + ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON); + Исключение + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Не удалось получить данные!",Ложь,""); + КонецПопытки; + + Если СтруктураОтвет.Отработало Тогда + Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда + + НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,""); + Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0); + + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Передана не структура!",Ложь,""); + КонецЕсли; + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,""); + КонецЕсли; + + //Проверяем была ли ошибка + Если СтруктураОтвет.Отработало Тогда + Если Не ПустаяСтрока(НаименованиеОбъекта) + И Порция > 0 Тогда + + //Готовим структуру для дальнейшей работы + СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция", + ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"), + ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="), + ТекущаяДатаСеанса(), + НаименованиеОбъекта, + Порция); + + //Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня. + //Тоесть на следующий день данные будут неактуальны + HS_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет); + + Если СтруктураОтвет.Отработало Тогда + //Готовим ответ + КоличествоЭлементов = ?(СтруктураЗапроса.РезультатОтвет.Свойство("КоличествоЭлементов"), + СтруктураЗапроса.РезультатОтвет.КоличествоЭлементов, + 0); + + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + РезультатОтветJSON = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,КоличествоЭлементов); + + СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON; + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,?(Порция=0,"top=0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,""); + КонецЕсли; + КонецЕсли; +КонецПроцедуры +//Пример из Части 4. Метод написан получения порции +Процедура ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров) Экспорт + //Проверяем входящие параметры + Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда + + перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName"); + НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта); + + перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top"); + Порция = ?(перПорция = Неопределено,0,Число(перПорция)); + + перСтраница = СтруктураВхПараметров.ПараметрыЗапроса.Получить("page"); + текСтраница = ?(перСтраница = Неопределено,0,Число(перСтраница)); + + + ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса); + + Попытка + ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON); + Исключение + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Не удалось получить данные!",Ложь,""); + КонецПопытки; + + Если СтруктураОтвет.Отработало Тогда + Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда + + НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,""); + Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0); + текСтраница = ?(ТелоЗапросаJSON.Свойство("page"),ТелоЗапросаJSON.page,0); + + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Передана не структура!",Ложь,""); + КонецЕсли; + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,""); + КонецЕсли; + + //Проверяем была ли ошибка + Если СтруктураОтвет.Отработало Тогда + Если Не ПустаяСтрока(НаименованиеОбъекта) + И Порция > 0 + И текСтраница >= 0 Тогда + + //Готовим структуру для дальнейшей работы + СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция,Страница", + ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"), + ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="), + ТекущаяДатаСеанса(), + НаименованиеОбъекта, + Порция, + текСтраница); + + //Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня. + //Тоесть на следующий день данные будут неактуальны + HS_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет); + + Если СтруктураОтвет.Отработало Тогда + //Готовим ответ + МассивПоследних = ?(СтруктураЗапроса.РезультатОтвет.Свойство("МассивПоследних"), + СтруктураЗапроса.РезультатОтвет.МассивПоследних, + Новый Массив); + + РезультатОтвет = Новый Массив; + Если МассивПоследних.Количество() > 0 + И МассивПоследних.Количество() >= текСтраница Тогда + //Проверяем справочник Иерархический или нет + перЕстьГруппы = ?(МассивПоследних[0].Метаданные().Иерархический,Истина,Ложь); + + //Получаем нужную порцию + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ "+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")+" + | Ссылка КАК Ссылка, + | ПометкаУдаления КАК DeletionMark, + | Код КАК Code, + | Наименование КАК Description + | //[ЕстьГруппы]//, ЭтоГруппа КАК IsFolder + |ИЗ + | [ИмяТаблицы] ГДЕ Ссылка > &Ссылка УПОРЯДОЧИТЬ ПО Ссылка"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта); + Если перЕстьГруппы Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "//[ЕстьГруппы]//", ""); + КонецЕсли; + + Запрос.УстановитьПараметр("Ссылка",МассивПоследних[текСтраница]); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + текЭлМасс = Новый Структура; + текЭлМасс.Вставить("Ref_Key", XMLСтрока(ВыборкаДетальныеЗаписи.Ссылка)); + текЭлМасс.Вставить("Description", ВыборкаДетальныеЗаписи.Description); + текЭлМасс.Вставить("Code", ВыборкаДетальныеЗаписи.Code); + текЭлМасс.Вставить("DeletionMark", ВыборкаДетальныеЗаписи.DeletionMark); + Если перЕстьГруппы Тогда + текЭлМасс.Вставить("IsFolder", ВыборкаДетальныеЗаписи.IsFolder); + КонецЕсли; + + РезультатОтвет.Добавить(текЭлМасс); + КонецЦикла; + КонецЕсли; + + стрРезультатОтвет = Новый Структура("value",РезультатОтвет); + + ВхПараметры = HS_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON(); + //Делаем красивый вывод данных (Эстетика чисто для глаза) + ВхПараметры.ПереносСтрок = ПереносСтрокJSON.Авто; + + РезультатОтветJSON = HS_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,стрРезультатОтвет); + + СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON; + + СтруктураОтвет.Вставить("ФорматОтвета",HS_ОбщиеПроцедурыИФункции.ФорматОтветаJSON()); + КонецЕсли; + Иначе + HS_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,?(Порция=0,"top=0 или page<0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,""); + КонецЕсли; + КонецЕсли; +КонецПроцедуры +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции.xml b/src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции.xml new file mode 100644 index 0000000..a2dbbf1 --- /dev/null +++ b/src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции.xml @@ -0,0 +1,23 @@ + + + + + HS_ОбщиеПроцедурыИФункции + + + ru + Общие процедуры и функции + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции/Ext/Module.bsl b/src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции/Ext/Module.bsl new file mode 100644 index 0000000..0a5ebbc --- /dev/null +++ b/src/HTTPServices/CommonModules/HS_ОбщиеПроцедурыИФункции/Ext/Module.bsl @@ -0,0 +1,375 @@ +//Заполняем структуру ответа +Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета) Экспорт + СтруктураОтвет.КодОтвета = КодОтвета; + СтруктураОтвет.ТекстОшибки = ТекстОшибки; + СтруктураОтвет.Отработало = Отработало; + СтруктураОтвет.ДанныеОтвета = ДанныеОтвета; +КонецПроцедуры + +Функция БазаФайловая() + СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы(); + // в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД + ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE="); + Если ПозицияПоиска = 1 тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +#Область ВспомогательныеПроцедурыФункцииМетодов +//Считываем или создаем элемент справочника HS_ХранилищеРезультатов +//Вспомогательная процедура методов: ПолучитьПорциюЭлементовВариантЗапроса, ПолучитьКоличествоЭлементовВариантЗапрос +Процедура ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет) Экспорт + НайденнаяСсылка = ПолучитьПредыдущийЗапрос(СтруктураЗапроса); + Если Не ЗначениеЗаполнено(НайденнаяСсылка) Тогда + + КоличествоЭлементов = ПолучитьКоличествоЭлементов(СтруктураЗапроса.НаименованиеОбъекта); + Если КоличествоЭлементов = -1 Тогда + ЗаполнитьСтруктуруОтвета(СтруктураОтвет, + 400,"Объект: """+СтруктураЗапроса.НаименованиеОбъекта+""" не найден!",Ложь,""); + Иначе + МассивПоследних = Новый Массив; + МассивПоследних.Добавить(ПустаяСсылкаПоНаименованиеОбъекта(СтруктураЗапроса.НаименованиеОбъекта)); + Если КоличествоЭлементов = 0 Тогда + КоличествоСтраниц = 0; + Иначе + //Получаем количество страниц + перДоОкругления = КоличествоЭлементов/СтруктураЗапроса.Порция; + КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20); + + //Заполняем МассивПоследних ссылок + ПродолжаемЗаполнять = Истина; + ПромежуточнаяСтруктура = Новый Структура("Продолжаем,Ссылка",Истина,Неопределено); + Пока ПродолжаемЗаполнять Цикл + ПромежуточнаяСтруктура = + ПолучитьПоследнийЭлементПорции(ПромежуточнаяСтруктура,СтруктураЗапроса.НаименованиеОбъекта,СтруктураЗапроса.Порция); + + ПродолжаемЗаполнять = ПромежуточнаяСтруктура.Продолжаем; + + Если ПродолжаемЗаполнять Тогда + МассивПоследних.Добавить(ПромежуточнаяСтруктура.Ссылка); + КонецЕсли; + КонецЦикла; + + + КонецЕсли; + + РезультатОтвет = Новый Структура("КоличествоЭлементов,МассивПоследних", + КоличествоЭлементов, + МассивПоследних); + + ТекущийОбъект = Справочники.HS_ХранилищеРезультатов.СоздатьЭлемент(); + ТекущийОбъект.МетодЗапроса = СтруктураЗапроса.МетодЗапроса; + ТекущийОбъект.ПараметрыЗапроса = СтруктураЗапроса.ПараметрыЗапроса; + ТекущийОбъект.ДатаЗапроса = СтруктураЗапроса.ДатаЗапроса; + + ТекущийОбъект.УстановитьНовыйКод(); + + ТекущийОбъект.Результат = Новый ХранилищеЗначения(РезультатОтвет, Новый СжатиеДанных(9)); + + ТекущийОбъект.ОбменДанными.Загрузка = Истина; + ТекущийОбъект.Записать(); + КонецЕсли; + + Иначе + + РезультатОтвет = НайденнаяСсылка.Результат.Получить(); + + КонецЕсли; + + СтруктураЗапроса.Вставить("РезультатОтвет",РезультатОтвет) +КонецПроцедуры +#КонецОбласти + + +#Область РаботаСДанными +//Получаем дату из входных параметров +Функция ПолучитьДатуВремяИзСтроки(ДатаВремя) Экспорт + + Результат = Неопределено; + ДатаВремя = СтрЗаменить(ДатаВремя, "-", ""); + ДатаВремя = СтрЗаменить(ДатаВремя, ":", ""); + Если СтрДлина(ДатаВремя) - Найти(ДатаВремя, " ") = 5 Тогда // время в формате Ч:ММ:СС + ДатаВремя = СтрЗаменить(ДатаВремя, " ", "0"); + ИначеЕсли Найти(ДатаВремя, "T") > 0 Тогда //время в формате ГГГГММДДTЧЧММСС + ДатаВремя = СтрЗаменить(ДатаВремя, "T", ""); + Иначе // время в формате ЧЧ:ММ:СС + ДатаВремя = СтрЗаменить(ДатаВремя, " ", ""); + КонецЕсли; + + ОписаниеТипа = Новый ОписаниеТипов("Дата"); + Результат = ОписаниеТипа.ПривестиЗначение(ДатаВремя); // дата и время в виде "ГГГГММДДЧЧММСС" + Если Не ЗначениеЗаполнено(Результат) Тогда + Результат = ОписаниеТипа.ПривестиЗначение(Лев(ДатаВремя, 8)); // только дата "ГГГГММДД" + КонецЕсли; + + Возврат Результат; + +КонецФункции +//Получаем ПустуюСсылку +Функция ПустаяСсылкаПоНаименованиеОбъекта(НаименованиеОбъекта) Экспорт + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ ЗНАЧЕНИЕ("+НаименованиеОбъекта+".ПустаяСсылка) как Ссылка"; + + РезультатЗапроса = Запрос.Выполнить(); + + Выборка = РезультатЗапроса.Выбрать(); + + Если Выборка.Следующий() Тогда + Возврат Выборка.Ссылка; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции +//Получаем ссылку на Справочник.HS_ХранилищеРезультатов по заданной структуре +Функция ПолучитьПредыдущийЗапрос(СтруктураЗапроса) Экспорт + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | HS_ХранилищеРезультатов.Ссылка КАК Ссылка + |ИЗ + | Справочник.HS_ХранилищеРезультатов КАК HS_ХранилищеРезультатов + |ГДЕ + | НЕ HS_ХранилищеРезультатов.ПометкаУдаления + | И HS_ХранилищеРезультатов.МетодЗапроса = &МетодЗапроса + | И HS_ХранилищеРезультатов.ПараметрыЗапроса = &ПараметрыЗапроса + | И HS_ХранилищеРезультатов.ДатаЗапроса МЕЖДУ &ДатаЗапросаН И &ДатаЗапросаК"; + + Запрос.УстановитьПараметр("ДатаЗапросаК", КонецДня(СтруктураЗапроса.ДатаЗапроса)); + Запрос.УстановитьПараметр("ДатаЗапросаН", НачалоДня(СтруктураЗапроса.ДатаЗапроса)); + Запрос.УстановитьПараметр("МетодЗапроса", СтруктураЗапроса.МетодЗапроса); + Запрос.УстановитьПараметр("ПараметрыЗапроса", СтруктураЗапроса.ПараметрыЗапроса); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Если ВыборкаДетальныеЗаписи.Следующий() Тогда + Возврат ВыборкаДетальныеЗаписи.Ссылка; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции +//Получить количество элементов запросом +Функция ПолучитьКоличествоЭлементов(НаименованиеОбъекта) Экспорт + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК Количество + |ИЗ + | [ИмяТаблицы] + |"; + Если НЕ ПустаяСтрока(НаименованиеОбъекта) Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта); + Иначе + Возврат -1; + КонецЕсли; + + Попытка + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат 0; + Иначе + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + Если ВыборкаДетальныеЗаписи.Следующий() Тогда + Возврат ВыборкаДетальныеЗаписи.Количество; + КонецЕсли; + КонецЕсли; + Исключение + Возврат -1; + КонецПопытки; +КонецФункции +//Если в порции 1000 элементов, то мы получим 1000-й +Функция ПолучитьПоследнийЭлементПорции(ВхСтруктура,НаименованиеОбъекта,Порция) Экспорт + //ПромежуточнаяСтруктура = Новый Структура("Продолжаем,Ссылка",Истина,Неопределено); + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ "+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")+" + | Ссылка КАК Ссылка + |ПОМЕСТИТЬ ВременнаяТаблица + |ИЗ + | [ИмяТаблицы] + |ГДЕ + | Ссылка > &Ссылка + | + |УПОРЯДОЧИТЬ ПО + | Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВременнаяТаблица.Ссылка КАК Ссылка + |ИЗ + | ВременнаяТаблица КАК ВременнаяТаблица + |ГДЕ + | НЕ ВременнаяТаблица.Ссылка В + | (ВЫБРАТЬ ПЕРВЫЕ "+ Формат(Порция-1, "ЧДЦ=0; ЧН=0; ЧГ=")+" + | тз.Ссылка + | ИЗ + | ВременнаяТаблица КАК тз)"; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта); + Если ВхСтруктура.Ссылка = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Ссылка", "ЗНАЧЕНИЕ("+НаименованиеОбъекта+".ПустаяСсылка)"); + Иначе + Запрос.УстановитьПараметр("Ссылка", ВхСтруктура.Ссылка); + КонецЕсли; + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + ВхСтруктура.Продолжаем = Ложь; + Иначе + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + Если ВыборкаДетальныеЗаписи.Следующий() Тогда + ВхСтруктура.Продолжаем = Истина; + ВхСтруктура.Ссылка = ВыборкаДетальныеЗаписи.Ссылка; + Иначе + ВхСтруктура.Продолжаем = Ложь; + КонецЕсли; + КонецЕсли; + + Возврат ВхСтруктура; + +КонецФункции + +Функция ПреобразоватьТаблицуЗначенийВМассивСтруктур(п_ТЗ) Экспорт + + Массив = Новый Массив(); + + СтруктураСтрокой = ""; + НужнаЗапятая = Ложь; + + Для Каждого Колонка Из п_ТЗ.Колонки Цикл + + Если НужнаЗапятая Тогда + СтруктураСтрокой = СтруктураСтрокой + ","; + КонецЕсли; + + СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя; + НужнаЗапятая = Истина; + + КонецЦикла; + + Для Каждого Строка Из п_ТЗ Цикл + + НоваяСтрока = Новый Структура(СтруктураСтрокой); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + + Массив.Добавить(НоваяСтрока); + + КонецЦикла; + + Возврат Массив; + +КонецФункции + +#КонецОбласти + +#Область СерилизацияДесирилизация +Функция ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет) Экспорт + ПараметрыJSON = Новый ПараметрыЗаписиJSON(ВхПараметры.ПереносСтрок, + ВхПараметры.СимволОтступа, + ВхПараметры.ИспользоватьДвойныеКавычки, + ВхПараметры.ЭкранированиеСимволов, + ВхПараметры.ЭкранироватьУгловыеСкобки, + ВхПараметры.ЭкранироватьАмперсанд, + ВхПараметры.ЭкранироватьОдинарныеКавычки, + ВхПараметры.ЭкранироватьРазделителиСтрок, + ВхПараметры.ЭкранироватьСлешь); + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.ПроверятьСтруктуру = Истина; + ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); + Попытка + ЗаписатьJSON(ЗаписьJSON, РезультатОтвет); + Результат = ЗаписьJSON.Закрыть(); + Исключение + Результат = ""; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +Функция СтандартныеПараметрыJSON() Экспорт + ПараметрыJSON = Новый Структура; + ПараметрыJSON.Вставить("ПереносСтрок",ПереносСтрокJSON.Нет); + ПараметрыJSON.Вставить("СимволОтступа"," "); + ПараметрыJSON.Вставить("ИспользоватьДвойныеКавычки",Истина); + ПараметрыJSON.Вставить("ЭкранированиеСимволов",ЭкранированиеСимволовJSON.Нет); + ПараметрыJSON.Вставить("ЭкранироватьУгловыеСкобки",Ложь); + ПараметрыJSON.Вставить("ЭкранироватьАмперсанд",Ложь); + ПараметрыJSON.Вставить("ЭкранироватьОдинарныеКавычки",Ложь); + ПараметрыJSON.Вставить("ЭкранироватьРазделителиСтрок",Ложь); + ПараметрыJSON.Вставить("ЭкранироватьСлешь",Ложь); + + Возврат ПараметрыJSON; + +КонецФункции +#КонецОбласти + +#Область ФорматыОтвета +Процедура ВозвращаемНужныйФорматОтвета(Ответ,СтруктураОтвет) Экспорт + + Если СтруктураОтвет.Свойство("ФорматОтвета") Тогда + ФорматОтвета = СтруктураОтвет.ФорматОтвета; + Иначе + ФорматОтвета = ""; + КонецЕсли; + + Если ВРег(ФорматОтвета) = Врег(ФорматОтветаJSON()) Тогда + Ответ.Заголовки.Вставить("Content-Type","application/json; charset=utf-8"); + Иначе + Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8"); + КонецЕсли; +КонецПроцедуры + +Функция ФорматОтветаJSON() Экспорт + Возврат "JSON"; +КонецФункции +#КонецОбласти + +#Область РаботаСФоновымиЗаданиями +Функция НайтиЗадание(Идентификатор) Экспорт + // Считывает состояние фонового задания по переданному идентификатору. + // + // Параметры: + // Идентификатор - УникальныйИдентификатор - Идентификатор фонового задания. + // + // Возвращаемое значение: + // Неопределено - Задание не найдено. + // Структура - Сведения о задании. + // * Выполняется - Булево - Истина когда фоновое задание еще выполняется. + // * Успешно - Булево - Истина когда сеанс фонового задания завершился без ошибок. + // * Ошибка - Строка, ИнформацияОбОшибке, Неопределено - Описание ошибки. + // + УстановитьПривилегированныйРежим(Истина); + + Результат = Новый Структура("Выполняется, Успех, Ошибка", Ложь, Ложь, Неопределено); + Если Идентификатор = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор); + Если Задание = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда + Результат.Выполняется = Истина; + Иначе + Результат.Выполняется = Ложь; + Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда + Результат.Успех = Истина; + Иначе + Результат.Успех = Ложь; + Результат.Ошибка = Задание.ИнформацияОбОшибке; + КонецЕсли; + КонецЕсли; + + Возврат Результат; +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/src/HTTPServices/ConfigDumpInfo.xml b/src/HTTPServices/ConfigDumpInfo.xml new file mode 100644 index 0000000..97a5616 --- /dev/null +++ b/src/HTTPServices/ConfigDumpInfo.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/Configuration.xml b/src/HTTPServices/Configuration.xml new file mode 100644 index 0000000..83be8d2 --- /dev/null +++ b/src/HTTPServices/Configuration.xml @@ -0,0 +1,83 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + ef0d805a-3847-4325-95bf-af7fdcaa8a01 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 615f1330-d148-44bc-81e1-d389e9534f40 + + + e3687481-0a87-462c-a166-9f34594f9bba + 9d7d7a29-ce18-4327-8f0b-b8df2dbbd874 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + ca6af699-2199-42ec-bb6e-99f983b52a6d + + + 51f2d5d8-ea4d-4064-8892-82951750031e + d26202dc-649d-4c29-84aa-8808df2f5766 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + aa2cb56c-2f15-40a1-9784-2c51145f0955 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + d898cfc2-b545-41a8-9812-66ebf3c9c613 + + + + HTTPServices + + + ru + HTTP Service + + + + AddOn + Adopted + true + HS_ + Version8_3_13 + ManagedApplication + + PlatformApplication + + Russian + ZheLeZ0 + 0.0.0.01 + Language.Русский + + + + + + TaxiEnableVersion8_2 + + + Русский + HS_ОбработкаМетодовHTTP + HS_ОбщиеПроцедурыИФункции + HS_ОбработкаУниверсальныхМетодов + HS_CSM_API + HS_ПолучитьКонтрагентаПоИНН + ВладелецСостоянияДокумента + Контрагенты + КонтактныеЛица + ДоговорыКонтрагентов + ВидыСостоянийДокументов + ЗаказКлиента + СчетНаОплатуПокупателю + Заявка + ЮридическоеФизическоеЛицо + СостоянияДокументов + ОплатаСчетовПокупателями + + + \ No newline at end of file diff --git a/src/HTTPServices/DefinedTypes/ВладелецСостоянияДокумента.xml b/src/HTTPServices/DefinedTypes/ВладелецСостоянияДокумента.xml new file mode 100644 index 0000000..68f3ce7 --- /dev/null +++ b/src/HTTPServices/DefinedTypes/ВладелецСостоянияДокумента.xml @@ -0,0 +1,17 @@ + + + + + + 623cdbde-d542-4321-9ef8-9979f4cf1996 + a5e9bc2b-6f5e-4195-9f39-c688e2d061cf + + + + ВладелецСостоянияДокумента + + Adopted + 3861957d-a588-4af9-a8b7-a411a11a8ece + + + \ No newline at end of file diff --git a/src/HTTPServices/Documents/ЗаказКлиента.xml b/src/HTTPServices/Documents/ЗаказКлиента.xml new file mode 100644 index 0000000..7c1cdb3 --- /dev/null +++ b/src/HTTPServices/Documents/ЗаказКлиента.xml @@ -0,0 +1,48 @@ + + + + + + 1fc2fe80-b1fd-4c54-8933-7337bed7622c + 121adbc6-315a-44ce-86d5-dbb3bbcf8b34 + + + 99682e32-8f08-4415-8945-18f2cfb2c698 + 22ea2404-6f88-4e1c-a3d0-a9fb672244c4 + + + 17784b97-8952-4269-8127-eec82314d5c0 + c53cc267-54b3-4213-9857-70e9b9005429 + + + 1a17ee1b-1965-4a51-9e28-8cc90ecb0c56 + 728516be-3e4f-478e-b34a-32d5e84f04d6 + + + 1fd43968-a80b-40a6-aac3-b75775b086a7 + 376cb175-3063-40d3-9010-65aa205a61bc + + + + ЗаказКлиента + + Adopted + d54e9a32-b5b5-4e5d-856e-f937a589dec9 + + + + + + + Контрагент + + Adopted + b379ea5a-d702-4929-99b7-a388c4e0f842 + + cfg:CatalogRef.Контрагенты + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/Documents/Заявка.xml b/src/HTTPServices/Documents/Заявка.xml new file mode 100644 index 0000000..746b087 --- /dev/null +++ b/src/HTTPServices/Documents/Заявка.xml @@ -0,0 +1,35 @@ + + + + + + 875c13c4-f9e2-43a6-921c-6f2db25866c9 + 51a8277d-9f17-45ef-97a1-d3db60cd017c + + + 8f8429b6-5e4f-4588-a591-d6ea043dcad0 + c228c381-5793-4d23-b479-fa814b7b965d + + + 09faca81-eb5c-4f5a-a390-e78a0dd46d4d + a19f0a8d-e757-4d0a-95cc-458b763359ca + + + 272168a9-4966-4504-a6c4-9a0ca061beb8 + 524d114c-697d-4840-8688-120700773f3f + + + adf20928-a602-438c-9181-379d3146d4ff + 18e552f1-bd14-48c6-ada4-1f469461adfe + + + + Заявка + + Adopted + eab53d5f-9cb7-4e46-909c-277a2cc4086f + + + + + \ No newline at end of file diff --git a/src/HTTPServices/Documents/СчетНаОплатуПокупателю.xml b/src/HTTPServices/Documents/СчетНаОплатуПокупателю.xml new file mode 100644 index 0000000..e47bc93 --- /dev/null +++ b/src/HTTPServices/Documents/СчетНаОплатуПокупателю.xml @@ -0,0 +1,60 @@ + + + + + + 53f32b88-5fd6-4a3c-abba-8af925bbe948 + 36395368-2cb8-46be-ab56-e5d06f82aae6 + + + 13d17769-1e97-4e5c-aec4-70653e0e67cb + aec00980-02f1-4529-a043-c48b1de57dcf + + + 1eeb11a4-2f77-4b0f-813c-0ce8fc0a79ee + 53658bbc-ac29-499e-a470-72e256043bcb + + + 448cd624-6a37-459b-a517-3a2b84623def + 38fab049-9da3-495c-bdf6-4cdea52816e7 + + + 0a8bcd54-22c7-4250-b32e-97503943de3c + ff5c52f7-7366-4482-aac8-9a80e56e6ecb + + + + СчетНаОплатуПокупателю + + Adopted + 459ebe0d-2cf6-494c-914a-64b8956306fe + + + + + + + Контрагент + + Adopted + 39147772-977f-4479-be80-ef84677e1718 + + cfg:CatalogRef.Контрагенты + + + + + + + ЗаявкаОснование + + Adopted + c0105859-1a24-4564-b27a-8b76dd76d218 + + cfg:AnyRef + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/Enums/ЮридическоеФизическоеЛицо.xml b/src/HTTPServices/Enums/ЮридическоеФизическоеЛицо.xml new file mode 100644 index 0000000..00e5a55 --- /dev/null +++ b/src/HTTPServices/Enums/ЮридическоеФизическоеЛицо.xml @@ -0,0 +1,45 @@ + + + + + + b03a3038-53f0-49e2-8f18-eb91bc3ca579 + cb714364-2bb4-442e-b339-5598f7d9ade4 + + + dda68179-8676-490d-90d5-53bd7cdad290 + 474e1cf6-2c6f-4e96-a88e-7c0f9e874547 + + + a2100e67-6819-46e7-b64e-5d4cfe458219 + 3246b09b-86c7-47a2-98ce-744fea156c3a + + + + ЮридическоеФизическоеЛицо + + Adopted + 8c0047ed-e38e-494c-9c23-096db84ac345 + + + + + + ЮридическоеЛицо + + Adopted + e88926ba-5730-4b05-bf70-311b35a06afc + + + + + + ФизическоеЛицо + + Adopted + bd634b28-d5b7-4ac7-aac9-2ff113f90e9e + + + + + \ No newline at end of file diff --git a/src/HTTPServices/HTTPServices/HS_CSM_API.xml b/src/HTTPServices/HTTPServices/HS_CSM_API.xml new file mode 100644 index 0000000..1cc6a75 --- /dev/null +++ b/src/HTTPServices/HTTPServices/HS_CSM_API.xml @@ -0,0 +1,49 @@ + + + + + HS_CSM_API + + + ru + CSM API + + + API интерфейс для получения информации на сайт прямыми запросами + CSM-API + AutoUse + 20 + + + + + CSM_API + + + ru + CSM API + + + + + + + + + POST + + + ru + POST + + + + POST + CSM_API_POST + + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/HTTPServices/HS_CSM_API/Ext/Module.bsl b/src/HTTPServices/HTTPServices/HS_CSM_API/Ext/Module.bsl new file mode 100644 index 0000000..8886a81 --- /dev/null +++ b/src/HTTPServices/HTTPServices/HS_CSM_API/Ext/Module.bsl @@ -0,0 +1,30 @@ + +Функция CSM_API_POST(Запрос) + СтруктураВхПараметров = Новый Структура; + //Получаем имя метода + перИмяМетода = Запрос.ПараметрыURL["ИмяМетода"]; + //Помещаем имя метода в структуру + СтруктураВхПараметров.Вставить("ИмяМетода",перИмяМетода); + + //Метод запроса + СтруктураВхПараметров.Вставить("МетодЗапроса",Запрос.HTTPМетод); + + //Тело запроса + ЗапросОтКлиента = Запрос.ПолучитьТелоКакСтроку(); + СтруктураВхПараметров.Вставить("ТелоЗапроса",ЗапросОтКлиента); + + //Передаем входящие параметры (Модуль для метода POST) + СтруктураОтвет = HS_ОбработкаМетодовHTTP.HS_ОбработкаМетодовPOST(СтруктураВхПараметров); + + Ответ = Новый HTTPСервисОтвет(СтруктураОтвет.КодОтвета); + Если СтруктураОтвет.Отработало Тогда + Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ДанныеОтвета,КодировкаТекста.UTF8); + Иначе + Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ТекстОшибки,КодировкаТекста.UTF8); + КонецЕсли; + + //В зависимости от формата меняем "Content-Type" + HS_ОбщиеПроцедурыИФункции.ВозвращаемНужныйФорматОтвета(Ответ,СтруктураОтвет); + + Возврат Ответ; +КонецФункции diff --git a/src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН.xml b/src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН.xml new file mode 100644 index 0000000..18318c0 --- /dev/null +++ b/src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН.xml @@ -0,0 +1,49 @@ + + + + + HS_ПолучитьКонтрагентаПоИНН + + + ru + HS получить контрагента по ИНН + + + + ContFromINN + AutoUse + 20 + + + + + ContFromINN + + + ru + Cont from INN + + + + + + + + + POST + + + ru + POST + + + + POST + ContFromINN_POST + + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН/Ext/Module.bsl b/src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН/Ext/Module.bsl new file mode 100644 index 0000000..2c221f4 --- /dev/null +++ b/src/HTTPServices/HTTPServices/HS_ПолучитьКонтрагентаПоИНН/Ext/Module.bsl @@ -0,0 +1,30 @@ + +Функция ContFromINN_POST(Запрос) + СтруктураВхПараметров = Новый Структура; + //Получаем имя метода + перИмяМетода = Запрос.ПараметрыURL["ИмяМетода"]; + //Помещаем имя метода в структуру + СтруктураВхПараметров.Вставить("ИмяМетода",перИмяМетода); + + //Метод запроса + СтруктураВхПараметров.Вставить("МетодЗапроса",Запрос.HTTPМетод); + + //Тело запроса + ЗапросОтКлиента = Запрос.ПолучитьТелоКакСтроку(); + СтруктураВхПараметров.Вставить("ТелоЗапроса",ЗапросОтКлиента); + + //Передаем входящие параметры (Модуль для метода POST) + СтруктураОтвет = HS_ОбработкаМетодовHTTP.HS_ОбработкаМетодовPOST(СтруктураВхПараметров); + + Ответ = Новый HTTPСервисОтвет(СтруктураОтвет.КодОтвета); + Если СтруктураОтвет.Отработало Тогда + Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ДанныеОтвета,КодировкаТекста.UTF8); + Иначе + Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ТекстОшибки,КодировкаТекста.UTF8); + КонецЕсли; + + //В зависимости от формата меняем "Content-Type" + HS_ОбщиеПроцедурыИФункции.ВозвращаемНужныйФорматОтвета(Ответ,СтруктураОтвет); + + Возврат Ответ; +КонецФункции diff --git a/src/HTTPServices/InformationRegisters/СостоянияДокументов.xml b/src/HTTPServices/InformationRegisters/СостоянияДокументов.xml new file mode 100644 index 0000000..db7e812 --- /dev/null +++ b/src/HTTPServices/InformationRegisters/СостоянияДокументов.xml @@ -0,0 +1,84 @@ + + + + + + 2cbfd297-691a-411c-9615-4c85ed3844a0 + d41f8ae2-8b7d-4e27-ae96-685329e33cc5 + + + 136d6574-034e-4bbd-9983-8c1a13ebc64d + 977e61e4-d19b-4f91-90c3-7fe35715147f + + + 1fbb3c2f-340d-4f35-8507-c3524d6bfe5f + 641ad8a9-b123-4472-866e-42f1e279e830 + + + ed1611e2-7cd0-4d84-8849-a9df97072bf2 + bb5d1d03-d9f6-486a-a74e-27d5a05714a6 + + + e17f64a3-4631-4950-b435-61faca15de96 + 38929359-c0c8-4094-954a-6b39ada009f4 + + + 2f032c61-1087-48da-b05e-3bf088ccc7bb + 38903448-09b9-4163-a865-1777a61ba447 + + + b3d6e851-9dca-41ac-aa8d-277a707e0d19 + be71de9d-78a0-435c-824e-b34c726f0bcf + + + + СостоянияДокументов + + Adopted + ac764ded-add7-4c91-99bb-788fb1883dad + Nonperiodical + Independent + + + + + + Состояние + + Adopted + b9cc309d-1af2-4cbf-8f1c-28da9102b2b1 + + cfg:CatalogRef.ВидыСостоянийДокументов + + + + + + + ДатаУстановкиСостояния + + Adopted + cb537565-2fcc-4356-8388-845a3103b8ea + + xs:dateTime + + DateTime + + + + + + + + Документ + + Adopted + 76ff0a9e-630e-4589-86a9-8b4c0f670eb3 + + cfg:DefinedType.ВладелецСостоянияДокумента + + + + + + \ No newline at end of file diff --git a/src/HTTPServices/Languages/Русский.xml b/src/HTTPServices/Languages/Русский.xml new file mode 100644 index 0000000..a717c46 --- /dev/null +++ b/src/HTTPServices/Languages/Русский.xml @@ -0,0 +1,13 @@ + + + + + + Русский + + Adopted + 27b83b64-c15f-4ab2-95af-13baf11f9fe4 + ru + + + \ No newline at end of file