HTTP Сервисы: Путь к своему сервису. Часть 4

10.10.18

Разработка - Инструментарий разработчика

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 3». В предыдущих частях мы уже о многом поговорили. В этой части поговорим про размер сообщений, о файлах, о порциях и немножко, о регламентах.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение с рассмотренными примерами сервисов. (Под 8.3.12)
.cfe 36,66Kb ver:0.0.5
44
44 Скачать (1 SM) Купить за 1 850 руб.
Внешняя обработка созданная по ходу статьи (HTTP-сервисы часть4)
.epf 9,75Kb ver:0.1
36
36 Скачать (1 SM) Купить за 1 850 руб.
  • В первой части мы создали каркас для Get метода в расширении конфигурации. 
  • Во второй части мы поработали с OData и создали обработку, получающую через HTTP-Сервис используя метод Get данные сформированные при помощи СКД.
  • В третьей части мы поработали со всеми методами. Сделали пример формирующий данные при помощи СКД, работающий как через Get, так и через Post. Также поработали с длительными операциями.

В этой части поговорим о такой важной вещи как порционная передача данных. Работать будем в основном с методами GET и POST, немножко затронем OData.

HTTP-сервис будет в расширении конфигурации БСП 3.0.1.231 на платформе 8.3.12.1595.

Начнем.

Немножко про OData и порции.

Есть у OData сильный недостаток, если хотите его испытать сделайте запрос к самому большему объекту в вашей боевой базе, ну и попробуйте поработать. Вскоре пользователи прибегут к вам сами.

Для того чтобы такого не происходило нужно делать следующие вещи:

  1. Делайте выборку только по тем реквизитам, которые вам нужны. Для этого используйте $select.
  2. Перед тем как делать запрос уточните количество записей. Для этого используйте $count.
  • count - Позволяет получить в качестве результата запроса размер выборки. При успешном выполнении, тело ответа должно содержать только число элементов коллекции, отформатированное как обычное число.
  1. Если записей много забирайте их порциями через $top и $skip.
  • top - Ограничивает количество записей, возвращаемых при обращении к ресурсу.
  • skip - Позволяет исключить из результата запроса первые несколько записей. Если параметры $top и $skip указываются одновременно, то параметр $skip будет применен раньше, чем параметр $top. Приоритет применения параметров не зависит от порядка их указания в теле запроса.
  1. Я бы еще рекомендовал использовать 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&"

Создаем Команды:

  • НачальнаяЗагрузка – Загружаем количество элементов и рассчитываем количество страниц.
  • Вперед – Загружаем следующую порцию.
  • Назад – загружаем предыдущую порцию.

 
 Модуль формы
 
 Результат

Таким образом мы организовали порционное считывание данных по OData.

Ограничения по размеру файлов\данных. Дробление и порции.

В третьей части мы вскользь уже говорили о том, что по средствам метода POST можно передавать большие объемы данных, но ограничение в объеме все же есть и у данного метода. Настройка ограничения по умолчанию в IIS равна 30000000(байт) или 28,61(мегабайт) и находится тут:

Для Apache по ограничениям не скажу, не использую его более 5-ти лет, поэтому не знаю, что там за это время изменилось.

 
 Пример дробления файла

Как Вы понимаете в случае, когда данные передаются в виде разделенного файла, необходимо получить весь файл чтобы прочитать его содержимое.

Что делать, если нам нужно получить некий объем данных, невзирая на ограничения, но с возможностью чтения данных по частям?

Естественно речь идет про некую структуру данных в формате JSON или XML (есть варианты и других форматов, но нам это сейчас неинтересно). Будем использовать порции.

Предлагаю сделать через методы POST и GET нечто подобное, что мы сделали выше по OData.

Решим данную задачку двумя методами. Вариантов решения много, но я решил показать вариант, через запрос и вариант через план обмена.

1 Вариант. Через запрос.

 
 Суть метода

Для начала давайте нарисуем сервис возвращающий количество элементов и массив последних ссылок в порциях. При этом массив с последними ссылками оставим на стороне сервера хранящего данные в справочнике PAPI_ХранилищеРезультатов, созданном в предыдущей статье (Часть 3). Сервис будет называться «ПолучитьКоличествоЭлементовВариантЗапрос», наименование объекта будем подавать параметром ItemName, количество объектов в порции будем подавать параметром top. Затем создадим метод «ПолучитьПорциюЭлементовВариантЗапроса» и будем подавать в него те же параметры, что и в предыдущем методе и номер страницы (порции) параметром page.

