- В первой части мы создали каркас для 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.
//Заполняем структуру ответа
Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета) Экспорт
СтруктураОтвет.КодОтвета = КодОтвета;
СтруктураОтвет.ТекстОшибки = ТекстОшибки;
СтруктураОтвет.Отработало = Отработало;
СтруктураОтвет.ДанныеОтвета = ДанныеОтвета;
КонецПроцедуры
Функция БазаФайловая()
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
// в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "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_ОбработкаУниверсальныхМетодов. Добавляем в него наши методы.
//Функция экспортная, специально чтобы можно было отлаживать как по 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>";
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовPOST(СтруктураВхПараметров) Экспорт
//структура ответа. Собственна нужна для формирования ответа
СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
//Переправляем на нужный метод
#Область ПримерыЧасть3
//Получаем список заданий за период (БСП)
Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),ложь,"");
КонецЕсли;
Возврат СтруктураОтвет;
КонецФункции
#Область Методы
//Пример из Части 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_ОбщиеПроцедурыИФункции. Добавим в него Область РаботаСПланОбмена и Вспомогательную процедуру.
//Заполняем структуру ответа
Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета) Экспорт
СтруктураОтвет.КодОтвета = КодОтвета;
СтруктураОтвет.ТекстОшибки = ТекстОшибки;
СтруктураОтвет.Отработало = Отработало;
СтруктураОтвет.ДанныеОтвета = ДанныеОтвета;
КонецПроцедуры
Функция БазаФайловая()
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
// в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "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_ОбработкаУниверсальныхМетодов. Добавляем в него наши методы.
//Функция экспортная, специально чтобы можно было отлаживать как по 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>";
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовPOST(СтруктураВхПараметров) Экспорт
//структура ответа. Собственна нужна для формирования ответа
СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
//Переправляем на нужный метод
#Область ПримерыЧасть3
//Получаем список заданий за период (БСП)
Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьСписокЗаданийЗаПериод") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьСписокЗаданийЗаПериод(СтруктураОтвет,СтруктураВхПараметров);
#КонецОбласти
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантЗапрос") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантЗапрос(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантЗапроса") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантЗапроса(СтруктураОтвет,СтруктураВхПараметров);
//Получаем количество элементов
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьКоличествоЭлементовВариантПланОбмена") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьКоличествоЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров);
//Порционно получаем элементы в формате JSON
ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("ПолучитьПорциюЭлементовВариантПланОбмена") Тогда
PAPI_ОбработкаУниверсальныхМетодов.ПолучитьПорциюЭлементовВариантПланОбмена(СтруктураОтвет,СтруктураВхПараметров);
Иначе
PAPI_ОбщиеПроцедурыИФункции.ЗаполнитьСтруктуруОтвета(СтруктураОтвет,501,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),ложь,"");
КонецЕсли;
Возврат СтруктураОтвет;
КонецФункции
#Область Методы
//Пример из Части 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Соединение = Неопределено;
КонецПроцедуры