Как реализовать функцию обработки спецсимволов и экранирования строк в 1С 7.7 для JSON

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Работа с современными форматами обмена данными, такими как JSON, в устаревшей платформе 1С:Предприятие 7.7 сопряжена с рядом трудностей. Основная проблема заключается в том, что "семерка" не имеет встроенных средств для сериализации объектов в JSON и работает в кодировке Windows-1251 (ANSI), в то время как стандарт JSON требует обязательного экранирования определенных символов и использования кодировки UTF-8. Чтобы упростить разработку, можно использовать готовую библиотеку процедур и функций для 1С 7.7, которая уже содержит инструменты для работы с JSON, строками и HTTP-запросами. Рассмотрим подробнее, как правильно подготовить строку к выгрузке самостоятельно.

Метод 1: Экранирование через СтрЗаменить

Проанализируем простейший способ подготовки строки. Согласно спецификации JSON, символы кавычек и обратного слэша должны быть экранированы. Разберем реализацию функции, которая выполняет базовую замену знаков, чтобы JSON-структура не "развалилась" при чтении. Это критически важно, когда выполняется подключение фискальных регистраторов по протоколу JSON, где любая ошибка в формате строки приведет к отказу оборудования.

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


Функция ИсправитьКавычки(Стр) Экспорт
    // Сначала заменяем обратный слэш, чтобы не экранировать уже добавленные слэши
    Стр = СтрЗаменить(Стр, "\", "\\"); 
    // Экранируем прямой слэш (рекомендуется для JSON)
    Стр = СтрЗаменить(Стр, "/", "\/");
    // Экранируем двойные кавычки
    Возврат СтрЗаменить(СокрЛП(Стр), """", "\""");
КонецФункции

Важный нюанс: при использовании СтрЗаменить порядок операций критичен. Мы всегда должны начинать с замены самого символа обратного слэша \, иначе последующие замены (например, кавычки на \") приведут к ошибочному удвоению слэшей там, где это не нужно.

Метод 2: Очистка от непечатных символов и управляющих кодов

Выясним причину, по которой обычного экранирования кавычек часто недостаточно. При обмене данными с веб-сервисами или 1С 8.3 файлы могут не проходить валидацию из-за наличия символов с кодами ниже 32 (управляющие символы ASCII), которые часто попадают в базу при копировании текста из интернета или документов Word.

Проанализируем ситуацию: символы перевода строки, табуляции или возврата каретки также должны быть либо удалены, либо заменены на соответствующие последовательности \n, \t, \r. Посмотрим на реализацию функции очистки строки методом перебора:


Функция ОчиститьТекстОтСпецсимволов(Знач Текст, СимволЗамены = "")
    Итог = "";
    ДлинаСтроки = СтрДлина(Текст);
    Для НомерСимвола = 1 По ДлинаСтроки Цикл
        Символ = Сред(Текст, НомерСимвола, 1);
        КодСимвола = КодСимв(Символ);
        
        // Проверяем на недопустимые управляющие символы (0-8, 11, 12, 14-31)
        Если (КодСимвола < 9)
            Или ((КодСимвола > 10) И (КодСимвола < 13))
            Или ((КодСимвола > 13) И (КодСимвола < 32)) Тогда
            
            Символ = СимволЗамены; // Удаляем или заменяем на пробел
        КонецЕсли;
        
        Итог = Итог + Символ;
    КонецЦикла;
    Возврат Итог;
КонецФункции

Этот подход гарантирует, что в результирующем JSON не будет "битых" символов, которые вызывают ошибки парсинга. Однако помните, что в 1С 7.7 конкатенация строк в цикле Итог = Итог + Символ работает медленно на очень больших текстах. Для оптимизации рекомендуем использовать объект Текст или внешние компоненты.

Метод 3: Использование «белого списка» разрешенных символов

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

Разберем, как реализовать фильтрацию по разрешенному набору знаков:


Функция ОставитьРазрешенныеСимволы(СтрокаИсточник)
    НовСтрока = "";
    // Задаем набор допустимых символов: буквы, цифры и основные знаки пунктуации
    Разрешенные = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя .,-()";
    
    Для Сч = 1 По СтрДлина(СтрокаИсточник) Цикл
        ТекСимв = Сред(СтрокаИсточник, Сч, 1);
        Если Найти(Разрешенные, ТекСимв) > 0 Тогда
            НовСтрока = НовСтрока + ТекСимв;
        КонецЕсли;
    КонецЦикла;
    
    Возврат НовСтрока;
КонецФункции

Предупреждение: не забудьте включить в список разрешенных символов букву Ё и цифры, так как часто программисты забывают об этом при создании "белых списков", что приводит к потере данных (например, исчезают пробелы или номера домов в адресах).

Метод 4: Работа с маркировкой (Честный Знак) и спецсимволом GS1

Проанализируем специфическую задачу: передачу кодов маркировки. Они содержат непечатный разделитель GS1 (код символа 29). В 1С 7.7 хранение этого символа в обычных строковых реквизитах справочников может быть нестабильным. Это крайне важно учитывать, когда вы реализуете разрешительный режим на кассах для Честного знака, работающий через API запросы.

В некоторых случаях, например, осуществляя встраивание ТС ПИоТ в 1С 7.7 для работы с Атол, разработчику приходится вручную контролировать корректность передаваемых кодов. Также полезно изучить пример работы локального модуля Честный знак, который позволяет обрабатывать запросы даже при проблемах со связью.

Рассмотрим стратегию временной замены:

  1. При сохранении кода маркировки в базу заменяем Симв(29) на печатную метку, например, (GS1).
  2. Перед формированием JSON или передачей данных в ККТ (контрольно-кассовую технику) производим обратную замену.

// Пример подготовки для ККТ
КодДляПередачи = СтрЗаменить(СокрЛП(КодИзБазы), "(GS1)", Симв(29));

Дополнительные рекомендации по производительности

Если вам необходимо обрабатывать очень большие объемы текста в 1С 7.7 (например, выгрузку сотен тысяч строк номенклатуры), стандартные циклы будут работать долго. В таких случаях мы рекомендуем:

  1. Использовать объект VBScript.RegExp через COM-соединение. Это позволит выполнять сложные замены и фильтрацию с помощью регулярных выражений.
  2. Для конвертации итогового файла в UTF-8 используйте объект ADODB.Stream.
  3. Для сложных интеграций, таких как получение токена авторизации RuStore с подписью RSA SHA512, может потребоваться комбинирование штатных средств с внешними компонентами для криптографии.
  4. При экранировании специфических Unicode-символов, которых нет в кириллице, используйте формат \uXXXX, где XXXX — шестнадцатеричный код символа.

Таким образом, мы рассмотрели основные способы обработки строк. Выбор конкретного метода зависит от вашей задачи: для простых выгрузок достаточно СтрЗаменить, а для надежного обмена данными с веб-серверами лучше комбинировать очистку от непечатных символов с последующим экранированием по стандарту RFC 8259.

← На главную