Правим справочник PAPI_ХранилищеРезультатов.

Добавляем реквизиты:

  • МетодЗапроса – Строка(200).
  • ПараметрыЗапроса – Строка(200).
  • ДатаЗапроса – Дата и время. Будем считать, что данные актуальны в течение дня

Правим модуль PAPI_ОбщиеПроцедурыИФункции. Добавим в него несколько функций и процедуру по получению элементов. И вынесем в него часто встречающийся код по преобразованию в формат JSON.

 
 Код модуля PAPI_ОбщиеПроцедурыИФункции

Правим модули PAPI_ОбработкаМетодовGET и PAPI_ОбработкаМетодовPOST и PAPI_ОбработкаУниверсальныхМетодов. Добавляем в него наши методы.

 
 Код модуля PAPI_ОбработкаМетодовGET
 
 Код модуля PAPI_ОбработкаМетодовPOST
 
 Код модуля PAPI_ОбработкаУниверсальныхМетодов

Правим обработку, которую делали ранее для примера с OData. 

Создаем реквизит:

  • МетодСервиса – Строка. Будет хранить список значений (Пример 1 - OData(1_1), Пример 1 - Get(1_2), Пример 1 - Post(1_3))

Добавляем декорацию (ДекорацияРазмерОтвета) для вывода "Content-Length" из заголовка ответа и меняем модуль формы.

 
 Модуль формы
 
 Результат
  • На самом деле можно еще было бы создать регламент при помощи дополнительной обработки по очистке старых результатов.
  • Или создать механизм, который собирал бы количество обращений в день в разрезе параметров запроса и метода, а далее с утра регламентом подготавливал результаты для самых "горячих запросов".
  • Так же можно было создать, например регистр сведений, который хранил порции по результатам и тогда вычисления на сервере сводились бы к минимуму по данным запросам.

Данный метод плох тем, что если в базе часто создаются элементы, тогда результат будет непредсказуемым!

2 Вариант. Через Планы обмена.

Тут все просто. Регистрируем все на узле и бьем на сообщения в зависимости от порции.

Давайте нарисуем сервис возвращающий количество элементов и регистрирующий элементы справочника на узле. Будет использован план обмена _ДемоАвтономнаяРабота из БСП. Сервис будет называться «ПолучитьКоличествоЭлементовВариантПланОбмена», наименование объекта будем подавать параметром ItemName, количество объектов в порции будем подавать параметром top. Затем создадим метод «ПолучитьПорциюЭлементовВариантПланОбмена» и будем подавать в него те же параметры, что и в предыдущем методе и номер страницы (порции) параметром page.

Правим модуль PAPI_ОбщиеПроцедурыИФункции. Добавим в него Область РаботаСПланОбмена и Вспомогательную процедуру.

 
 Код модуля PAPI_ОбщиеПроцедурыИФункции

Правим модули PAPI_ОбработкаМетодовGET и PAPI_ОбработкаМетодовPOST и PAPI_ОбработкаУниверсальныхМетодов. Добавляем в него наши методы.

 
 Код модуля PAPI_ОбработкаМетодовGET
 
 Код модуля PAPI_ОбработкаМетодовPOST
 
 Код модуля PAPI_ОбработкаУниверсальныхМетодов

Правим обработку. Реквизиту МетодСервиса добавляем 2 значения Пример 2 - Get(2_1) и Пример 2 - Post(2_2)
Меняем модуль формы.

 
 Модуль формы
 
 Результат

Посмотрим запросом, что лежит на узле:

ВЫБРАТЬ
	КлассификаторБанковИзменения.Ссылка КАК Ссылка,
	КлассификаторБанковИзменения.НомерСообщения КАК НомерСообщения
ИЗ
	Справочник.КлассификаторБанков.Изменения КАК КлассификаторБанковИзменения
ГДЕ
	КлассификаторБанковИзменения.Узел = &Узел

УПОРЯДОЧИТЬ ПО
	НомерСообщения
ИТОГИ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Ссылка)
ПО
	НомерСообщения

  • В методе «ПолучитьКоличествоЭлементовВариантПланОбмена» я чищу узел и перезаполняю его, но лучше нарисовать регламент и все новые элементы распределять на новые сообщения либо прямо в методе проверять есть ли новые элементы без номеров сообщений.

Метод с узлами более правильный, чем метод запросом!

