Валидация JSON в 1С: от ручных проверок к схемам

27.02.26

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

Внешняя Native API компонента для 1С, которая проверяет JSON по схеме - вместо десятков ручных проверок в коде.

Если вы писали HTTP-сервисы на 1С, вы знаете этот момент. JSON пришёл, ПрочитатьJSON отработал, и начинается самое интересное - убедиться, что данные вообще похожи на то, что ожидалось.

Обычно это выглядит так:

Если НЕ ЗначениеЗаполнено(Данные["clientId"]) Тогда
    Возврат ОшибкаФормата("Не заполнен clientId");
КонецЕсли;

Если ТипЗнч(Данные["amount"]) <> Тип("Число") Тогда
    Возврат ОшибкаФормата("amount должен быть числом");
КонецЕсли;

Если НЕ (Данные["amount"] > 0) Тогда
    Возврат ОшибкаФормата("amount должен быть больше нуля");
КонецЕсли;

// ... и ещё 20 таких же проверок

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

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

Самое неприятное - такой код не документирует контракт. Чтобы понять, что именно принимает сервис, нужно читать всю процедуру валидации целиком.


Описать структуру один раз

Есть стандарт для описания структуры JSON-документов - JSON Schema. Схема сама является JSON-объектом, в котором вы декларативно указываете: какие поля обязательны, какие типы допустимы, каковы ограничения на значения.

Вот как выглядит схема для той же заявки:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "required": ["clientId", "amount"],
  "properties": {
    "clientId": { "type": "string" },
    "amount": { "type": "number", "exclusiveMinimum": 0 }
  },
  "additionalProperties": false
}

Это заменяет весь тот код выше. Плюс схему можно отдать внешней системе как документацию - она машиночитаема и понятна без объяснений.

Проблема одна: в 1С нет встроенного инструмента, который умеет валидировать JSON по такой схеме.


jsonschema-1c

Чтобы закрыть этот пробел, была написана внешняя компонента - jsonschema-1c. Она предоставляет три основных метода:

  • УстановитьСхему - задаёт схему для валидации
  • ДобавитьСхему - регистрирует вспомогательную схему для $ref
  • Проверить - проверяет переданный JSON на соответствие схеме с описанием ошибок
  • Действителен - проверяет переданный JSON на соответствие схеме без описания подробностей ошибки

Исходный код, актуальная документация и релизы: https://github.com/Toveal/jsonschema-1c


Как это выглядит на практике

Возьмём HTTP-сервис, который принимает заявку на перевод денег. Определяем схему:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "required": ["requestId", "clientInn", "amount", "currency", "createdAt"],
  "properties": {
    "requestId": { "type": "string", "minLength": 1 },
    "clientInn": { "type": "string", "format": "ru-inn-individual" },
    "amount": { "type": "number", "exclusiveMinimum": 0, "maximum": 1000000 },
    "currency": { "type": "string", "enum": ["RUB", "KZT", "USD"] },
    "createdAt": { "type": "string", "format": "local-date-time" },
    "comment": { "type": "string", "maxLength": 500 }
  },
  "additionalProperties": false
}

Обработчик запроса становится простым и читаемым:

Функция ОбработатьЗапрос(Запрос)
    
    КомпонентаПодключена = ПодключитьВнешнююКомпоненту(ПутьККомпоненте(), "JsonСхема",
        ТипВнешнейКомпоненты.Native, ТипПодключенияВнешнейКомпоненты.НеИзолированно);

    Если Не КомпонентаПодключена Тогда
        Возврат СформироватьОтвет(500, "Ошибка подключения компоненты");
    КонецЕсли;

    Компонента = Новый("AddIn.JsonСхема.JsonSchema1C");
    Компонента.УстановитьОсновнуюСхему(ОсновнаяСхема());

    БуферОшибок = "";
    
    Если Не Компонента.Проверить(ТестовыйJSON(), БуферОшибок) Тогда
        Возврат СформироватьОтвет(400, БуферОшибок);    
    КонецЕсли;
    
    // Данные корректны - работаем дальше
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
    Данные = ПрочитатьJSON(ЧтениеJSON);
    
    // ... обработка заявки
    
    Возврат СформироватьОтвет(200, "OK");
    
КонецФункции

Если документ не прошёл проверку, переменная БуферОшибок будет содержать конкретные пути и описания:

[
    "-500 is less than or equal to the minimum of 0",
    "\"12345\" is not a \"ru-inn-individual\"",
    "\"2024-03-15T10:30:00Z\" is not a \"local-date-time\"",
    "\"EUR\" is not one of \"RUB\", \"KZT\" or \"USD\"",
    "\"\" is shorter than 1 character",
    "Additional properties are not allowed ('extraField' was unexpected)"
]

Это можно сразу отдавать вызывающей системе - никакой дополнительной обработки не нужно.


