Самодокументируемый многопоточный ответ на http запрос

18.06.26

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

А что, если ты все это время выполнял обработку запросов внешних систем неправильно?

Файлы

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

Наименование Скачано Купить файл
Конструктор объекта
.cfe 23,45Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

1. Чтение структуры входящих параметров

2. Запрос данных / вычисления

3. Формирование структуры ответа

// 1.
ВходящиеПараметрыСтрока	= HTTPЗапрос.ПолучитьТелоКакСтроку();

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ВходящиеПараметрыСтрока);

ВходящиеПараметры = ПрочитатьJSON(ЧтениеJSON);

// 2.
ЧтоТоДелаем(ВходящиеПараметры);

// 3.
Ответ = Новый Структура;
Ответ.Вставить("Атрибут1", 1)

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписатьJSON(ЗаписьJSON, Ответ);

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

Супер, развиваем успех: добавляем обработку новых запросов, новую функциональность, в хранилище новые тысячи строк кода.

И все это великолепие рушится одним вопросом: "Ребят, а какое у нас API? Заказчик хочет отдать своим клиентам описание в формате OpenAPI для интеграции". 

А что сделаешь? 

- Мы не знаем, что каждый метод ожидает в качестве входящих параметров: типы, доступные значения, атрибуты, обязательные атрибуты, примечания.

- Мы не знаем, что каждый метод отдает: типы, возможные значения, атрибуты, примечания.

- Мы ничего не знаем. Что-то приходит, что-то отдаем.

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

Как спасти, что предпринять?

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

2. Можно к текущей обработке запроса подстроить какой нибудь механизм формирования описаний. Возможно, это решение, а возможно, просто обертка для обхода все тех же ошибок.

А что случилось? Было же хорошо, кто все испортил?

На вход пришел JSON, где-то ссылки, где-то числа, строки, прочитали в структуру. Что-то сделали, сформировали структуру в ответ, сериализовали в JSON. Все строится вокруг объекта "Структура": в него читаем, из него выгружаем. У структуры есть ключ и значение. "Ключ" - имя атрибута, "Значение" - содержимое атрибута. А где разместить признаки обязательности, типов и доступных значений для атрибута? Верно, в еще одной структуре в значении. Слишком много структур.

А что, если объект "Структура" для формирования ответа внешним системам неприменим и мы совершили ошибку в самом начале, а все, что дальше, это просто костыли? Давай заменим её на "Контейнер объекта")))

"Контейнер объекта" представляет собой набор из четырех обработок (объектов), каждая из которых одновременно является независимой и зависит от других. Вместе они формируют комплексный функционал для описания структуры/коллекций, открывая безграничные возможности расширения её свойств.

1. Обработка.сп_КонтейнерОбъекта - Объект, описывающий хранимые объекты (структуры).

2. Обработка.сп_КонтейнерКоллекции - Объект, описывающий хранимые коллекции (массивы).

3. Обработка.сп_КонтейнерЗначения - Объект, описывающий хранимое значение.

4. Обработка.сп_КонтейнерСвойства - Объект, описывающий свойства хранимого объекта (ключа структуры).

 

//{
//    "Атрибут1": null,
//    "Атрибут3": {
//        "Поле1": "Привет из контекста 2!"
//    },
//    "Атрибут4": [],
//    "Атрибут5": "Привет!",
//    "Атрибут6": "Привет из контекста 1!"
//}

// Инициализация ответа
Ответ = Обработки.сп_КонтейнерОбъекта.Инициализировать();

// Атрибут1 (Строка)
// Добавим новое свойство в объект ответа с типом строка
Атрибут1 = Обработки.сп_КонтейнерЗначения.Инициализировать(Новый ОписаниеТипов("Строка"));
Атрибут1Свойство = Ответ.СвойствоДобавить("Атрибут1", Атрибут1);

// Атрибут2 (Ссылка)
// При добавлении свойства в объект установим отказ от вывода в результат в случае если не заполнено / не установлено
Атрибут2 = Обработки.сп_КонтейнерЗначения.Инициализировать(Новый ОписаниеТипов("СправочникСсылка.Валюты"));
Атрибут2Свойство = Ответ.СвойствоДобавить("Атрибут2", Атрибут2);

Атрибут2Свойство.ВыводитьПустое = Ложь;

// Атрибут3 (Структура)
// Добавим в ответ описание вложенной структуры
Атрибут3 = Обработки.сп_КонтейнерОбъекта.Инициализировать();
Атрибут3Свойство = Ответ.СвойствоДобавить("Атрибут3", Атрибут3);

// Атрибут3.Поле1 (Число)
Поле1 = Обработки.сп_КонтейнерЗначения.Инициализировать(Новый ОписаниеТипов("Число"));
Поле1Свойство = Атрибут3.СвойствоДобавить("Поле1", Поле1);

