- В первой части мы создали каркас для Get метода в расширении конфигурации.
- Во второй части мы поработали с OData и создали обработку, получающую через HTTP-Сервис используя метод Get данные сформированные при помощи СКД.
- В третьей части мы поработали со всеми методами. Сделали пример формирующий данные при помощи СКД, работающий как через Get, так и через Post. Также поработали с длительными операциями.
В этой части поговорим о такой важной вещи как порционная передача данных. Работать будем в основном с методами GET и POST, немножко затронем OData.
HTTP-сервис будет в расширении конфигурации БСП 3.0.1.231 на платформе 8.3.12.1595.
Начнем.
Немножко про OData и порции.
Есть у OData сильный недостаток, если хотите его испытать сделайте запрос к самому большему объекту в вашей боевой базе, ну и попробуйте поработать. Вскоре пользователи прибегут к вам сами.
Для того чтобы такого не происходило нужно делать следующие вещи:
- Делайте выборку только по тем реквизитам, которые вам нужны. Для этого используйте $select.
- Перед тем как делать запрос уточните количество записей. Для этого используйте $count.
- count — Позволяет получить в качестве результата запроса размер выборки. При успешном выполнении, тело ответа должно содержать только число элементов коллекции, отформатированное как обычное число.
- Если записей много забирайте их порциями через $top и $skip.
- top — Ограничивает количество записей, возвращаемых при обращении к ресурсу.
- skip — Позволяет исключить из результата запроса первые несколько записей. Если параметры $top и $skip указываются одновременно, то параметр $skip будет применен раньше, чем параметр $top. Приоритет применения параметров не зависит от порядка их указания в теле запроса.
- Я бы еще рекомендовал использовать JSON, так как меньше весит, но тут на вкус и цвет…
Предлагаю сделать небольшую обработку, которая будет забирать порциями данные из справочника КлассификаторБанков, он самый большой в БСП. Порция по умолчанию будет равна 1000 элементов.
Воспользуемся обработкой Доступный состав стандартного интерфейса OData и дадим доступ к нужному нам справочнику.
Узнаем сколько в справочнике элементов. Наш запрос будет таким: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков/$count?$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
4774 элемента. Далее набросаем обработку.
Создаем реквизиты:
- КоличествоСтраниц – Число. Получаем путем округления в большую сторону количество элементовПорцию
- КоличествоЭлементов – Число. Количество элементов полученных по OData.
- ОбъектКонфигурации – Строка. Представление элемента в OData.
- Порция – Число. Количество элементов на странице.
- Результат – Строка.
- ТекущаяСтраница – Число.
- Селект — Строка. Кусок запроса с параметрами выборки. В нашем примере "$select=Ref_Key,Description,Code,DeletionMark,IsFolder&"
Создаем Команды:
- НачальнаяЗагрузка – Загружаем количество элементов и рассчитываем количество страниц.
- Вперед – Загружаем следующую порцию.
- Назад – загружаем предыдущую порцию.
Модуль формы
&НаКлиенте
Перем HTTPСоединение;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Значения по умолчанию
ОбъектКонфигурации = "Catalog_КлассификаторБанков";
Порция = 1000;
Селект = "$select=Ref_Key,Description,Code,DeletionMark,IsFolder&";
КонецПроцедуры
&НаКлиенте
Процедура НачальнаяЗагрузка(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
//Запрашиваем количество элементов $count
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "/$count?"
+ Селект
+ "$format=json;odata=nometadata";
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Ответочка = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответочка);
Попытка
//Считываем количество элементов
КоличествоЭлементов = ПрочитатьJSON(ЧтениеJSON);
Исключение
КоличествоЭлементов = 0;
КонецПопытки;
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки());
КонецПопытки;
Результат = "";
ТекущаяСтраница = 0;
//Проверяем корректность данных
Если Порция <> 0 и КоличествоЭлементов <> 0 Тогда
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Страница 0 из " +КоличествоСтраниц+ " страниц.";
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Истина;
Иначе
КоличествоСтраниц = 0;
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Найдено " + КоличествоЭлементов + " элементов. Порция="+Порция;
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Вперед(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница + 1;
Элементы.Назад.Видимость = Истина;
Если ТекущаяСтраница >= КоличествоСтраниц Тогда
Элементы.Вперед.Видимость = Ложь;
ТекущаяСтраница = КоличествоСтраниц;
КонецЕсли;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+ ?(ПустаяСтрока(Селект),"","&"+Селект)
//НЕОБЯЗАТЕЛЬНО: "&$orderby=Ref_Key asc" (для упорядочивания по возрастанию по Ref_Key)
+ "&$orderby=Ref_Key asc&$format=json;odata=nometadata";
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
КонецПроцедуры
&НаКлиенте
Процедура Назад(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница - 1;
Элементы.Вперед.Видимость = Истина;
Если ТекущаяСтраница < 2 Тогда
Элементы.Назад.Видимость = Ложь;
ТекущаяСтраница = 1;
КонецЕсли;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+ ?(ПустаяСтрока(Селект),"","&"+Селект)
//НЕОБЯЗАТЕЛЬНО: "&$orderby=Ref_Key asc" (для упорядочивания по возрастанию по Ref_Key)
+ "&$orderby=Ref_Key asc&$format=json;odata=nometadata";
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
КонецПроцедуры
//Подключаемся Новый HTTPСоединение
&НаКлиенте
Функция Подключиться()
//В тестовых обработках так делать можно, но когда делаете в рабочей такие вещи НЕДОПУСТИМЫ!
//Храните логины и пароли в недоступных для глаз местах! (https://its.1c.ru/db/v8std#content:2149184389:hdoc)
перПорт = 0;
перСервер = "127.0.0.1";
перПользователь = "Администратор";
перПароль = "";
Попытка
Если перПорт <= 0 Тогда
HTTPСоединение = Новый HTTPСоединение(перСервер,,перПользователь,перПароль);
Иначе
HTTPСоединение = Новый HTTPСоединение(перСервер,перПорт,перПользователь,перПароль);
КонецЕсли;
Возврат Истина;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецФункции
//Подчищаем соединение
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
HTTPСоединение = Неопределено;
КонецПроцедуры
Результат
Запрос: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков/$count?$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
Запрос: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков?$top=1000&$skip=0&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
Запрос: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков?$top=1000&$skip=4000&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
Таким образом мы организовали порционное считывание данных по OData.
Ограничения по размеру файловданных. Дробление и порции.
В третьей части мы вскользь уже говорили о том, что по средствам метода POST можно передавать большие объемы данных, но ограничение в объеме все же есть и у данного метода. Настройка ограничения по умолчанию в IIS равна 30000000(байт) или 28,61(мегабайт) и находится тут:
Для Apache по ограничениям не скажу, не использую его более 5-ти лет, поэтому не знаю, что там за это время изменилось.
- По поводу обхода ограничений можно почитать вот эту статью -> Передача больших пакетов через веб-сервисы. В статье описано дробление файла на пакеты и передача через веб сервис. Принцип дробления можно найти и в типовых конфигурациях.
- По работе с двоичными данными в http-сервисе можно посмотреть вот эту статью -> Средства работы с двоичными данными
Пример дробления файла
// Файл с сообщением обмена разделяется на части по 2 Мб
МассивЧастейФайла = РазделитьФайл(ИмяВременногоФайла, 2 * 1024 * 1024);
МассивЧастей = Новый Массив;
Для Каждого ИмяФайла Из МассивЧастейФайла Цикл
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
// Каждая часть сообщения максимально сжимается
МассивЧастей.Добавить(Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9) ) );
УдалитьФайлы(ИмяФайла);
КонецЦикла;
Как Вы понимаете в случае, когда данные передаются в виде разделенного файла, необходимо получить весь файл чтобы прочитать его содержимое.
Что делать, если нам нужно получить некий объем данных, невзирая на ограничения, но с возможностью чтения данных по частям?
Естественно речь идет про некую структуру данных в формате JSON или XML (есть варианты и других форматов, но нам это сейчас неинтересно). Будем использовать порции.
Предлагаю сделать через методы POST и GET нечто подобное, что мы сделали выше по OData.
Решим данную задачку двумя методами. Вариантов решения много, но я решил показать вариант, через запрос и вариант через план обмена.
1 Вариант. Через запрос.
Суть метода
//Сначала в &Ссылка подается ПустаяСсылка, потом последняя ссылка из последней порции
ВЫБРАТЬ ПЕРВЫЕ N-Элементов
Ссылка КАК Ссылка
ИЗ
[ИмяТаблицы]
ГДЕ
Ссылка > &Ссылка
УПОРЯДОЧИТЬ ПО
Ссылка
N-Элементов — Порция
[ИмяТаблицы] — Соответственно объект конфигурации, в нашем случае Справочник.КлассификаторБанков
Для начала давайте нарисуем сервис возвращающий количество элементов и массив последних ссылок в порциях. При этом массив с последними ссылками оставим на стороне сервера хранящего данные в справочнике PAPI_ХранилищеРезультатов, созданном в предыдущей статье (Часть 3). Сервис будет называться «ПолучитьКоличествоЭлементовВариантЗапрос», наименование объекта будем подавать параметром ItemName, количество объектов в порции будем подавать параметром top. Затем создадим метод «ПолучитьПорциюЭлементовВариантЗапроса» и будем подавать в него те же параметры, что и в предыдущем методе и номер страницы (порции) параметром page.
Правим справочник PAPI_ХранилищеРезультатов.
Добавляем реквизиты:
- МетодЗапроса – Строка(200).
- ПараметрыЗапроса – Строка(200).
- ДатаЗапроса – Дата и время. Будем считать, что данные актуальны в течение дня
Правим модуль PAPI_ОбщиеПроцедурыИФункции. Добавим в него несколько функций и процедуру по получению элементов. И вынесем в него часто встречающийся код по преобразованию в формат JSON.
Код модуля PAPI_ОбщиеПроцедурыИФункции
//Заполняем структуру ответа
Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета) Экспорт
СтруктураОтвет.КодОтвета = КодОтвета;
СтруктураОтвет.ТекстОшибки = ТекстОшибки;
СтруктураОтвет.Отработало = Отработало;
СтруктураОтвет.ДанныеОтвета = ДанныеОтвета;
КонецПроцедуры
Функция БазаФайловая()
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
// в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE=");
Если ПозицияПоиска = 1 тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
#Область ВспомогательныеПроцедурыФункцииМетодов
//Считываем или создаем элемент справочника PAPI_ХранилищеРезультатов
//Вспомогательная процедура методов: ПолучитьПорциюЭлементовВариантЗапроса, ПолучитьКоличествоЭлементовВариантЗапрос
Процедура ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет) Экспорт
НайденнаяСсылка = ПолучитьПредыдущийЗапрос(СтруктураЗапроса);
Если Не ЗначениеЗаполнено(НайденнаяСсылка) Тогда
КоличествоЭлементов = ПолучитьКоличествоЭлементов(СтруктураЗапроса.НаименованиеОбъекта);
Если КоличествоЭлементов = -1 Тогда
ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Объект: """+СтруктураЗапроса.НаименованиеОбъекта+""" не найден!",Ложь,"");
Иначе
МассивПоследних = Новый Массив;
МассивПоследних.Добавить(ПустаяСсылкаПоНаименованиеОбъекта(СтруктураЗапроса.НаименованиеОбъекта));
Если КоличествоЭлементов = 0 Тогда
КоличествоСтраниц = 0;
Иначе
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/СтруктураЗапроса.Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
//Заполняем МассивПоследних ссылок
ПродолжаемЗаполнять = Истина;
ПромежуточнаяСтруктура = Новый Структура("Продолжаем,Ссылка",Истина,Неопределено);
Пока ПродолжаемЗаполнять Цикл
ПромежуточнаяСтруктура =
ПолучитьПоследнийЭлементПорции(ПромежуточнаяСтруктура,СтруктураЗапроса.НаименованиеОбъекта,СтруктураЗапроса.Порция);
ПродолжаемЗаполнять = ПромежуточнаяСтруктура.Продолжаем;
Если ПродолжаемЗаполнять Тогда
МассивПоследних.Добавить(ПромежуточнаяСтруктура.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЕсли;
РезультатОтвет = Новый Структура("КоличествоЭлементов,МассивПоследних",
КоличествоЭлементов,
МассивПоследних);
ТекущийОбъект = Справочники.PAPI_ХранилищеРезультатов.СоздатьЭлемент();
ТекущийОбъект.МетодЗапроса = СтруктураЗапроса.МетодЗапроса;
ТекущийОбъект.ПараметрыЗапроса = СтруктураЗапроса.ПараметрыЗапроса;
ТекущийОбъект.ДатаЗапроса = СтруктураЗапроса.ДатаЗапроса;
ТекущийОбъект.УстановитьНовыйКод();
ТекущийОбъект.Результат = Новый ХранилищеЗначения(РезультатОтвет, Новый СжатиеДанных(9));
ТекущийОбъект.ОбменДанными.Загрузка = Истина;
ТекущийОбъект.Записать();
КонецЕсли;
Иначе
РезультатОтвет = НайденнаяСсылка.Результат.Получить();
КонецЕсли;
СтруктураЗапроса.Вставить("РезультатОтвет",РезультатОтвет)
КонецПроцедуры
#КонецОбласти
#Область РаботаСДанными
//Получаем дату из входных параметров
Функция ПолучитьДатуВремяИзСтроки(ДатаВремя) Экспорт
Результат = Неопределено;
ДатаВремя = СтрЗаменить(ДатаВремя, "-", "");
ДатаВремя = СтрЗаменить(ДатаВремя, ":", "");
Если СтрДлина(ДатаВремя) - Найти(ДатаВремя, " ") = 5 Тогда // время в формате Ч:ММ:СС
ДатаВремя = СтрЗаменить(ДатаВремя, " ", "0");
ИначеЕсли Найти(ДатаВремя, "T") > 0 Тогда //время в формате ГГГГММДДTЧЧММСС
ДатаВремя = СтрЗаменить(ДатаВремя, "T", "");
Иначе // время в формате ЧЧ:ММ:СС
ДатаВремя = СтрЗаменить(ДатаВремя, " ", "");
КонецЕсли;
ОписаниеТипа = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипа.ПривестиЗначение(ДатаВремя); // дата и время в виде "ГГГГММДДЧЧММСС"
Если Не ЗначениеЗаполнено(Результат) Тогда
Результат = ОписаниеТипа.ПривестиЗначение(Лев(ДатаВремя, 8)); // только дата "ГГГГММДД"
КонецЕсли;
Возврат Результат;
КонецФункции
//Получаем ПустуюСсылку
Функция ПустаяСсылкаПоНаименованиеОбъекта(НаименованиеОбъекта) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ЗНАЧЕНИЕ("+НаименованиеОбъекта+".ПустаяСсылка) как Ссылка";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
//Получаем ссылку на Справочник.PAPI_ХранилищеРезультатов по заданной структуре
Функция ПолучитьПредыдущийЗапрос(СтруктураЗапроса) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| PAPI_ХранилищеРезультатов.Ссылка КАК Ссылка
|ИЗ
| Справочник.PAPI_ХранилищеРезультатов КАК PAPI_ХранилищеРезультатов
|ГДЕ
| НЕ PAPI_ХранилищеРезультатов.ПометкаУдаления
| И PAPI_ХранилищеРезультатов.МетодЗапроса = &МетодЗапроса
| И PAPI_ХранилищеРезультатов.ПараметрыЗапроса = &ПараметрыЗапроса
| И PAPI_ХранилищеРезультатов.ДатаЗапроса МЕЖДУ &ДатаЗапросаН И &ДатаЗапросаК";
Запрос.УстановитьПараметр("ДатаЗапросаК", КонецДня(СтруктураЗапроса.ДатаЗапроса));
Запрос.УстановитьПараметр("ДатаЗапросаН", НачалоДня(СтруктураЗапроса.ДатаЗапроса));
Запрос.УстановитьПараметр("МетодЗапроса", СтруктураЗапроса.МетодЗапроса);
Запрос.УстановитьПараметр("ПараметрыЗапроса", СтруктураЗапроса.ПараметрыЗапроса);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.Ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
//Получить количество элементов запросом
Функция ПолучитьКоличествоЭлементов(НаименованиеОбъекта) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| [ИмяТаблицы]
|";
Если НЕ ПустаяСтрока(НаименованиеОбъекта) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Иначе
Возврат -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";
КонецФункции
#КонецОбласти
#Область РаботаСФоновымиЗаданиями
Функция НайтиЗадание(Идентификатор) Экспорт
// Считывает состояние фонового задания по переданному идентификатору.
//
// Параметры:
// Идентификатор - УникальныйИдентификатор - Идентификатор фонового задания.
//
// Возвращаемое значение:
// Неопределено - Задание не найдено.
// Структура - Сведения о задании.
// * Выполняется - Булево - Истина когда фоновое задание еще выполняется.
// * Успешно - Булево - Истина когда сеанс фонового задания завершился без ошибок.
// * Ошибка - Строка, ИнформацияОбОшибке, Неопределено - Описание ошибки.
//
УстановитьПривилегированныйРежим(Истина);
Результат = Новый Структура("Выполняется, Успех, Ошибка", Ложь, Ложь, Неопределено);
Если Идентификатор = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
Если Задание = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Результат.Выполняется = Истина;
Иначе
Результат.Выполняется = Ложь;
Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Результат.Успех = Истина;
Иначе
Результат.Успех = Ложь;
Результат.Ошибка = Задание.ИнформацияОбОшибке;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
Правим модули PAPI_ОбработкаМетодовGET и PAPI_ОбработкаМетодовPOST и PAPI_ОбработкаУниверсальныхМетодов. Добавляем в него наши методы.
Код модуля PAPI_ОбработкаМетодовGET
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовGET(СтруктураВхПараметров) Экспорт
//структура ответа. Собственна нужна для формирования ответа
СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
//Операцию нужно выполнить используя БСП:Базовая функциональностьДлительные операции++
#Область ПримерыЧасть3
ВФоне = СтруктураВхПараметров.ПараметрыЗапроса.Получить("BTask");
Если не ВФоне = Неопределено Тогда
ВФоне = Булево(ВФоне);
Если ВФоне = Истина Тогда
УникальныйИдентификатор = Новый УникальныйИдентификатор;
//Уникальный адрес результата
АдресРезультата = СтруктураВхПараметров.ИмяМетода+"_"+Строка(УникальныйИдентификатор);
//Подгатавливаем параметры для Длительной операции
ПараметрыЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыЗапуска.НаименованиеФоновогоЗадания = "Выполнение_" + АдресРезультата;
ПараметрыЗапуска.ОжидатьЗавершение = Ложь;
ПараметрыЗапуска.КлючФоновогоЗадания = УникальныйИдентификатор;
ПараметрыЗапуска.ЗапуститьВФоне = Истина;
//Добавляем адрес в структуру
СтруктураВхПараметров.Вставить("АдресРезультата",АдресРезультата);
//Запускаем метод в фоне
РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(
"PAPI_АсинхронныеОперации.ФЗ_ВыполнитьМетод_ДлительнаяОперация",
СтруктураВхПараметров,
ПараметрыЗапуска);
//Проверяем что задание запустилось
Если РезультатФоновогоЗадания.Статус = "Ошибка" Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Ошибка при формировании: "+Строка(РезультатФоновогоЗадания.КраткоеПредставлениеОшибки),Ложь,"");
Возврат СтруктураОтвет;
КонецЕсли;
ФоновоеЗаданиеИдентификатор = РезультатФоновогоЗадания.ИдентификаторЗадания;
АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" +
"Result_Key=" + АдресРезультата + "&" +
"Task_Key=" + Строка(ФоновоеЗаданиеИдентификатор);
//Формируем html ответ
СтруктураОтвет.ДанныеОтвета = "<html>
|<body>
| <b>Задание отправлено на выполнение!</b><br>
| <p>Идентификатор фонового задания = " + Строка(ФоновоеЗаданиеИдентификатор) + "<br>
| Адрес хранилища результата = " + АдресРезультата + "</p>
| <p><a href=""" + АдресСсылки + """>Ссылка на получение результата</a></p>
|</body>
|</html>";
Возврат СтруктураОтвет;
КонецЕсли;
КонецЕсли;
#КонецОбласти
//Операцию нужно выполнить используя БСП:Базовая функциональностьДлительные операции--
#Область ПримерыЧасть1
//Переправляем на нужный метод
Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Список") Тогда
ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров);
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Документ") Тогда
ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
#Область ПримерыЧасть2
//Получаем доступные остатки по складу в формате JSON (ERP, УТ, КА)
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ОстаткиИДоступностьТоваровПоСкладу") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
#Область ПримерыЧасть3
//Получаем список заданий за период (БСП)
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров);
//Проверяем фоновое задание. Если Выполнено забираем результат
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ФоновоеЗаданиеПроверить") Тогда
ПроверитьФоновоеЗадание(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),Ложь,"");
КонецЕсли;
Возврат СтруктураОтвет;
КонецФункции
#Область Методы
#Область ПримерыЧасть1
Процедура ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров)
Результат = "Расходная накладная, 1, 01.01.2014
|Расходная накладная, 2, 01.01.2014";
СтруктураОтвет.ДанныеОтвета = Результат;
КонецПроцедуры
Процедура ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров)
//ПраметрыЗапроса - number
ПарНомер = СтруктураВхПараметров.ПараметрыЗапроса.Получить("number");
Номер = Число(?(ПарНомер=Неопределено,0,ПарНомер));
Если Номер > 2 Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует документ с номером: " + Номер,ложь,"");
Иначе
Если Номер = 1 Тогда
Результат = "Расходная накладная, 1, 01.01.2014";
Иначе
Результат = "Расходная накладная, 2, 01.01.2014";
КонецЕсли;
СтруктураОтвет.ДанныеОтвета = Результат;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПримерыЧасть3
Процедура ПроверитьФоновоеЗадание(СтруктураОтвет,СтруктураВхПараметров)
перФоновоеЗаданиеИдентификатор = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Task_Key");
АдресРезультата = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Result_Key");
//Проверяем фоновое задание
Если перФоновоеЗаданиеИдентификатор = Неопределено Тогда
Задание = PAPI_ОбщиеПроцедурыИФункции.НайтиЗадание(Неопределено);
Иначе
//Получаем Уникальный идентификатор задания
ФоновоеЗаданиеИдентификатор = Новый УникальныйИдентификатор(перФоновоеЗаданиеИдентификатор);
Задание = PAPI_ОбщиеПроцедурыИФункции.НайтиЗадание(ФоновоеЗаданиеИдентификатор);
КонецЕсли;
//При отсутствии адреса результата прерываем
Если АдресРезультата = Неопределено Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Result_Key""",Ложь,"");
Возврат;
КонецЕсли;
Если Не Задание.Выполняется Тогда
Попытка
НайденнаяСсылка = Справочники.PAPI_ХранилищеРезультатов.НайтиПоРеквизиту("АдресРезультата",АдресРезультата);
Если НайденнаяСсылка = Справочники.PAPI_ХранилищеРезультатов.ПустаяСсылка() Тогда
//Можно вынести в отдельную функцию
АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" +
"Result_Key=" + АдресРезультата + ?(ЗначениеЗаполнено(перФоновоеЗаданиеИдентификатор),
"&Task_Key=" + перФоновоеЗаданиеИдентификатор,"");
//Формируем html ответ
СтруктураОтвет.ДанныеОтвета = "<html>
|<body>
| <b>Задание еще выполняется, попробуйте получить результат позже!</b><br>
| <p>Идентификатор фонового задания = " + перФоновоеЗаданиеИдентификатор + "<br>
| Адрес хранилища результата = " + АдресРезультата + "</p>
|<p><a href=""" + АдресСсылки + """>Ссылка на получение результата</a></p>
|</body>
|</html>";
Иначе
СтруктураОтвет = НайденнаяСсылка.Результат.Получить();
КонецЕсли;
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Ошибка при формировании: "+ОписаниеОшибки(),Ложь,"");
КонецПопытки;
Иначе
//Задание еще в процессе
АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" +
"Result_Key=" + АдресРезультата + ?(ЗначениеЗаполнено(перФоновоеЗаданиеИдентификатор),
"&Task_Key=" + перФоновоеЗаданиеИдентификатор,"");
//Формируем html ответ
СтруктураОтвет.ДанныеОтвета = "<html>
|<body>
| <b>Задание еще выполняется, попробуйте получить результат позже!</b><br>
| <p>Идентификатор фонового задания = " + перФоновоеЗаданиеИдентификатор + "<br>
| Адрес хранилища результата = " + АдресРезультата + "</p>
|<p><a href=""" + АдресСсылки + """>Ссылка на получение результата</a></p>
|</body>
|</html>";
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
Код модуля PAPI_ОбработкаМетодовPOST
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовPOST(СтруктураВхПараметров) Экспорт
//структура ответа. Собственна нужна для формирования ответа
СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
//Переправляем на нужный метод
#Область ПримерыЧасть3
//Получаем список заданий за период (БСП)
Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),ложь,"");
КонецЕсли;
Возврат СтруктураОтвет;
КонецФункции
Код модуля PAPI_ОбработкаУниверсальныхМетодов
#Область Методы
//Пример из Части 2. Метод написан под ERP, будет работать в УТ и КА
#Область ПримерыЧасть2
Процедура ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//ПраметрыЗапроса - number
Склад_Key = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Ref_Key");
Если не Склад_Key = Неопределено Тогда
//Получаем Склад
Попытка
Склад = XMLЗначение(Тип("СправочникСсылка.Склады"), Склад_Key);
Исключение
Склад = Неопределено;
КонецПопытки;
Если ЗначениеЗаполнено(Склад) Тогда
//Получаем схему компоновки и вариант отчета
//СхемаКомпоновки = Отчеты.ОстаткиИДоступностьТоваров.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваров");
СхемаКомпоновки = Отчеты.PAPI_ХранилищеМакетов.ПолучитьМакет("СКД_ОстаткиИДоступностьТоваров_HTTP");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваровНеТаблица");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
//Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"++
ТекстЗапроса = СхемаКомпоновки.НаборыДанных.Основной.Запрос;
ТекстЗапроса = СтрЗаменить(
ТекстЗапроса,
"&ТекстЗапросаВесНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура"));
ТекстЗапроса = СтрЗаменить(
ТекстЗапроса,
"&ТекстЗапросаОбъемНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура"));
СхемаКомпоновки.НаборыДанных.Основной.Запрос = ТекстЗапроса;
//Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"--
ПрараметрОтбора = НастройкиКомпоновки.Отбор.Элементы;
СкладПолеКомпоновки = Новый ПолеКомпоновкиДанных("Склад");
Для Каждого СтрокаОтбора из ПрараметрОтбора Цикл
Если СтрокаОтбора.ЛевоеЗначение = СкладПолеКомпоновки Тогда
СтрокаОтбора.Использование = Истина;
СтрокаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
СтрокаОтбора.ПравоеЗначение = Склад;
КонецЕсли;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоЗначений = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Обходим дерево и формируем РезультатОтвет
РезультатОтвет = Новый Массив;
Для Каждого ВерхнийУровеньДерева Из ДеревоЗначений.Строки Цикл
Для Каждого ПодчиненныйУровеньДерева Из ВерхнийУровеньДерева.Строки Цикл
Если ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Номенклатура)
И ТипЗнч(ПодчиненныйУровеньДерева.Номенклатура) = Тип("СправочникСсылка.Номенклатура")
Тогда
РезультатОтвет.Добавить(Новый Структура("ИмяЗначение,Артикул,Guid,ДоступноСейчас,Остаток",
ПодчиненныйУровеньДерева.Номенклатура.Наименование +
?(ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Характеристика),
","+Строка(ПодчиненныйУровеньДерева.Характеристика),""),
ПодчиненныйУровеньДерева.НоменклатураАртикул,
XMLСтрока(ПодчиненныйУровеньДерева.Номенклатура),
ПодчиненныйУровеньДерева.ДоступноСейчас,
ПодчиненныйУровеньДерева.ВНаличии));
КонецЕсли;
КонецЦикла;
КонецЦикла;
//РезультатОтвет в JSON
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
СтруктураОтвет.ДанныеОтвета = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет);
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не заполнен или неверно заполнен параметр ""Ref_Key""",ложь,"");
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Ref_Key""",ложь,"");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
//Пример из Части 3. Метод написан под Демо БСП, следовательно будет работать в конфигурациях с БСП
#Область ПримерыЧасть3
Процедура ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНачалоПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("StartPeriod");
НачалоПериода = ?(перНачалоПериода = Неопределено,
Неопределено,PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перНачалоПериода));
перКонецПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("EndPeriod");
КонецПериода = ?(перКонецПериода = Неопределено,
Неопределено,PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перКонецПериода));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НачалоПериода = ?(ТелоЗапросаJSON.Свойство("StartPeriod"),
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.StartPeriod),Неопределено);
КонецПериода = ?(ТелоЗапросаJSON.Свойство("EndPeriod"),
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.EndPeriod),Неопределено);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
//Получаем схему компоновки и вариант отчета
СхемаКомпоновки = Отчеты.Задания.ПолучитьМакет("Макет");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("СписокЗаданий");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
//Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"++
ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач");
СрокИсполнения = СхемаКомпоновки.НаборыДанных[0].Поля.Найти("СрокИсполнения");
СрокИсполнения.Оформление.УстановитьЗначениеПараметра("Формат", ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"));
//Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"--
Параметр = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти("Период");
Если Параметр <> Неопределено Тогда
Параметр.Использование = ?(ЗначениеЗаполнено(НачалоПериода)
ИЛИ ЗначениеЗаполнено(КонецПериода),Истина,Ложь);
ПериодВрем = Новый СтандартныйПериод;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
ПериодВрем.ДатаНачала = НачалоДня(НачалоПериода);
КонецЕсли;
Если ЗначениеЗаполнено(КонецПериода) Тогда
ПериодВрем.ДатаОкончания = КонецДня(КонецПериода);
КонецЕсли;
Если Параметр.Использование Тогда
Параметр.Значение = ПериодВрем;
КонецЕсли;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Обходим ТЗ и формируем РезультатОтвет
РезультатОтвет = Новый Массив;
Для Каждого СтрокаТЗ Из ТЗ Цикл
Если ЗначениеЗаполнено(СтрокаТЗ.Ссылка)
И ТипЗнч(СтрокаТЗ.Ссылка) = Тип("БизнесПроцессСсылка.Задание")
Тогда
РезультатОтвет.Добавить(Новый Структура("Задание,Guid,Автор,Дата,Выполнено",
СтрокаТЗ.Ссылка.Наименование,
XMLСтрока(СтрокаТЗ.Ссылка),
СтрокаТЗ.Автор.Наименование,
СтрокаТЗ.Дата,
СтрокаТЗ.Выполнено));
КонецЕсли;
КонецЦикла;
//РезультатОтвет в JSON
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
СтруктураОтвет.ДанныеОтвета = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет);
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
КонецПроцедуры
#КонецОбласти
//Пример из Части 4. Метод написан получения количество элементов по типу объекта
Процедура ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция",
ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"),
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
ТекущаяДатаСеанса(),
НаименованиеОбъекта,
Порция);
//Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня.
//Тоесть на следующий день данные будут неактуальны
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
КоличествоЭлементов = ?(СтруктураЗапроса.РезультатОтвет.Свойство("КоличествоЭлементов"),
СтруктураЗапроса.РезультатОтвет.КоличествоЭлементов,
0);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,КоличествоЭлементов);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод написан получения порции
Процедура ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
перСтраница = СтруктураВхПараметров.ПараметрыЗапроса.Получить("page");
текСтраница = ?(перСтраница = Неопределено,0,Число(перСтраница));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
текСтраница = ?(ТелоЗапросаJSON.Свойство("page"),ТелоЗапросаJSON.page,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0
И текСтраница >= 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция,Страница",
ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"),
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
ТекущаяДатаСеанса(),
НаименованиеОбъекта,
Порция,
текСтраница);
//Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня.
//Тоесть на следующий день данные будут неактуальны
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
МассивПоследних = ?(СтруктураЗапроса.РезультатОтвет.Свойство("МассивПоследних"),
СтруктураЗапроса.РезультатОтвет.МассивПоследних,
Новый Массив);
РезультатОтвет = Новый Массив;
Если МассивПоследних.Количество() > 0
И МассивПоследних.Количество() >= текСтраница Тогда
//Проверяем справочник Иерархический или нет
перЕстьГруппы = ?(МассивПоследних[0].Метаданные().Иерархический,Истина,Ложь);
//Получаем нужную порцию
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ "+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")+"
| Ссылка КАК Ссылка,
| ПометкаУдаления КАК DeletionMark,
| Код КАК Code,
| Наименование КАК Description
| //[ЕстьГруппы]//, ЭтоГруппа КАК IsFolder
|ИЗ
| [ИмяТаблицы] ГДЕ Ссылка > &Ссылка УПОРЯДОЧИТЬ ПО Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Если перЕстьГруппы Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "//[ЕстьГруппы]//", "");
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка",МассивПоследних[текСтраница]);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
текЭлМасс = Новый Структура;
текЭлМасс.Вставить("Ref_Key", XMLСтрока(ВыборкаДетальныеЗаписи.Ссылка));
текЭлМасс.Вставить("Description", ВыборкаДетальныеЗаписи.Description);
текЭлМасс.Вставить("Code", ВыборкаДетальныеЗаписи.Code);
текЭлМасс.Вставить("DeletionMark", ВыборкаДетальныеЗаписи.DeletionMark);
Если перЕстьГруппы Тогда
текЭлМасс.Вставить("IsFolder", ВыборкаДетальныеЗаписи.IsFolder);
КонецЕсли;
РезультатОтвет.Добавить(текЭлМасс);
КонецЦикла;
КонецЕсли;
стрРезультатОтвет = Новый Структура("value",РезультатОтвет);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
//Делаем красивый вывод данных (Эстетика чисто для глаза)
ВхПараметры.ПереносСтрок = ПереносСтрокJSON.Авто;
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,стрРезультатОтвет);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0 или page<0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Правим обработку, которую делали ранее для примера с OData.
Создаем реквизит:
- МетодСервиса – Строка. Будет хранить список значений (Пример 1 — OData(1_1), Пример 1 — Get(1_2), Пример 1 — Post(1_3))
Добавляем декорацию (ДекорацияРазмерОтвета) для вывода "Content-Length" из заголовка ответа и меняем модуль формы.
Модуль формы
&НаКлиенте
Перем HTTPСоединение;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Значения по умолчанию
ОбъектКонфигурации = "Catalog_КлассификаторБанков";
Порция = 1000;
Селект = "$select=Ref_Key,Description,Code,DeletionMark,IsFolder&";
//Пример 1 - OData(1_1)
//Пример 1 - Get(1_2)
//Пример 1 - Post(1_3)
//Первоначальное заполнение МетодСервиса
ЭлСписка = Новый СписокЗначений;
ЭлСписка.Добавить("1_1","Пример 1 - OData");
МетодСервиса = ЭлСписка[0].Значение;
КонецПроцедуры
&НаКлиенте
Процедура НачальнаяЗагрузка(Команда)
ОчиститьСообщения();
Результат = "";
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Если МетодСервиса = "1_1" Тогда
//Запрашиваем количество элементов $count
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "/$count?"
+ Селект
+ "$format=json;odata=nometadata";
ИначеЕсли МетодСервиса = "1_2" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьКоличествоЭлементовВариантЗапрос?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "1_3" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьКоличествоЭлементовВариантЗапрос";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Иначе
Сообщить("Не заполнен ""Метод сервиса""!");
Возврат;
КонецЕсли;
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
//POST или GET
Если МетодСервиса = "1_3" Тогда
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
Иначе
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КонецЕсли;
перРазмерОтвета = HTTPОтвет.Заголовки.Получить("Content-Length");
РазмерОтвета = ?(не перРазмерОтвета = Неопределено,Число(перРазмерОтвета),0);
//Получаем ответ или текст ошибки
Ответочка = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Результат = Ответочка;
Если HTTPОтвет.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответочка);
Попытка
//Считываем количество элементов
КоличествоЭлементов = ПрочитатьJSON(ЧтениеJSON);
Исключение
КоличествоЭлементов = 0;
КонецПопытки;
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки());
КонецПопытки;
ТекущаяСтраница = 0;
//Проверяем корректность данных
Если Порция <> 0 и КоличествоЭлементов <> 0 Тогда
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Страница 0 из " +КоличествоСтраниц+ " страниц.";
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Истина;
Иначе
КоличествоСтраниц = 0;
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Найдено " + КоличествоЭлементов + " элементов. Порция="+Порция;
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Ложь;
КонецЕсли;
Элементы.ДекорацияРазмерОтвета.Заголовок = "Размер ответа " +РазмерОтвета+ " байт.";
КонецПроцедуры
&НаКлиенте
Процедура Вперед(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница + 1;
Элементы.Назад.Видимость = Истина;
Если ТекущаяСтраница >= КоличествоСтраниц Тогда
Элементы.Вперед.Видимость = Ложь;
ТекущаяСтраница = КоличествоСтраниц;
КонецЕсли;
page = ТекущаяСтраница - 1;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
Если МетодСервиса = "1_1" Тогда
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+ ?(ПустаяСтрока(Селект),"","&"+Селект)
//НЕОБЯЗАТЕЛЬНО: "&$orderby=Ref_Key asc" (для упорядочивания по возрастанию по Ref_Key)
+ "&$orderby=Ref_Key asc&$format=json;odata=nometadata";
ИначеЕсли МетодСервиса = "1_2" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&page="
+ Формат(page, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "1_3" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
СтруктураЗапроса.Вставить("page",page);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Иначе
Сообщить("Не заполнен ""Метод сервиса""!");
Возврат;
КонецЕсли;
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
//POST или GET
Если МетодСервиса = "1_3" Тогда
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
Иначе
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КонецЕсли;
перРазмерОтвета = HTTPОтвет.Заголовки.Получить("Content-Length");
РазмерОтвета = ?(не перРазмерОтвета = Неопределено,Число(перРазмерОтвета),0);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
РазмерОтвета = 0;
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
Элементы.ДекорацияРазмерОтвета.Заголовок = "Размер ответа " +РазмерОтвета+ " байт.";
КонецПроцедуры
&НаКлиенте
Процедура Назад(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница - 1;
Элементы.Вперед.Видимость = Истина;
Если ТекущаяСтраница < 2 Тогда
Элементы.Назад.Видимость = Ложь;
ТекущаяСтраница = 1;
КонецЕсли;
page = ТекущаяСтраница - 1;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
Если МетодСервиса = "1_1" Тогда
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+ ?(ПустаяСтрока(Селект),"","&"+Селект)
//НЕОБЯЗАТЕЛЬНО: "&$orderby=Ref_Key asc" (для упорядочивания по возрастанию по Ref_Key)
+ "&$orderby=Ref_Key asc&$format=json;odata=nometadata";
ИначеЕсли МетодСервиса = "1_2" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&page="
+ Формат(page, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "1_3" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
СтруктураЗапроса.Вставить("page",page);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Иначе
Сообщить("Не заполнен ""Метод сервиса""!");
Возврат;
КонецЕсли;
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
//POST или GET
Если МетодСервиса = "1_3" Тогда
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
Иначе
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КонецЕсли;
перРазмерОтвета = HTTPОтвет.Заголовки.Получить("Content-Length");
РазмерОтвета = ?(не перРазмерОтвета = Неопределено,Число(перРазмерОтвета),0);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
РазмерОтвета = 0;
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
Элементы.ДекорацияРазмерОтвета.Заголовок = "Размер ответа " +РазмерОтвета+ " байт.";
КонецПроцедуры
//Подключаемся Новый HTTPСоединение
&НаКлиенте
Функция Подключиться()
//В тестовых обработках так делать можно, но когда делаете в рабочей такие вещи НЕДОПУСТИМЫ!
//Храните логины и пароли в недоступных для глаз местах! (https://its.1c.ru/db/v8std#content:2149184389:hdoc)
перПорт = 0;
перСервер = "127.0.0.1";
перПользователь = "Администратор";
перПароль = "";
Попытка
Если перПорт <= 0 Тогда
HTTPСоединение = Новый HTTPСоединение(перСервер,,перПользователь,перПароль);
Иначе
HTTPСоединение = Новый HTTPСоединение(перСервер,перПорт,перПользователь,перПароль);
КонецЕсли;
Возврат Истина;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецФункции
//Подчищаем соединение
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
HTTPСоединение = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура МетодСервисаПриИзменении(Элемент)
//OData или нет
Если МетодСервиса = "1_1" Тогда
Если ОбъектКонфигурации <> "Catalog_КлассификаторБанков" Тогда
ОбъектКонфигурации = "Catalog_КлассификаторБанков";
КонецЕсли;
Иначе
Если ОбъектКонфигурации <> "Справочники.КлассификаторБанков" Тогда
ОбъектКонфигурации = "Справочник.КлассификаторБанков";
КонецЕсли;
КонецЕсли;
//ВСЕ ЧИСТИМ++
ТекущаяСтраница = 0;
КоличествоСтраниц = 0;
Результат = "";
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "";
Элементы.ДекорацияРазмерОтвета.Заголовок = "";
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Ложь;
//ВСЕ ЧИСТИМ--
КонецПроцедуры
Результат
OData:
GET:
POST:
- На самом деле можно еще было бы создать регламент при помощи дополнительной обработки по очистке старых результатов.
- Или создать механизм, который собирал бы количество обращений в день в разрезе параметров запроса и метода, а далее с утра регламентом подготавливал результаты для самых "горячих запросов".
- Так же можно было создать, например регистр сведений, который хранил порции по результатам и тогда вычисления на сервере сводились бы к минимуму по данным запросам.
Данный метод плох тем, что если в базе часто создаются элементы, тогда результат будет непредсказуемым!
2 Вариант. Через Планы обмена.
Тут все просто. Регистрируем все на узле и бьем на сообщения в зависимости от порции.
Давайте нарисуем сервис возвращающий количество элементов и регистрирующий элементы справочника на узле. Будет использован план обмена _ДемоАвтономнаяРабота из БСП. Сервис будет называться «ПолучитьКоличествоЭлементовВариантПланОбмена», наименование объекта будем подавать параметром ItemName, количество объектов в порции будем подавать параметром top. Затем создадим метод «ПолучитьПорциюЭлементовВариантПланОбмена» и будем подавать в него те же параметры, что и в предыдущем методе и номер страницы (порции) параметром page.
Правим модуль PAPI_ОбщиеПроцедурыИФункции. Добавим в него Область РаботаСПланОбмена и Вспомогательную процедуру.
Код модуля PAPI_ОбщиеПроцедурыИФункции
//Заполняем структуру ответа
Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета) Экспорт
СтруктураОтвет.КодОтвета = КодОтвета;
СтруктураОтвет.ТекстОшибки = ТекстОшибки;
СтруктураОтвет.Отработало = Отработало;
СтруктураОтвет.ДанныеОтвета = ДанныеОтвета;
КонецПроцедуры
Функция БазаФайловая()
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
// в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE=");
Если ПозицияПоиска = 1 тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
#Область ВспомогательныеПроцедурыФункцииМетодов
//Считываем или создаем элемент справочника PAPI_ХранилищеРезультатов
//Вспомогательная процедура методов: ПолучитьПорциюЭлементовВариантЗапроса, ПолучитьКоличествоЭлементовВариантЗапрос
Процедура ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет) Экспорт
НайденнаяСсылка = ПолучитьПредыдущийЗапрос(СтруктураЗапроса);
Если Не ЗначениеЗаполнено(НайденнаяСсылка) Тогда
КоличествоЭлементов = ПолучитьКоличествоЭлементов(СтруктураЗапроса.НаименованиеОбъекта);
Если КоличествоЭлементов = -1 Тогда
ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Объект: """+СтруктураЗапроса.НаименованиеОбъекта+""" не найден!",Ложь,"");
Иначе
МассивПоследних = Новый Массив;
МассивПоследних.Добавить(ПустаяСсылкаПоНаименованиеОбъекта(СтруктураЗапроса.НаименованиеОбъекта));
Если КоличествоЭлементов = 0 Тогда
КоличествоСтраниц = 0;
Иначе
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/СтруктураЗапроса.Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
//Заполняем МассивПоследних ссылок
ПродолжаемЗаполнять = Истина;
ПромежуточнаяСтруктура = Новый Структура("Продолжаем,Ссылка",Истина,Неопределено);
Пока ПродолжаемЗаполнять Цикл
ПромежуточнаяСтруктура =
ПолучитьПоследнийЭлементПорции(ПромежуточнаяСтруктура,СтруктураЗапроса.НаименованиеОбъекта,СтруктураЗапроса.Порция);
ПродолжаемЗаполнять = ПромежуточнаяСтруктура.Продолжаем;
Если ПродолжаемЗаполнять Тогда
МассивПоследних.Добавить(ПромежуточнаяСтруктура.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЕсли;
РезультатОтвет = Новый Структура("КоличествоЭлементов,МассивПоследних",
КоличествоЭлементов,
МассивПоследних);
ТекущийОбъект = Справочники.PAPI_ХранилищеРезультатов.СоздатьЭлемент();
ТекущийОбъект.МетодЗапроса = СтруктураЗапроса.МетодЗапроса;
ТекущийОбъект.ПараметрыЗапроса = СтруктураЗапроса.ПараметрыЗапроса;
ТекущийОбъект.ДатаЗапроса = СтруктураЗапроса.ДатаЗапроса;
ТекущийОбъект.УстановитьНовыйКод();
ТекущийОбъект.Результат = Новый ХранилищеЗначения(РезультатОтвет, Новый СжатиеДанных(9));
ТекущийОбъект.ОбменДанными.Загрузка = Истина;
ТекущийОбъект.Записать();
КонецЕсли;
Иначе
РезультатОтвет = НайденнаяСсылка.Результат.Получить();
КонецЕсли;
СтруктураЗапроса.Вставить("РезультатОтвет",РезультатОтвет)
КонецПроцедуры
//Возвращаем количество элементов и регистрируем элементы на узле
Процедура ПолучитьИлиЗаписатьУзел(СтруктураЗапроса,СтруктураОтвет) Экспорт
перНомерОтправленного = 0;
Узел = ПланыОбмена._ДемоАвтономнаяРабота.НайтиПоНаименованию(СтруктураЗапроса.НаименованиеУзла);
Если не ЗначениеЗаполнено(Узел) Тогда
УзелОбъект = ПланыОбмена._ДемоАвтономнаяРабота.СоздатьУзел();
УзелОбъект.Код = Строка(Новый УникальныйИдентификатор);
УзелОбъект.Наименование = СтруктураЗапроса.НаименованиеУзла;
УзелОбъект.ИспользоватьОтборПоОрганизациям = Ложь;
УзелОбъект.РегистрироватьИзменения = Истина;
Попытка
УзелОбъект.Записать();
Узел = УзелОбъект.Ссылка;
Исключение
ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
406,ОписаниеОшибки(),Ложь,"");
КонецПопытки;
Иначе
Попытка
//Чищу на узле все, НО это для примера, а так это лишнее.
//Нужно не чистить а распредилять новые элементы в новые сообщения!
ПланыОбмена.УдалитьРегистрациюИзменений(Узел,Неопределено);
Исключение
ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
406,ОписаниеОшибки(),Ложь,"");
КонецПопытки
КонецЕсли;
Если СтруктураОтвет.Отработало Тогда
Попытка
КлассификаторБанков = Метаданные.Справочники.КлассификаторБанков;
ПланыОбмена.ЗарегистрироватьИзменения(Узел, КлассификаторБанков);
Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| [ИмяТаблицы].Изменения
|ГДЕ
| Узел = &Узел";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", СтруктураЗапроса.НаименованиеОбъекта);
Запрос.УстановитьПараметр("Узел", Узел);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
КоличествоЭлементов = 0;
Иначе
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
КоличествоЭлементов = ВыборкаДетальныеЗаписи.Количество;
Иначе
КоличествоЭлементов = 0;
КонецЕсли;
КонецЕсли;
Если КоличествоЭлементов = 0 Тогда
КоличествоСтраниц = 0;
Иначе
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/СтруктураЗапроса.Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
КонецЕсли;
ОбъектыРегистрации = Новый Массив;
Пока КоличествоСтраниц>0 Цикл
ПолучитьНовыеДанныеИзмененийНаУзле(Узел,СтруктураЗапроса.НаименованиеОбъекта,ОбъектыРегистрации,СтруктураЗапроса.Порция);
Если ОбъектыРегистрации.Количество()>0 Тогда
перНомерОтправленного = перНомерОтправленного + 1;
//Меняем номера
ПланыОбмена.ВыбратьИзменения(Узел, перНомерОтправленного, ОбъектыРегистрации);
КонецЕсли;
КоличествоСтраниц = КоличествоСтраниц - 1;
ОбъектыРегистрации.Очистить();
КонецЦикла;
Исключение
КоличествоЭлементов = 0;
ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
406,ОписаниеОшибки(),Ложь,"");
КонецПопытки;
Иначе
КоличествоЭлементов = 0;
КонецЕсли;
СтруктураЗапроса.Вставить("КоличествоЭлементов",КоличествоЭлементов)
КонецПроцедуры
#КонецОбласти
#Область РаботаСПланОбмена
//Забираем порционно данные с узла у которых номер сообщения 0 или null
Процедура ПолучитьНовыеДанныеИзмененийНаУзле(Узел,НаименованиеОбъекта,ОбъектыРегистрации,Порция)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ "+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")+"
| ИскомыйОбъект.Ссылка как Ссылка
|ИЗ
| [ИмяТаблицы].Изменения КАК ИскомыйОбъект
|ГДЕ
| ИскомыйОбъект.Узел = &Узел
| И (ИскомыйОбъект.НомерСообщения = 0 ИЛИ ИскомыйОбъект.НомерСообщения Есть Null)";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Запрос.УстановитьПараметр("Узел", Узел);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбъектыРегистрации.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
КонецПроцедуры
//Забираемданные с узла по номеру сообщения
Процедура ПолучитьДанныеСУзлаПоНомеруСообщения(Узел,НаименованиеОбъекта,ОбъектыРегистрации,НомерСообщения) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ИскомыйОбъект.Ссылка как Ссылка
|ИЗ
| [ИмяТаблицы].Изменения КАК ИскомыйОбъект
|ГДЕ
| ИскомыйОбъект.Узел = &Узел
| И ИскомыйОбъект.НомерСообщения = &НомерСообщения";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Запрос.УстановитьПараметр("Узел", Узел);
Запрос.УстановитьПараметр("НомерСообщения", НомерСообщения);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбъектыРегистрации.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область РаботаСДанными
//Получаем дату из входных параметров
Функция ПолучитьДатуВремяИзСтроки(ДатаВремя) Экспорт
Результат = Неопределено;
ДатаВремя = СтрЗаменить(ДатаВремя, "-", "");
ДатаВремя = СтрЗаменить(ДатаВремя, ":", "");
Если СтрДлина(ДатаВремя) - Найти(ДатаВремя, " ") = 5 Тогда // время в формате Ч:ММ:СС
ДатаВремя = СтрЗаменить(ДатаВремя, " ", "0");
ИначеЕсли Найти(ДатаВремя, "T") > 0 Тогда //время в формате ГГГГММДДTЧЧММСС
ДатаВремя = СтрЗаменить(ДатаВремя, "T", "");
Иначе // время в формате ЧЧ:ММ:СС
ДатаВремя = СтрЗаменить(ДатаВремя, " ", "");
КонецЕсли;
ОписаниеТипа = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипа.ПривестиЗначение(ДатаВремя); // дата и время в виде "ГГГГММДДЧЧММСС"
Если Не ЗначениеЗаполнено(Результат) Тогда
Результат = ОписаниеТипа.ПривестиЗначение(Лев(ДатаВремя, 8)); // только дата "ГГГГММДД"
КонецЕсли;
Возврат Результат;
КонецФункции
//Получаем ПустуюСсылку
Функция ПустаяСсылкаПоНаименованиеОбъекта(НаименованиеОбъекта) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ЗНАЧЕНИЕ("+НаименованиеОбъекта+".ПустаяСсылка) как Ссылка";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
//Получаем ссылку на Справочник.PAPI_ХранилищеРезультатов по заданной структуре
Функция ПолучитьПредыдущийЗапрос(СтруктураЗапроса) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| PAPI_ХранилищеРезультатов.Ссылка КАК Ссылка
|ИЗ
| Справочник.PAPI_ХранилищеРезультатов КАК PAPI_ХранилищеРезультатов
|ГДЕ
| НЕ PAPI_ХранилищеРезультатов.ПометкаУдаления
| И PAPI_ХранилищеРезультатов.МетодЗапроса = &МетодЗапроса
| И PAPI_ХранилищеРезультатов.ПараметрыЗапроса = &ПараметрыЗапроса
| И PAPI_ХранилищеРезультатов.ДатаЗапроса МЕЖДУ &ДатаЗапросаН И &ДатаЗапросаК";
Запрос.УстановитьПараметр("ДатаЗапросаК", КонецДня(СтруктураЗапроса.ДатаЗапроса));
Запрос.УстановитьПараметр("ДатаЗапросаН", НачалоДня(СтруктураЗапроса.ДатаЗапроса));
Запрос.УстановитьПараметр("МетодЗапроса", СтруктураЗапроса.МетодЗапроса);
Запрос.УстановитьПараметр("ПараметрыЗапроса", СтруктураЗапроса.ПараметрыЗапроса);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.Ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
//Получить количество элементов запросом
Функция ПолучитьКоличествоЭлементов(НаименованиеОбъекта) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| [ИмяТаблицы]
|";
Если НЕ ПустаяСтрока(НаименованиеОбъекта) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Иначе
Возврат -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";
КонецФункции
#КонецОбласти
#Область РаботаСФоновымиЗаданиями
Функция НайтиЗадание(Идентификатор) Экспорт
// Считывает состояние фонового задания по переданному идентификатору.
//
// Параметры:
// Идентификатор - УникальныйИдентификатор - Идентификатор фонового задания.
//
// Возвращаемое значение:
// Неопределено - Задание не найдено.
// Структура - Сведения о задании.
// * Выполняется - Булево - Истина когда фоновое задание еще выполняется.
// * Успешно - Булево - Истина когда сеанс фонового задания завершился без ошибок.
// * Ошибка - Строка, ИнформацияОбОшибке, Неопределено - Описание ошибки.
//
УстановитьПривилегированныйРежим(Истина);
Результат = Новый Структура("Выполняется, Успех, Ошибка", Ложь, Ложь, Неопределено);
Если Идентификатор = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
Если Задание = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Результат.Выполняется = Истина;
Иначе
Результат.Выполняется = Ложь;
Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Результат.Успех = Истина;
Иначе
Результат.Успех = Ложь;
Результат.Ошибка = Задание.ИнформацияОбОшибке;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
Правим модули PAPI_ОбработкаМетодовGET и PAPI_ОбработкаМетодовPOST и PAPI_ОбработкаУниверсальныхМетодов. Добавляем в него наши методы.
Код модуля PAPI_ОбработкаМетодовGET
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовGET(СтруктураВхПараметров) Экспорт
//структура ответа. Собственна нужна для формирования ответа
СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
//Операцию нужно выполнить используя БСП:Базовая функциональностьДлительные операции++
#Область ПримерыЧасть3
ВФоне = СтруктураВхПараметров.ПараметрыЗапроса.Получить("BTask");
Если не ВФоне = Неопределено Тогда
ВФоне = Булево(ВФоне);
Если ВФоне = Истина Тогда
УникальныйИдентификатор = Новый УникальныйИдентификатор;
//Уникальный адрес результата
АдресРезультата = СтруктураВхПараметров.ИмяМетода+"_"+Строка(УникальныйИдентификатор);
//Подгатавливаем параметры для Длительной операции
ПараметрыЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыЗапуска.НаименованиеФоновогоЗадания = "Выполнение_" + АдресРезультата;
ПараметрыЗапуска.ОжидатьЗавершение = Ложь;
ПараметрыЗапуска.КлючФоновогоЗадания = УникальныйИдентификатор;
ПараметрыЗапуска.ЗапуститьВФоне = Истина;
//Добавляем адрес в структуру
СтруктураВхПараметров.Вставить("АдресРезультата",АдресРезультата);
//Запускаем метод в фоне
РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(
"PAPI_АсинхронныеОперации.ФЗ_ВыполнитьМетод_ДлительнаяОперация",
СтруктураВхПараметров,
ПараметрыЗапуска);
//Проверяем что задание запустилось
Если РезультатФоновогоЗадания.Статус = "Ошибка" Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Ошибка при формировании: "+Строка(РезультатФоновогоЗадания.КраткоеПредставлениеОшибки),Ложь,"");
Возврат СтруктураОтвет;
КонецЕсли;
ФоновоеЗаданиеИдентификатор = РезультатФоновогоЗадания.ИдентификаторЗадания;
АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" +
"Result_Key=" + АдресРезультата + "&" +
"Task_Key=" + Строка(ФоновоеЗаданиеИдентификатор);
//Формируем html ответ
СтруктураОтвет.ДанныеОтвета = "<html>
|<body>
| <b>Задание отправлено на выполнение!</b><br>
| <p>Идентификатор фонового задания = " + Строка(ФоновоеЗаданиеИдентификатор) + "<br>
| Адрес хранилища результата = " + АдресРезультата + "</p>
| <p><a href=""" + АдресСсылки + """>Ссылка на получение результата</a></p>
|</body>
|</html>";
Возврат СтруктураОтвет;
КонецЕсли;
КонецЕсли;
#КонецОбласти
//Операцию нужно выполнить используя БСП:Базовая функциональностьДлительные операции--
#Область ПримерыЧасть1
//Переправляем на нужный метод
Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Список") Тогда
ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров);
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Документ") Тогда
ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
#Область ПримерыЧасть2
//Получаем доступные остатки по складу в формате JSON (ERP, УТ, КА)
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ОстаткиИДоступностьТоваровПоСкладу") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
#Область ПримерыЧасть3
//Получаем список заданий за период (БСП)
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров);
//Проверяем фоновое задание. Если Выполнено забираем результат
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ФоновоеЗаданиеПроверить") Тогда
ПроверитьФоновоеЗадание(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров);
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантПланОбмена") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантПланОбмена") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),Ложь,"");
КонецЕсли;
Возврат СтруктураОтвет;
КонецФункции
#Область Методы
#Область ПримерыЧасть1
Процедура ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров)
Результат = "Расходная накладная, 1, 01.01.2014
|Расходная накладная, 2, 01.01.2014";
СтруктураОтвет.ДанныеОтвета = Результат;
КонецПроцедуры
Процедура ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров)
//ПраметрыЗапроса - number
ПарНомер = СтруктураВхПараметров.ПараметрыЗапроса.Получить("number");
Номер = Число(?(ПарНомер=Неопределено,0,ПарНомер));
Если Номер > 2 Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует документ с номером: " + Номер,ложь,"");
Иначе
Если Номер = 1 Тогда
Результат = "Расходная накладная, 1, 01.01.2014";
Иначе
Результат = "Расходная накладная, 2, 01.01.2014";
КонецЕсли;
СтруктураОтвет.ДанныеОтвета = Результат;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПримерыЧасть3
Процедура ПроверитьФоновоеЗадание(СтруктураОтвет,СтруктураВхПараметров)
перФоновоеЗаданиеИдентификатор = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Task_Key");
АдресРезультата = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Result_Key");
//Проверяем фоновое задание
Если перФоновоеЗаданиеИдентификатор = Неопределено Тогда
Задание = PAPI_ОбщиеПроцедурыИФункции.НайтиЗадание(Неопределено);
Иначе
//Получаем Уникальный идентификатор задания
ФоновоеЗаданиеИдентификатор = Новый УникальныйИдентификатор(перФоновоеЗаданиеИдентификатор);
Задание = PAPI_ОбщиеПроцедурыИФункции.НайтиЗадание(ФоновоеЗаданиеИдентификатор);
КонецЕсли;
//При отсутствии адреса результата прерываем
Если АдресРезультата = Неопределено Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Result_Key""",Ложь,"");
Возврат;
КонецЕсли;
Если Не Задание.Выполняется Тогда
Попытка
НайденнаяСсылка = Справочники.PAPI_ХранилищеРезультатов.НайтиПоРеквизиту("АдресРезультата",АдресРезультата);
Если НайденнаяСсылка = Справочники.PAPI_ХранилищеРезультатов.ПустаяСсылка() Тогда
//Можно вынести в отдельную функцию
АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" +
"Result_Key=" + АдресРезультата + ?(ЗначениеЗаполнено(перФоновоеЗаданиеИдентификатор),
"&Task_Key=" + перФоновоеЗаданиеИдентификатор,"");
//Формируем html ответ
СтруктураОтвет.ДанныеОтвета = "<html>
|<body>
| <b>Задание еще выполняется, попробуйте получить результат позже!</b><br>
| <p>Идентификатор фонового задания = " + перФоновоеЗаданиеИдентификатор + "<br>
| Адрес хранилища результата = " + АдресРезультата + "</p>
|<p><a href=""" + АдресСсылки + """>Ссылка на получение результата</a></p>
|</body>
|</html>";
Иначе
СтруктураОтвет = НайденнаяСсылка.Результат.Получить();
КонецЕсли;
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Ошибка при формировании: "+ОписаниеОшибки(),Ложь,"");
КонецПопытки;
Иначе
//Задание еще в процессе
АдресСсылки = СтруктураВхПараметров.БазовыйURL + "/V1/ФоновоеЗаданиеПроверить?" +
"Result_Key=" + АдресРезультата + ?(ЗначениеЗаполнено(перФоновоеЗаданиеИдентификатор),
"&Task_Key=" + перФоновоеЗаданиеИдентификатор,"");
//Формируем html ответ
СтруктураОтвет.ДанныеОтвета = "<html>
|<body>
| <b>Задание еще выполняется, попробуйте получить результат позже!</b><br>
| <p>Идентификатор фонового задания = " + перФоновоеЗаданиеИдентификатор + "<br>
| Адрес хранилища результата = " + АдресРезультата + "</p>
|<p><a href=""" + АдресСсылки + """>Ссылка на получение результата</a></p>
|</body>
|</html>";
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
Код модуля PAPI_ОбработкаМетодовPOST
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовPOST(СтруктураВхПараметров) Экспорт
//структура ответа. Собственна нужна для формирования ответа
СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
//Переправляем на нужный метод
#Область ПримерыЧасть3
//Получаем список заданий за период (БСП)
Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров);
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантПланОбмена") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантПланОбмена") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),ложь,"");
КонецЕсли;
Возврат СтруктураОтвет;
КонецФункции
Код модуля PAPI_ОбработкаУниверсальныхМетодов
#Область Методы
//Пример из Части 2. Метод написан под ERP, будет работать в УТ и КА
#Область ПримерыЧасть2
Процедура ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//ПраметрыЗапроса - number
Склад_Key = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Ref_Key");
Если не Склад_Key = Неопределено Тогда
//Получаем Склад
Попытка
Склад = XMLЗначение(Тип("СправочникСсылка.Склады"), Склад_Key);
Исключение
Склад = Неопределено;
КонецПопытки;
Если ЗначениеЗаполнено(Склад) Тогда
//Получаем схему компоновки и вариант отчета
//СхемаКомпоновки = Отчеты.ОстаткиИДоступностьТоваров.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваров");
СхемаКомпоновки = Отчеты.PAPI_ХранилищеМакетов.ПолучитьМакет("СКД_ОстаткиИДоступностьТоваров_HTTP");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваровНеТаблица");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
//Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"++
ТекстЗапроса = СхемаКомпоновки.НаборыДанных.Основной.Запрос;
ТекстЗапроса = СтрЗаменить(
ТекстЗапроса,
"&ТекстЗапросаВесНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура"));
ТекстЗапроса = СтрЗаменить(
ТекстЗапроса,
"&ТекстЗапросаОбъемНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура"));
СхемаКомпоновки.НаборыДанных.Основной.Запрос = ТекстЗапроса;
//Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"--
ПрараметрОтбора = НастройкиКомпоновки.Отбор.Элементы;
СкладПолеКомпоновки = Новый ПолеКомпоновкиДанных("Склад");
Для Каждого СтрокаОтбора из ПрараметрОтбора Цикл
Если СтрокаОтбора.ЛевоеЗначение = СкладПолеКомпоновки Тогда
СтрокаОтбора.Использование = Истина;
СтрокаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
СтрокаОтбора.ПравоеЗначение = Склад;
КонецЕсли;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоЗначений = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Обходим дерево и формируем РезультатОтвет
РезультатОтвет = Новый Массив;
Для Каждого ВерхнийУровеньДерева Из ДеревоЗначений.Строки Цикл
Для Каждого ПодчиненныйУровеньДерева Из ВерхнийУровеньДерева.Строки Цикл
Если ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Номенклатура)
И ТипЗнч(ПодчиненныйУровеньДерева.Номенклатура) = Тип("СправочникСсылка.Номенклатура")
Тогда
РезультатОтвет.Добавить(Новый Структура("ИмяЗначение,Артикул,Guid,ДоступноСейчас,Остаток",
ПодчиненныйУровеньДерева.Номенклатура.Наименование +
?(ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Характеристика),
","+Строка(ПодчиненныйУровеньДерева.Характеристика),""),
ПодчиненныйУровеньДерева.НоменклатураАртикул,
XMLСтрока(ПодчиненныйУровеньДерева.Номенклатура),
ПодчиненныйУровеньДерева.ДоступноСейчас,
ПодчиненныйУровеньДерева.ВНаличии));
КонецЕсли;
КонецЦикла;
КонецЦикла;
//РезультатОтвет в JSON
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
СтруктураОтвет.ДанныеОтвета = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет);
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не заполнен или неверно заполнен параметр ""Ref_Key""",ложь,"");
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Ref_Key""",ложь,"");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
//Пример из Части 3. Метод написан под Демо БСП, следовательно будет работать в конфигурациях с БСП
#Область ПримерыЧасть3
Процедура ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНачалоПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("StartPeriod");
НачалоПериода = ?(перНачалоПериода = Неопределено,
Неопределено,PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перНачалоПериода));
перКонецПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("EndPeriod");
КонецПериода = ?(перКонецПериода = Неопределено,
Неопределено,PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перКонецПериода));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НачалоПериода = ?(ТелоЗапросаJSON.Свойство("StartPeriod"),
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.StartPeriod),Неопределено);
КонецПериода = ?(ТелоЗапросаJSON.Свойство("EndPeriod"),
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.EndPeriod),Неопределено);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
//Получаем схему компоновки и вариант отчета
СхемаКомпоновки = Отчеты.Задания.ПолучитьМакет("Макет");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("СписокЗаданий");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
//Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"++
ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач");
СрокИсполнения = СхемаКомпоновки.НаборыДанных[0].Поля.Найти("СрокИсполнения");
СрокИсполнения.Оформление.УстановитьЗначениеПараметра("Формат", ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"));
//Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"--
Параметр = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти("Период");
Если Параметр <> Неопределено Тогда
Параметр.Использование = ?(ЗначениеЗаполнено(НачалоПериода)
ИЛИ ЗначениеЗаполнено(КонецПериода),Истина,Ложь);
ПериодВрем = Новый СтандартныйПериод;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
ПериодВрем.ДатаНачала = НачалоДня(НачалоПериода);
КонецЕсли;
Если ЗначениеЗаполнено(КонецПериода) Тогда
ПериодВрем.ДатаОкончания = КонецДня(КонецПериода);
КонецЕсли;
Если Параметр.Использование Тогда
Параметр.Значение = ПериодВрем;
КонецЕсли;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Обходим ТЗ и формируем РезультатОтвет
РезультатОтвет = Новый Массив;
Для Каждого СтрокаТЗ Из ТЗ Цикл
Если ЗначениеЗаполнено(СтрокаТЗ.Ссылка)
И ТипЗнч(СтрокаТЗ.Ссылка) = Тип("БизнесПроцессСсылка.Задание")
Тогда
РезультатОтвет.Добавить(Новый Структура("Задание,Guid,Автор,Дата,Выполнено",
СтрокаТЗ.Ссылка.Наименование,
XMLСтрока(СтрокаТЗ.Ссылка),
СтрокаТЗ.Автор.Наименование,
СтрокаТЗ.Дата,
СтрокаТЗ.Выполнено));
КонецЕсли;
КонецЦикла;
//РезультатОтвет в JSON
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
СтруктураОтвет.ДанныеОтвета = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет);
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
КонецПроцедуры
#КонецОбласти
//Пример из Части 4. Метод получения количество элементов по типу объекта - Запрос
Процедура ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция",
ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"),
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
ТекущаяДатаСеанса(),
НаименованиеОбъекта,
Порция);
//Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня.
//Тоесть на следующий день данные будут неактуальны
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
КоличествоЭлементов = ?(СтруктураЗапроса.РезультатОтвет.Свойство("КоличествоЭлементов"),
СтруктураЗапроса.РезультатОтвет.КоличествоЭлементов,
0);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,КоличествоЭлементов);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод получения порции - Запрос
Процедура ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
перСтраница = СтруктураВхПараметров.ПараметрыЗапроса.Получить("page");
текСтраница = ?(перСтраница = Неопределено,0,Число(перСтраница));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
текСтраница = ?(ТелоЗапросаJSON.Свойство("page"),ТелоЗапросаJSON.page,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0
И текСтраница >= 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция,Страница",
ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"),
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
ТекущаяДатаСеанса(),
НаименованиеОбъекта,
Порция,
текСтраница);
//Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня.
//Тоесть на следующий день данные будут неактуальны
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
МассивПоследних = ?(СтруктураЗапроса.РезультатОтвет.Свойство("МассивПоследних"),
СтруктураЗапроса.РезультатОтвет.МассивПоследних,
Новый Массив);
РезультатОтвет = Новый Массив;
Если МассивПоследних.Количество() > 0
И МассивПоследних.Количество() >= текСтраница Тогда
//Проверяем справочник Иерархический или нет
перЕстьГруппы = ?(МассивПоследних[0].Метаданные().Иерархический,Истина,Ложь);
//Получаем нужную порцию
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ "+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")+"
| Ссылка КАК Ссылка,
| ПометкаУдаления КАК DeletionMark,
| Код КАК Code,
| Наименование КАК Description
| //[ЕстьГруппы]//, ЭтоГруппа КАК IsFolder
|ИЗ
| [ИмяТаблицы] ГДЕ Ссылка > &Ссылка УПОРЯДОЧИТЬ ПО Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Если перЕстьГруппы Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "//[ЕстьГруппы]//", "");
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка",МассивПоследних[текСтраница]);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
текЭлМасс = Новый Структура;
текЭлМасс.Вставить("Ref_Key", XMLСтрока(ВыборкаДетальныеЗаписи.Ссылка));
текЭлМасс.Вставить("Description", ВыборкаДетальныеЗаписи.Description);
текЭлМасс.Вставить("Code", ВыборкаДетальныеЗаписи.Code);
текЭлМасс.Вставить("DeletionMark", ВыборкаДетальныеЗаписи.DeletionMark);
Если перЕстьГруппы Тогда
текЭлМасс.Вставить("IsFolder", ВыборкаДетальныеЗаписи.IsFolder);
КонецЕсли;
РезультатОтвет.Добавить(текЭлМасс);
КонецЦикла;
КонецЕсли;
стрРезультатОтвет = Новый Структура("value",РезультатОтвет);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
//Делаем красивый вывод данных (Эстетика чисто для глаза)
ВхПараметры.ПереносСтрок = ПереносСтрокJSON.Авто;
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,стрРезультатОтвет);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0 или page<0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод получения количество элементов по типу объекта ПланОбмена
Процедура ПолучитьКоличествоЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("НаименованиеУзла,НаименованиеОбъекта,Порция",
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
НаименованиеОбъекта,
Порция);
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьУзел(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
КоличествоЭлементов = ?(СтруктураЗапроса.Свойство("КоличествоЭлементов"),
СтруктураЗапроса.КоличествоЭлементов,
0);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,КоличествоЭлементов);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод получения порции - ПланОбмена
Процедура ПолучитьПорциюЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
перСтраница = СтруктураВхПараметров.ПараметрыЗапроса.Получить("page");
текСтраница = ?(перСтраница = Неопределено,0,Число(перСтраница));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
текСтраница = ?(ТелоЗапросаJSON.Свойство("page"),ТелоЗапросаJSON.page,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0
И текСтраница >= 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("НаименованиеУзла,НаименованиеОбъекта,текСтраница",
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
НаименованиеОбъекта,
текСтраница);
Узел = ПланыОбмена._ДемоАвтономнаяРабота.НайтиПоНаименованию(СтруктураЗапроса.НаименованиеУзла);
Если не ЗначениеЗаполнено(Узел) Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Узел отсутствует!",Ложь,"");
КонецЕсли;
Если СтруктураОтвет.Отработало Тогда
ОбъектыРегистрации = Новый Массив;
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДанныеСУзлаПоНомеруСообщения(Узел,СтруктураЗапроса.НаименованиеОбъекта,ОбъектыРегистрации,СтруктураЗапроса.текСтраница);
//Готовим ответ
РезультатОтвет = Новый Массив;
Если ОбъектыРегистрации.Количество()>0 Тогда
перЕстьГруппы = ?(ОбъектыРегистрации[0].Метаданные().Иерархический,Истина,Ложь);
Для Каждого СтрокаМассива из ОбъектыРегистрации Цикл
текЭлМасс = Новый Структура;
текЭлМасс.Вставить("Ref_Key", XMLСтрока(СтрокаМассива));
текЭлМасс.Вставить("Description", СтрокаМассива.Наименование);
текЭлМасс.Вставить("Code", СтрокаМассива.Код);
текЭлМасс.Вставить("DeletionMark", СтрокаМассива.ПометкаУдаления);
Если перЕстьГруппы Тогда
текЭлМасс.Вставить("IsFolder", СтрокаМассива.ЭтоГруппа);
КонецЕсли;
РезультатОтвет.Добавить(текЭлМасс);
КонецЦикла;
КонецЕсли;
стрРезультатОтвет = Новый Структура("value",РезультатОтвет);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
//Делаем красивый вывод данных (Эстетика чисто для глаза)
ВхПараметры.ПереносСтрок = ПереносСтрокJSON.Авто;
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,стрРезультатОтвет);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0 или page<0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Правим обработку. Реквизиту МетодСервиса добавляем 2 значения Пример 2 — Get(2_1) и Пример 2 — Post(2_2)
Меняем модуль формы.
Модуль формы
&НаКлиенте
Перем HTTPСоединение;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Значения по умолчанию
ОбъектКонфигурации = "Catalog_КлассификаторБанков";
Порция = 1000;
Селект = "$select=Ref_Key,Description,Code,DeletionMark,IsFolder&";
//Пример 1 - OData(1_1)
//Пример 1 - Get(1_2)
//Пример 1 - Post(1_3)
//Пример 2 - Get(2_1)
//Пример 2 - Post(2_2)
//Первоначальное заполнение МетодСервиса
ЭлСписка = Новый СписокЗначений;
ЭлСписка.Добавить("1_1","Пример 1 - OData");
МетодСервиса = ЭлСписка[0].Значение;
КонецПроцедуры
&НаКлиенте
Процедура НачальнаяЗагрузка(Команда)
ОчиститьСообщения();
Результат = "";
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Если МетодСервиса = "1_1" Тогда
//Запрашиваем количество элементов $count
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "/$count?"
+ Селект
+ "$format=json;odata=nometadata";
ИначеЕсли МетодСервиса = "1_2" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьКоличествоЭлементовВариантЗапрос?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "1_3" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьКоличествоЭлементовВариантЗапрос";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
ИначеЕсли МетодСервиса = "2_1" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьКоличествоЭлементовВариантПланОбмена?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "2_2" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьКоличествоЭлементовВариантПланОбмена";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Иначе
Сообщить("Не заполнен ""Метод сервиса""!");
Возврат;
КонецЕсли;
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
//POST или GET
Если МетодСервиса = "1_3"
ИЛИ МетодСервиса = "2_2" Тогда
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
Иначе
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КонецЕсли;
перРазмерОтвета = HTTPОтвет.Заголовки.Получить("Content-Length");
РазмерОтвета = ?(не перРазмерОтвета = Неопределено,Число(перРазмерОтвета),0);
//Получаем ответ или текст ошибки
Ответочка = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Результат = Ответочка;
Если HTTPОтвет.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответочка);
Попытка
//Считываем количество элементов
КоличествоЭлементов = ПрочитатьJSON(ЧтениеJSON);
Исключение
КоличествоЭлементов = 0;
КонецПопытки;
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки());
КонецПопытки;
ТекущаяСтраница = 0;
//Проверяем корректность данных
Если Порция <> 0 и КоличествоЭлементов <> 0 Тогда
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Страница 0 из " +КоличествоСтраниц+ " страниц.";
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Истина;
Иначе
КоличествоСтраниц = 0;
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Найдено " + КоличествоЭлементов + " элементов. Порция="+Порция;
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Ложь;
КонецЕсли;
Элементы.ДекорацияРазмерОтвета.Заголовок = "Размер ответа " +РазмерОтвета+ " байт.";
КонецПроцедуры
&НаКлиенте
Процедура Вперед(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница + 1;
Элементы.Назад.Видимость = Истина;
Если ТекущаяСтраница >= КоличествоСтраниц Тогда
Элементы.Вперед.Видимость = Ложь;
ТекущаяСтраница = КоличествоСтраниц;
КонецЕсли;
page = ТекущаяСтраница - 1;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
Если МетодСервиса = "1_1" Тогда
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+ ?(ПустаяСтрока(Селект),"","&"+Селект)
//НЕОБЯЗАТЕЛЬНО: "&$orderby=Ref_Key asc" (для упорядочивания по возрастанию по Ref_Key)
+ "&$orderby=Ref_Key asc&$format=json;odata=nometadata";
ИначеЕсли МетодСервиса = "1_2" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&page="
+ Формат(page, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "1_3" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
СтруктураЗапроса.Вставить("page",page);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
ИначеЕсли МетодСервиса = "2_1" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантПланОбмена?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&page="
+ Формат(ТекущаяСтраница, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "2_2" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
СтруктураЗапроса.Вставить("page",ТекущаяСтраница);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантПланОбмена";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Иначе
Сообщить("Не заполнен ""Метод сервиса""!");
Возврат;
КонецЕсли;
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
//POST или GET
Если МетодСервиса = "1_3"
ИЛИ МетодСервиса = "2_2" Тогда
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
Иначе
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КонецЕсли;
перРазмерОтвета = HTTPОтвет.Заголовки.Получить("Content-Length");
РазмерОтвета = ?(не перРазмерОтвета = Неопределено,Число(перРазмерОтвета),0);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
РазмерОтвета = 0;
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
Элементы.ДекорацияРазмерОтвета.Заголовок = "Размер ответа " +РазмерОтвета+ " байт.";
КонецПроцедуры
&НаКлиенте
Процедура Назад(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница - 1;
Элементы.Вперед.Видимость = Истина;
Если ТекущаяСтраница < 2 Тогда
Элементы.Назад.Видимость = Ложь;
ТекущаяСтраница = 1;
КонецЕсли;
page = ТекущаяСтраница - 1;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
Если МетодСервиса = "1_1" Тогда
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+ ?(ПустаяСтрока(Селект),"","&"+Селект)
//НЕОБЯЗАТЕЛЬНО: "&$orderby=Ref_Key asc" (для упорядочивания по возрастанию по Ref_Key)
+ "&$orderby=Ref_Key asc&$format=json;odata=nometadata";
ИначеЕсли МетодСервиса = "1_2" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&page="
+ Формат(page, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "1_3" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
СтруктураЗапроса.Вставить("page",page);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантЗапроса";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
ИначеЕсли МетодСервиса = "2_1" Тогда
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантПланОбмена?ItemName="
+ ОбъектКонфигурации
+ "&top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+ "&page="
+ Формат(ТекущаяСтраница, "ЧДЦ=0; ЧН=0; ЧГ=");
ИначеЕсли МетодСервиса = "2_2" Тогда
СтруктураЗапроса = новый Структура;
СтруктураЗапроса.Вставить("ItemName",ОбъектКонфигурации);
СтруктураЗапроса.Вставить("top",Порция);
СтруктураЗапроса.Вставить("page",ТекущаяСтраница);
перРесурсНаСервере = "DemoSSL3_0_1_231/hs/PAPI/V1/ПолучитьПорциюЭлементовВариантПланОбмена";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " " , Истина, ЭкранированиеСимволовJSON.Нет, Ложь, Ложь, Ложь, Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Иначе
Сообщить("Не заполнен ""Метод сервиса""!");
Возврат;
КонецЕсли;
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
//POST или GET
Если МетодСервиса = "1_3"
ИЛИ МетодСервиса = "2_2" Тогда
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
Иначе
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КонецЕсли;
перРазмерОтвета = HTTPОтвет.Заголовки.Получить("Content-Length");
РазмерОтвета = ?(не перРазмерОтвета = Неопределено,Число(перРазмерОтвета),0);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
РазмерОтвета = 0;
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
Элементы.ДекорацияРазмерОтвета.Заголовок = "Размер ответа " +РазмерОтвета+ " байт.";
КонецПроцедуры
//Подключаемся Новый HTTPСоединение
&НаКлиенте
Функция Подключиться()
//В тестовых обработках так делать можно, но когда делаете в рабочей такие вещи НЕДОПУСТИМЫ!
//Храните логины и пароли в недоступных для глаз местах! (https://its.1c.ru/db/v8std#content:2149184389:hdoc)
перПорт = 0;
перСервер = "127.0.0.1";
перПользователь = "Администратор";
перПароль = "";
Попытка
Если перПорт <= 0 Тогда
HTTPСоединение = Новый HTTPСоединение(перСервер,,перПользователь,перПароль);
Иначе
HTTPСоединение = Новый HTTPСоединение(перСервер,перПорт,перПользователь,перПароль);
КонецЕсли;
Возврат Истина;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецФункции
//Подчищаем соединение
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
HTTPСоединение = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура МетодСервисаПриИзменении(Элемент)
//OData или нет
Если МетодСервиса = "1_1" Тогда
Если ОбъектКонфигурации <> "Catalog_КлассификаторБанков" Тогда
ОбъектКонфигурации = "Catalog_КлассификаторБанков";
КонецЕсли;
Иначе
Если ОбъектКонфигурации <> "Справочники.КлассификаторБанков" Тогда
ОбъектКонфигурации = "Справочник.КлассификаторБанков";
КонецЕсли;
КонецЕсли;
//ВСЕ ЧИСТИМ++
ТекущаяСтраница = 0;
КоличествоСтраниц = 0;
Результат = "";
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "";
Элементы.ДекорацияРазмерОтвета.Заголовок = "";
//Устанавливаем видимость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Ложь;
//ВСЕ ЧИСТИМ--
КонецПроцедуры
Результат
GET:
POST:
Посмотрим запросом, что лежит на узле:
ВЫБРАТЬ
КлассификаторБанковИзменения.Ссылка КАК Ссылка,
КлассификаторБанковИзменения.НомерСообщения КАК НомерСообщения
ИЗ
Справочник.КлассификаторБанков.Изменения КАК КлассификаторБанковИзменения
ГДЕ
КлассификаторБанковИзменения.Узел = &Узел
УПОРЯДОЧИТЬ ПО
НомерСообщения
ИТОГИ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Ссылка)
ПО
НомерСообщения
- В методе «ПолучитьКоличествоЭлементовВариантПланОбмена» я чищу узел и перезаполняю его, но лучше нарисовать регламент и все новые элементы распределять на новые сообщения либо прямо в методе проверять есть ли новые элементы без номеров сообщений.
Метод с узлами более правильный, чем метод запросом!
Четвертую часть заканчиваю. Мы рассмотрели с Вами методы порционной передачи данных на примере OData и методов GET и POST. Файлы мы рассмотрели вскользь, по крайней мере у меня потребность передачи файлов встречается очень редко.
Надеюсь данные примеры будут полезны в Вашей работе!
Статьи из данного цикла:
HTTP Сервисы: Путь к своему сервису. Часть 1
HTTP Сервисы: Путь к своему сервису. Часть 2
HTTP Сервисы: Путь к своему сервису. Часть 3
#Область Методы
//Пример из Части 2. Метод написан под ERP, будет работать в УТ и КА
#Область ПримерыЧасть2
Процедура ПолучитьОстаткиИДоступностьТоваровПоСкладу(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//ПраметрыЗапроса - number
Склад_Key = СтруктураВхПараметров.ПараметрыЗапроса.Получить("Ref_Key");
Если не Склад_Key = Неопределено Тогда
//Получаем Склад
Попытка
Склад = XMLЗначение(Тип("СправочникСсылка.Склады"), Склад_Key);
Исключение
Склад = Неопределено;
КонецПопытки;
Если ЗначениеЗаполнено(Склад) Тогда
//Получаем схему компоновки и вариант отчета
//СхемаКомпоновки = Отчеты.ОстаткиИДоступностьТоваров.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваров");
СхемаКомпоновки = Отчеты.PAPI_ХранилищеМакетов.ПолучитьМакет("СКД_ОстаткиИДоступностьТоваров_HTTP");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("ОстаткиИДоступностьТоваровНеТаблица");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
//Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"++
ТекстЗапроса = СхемаКомпоновки.НаборыДанных.Основной.Запрос;
ТекстЗапроса = СтрЗаменить(
ТекстЗапроса,
"&ТекстЗапросаВесНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура"));
ТекстЗапроса = СтрЗаменить(
ТекстЗапроса,
"&ТекстЗапросаОбъемНоменклатуры",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("Набор.Номенклатура.ЕдиницаИзмерения", "Набор.Номенклатура"));
СхемаКомпоновки.НаборыДанных.Основной.Запрос = ТекстЗапроса;
//Взято из модуля отчета.ОстаткиИДоступностьТоваров "ПриКомпоновкеРезультата"--
ПрараметрОтбора = НастройкиКомпоновки.Отбор.Элементы;
СкладПолеКомпоновки = Новый ПолеКомпоновкиДанных("Склад");
Для Каждого СтрокаОтбора из ПрараметрОтбора Цикл
Если СтрокаОтбора.ЛевоеЗначение = СкладПолеКомпоновки Тогда
СтрокаОтбора.Использование = Истина;
СтрокаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
СтрокаОтбора.ПравоеЗначение = Склад;
КонецЕсли;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоЗначений = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Обходим дерево и формируем РезультатОтвет
РезультатОтвет = Новый Массив;
Для Каждого ВерхнийУровеньДерева Из ДеревоЗначений.Строки Цикл
Для Каждого ПодчиненныйУровеньДерева Из ВерхнийУровеньДерева.Строки Цикл
Если ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Номенклатура)
И ТипЗнч(ПодчиненныйУровеньДерева.Номенклатура) = Тип("СправочникСсылка.Номенклатура")
Тогда
РезультатОтвет.Добавить(Новый Структура("ИмяЗначение,Артикул,Guid,ДоступноСейчас,Остаток",
ПодчиненныйУровеньДерева.Номенклатура.Наименование +
?(ЗначениеЗаполнено(ПодчиненныйУровеньДерева.Характеристика),
","+Строка(ПодчиненныйУровеньДерева.Характеристика),""),
ПодчиненныйУровеньДерева.НоменклатураАртикул,
XMLСтрока(ПодчиненныйУровеньДерева.Номенклатура),
ПодчиненныйУровеньДерева.ДоступноСейчас,
ПодчиненныйУровеньДерева.ВНаличии));
КонецЕсли;
КонецЦикла;
КонецЦикла;
//РезультатОтвет в JSON
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
СтруктураОтвет.ДанныеОтвета = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет);
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Не заполнен или неверно заполнен параметр ""Ref_Key""",ложь,"");
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,400,"Отсутствует параметр ""Ref_Key""",ложь,"");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
//Пример из Части 3. Метод написан под Демо БСП, следовательно будет работать в конфигурациях с БСП
#Область ПримерыЧасть3
Процедура ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНачалоПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("StartPeriod");
НачалоПериода = ?(перНачалоПериода = Неопределено,
Неопределено,PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перНачалоПериода));
перКонецПериода = СтруктураВхПараметров.ПараметрыЗапроса.Получить("EndPeriod");
КонецПериода = ?(перКонецПериода = Неопределено,
Неопределено,PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(перКонецПериода));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НачалоПериода = ?(ТелоЗапросаJSON.Свойство("StartPeriod"),
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.StartPeriod),Неопределено);
КонецПериода = ?(ТелоЗапросаJSON.Свойство("EndPeriod"),
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДатуВремяИзСтроки(ТелоЗапросаJSON.EndPeriod),Неопределено);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
//Получаем схему компоновки и вариант отчета
СхемаКомпоновки = Отчеты.Задания.ПолучитьМакет("Макет");
ВариантНастроеки = СхемаКомпоновки.ВариантыНастроек.Найти("СписокЗаданий");
НастройкиКомпоновки = ВариантНастроеки.Настройки;
//Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"++
ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач");
СрокИсполнения = СхемаКомпоновки.НаборыДанных[0].Поля.Найти("СрокИсполнения");
СрокИсполнения.Оформление.УстановитьЗначениеПараметра("Формат", ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"));
//Взято из модуля отчета.Задания "ПриКомпоновкеРезультата"--
Параметр = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти("Период");
Если Параметр <> Неопределено Тогда
Параметр.Использование = ?(ЗначениеЗаполнено(НачалоПериода)
ИЛИ ЗначениеЗаполнено(КонецПериода),Истина,Ложь);
ПериодВрем = Новый СтандартныйПериод;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
ПериодВрем.ДатаНачала = НачалоДня(НачалоПериода);
КонецЕсли;
Если ЗначениеЗаполнено(КонецПериода) Тогда
ПериодВрем.ДатаОкончания = КонецДня(КонецПериода);
КонецЕсли;
Если Параметр.Использование Тогда
Параметр.Значение = ПериодВрем;
КонецЕсли;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Обходим ТЗ и формируем РезультатОтвет
РезультатОтвет = Новый Массив;
Для Каждого СтрокаТЗ Из ТЗ Цикл
Если ЗначениеЗаполнено(СтрокаТЗ.Ссылка)
И ТипЗнч(СтрокаТЗ.Ссылка) = Тип("БизнесПроцессСсылка.Задание")
Тогда
РезультатОтвет.Добавить(Новый Структура("Задание,Guid,Автор,Дата,Выполнено",
СтрокаТЗ.Ссылка.Наименование,
XMLСтрока(СтрокаТЗ.Ссылка),
СтрокаТЗ.Автор.Наименование,
СтрокаТЗ.Дата,
СтрокаТЗ.Выполнено));
КонецЕсли;
КонецЦикла;
//РезультатОтвет в JSON
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
СтруктураОтвет.ДанныеОтвета = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,РезультатОтвет);
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
КонецПроцедуры
#КонецОбласти
//Пример из Части 4. Метод получения количество элементов по типу объекта - Запрос
Процедура ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция",
ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"),
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
ТекущаяДатаСеанса(),
НаименованиеОбъекта,
Порция);
//Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня.
//Тоесть на следующий день данные будут неактуальны
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
КоличествоЭлементов = ?(СтруктураЗапроса.РезультатОтвет.Свойство("КоличествоЭлементов"),
СтруктураЗапроса.РезультатОтвет.КоличествоЭлементов,
0);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,КоличествоЭлементов);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод получения порции - Запрос
Процедура ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
перСтраница = СтруктураВхПараметров.ПараметрыЗапроса.Получить("page");
текСтраница = ?(перСтраница = Неопределено,0,Число(перСтраница));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
текСтраница = ?(ТелоЗапросаJSON.Свойство("page"),ТелоЗапросаJSON.page,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0
И текСтраница >= 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("МетодЗапроса,ПараметрыЗапроса,ДатаЗапроса,НаименованиеОбъекта,Порция,Страница",
ВРег("ПолучитьКоличествоЭлементовВариантЗапрос"),
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
ТекущаяДатаСеанса(),
НаименованиеОбъекта,
Порция,
текСтраница);
//Проверяем был ли ранее подобный запрос. Считаем, что данные актуальны в дня.
//Тоесть на следующий день данные будут неактуальны
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьДанныеПредыдущегоЗапроса(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
МассивПоследних = ?(СтруктураЗапроса.РезультатОтвет.Свойство("МассивПоследних"),
СтруктураЗапроса.РезультатОтвет.МассивПоследних,
Новый Массив);
РезультатОтвет = Новый Массив;
Если МассивПоследних.Количество() > 0
И МассивПоследних.Количество() >= текСтраница Тогда
//Проверяем справочник Иерархический или нет
перЕстьГруппы = ?(МассивПоследних[0].Метаданные().Иерархический,Истина,Ложь);
//Получаем нужную порцию
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ "+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")+"
| Ссылка КАК Ссылка,
| ПометкаУдаления КАК DeletionMark,
| Код КАК Code,
| Наименование КАК Description
| //[ЕстьГруппы]//, ЭтоГруппа КАК IsFolder
|ИЗ
| [ИмяТаблицы] ГДЕ Ссылка > &Ссылка УПОРЯДОЧИТЬ ПО Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ИмяТаблицы]", НаименованиеОбъекта);
Если перЕстьГруппы Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "//[ЕстьГруппы]//", "");
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка",МассивПоследних[текСтраница]);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
текЭлМасс = Новый Структура;
текЭлМасс.Вставить("Ref_Key", XMLСтрока(ВыборкаДетальныеЗаписи.Ссылка));
текЭлМасс.Вставить("Description", ВыборкаДетальныеЗаписи.Description);
текЭлМасс.Вставить("Code", ВыборкаДетальныеЗаписи.Code);
текЭлМасс.Вставить("DeletionMark", ВыборкаДетальныеЗаписи.DeletionMark);
Если перЕстьГруппы Тогда
текЭлМасс.Вставить("IsFolder", ВыборкаДетальныеЗаписи.IsFolder);
КонецЕсли;
РезультатОтвет.Добавить(текЭлМасс);
КонецЦикла;
КонецЕсли;
стрРезультатОтвет = Новый Структура("value",РезультатОтвет);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
//Делаем красивый вывод данных (Эстетика чисто для глаза)
ВхПараметры.ПереносСтрок = ПереносСтрокJSON.Авто;
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,стрРезультатОтвет);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0 или page<0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод получения количество элементов по типу объекта ПланОбмена
Процедура ПолучитьКоличествоЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("НаименованиеУзла,НаименованиеОбъекта,Порция",
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
НаименованиеОбъекта,
Порция);
PAPI_ОбщиеПроцедурыИФункции.ПолучитьИлиЗаписатьУзел(СтруктураЗапроса,СтруктураОтвет);
Если СтруктураОтвет.Отработало Тогда
//Готовим ответ
КоличествоЭлементов = ?(СтруктураЗапроса.Свойство("КоличествоЭлементов"),
СтруктураЗапроса.КоличествоЭлементов,
0);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,КоличествоЭлементов);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Пример из Части 4. Метод получения порции - ПланОбмена
Процедура ПолучитьПорциюЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров) Экспорт
//Проверяем входящие параметры
Если ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("GET") Тогда
перНаименованиеОбъекта = СтруктураВхПараметров.ПараметрыЗапроса.Получить("ItemName");
НаименованиеОбъекта = ?(перНаименованиеОбъекта = Неопределено,"",перНаименованиеОбъекта);
перПорция = СтруктураВхПараметров.ПараметрыЗапроса.Получить("top");
Порция = ?(перПорция = Неопределено,0,Число(перПорция));
перСтраница = СтруктураВхПараметров.ПараметрыЗапроса.Получить("page");
текСтраница = ?(перСтраница = Неопределено,0,Число(перСтраница));
ИначеЕсли ВРег(СтруктураВхПараметров.МетодЗапроса) = ВРег("POST") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтруктураВхПараметров.ТелоЗапроса);
Попытка
ТелоЗапросаJSON = ПрочитатьJSON(ЧтениеJSON);
Исключение
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Не удалось получить данные!",Ложь,"");
КонецПопытки;
Если СтруктураОтвет.Отработало Тогда
Если ТипЗнч(ТелоЗапросаJSON) = Тип("Структура") Тогда
НаименованиеОбъекта = ?(ТелоЗапросаJSON.Свойство("ItemName"),ТелоЗапросаJSON.ItemName,"");
Порция = ?(ТелоЗапросаJSON.Свойство("top"),ТелоЗапросаJSON.top,0);
текСтраница = ?(ТелоЗапросаJSON.Свойство("page"),ТелоЗапросаJSON.page,0);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Передана не структура!",Ложь,"");
КонецЕсли;
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
501,"Метод: "+СтруктураВхПараметров.МетодЗапроса+" не поддерживается!",Ложь,"");
КонецЕсли;
//Проверяем была ли ошибка
Если СтруктураОтвет.Отработало Тогда
Если Не ПустаяСтрока(НаименованиеОбъекта)
И Порция > 0
И текСтраница >= 0 Тогда
//Готовим структуру для дальнейшей работы
СтруктураЗапроса = Новый Структура("НаименованиеУзла,НаименованиеОбъекта,текСтраница",
ВРег(НаименованиеОбъекта)+"_"+Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ="),
НаименованиеОбъекта,
текСтраница);
Узел = ПланыОбмена._ДемоАвтономнаяРабота.НайтиПоНаименованию(СтруктураЗапроса.НаименованиеУзла);
Если не ЗначениеЗаполнено(Узел) Тогда
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,"Узел отсутствует!",Ложь,"");
КонецЕсли;
Если СтруктураОтвет.Отработало Тогда
ОбъектыРегистрации = Новый Массив;
PAPI_ОбщиеПроцедурыИФункции.ПолучитьДанныеСУзлаПоНомеруСообщения(Узел,СтруктураЗапроса.НаименованиеОбъекта,ОбъектыРегистрации,СтруктураЗапроса.текСтраница);
//Готовим ответ
РезультатОтвет = Новый Массив;
Если ОбъектыРегистрации.Количество()>0 Тогда
перЕстьГруппы = ?(ОбъектыРегистрации[0].Метаданные().Иерархический,Истина,Ложь);
Для Каждого СтрокаМассива из ОбъектыРегистрации Цикл
текЭлМасс = Новый Структура;
текЭлМасс.Вставить("Ref_Key", XMLСтрока(СтрокаМассива));
текЭлМасс.Вставить("Description", СтрокаМассива.Наименование);
текЭлМасс.Вставить("Code", СтрокаМассива.Код);
текЭлМасс.Вставить("DeletionMark", СтрокаМассива.ПометкаУдаления);
Если перЕстьГруппы Тогда
текЭлМасс.Вставить("IsFolder", СтрокаМассива.ЭтоГруппа);
КонецЕсли;
РезультатОтвет.Добавить(текЭлМасс);
КонецЦикла;
КонецЕсли;
стрРезультатОтвет = Новый Структура("value",РезультатОтвет);
ВхПараметры = PAPI_ОбщиеПроцедурыИФункции.СтандартныеПараметрыJSON();
//Делаем красивый вывод данных (Эстетика чисто для глаза)
ВхПараметры.ПереносСтрок = ПереносСтрокJSON.Авто;
РезультатОтветJSON = PAPI_ОбщиеПроцедурыИФункции.ЗаписатьДанныеВJSON(ВхПараметры,стрРезультатОтвет);
СтруктураОтвет.ДанныеОтвета = РезультатОтветJSON;
СтруктураОтвет.Вставить("ФорматОтвета",PAPI_ОбщиеПроцедурыИФункции.ФорматОтветаJSON());
КонецЕсли;
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,
400,?(Порция=0,"top=0 или page<0","Объект: """+НаименованиеОбъекта+""" не найден!"),Ложь,"");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Результат работы
&НаКлиенте
Перем HTTPСоединение;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Значения по умолчанию
ОбъектКонфигурации = "Catalog_КлассификаторБанков";
Порция = 1000;
КонецПроцедуры
&НаКлиенте
Процедура НачальнаяЗагрузка(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
//Запрашиваем количество элементов $count
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "/$count?$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata";
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Ответочка = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответочка);
Попытка
//Считываем количество элементов
КоличествоЭлементов = ПрочитатьJSON(ЧтениеJSON);
Исключение
КоличествоЭлементов = 0;
КонецПопытки;
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки());
КонецПопытки;
Результат = "";
ТекущаяСтраница = 0;
//Проверяем корректность данных
Если Порция <> 0 и КоличествоЭлементов <> 0 Тогда
//Получаем количество страниц
перДоОкругления = КоличествоЭлементов/Порция;
КоличествоСтраниц = Окр(перДоОкругления+0.5,0,РежимОкругления.Окр15как20);
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Страница 0 из " +КоличествоСтраниц+ " страниц.";
//Устанавливаем видемость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Истина;
Иначе
КоличествоСтраниц = 0;
//Выводим информацию
Элементы.ДекорацияСтатус.Заголовок = "Найдено " + КоличествоЭлементов + " элементов. Порция="+Порция;
//Устанавливаем видемость элементов
Элементы.Назад.Видимость = Ложь;
Элементы.Вперед.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Вперед(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница + 1;
Элементы.Назад.Видимость = Истина;
Если ТекущаяСтраница >= КоличествоСтраниц Тогда
Элементы.Вперед.Видимость = Ложь;
ТекущаяСтраница = КоличествоСтраниц;
КонецЕсли;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+"&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+"&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata";
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
КонецПроцедуры
&НаКлиенте
Процедура Назад(Команда)
ОчиститьСообщения();
Если ПустаяСтрока(ОбъектКонфигурации) Тогда
Сообщить("Не заполнен ""Объект""",СтатусСообщения.Важное);
КонецЕсли;
Если не ЗначениеЗаполнено(Порция) Тогда
Сообщить("Не заполнена ""Порция""",СтатусСообщения.Важное);
КонецЕсли;
//Проверяем подключение и если не подключены подключаемся
Если HTTPСоединение = Неопределено Тогда
Если НЕ Подключиться() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ТекущаяСтраница = ТекущаяСтраница - 1;
Элементы.Вперед.Видимость = Истина;
Если ТекущаяСтраница < 2 Тогда
Элементы.Назад.Видимость = Ложь;
ТекущаяСтраница = 1;
КонецЕсли;
КоличествоПропустить = ТекущаяСтраница*Порция-Порция;
//Формируем запрос
перРесурсНаСервере = "DemoSSL3_0_1_231/odata/standard.odata/"
+ ОбъектКонфигурации
+ "?$top="
+ Формат(Порция, "ЧДЦ=0; ЧН=0; ЧГ=")
+"&$skip="
+ Формат(КоличествоПропустить, "ЧДЦ=0; ЧН=0; ЧГ=")
+"&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata";
Попытка
HTTPЗапрос= Новый HTTPЗапрос(перРесурсНаСервере);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
Сообщить("Подключится не получилось: "+ОписаниеОшибки());
КонецПопытки;
Элементы.ДекорацияСтатус.Заголовок = "Страница " +ТекущаяСтраница+ " из " +КоличествоСтраниц+ " страниц.";
КонецПроцедуры
//Подключаемся Новый HTTPСоединение
&НаКлиенте
Функция Подключиться()
//В тестовых обработках так делать можно, но когда делаете в рабочей такие вещи НЕДОПУСТИМЫ!
//Храните логины и пароли в недоступных для глаз местах! (https://its.1c.ru/db/v8std#content:2149184389:hdoc)
перПорт = 0;
перСервер = "127.0.0.1";
перПользователь = "Администратор";
перПароль = "";
Попытка
Если перПорт <= 0 Тогда
HTTPСоединение = Новый HTTPСоединение(перСервер,,перПользователь,перПароль);
Иначе
HTTPСоединение = Новый HTTPСоединение(перСервер,перПорт,перПользователь,перПароль);
КонецЕсли;
Возврат Истина;
Исключение
Сообщить("Подключится не получилось: " + ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецФункции
//Подчищаем соединение
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
HTTPСоединение = Неопределено;
КонецПроцедуры
Related Posts
- Получение логина и пароля техподдержки 1С из базы
- Класс для вывода отчета в Excel
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке
Сейчас пока добавил в избранное. Но подсказывает интуиция, что «не за горой» момент, когда опыт, изложенный в данной публикации, может пригодиться.
Вместо метода ПолучитьДатуВремяИзСтроки() можно применить платформенный XMLЗначение():
XMLDate = СтруктураЗапроса.ПараметрыЗапроса.Получить(«Date»);
Date = XMLЗначение(Тип(«Дата»), XMLDate);
(2)Вариантов масса. Можно и в ПрочитатьJSON указать тип
На Java работа с Web-сервисами проще. А в 1С, после ваших статей, я выберу для обмена Com.
Обмен через блокнот, выглядит проще.
(4)
Чем проще?
Обмен через блокнот, выглядит проще.
Это только выглядит. Чем Вас так напугали http-сервисы?
(5) Статья мне понравилась.
На первый взгляд я не увидел шаблонизаторов, помогающих делать веб-страницу. У вас данные возвращаются в текстовом виде.
А в самом 1с много чего не хватает. Например, коллекций, приходится в основном всё пихать в таблицу значений.
Про выгрузку в текстовый документ я упомянул потому, что результат будет такой же, только не надо разворачивать IIS/Apache
(6)
С файлами тоже свои заморочки. Вообще надо смотреть по ситуации, нет решений которые как пилюля от всего.
С кассами чаще всего через файлы работал, люблю для этого делать доп обработку с хранимыми параметрами работающую в режиме регламента или ручном используя БСП: Доп обработки и отчеты.
Одно скажу, Com уже более 4-х лет не использую. Показываю только для того чтобы оценили их тормознутость и согласились идти другими способами. Показывал как то один тестовый пример, обходил справочник используя Com проверяя реквизит на определенное значение. Тоже самое делал по OData.
В итоге Com молотил 30 с чем то минут, OData около 3 минут. Удивленные лица многого стоят.
Я вот что не понял в варианте с планом обмена — вы понаписали кучу функций и кода, ок.
Но ведь подразумевается что при использовании OData 1C просто открывает свои объекты, доступные по этому интерфейсу. А тут получается что все равно нужно дописывать функции.
То есть я всегда воспринимал OData как вариант, когда ничего делать не надо. А тут получается надо и только тогда взлетает.
Чем тогда он отличается от веб сервисов то..
(8)Odata показывал только вариант с использованием $top и $skip напрямую к справочнику без использования плана обмена. Соответственно код был только для организации порционного вывода в обработке.
Если вы откроете Результат, то увидите там непосредственно ссылки которые формируются для получения данных.
Запрос:http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков/$count?$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
Запрос:http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков ?$top=1000&$skip=0&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков ?$top=1000&$skip=4000&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
…
Запрос:
По сути можно просто обратится по этим ссылкам и получить результат, я лишь сделал программное формирование ссылки в зависимости от порции и обработку результата.
Вариант с планом который я показал, был через http-сервис. (Не по OData)
Поясню:
По Odata мы открываем объекты, можем даже план обмена открыть, но в плане есть атворегистрация и программная регистрация. Чаще всего авторегистрация не годится для нормального обмена с разными складамимагазинамиорганизациями, так как нужна некая фильтрация данных в разрезе Складаорганизациимагазина и тут в принципе без программного вмешательства не обойтись чтобы раскидывать по узлам.
(9) Теперь понял.
Но хочу уточнить, все таки при OData не годится для случая когда нужно вычитать какую то Изменившуюся порцию.
Вы согласны?
Ваш пример про top и skip хорош и в целом позволяет читать порции, но это количественные порции.
А прочитать изменившуются порцию через OData как я понимаю не получится, ну то есть подключить функционал плана обмена и через него соединится с таблицами изменениями.. или все таки можно?
(10)Можно по ODate получать из Плана изменившуются порцию ->https://its.1c.ru/db/v8314doc#bookmark:dev:TI000001394
Пробовал года 2 назад через postman с бухгалтерии получать, вот пример запроса:
http://127.0.0.1/BuhObmenVesi/odata/standard.odata/SelectChanges?DataExchangePoint= ‘http://127.0.0.1/BuhObmenVesi/odata/standard.odata/ExchangePlan_ПоОрганизации(guid’1c95d6bd-4942-11e7-8430-d897ba0899c9’)’&MessageNo=0&$format=json;odata=nometadata
Не помню почему сделал в итоге через http-сервис… Давно было,. не вспомню.
Добрый день. Спасибо за цикл статей. Скажите, а вы не сталкивались с вопросом авторизации в http-сервисе и выхода из режима авторизации? Скажем так: если при работе с Http-сервисом ввести логин и пароль пользователя, то для того, чтобы выйти из этого режима и снова попросить авторизацию необходимо перезапустить apache/IIS.
Если сталкивались поделитесь решением. Сейчас это нигде не освещено.
(12)Честно говоря не сталкивался. Можно будет поэкспериментировать.