Кастомные форматы для 1С

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

ru-inn-individual и ru-inn-legal-entity - валидация российского ИНН по контрольным суммам, для физлиц и организаций соответственно. kz-iin - аналог для казахстанского ИИН.

local-date-time когда 1С сериализует дату через ЗаписатьJSON, платформа выдаёт строки вида "2024-03-15T10:30:00" - без часового пояса. Стандартный формат date-time такие строки не принимает, поэтому корректно сериализованные даты не прошли бы валидацию. local-date-time решает именно эту проблему.

{
  "properties": {
    "ИННФизлица":    { "type": "string", "format": "ru-inn-individual" },
    "ИННОрганизации": { "type": "string", "format": "ru-inn-legal-entity" },
    "ДатаСоздания":  { "type": "string", "format": "local-date-time" }
  }
}

Составные схемы

Реальные схемы часто переиспользуют общие определения - адрес, контактное лицо, сумма. В JSON Schema для этого есть $ref. Компонента поддерживает его через ДобавитьСхему: сначала регистрируются все зависимости, затем устанавливается основная схема.

Компонента.ДобавитьСхему("https://myapp.local/schemas/address", ПолучитьМакет("СхемаАдреса").ПолучитьТекст());
Компонента.УстановитьСхему(ПолучитьМакет("СхемаЗаказа").ПолучитьТекст());

Порядок важен: зависимости регистрируются до установки основной схемы.


Когда это имеет смысл

Компонента хорошо работает там, где JSON приходит снаружи и его структура заранее известна: HTTP-сервисы, интеграции с внешними системами. Схема в этих случаях решает сразу две задачи - и проверяет данные, и документирует контракт.

Если у вас одно-два поля и структура никогда не меняется - проще написать проверки руками. Но как только валидация начинает разрастаться, декларативная схема даёт плоды.

Исходный код открыт : https://github.com/Toveal/jsonschema-1c 


Полезные ресурсы

https://www.jsonschemavalidator.net/ - онлайн валидация JSON по схеме
https://json.ophir.dev/ - онлайн редактор JSON схемы
https://json-schema.org/learn/getting-started-step-by-step - официальный гайд по JSON Schema с нуля
https://json-schema.org/understanding-json-schema - подробный справочник по всем ключевым словам схемы
//infostart.ru/1c/articles/1543922/ - серия статей "Понимание схемы JSON"

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

JSON JSON Schema валидация внешняя компонента Native API HTTP-сервис интеграция REST

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

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

См. также

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

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

24900 руб.

20.08.2024    66167    349    163    

307

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

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

16500 руб.

02.09.2020    256433    1417    421    

1160

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

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

15250 руб.

25.08.2025    52459    106    29    

117

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

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

22570 руб.

06.10.2023    37628    98    46    

118

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

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

17000 руб.

10.11.2023    24871    92    44    

101

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

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

6000 руб.

25.02.2026    3216    12    1    

14

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

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

9500 руб.

17.05.2024    52285    181    63    

214
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vix 31 28.02.26 01:40 Сейчас в теме
+ за старания, rust действительно идеально подходит для внешних компонент. Хотел спросить именно по json схеме. Почему не проще использовать стандартную библиотеку Python jsonschema. Не нужно хранить библиотеку в 1с, просто обращаться через htpp сервис в 1с?
caterpillar1276; +1 Ответить
2. Toveal 20 28.02.26 12:21 Сейчас в теме
(1) Да, такой вариант вполне имеет место быть. Но мне хотел сделать более универсальное решение. Закинул в базу и забыл. Да и есть очевидные плюсы
1. Подключил библиотеку и все. Никаких зависимостей и прочего. Не надо заботиться о инфраструктуре вокруг сервера 1с
2. Скорость выполнения. Http запрос как не крути будет медленнее чем вызов функции в dll
3. Native компонента проще в использовании чем вызов внешнего сервиса
Cocky_Idiot; +1 Ответить
3. Vix 31 28.02.26 16:52 Сейчас в теме
(2) да отличный вариант для толстого и тонкого клиента. На стороне веб клиента я помню упирался в ограничения с внешними компонентами
4. o.nikolaev 217 28.02.26 17:44 Сейчас в теме
JSON+JSON schema - здравствуй XML.
sapervodichka; DmitryKlimushkin; caterpillar1276; +3 1 Ответить
5. Cocky_Idiot 37 01.03.26 04:46 Сейчас в теме
(4) да наеборот же: "xml, давай досвиданья!"
XML - рабочий вариант где-то до середины нулевых. Потом сообразили, что он плох как машиночитаемый(ибо не бинарный, избыточный) так и человекочитаемый(ибо вообще не читаемый, как только появляются ns). Технология для своего времени была крута, но пришла и ушла, надо забыть, закопайте стюардессу.
14. o.nikolaev 217 01.03.26 21:14 Сейчас в теме
(5) Увы, по моему мнению ваше мнение насчет XML и JSON, а особенно "закопайте стюардессу" - абсолютно ошибочно.
sapervodichka; +1 Ответить
15. Cocky_Idiot 37 01.03.26 22:05 Сейчас в теме
(14)
по моему мнению
да, понимаю вас, тема крайне холиварная. к единому мнению "xml или json" не придем никогда.
12. gybson 6 01.03.26 19:39 Сейчас в теме
(4) Даже тут есть статься "Валидация JSON через XDTO". Но это же какая простая жизнь?
Нам же добрый хороший специалист прислал невалидные данные, радость в доме.
17. dhurricane 02.03.26 17:46 Сейчас в теме
(12) Одно из неудобств валидации JSON через XDTO - это дублирование схемы, когда она нужна и при валидации входящих запросов, и при написании спецификации в формате OpenAPI.
19. gybson 6 02.03.26 18:23 Сейчас в теме
(17) костылить wsdl и должно быть неудобно
6. Cocky_Idiot 37 01.03.26 04:54 Сейчас в теме
Инфостарт - местами торт.
Автор, кроме того, что решает насущную проблему валидации, ещё и даёт шаблон для создания внешних компонент на rust.
Двадцать два, перебор, но в хорошем смысле этого слова.
Хочу таким быть. Низкий поклон!
7. KPavlyushkevich 01.03.26 11:40 Сейчас в теме
Выглядит хорошо)
А можете помочь объяснить как собрать внешнюю компоненты из исходников?
8. Toveal 20 01.03.26 13:15 Сейчас в теме
(7)
Сборка на windows
1. Установите rust
2. Установите Docker
3. Запускайте по очереди
cargo install --force cargo-make
cargo install cross --git https://github.com/cross-rs/cross
4. Запустите
cargo make pack-release