// Атрибут4 (Массив структур)
// Добавим массив структур
Атрибут4Строка = Обработки.сп_КонтейнерОбъекта.Инициализировать();

// Атрибут4.Поле2
Поле2 = Обработки.сп_КонтейнерЗначения.Инициализировать(Новый ОписаниеТипов("Булево"));
Поле2Свойство = Атрибут4Строка.СвойствоДобавить("Поле2", Поле2);

Атрибут4 = Обработки.сп_КонтейнерКоллекции.Инициализировать(Атрибут4Строка);
Атрибут4Свойство = Ответ.СвойствоДобавить("Атрибут4", Атрибут4);

// Атрибут5 (Оперативная установка значения)
// Выполним установку значения свойства "онлайн" 
Атрибут5 = Обработки.сп_КонтейнерЗначения.Инициализировать(Новый ОписаниеТипов("Строка"));
Атрибут5Свойство = Ответ.СвойствоДобавить("Атрибут5", Атрибут5);

Атрибут5.ЗначениеУстановить("Привет!");

// Атрибут6 (Отложенная установка значения из контекста)
// Для значения свойства укажем адрес по которому будет получено значение при выгрузке
Атрибут6 = Обработки.сп_КонтейнерЗначения.Инициализировать(Новый ОписаниеТипов("Строка"));
Атрибут6Свойство = Ответ.СвойствоДобавить("Атрибут6", Атрибут6);

Атрибут6.ЗначениеУстановитьИзКонтекста("Контекст.Атрибут6");

// Поиск и установка значения в ответ
Ответ.ЗначениеУстановить("Атрибут3.Поле1", "Оперативный привет!");
Ответ.ЗначениеУстановитьИзКонтекста("Атрибут3.Поле1", "Контекст.Атрибут3Поле1");

// Выгрузка ответа
Результат = Ответ.Выгрузить();

// Выгрузка описаний ответа
// В значение для каждого свойства выполняется вывод описаний типов заданных при инициализации свойства
// Данный режим выгрузки возможно использовать для реализации получения типов/доступных значений свойств и т.д.
Результат = Ответ.Выгрузить("Описания");

// Выгрузка с переданным контекстом
// Нет необходимости при формировании ответа устанавливать значения свойств "онлайн".
// Как вариант использования, возможно запустить фоновые задания для получения данных и продолжить формирование ответа. 
// А когда данные будут готовы, выгрузить ответ в контексте сформированном в фоне.
Контекст = Новый Структура;
Контекст.Вставить("Атрибут6"		, "Привет из контекста 1!");
Контекст.Вставить("Атрибут3Поле1"	, "Привет из контекста 2!");

ВыгрузитьПараметры = Ответ.ВыгрузитьПараметрыИнициализировать();
ВыгрузитьПараметры.Режим					= "ЗначенияИзКонтекста";
ВыгрузитьПараметры.Контекст					= Контекст;

Результат = Ответ.Выгрузить(ВыгрузитьПараметры);

// Частичная выгрузка ответа, отдельного свойства или коллекции
Результат = Ответ.ЗначениеНайтиИВыгрузить("Атрибут3", ВыгрузитьПараметры);

 

В чем преимущество?

1. Описание объекта (входящей структуры / структура ответа) изолировано от данных, и они формируются независимо друг от друга. Хочешь, запускай в параллели.

2. Возможность реализации "статической типизации". Все значения свойств устанавливаются через единый метод, легко реализовать проверку типов.

3. Свойства атрибута это отдельный объект, со своими настройками. Легко добавить свои, предположим: ДоступныеЗначения (для проверки не только устанавливаемого типа, но и самого значения)

Как видите, все просто, данная разработка в помощь!

Обработка является частью модуля Стандартные подсистемы.

Проект и исходный код доступен на GitLab. 

 -----

Требования:

- Обработка предназначена для версии платформы >= 8.3.13, тестировалась на 8.3.21.1895

 

-----

Ссылки:
Проект в GitLab

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.1.91

Вступайте в нашу телеграмм-группу Инфостарт

См. также

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

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

24900 руб.

20.08.2024    72095    367    170    

319

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

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

16500 руб.

02.09.2020    262950    1465    421    

1174

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26

22570 руб.

06.10.2023    39050    108    46    

122

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    58734    119    34    

129

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

6000 руб.

25.02.2026    4197    14    1    

18

Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Программист Бизнес-аналитик Руководитель проекта 1С 8.3 Платные (руб)

Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.

14000 руб.

17.04.2026    6996    30    41    

44

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

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

9500 руб.

17.05.2024    53839    186    63    

218

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

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

17000 руб.

10.11.2023    25832    95    46    

103
Для отправки сообщения требуется регистрация/авторизация