Четвертую часть заканчиваю. Мы рассмотрели с Вами методы порционной передачи данных на примере OData и методов GET и POST. Файлы мы рассмотрели вскользь, по крайней мере у меня потребность передачи файлов встречается очень редко.

Надеюсь данные примеры будут полезны в Вашей работе!

Статьи из данного цикла:

HTTP Сервисы: Путь к своему сервису. Часть 1

HTTP Сервисы: Путь к своему сервису. Часть 2

HTTP Сервисы: Путь к своему сервису. Часть 3

HTTP-сервис API JSON IIS http web apache сервис Публикатор Линк PAPI Pretty API atom-xml XML OData Код состояния СКД БСП Длительные операции

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    171354    959    403    

923

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    13875    107    46    

107

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    17178    43    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    27150    94    48    

137

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11832    44    27    

67

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    191060    1152    0    

919

Инструментарий разработчика Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1078    2    0    

5

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    104086    244    100    

307
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. zhuravlev_as 460 03.10.18 11:18 Сейчас в теме
Сейчас пока добавил в избранное. Но подсказывает интуиция, что "не за горой" момент, когда опыт, изложенный в данной публикации, может пригодиться.
eeeio; dsdred; +2 Ответить
2. nicxxx 255 02.01.19 19:29 Сейчас в теме
Вместо метода ПолучитьДатуВремяИзСтроки() можно применить платформенный XMLЗначение():
XMLDate = СтруктураЗапроса.ПараметрыЗапроса.Получить("Date");
Date = XMLЗначение(Тип("Дата"), XMLDate);
3. dsdred 3774 04.01.19 18:08 Сейчас в теме
(2)Вариантов масса. Можно и в ПрочитатьJSON указать тип
4. user805602 16.04.19 12:49 Сейчас в теме
На Java работа с Web-сервисами проще. А в 1С, после ваших статей, я выберу для обмена Com.
Обмен через блокнот, выглядит проще.
5. dsdred 3774 16.04.19 13:11 Сейчас в теме
(4)
На Java работа с Web-сервисами проще.

Чем проще?

А в 1С, после ваших статей, я выберу для обмена Com.
Обмен через блокнот, выглядит проще.

Это только выглядит. Чем Вас так напугали http-сервисы?
6. user805602 17.04.19 04:27 Сейчас в теме
(5) Статья мне понравилась.
На первый взгляд я не увидел шаблонизаторов, помогающих делать веб-страницу. У вас данные возвращаются в текстовом виде.
А в самом 1с много чего не хватает. Например, коллекций, приходится в основном всё пихать в таблицу значений.
Про выгрузку в текстовый документ я упомянул потому, что результат будет такой же, только не надо разворачивать IIS/Apache
7. dsdred 3774 17.04.19 21:20 Сейчас в теме
(6)
Про выгрузку в текстовый документ я упомянул потому, что результат будет такой же, только не надо разворачивать IIS/Apache


С файлами тоже свои заморочки. Вообще надо смотреть по ситуации, нет решений которые как пилюля от всего.
С кассами чаще всего через файлы работал, люблю для этого делать доп обработку с хранимыми параметрами работающую в режиме регламента или ручном используя БСП: Доп обработки и отчеты.

Одно скажу, Com уже более 4-х лет не использую. Показываю только для того чтобы оценили их тормознутость и согласились идти другими способами. Показывал как то один тестовый пример, обходил справочник используя Com проверяя реквизит на определенное значение. Тоже самое делал по OData.
В итоге Com молотил 30 с чем то минут, OData около 3 минут. Удивленные лица многого стоят.
Емельянов Алексей; user805602; +2 Ответить
8. newbigrator 20.04.19 21:58 Сейчас в теме
Я вот что не понял в варианте с планом обмена - вы понаписали кучу функций и кода, ок.
Но ведь подразумевается что при использовании OData 1C просто открывает свои объекты, доступные по этому интерфейсу. А тут получается что все равно нужно дописывать функции.
То есть я всегда воспринимал OData как вариант, когда ничего делать не надо. А тут получается надо и только тогда взлетает.
Чем тогда он отличается от веб сервисов то..
9. dsdred 3774 21.04.19 11:10 Сейчас в теме
(8)Odata показывал только вариант с использованием $top и $skip напрямую к справочнику без использования плана обмена. Соответственно код был только для организации порционного вывода в обработке.
Если вы откроете Результат, то увидите там непосредственно ссылки которые формируются для получения данных.

Запрос: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков/$count?$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata

