Почему в 1С при чтении JSON в артикуле появляются пробелы и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними системами через формат JSON разработчики часто сталкиваются с неожиданным визуальным искажением данных. Например, артикул, который в источнике записан как 25478, при чтении в 1С превращается в 25 478. Разберем, почему это происходит и как гарантированно избавиться от этой «магии» платформы.

Разберем причину возникновения проблемы

Основная причина кроется в механизме автоматического определения типов при использовании функции ПрочитатьJSON. Когда 1С получает данные, она анализирует структуру JSON. Если значение поля (например, article) передано как число (без кавычек), парсер 1С автоматически присваивает этому полю тип Число.

В дальнейшем, когда вы выводите это значение в Сообщить или записываете в реквизит формы, платформа применяет встроенное форматирование для чисел. В настройках пользователя 1С обычно включено отображение разделителей групп разрядов (пробелов). Таким образом, пробел не приходит из JSON, он «рисуется» платформой 1С при попытке отобразить число.

Решение проблемы: принудительное приведение к строке

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

Для решения задачи мы будем использовать функцию Строка() непосредственно в момент присваивания значения из объекта, полученного через ПрочитатьJSON.

Рассмотрим пример правильного кода для обработки данных:


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Результат.ПолучитьТелоКакПоток);
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Для Каждого ЭлементСписка Из ДанныеJSON Цикл
    // Принудительно приводим к строке, чтобы избежать форматирования числа
    Артикул = Строка(ЭлементСписка.article);
    Наименование = ЭлементСписка.name;
    // ... дальнейшая логика обработки
КонецЦикла;

Важные рекомендации по написанию кода

Помимо решения основной проблемы с пробелами, проанализируем ошибки, которые часто допускают при работе с циклами в 1С:

  1. Избегайте конфликта имен: В исходном примере использовалась конструкция Для Каждого Товар из Товар. Это плохая практика, так как имя переменной цикла перекрывает имя коллекции. Рекомендуем использовать разные имена, например Для Каждого Элемент Из Коллекция.
  2. Инициализация переменных: Всегда очищайте переменные перед циклом, если вы собираетесь использовать их для накопления или передачи данных, чтобы избежать попадания «мусора» из предыдущих итераций.
  3. Безопасность типов: Поскольку артикулы могут приходить в разном формате (и как числа, и как строки), явное приведение Строка() является универсальным инструментом, который защитит вашу логику от падения при смене формата данных на стороне отправителя.

Подведем итоги

Мы выяснили, что появление пробелов в артикулах — это не ошибка парсинга JSON, а особенность представления чисел в интерфейсе 1С. Чтобы данные всегда оставались в исходном виде, необходимо:

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

← На главную