Zip архив будет в ./out
9. webester 26 01.03.26 15:59 Сейчас в теме
Сразу говорю, что внешняя компонента на раст это круто. Потому, что все, что я слышал, так это то, что кроме как на си писать внешние компоненты нельзя. Оказывается можно. Разобраться бы еще как. Два чая этому господину. Что непонятно, почему не писать валидатор на 1С? Все тоже самое в отдельном модуле или обработке. Потому, что медленно будет?
10. Toveal 20 01.03.26 17:09 Сейчас в теме
(9) Если опустить прочие нюансы то да, 1С будет медленнее потому что интерпретируемый язык. Ну а на чистом 1С реализовать не получится:
Вся валидация будет выполняться линейно и распараллелить не получится т.к. запуск фоновых заданий идёт с клиента
Первое что пришло в голову это regex. В платформе поддержка появилась не так давно, поэтому придется использовать внешнюю компоненту для regex или ограничить поддерживаемые платформы
18. dhurricane 02.03.26 17:47 Сейчас в теме
(10) А что именно параллелится, раскажите, пожалуйста?
11. DmitryKlimushkin 181 01.03.26 18:26 Сейчас в теме
Приветствую любое упорядочение и систематизацию, к которой , конечно же, относится валидация)
Вспомнил, почему я очень часто использую XML и совсем редко имею дело с JSON. Потому, что платформа 1С XML вполне обслуживает, а JSON это такой ... пасынок. Если уж нет выбора и в ассортименте на входе только JSON, тогда может и стоит повыкручиваться, прилепляя где-то сбоку "ласточкино гнездо". Но если речь идёт о каком-то своём обмене, то лучше сразу применять тот стандарт, который в платформе богаче обслуживается. Как один из собеседников ((4). o.nikolaev) написал, что "JSON+JSON schema - здравствуй XML" - лучше и не скажешь.
13. gybson 6 01.03.26 19:49 Сейчас в теме
Rust это хорошо. ИИ использовался? Я GLM-5 спросил, она некий шаблон дала и посоветовала библиотеку addin1c
16. dehro 13 02.03.26 07:23 Сейчас в теме
Если задачу можно решить средствами платформы (без привлечения внешних механизмов), решать нужно средствами платформы.

Кроме того, внешняя компонента так же перебирает все поля на соответствие схеме. В чём же выигрыш?
Напишите эту проверку на 1С, поместите в отдельный модуль. Так же будете вызывать одной строкой.
20. rnobody 4 03.03.26 15:09 Сейчас в теме
(16)
Если задачу можно решить средствами платформы (без привлечения внешних механизмов), решать нужно средствами платформы.


Валидация JSON
21. dehro 13 05.03.26 08:55 Сейчас в теме
(20) Можно написать функцию, которая разбирает json-схему в структуру, эту структуру закэшировать, а потом по ней проверять полученные значения.

Вызов внешнего функционала однозначно увеличение времени работы.

Хотя тогда XML однозначно удобнее.
Для отправки сообщения требуется регистрация/авторизация