Запрос: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков?$top=1000&$skip=0&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata
...
Запрос: http://127.0.0.1/DemoSSL3_0_1_231/odata/standard.odata/Catalog_КлассификаторБанков?$top=1000&$skip=4000&$select=Ref_Key,Description,Code,DeletionMark,IsFolder&$format=json;odata=nometadata

По сути можно просто обратится по этим ссылкам и получить результат, я лишь сделал программное формирование ссылки в зависимости от порции и обработку результата.


Вариант с планом который я показал, был через http-сервис. (Не по OData)
Поясню:
По Odata мы открываем объекты, можем даже план обмена открыть, но в плане есть атворегистрация и программная регистрация. Чаще всего авторегистрация не годится для нормального обмена с разными складами\магазинами\организациями, так как нужна некая фильтрация данных в разрезе Склада\организации\магазина и тут в принципе без программного вмешательства не обойтись чтобы раскидывать по узлам.
10. newbigrator 21.04.19 16:37 Сейчас в теме
(9) Теперь понял.
Но хочу уточнить, все таки при OData не годится для случая когда нужно вычитать какую то Изменившуюся порцию.
Вы согласны?

Ваш пример про top и skip хорош и в целом позволяет читать порции, но это количественные порции.
А прочитать изменившуются порцию через OData как я понимаю не получится, ну то есть подключить функционал плана обмена и через него соединится с таблицами изменениями.. или все таки можно?
11. dsdred 3774 21.04.19 21:58 Сейчас в теме
(10)Можно по ODate получать из Плана изменившуются порцию -> https://its.1c.ru/db/v8314doc#bookmark:dev:TI000001394

Пробовал года 2 назад через postman с бухгалтерии получать, вот пример запроса:
http://127.0.0.1/BuhObmenVesi/odata/standard.odata/SelectChanges?DataExchangePoint='http://127.0.0.1/BuhObmenVesi/odata/standard.odata/ExchangePlan_ПоОрганизации(guid'1c95d6bd-4942-11e7-8430-d897ba0899c9')'&MessageNo=0&$format=json;odata=nometadata

Не помню почему сделал в итоге через http-сервис... Давно было,. не вспомню.
12. Diversus 2331 02.12.19 14:10 Сейчас в теме
Добрый день. Спасибо за цикл статей. Скажите, а вы не сталкивались с вопросом авторизации в http-сервисе и выхода из режима авторизации? Скажем так: если при работе с Http-сервисом ввести логин и пароль пользователя, то для того, чтобы выйти из этого режима и снова попросить авторизацию необходимо перезапустить apache/IIS.
Если сталкивались поделитесь решением. Сейчас это нигде не освещено.
13. dsdred 3774 03.12.19 11:32 Сейчас в теме
(12)Честно говоря не сталкивался. Можно будет поэкспериментировать.
14. vbuots 20 29.06.20 09:43 Сейчас в теме
Подскажите пож. как правильно организовать работу с http сервисом с аутентификацией? Т.е. сначала авторизация с токеном, затем открыт доступ к запросам в БД..
15. dsdred 3774 29.06.20 11:39 Сейчас в теме
(14)Добрый день.
В зависимости от задачи.
http-сервис для внутреннего и для внешнего использования имеют очень разные схемы реализации.
Трудно сказать, что есть "правильно". Много зависит именно от цели.

Рекомендую посмотреть на различные API и выбрать вариант близкий Вам.

Сразу продумайте по сеансам (Ограничение на время, на количество запросов и т.д)
По токенам (будут они временные или постоянные с заменой в определенный период)
Продумайте доступ к методам и т.д.

П.С. Я использую разные варианты в зависимости от задачи.
16. src 17.09.21 12:27 Сейчас в теме
Приятная статья, спасибо автору за труды...
17. sml 41 23.09.21 15:16 Сейчас в теме
жирно плюсую Автору за оч. полезную информацию.
Хорошо бы в статьях (особенно для тех, кто читает не все статьи подряд) отмечать добавляемый код на стороне Запрашивающей и стороне Формирующей ответ.
18. dsdred 3774 23.09.21 15:43 Сейчас в теме
(17)
Хорошо бы в статьях (особенно для тех, кто читает не все статьи подряд) отмечать добавляемый код на стороне Запрашивающей и стороне Формирующей ответ

Подумаю в эту сторону, проблема в том что тогда надо код тащить из предыдущих статей...
Оставьте свое сообщение