Работа с современными форматами обмена данными, такими как JSON, в устаревшей платформе 1С:Предприятие 7.7 сопряжена с рядом трудностей. Основная проблема заключается в том, что "семерка" не имеет встроенных средств для сериализации объектов в JSON и работает в кодировке Windows-1251 (ANSI), в то время как стандарт JSON требует обязательного экранирования определенных символов и использования кодировки UTF-8. Чтобы упростить разработку, можно использовать готовую библиотеку процедур и функций для 1С 7.7, которая уже содержит инструменты для работы с JSON, строками и HTTP-запросами. Рассмотрим подробнее, как правильно подготовить строку к выгрузке самостоятельно.
Проанализируем простейший способ подготовки строки. Согласно спецификации JSON, символы кавычек и обратного слэша должны быть экранированы. Разберем реализацию функции, которая выполняет базовую замену знаков, чтобы JSON-структура не "развалилась" при чтении. Это критически важно, когда выполняется подключение фискальных регистраторов по протоколу JSON, где любая ошибка в формате строки приведет к отказу оборудования.
Рассмотрим пример кода, который последовательно обрабатывает строку:
Функция ИсправитьКавычки(Стр) Экспорт
// Сначала заменяем обратный слэш, чтобы не экранировать уже добавленные слэши
Стр = СтрЗаменить(Стр, "\", "\\");
// Экранируем прямой слэш (рекомендуется для JSON)
Стр = СтрЗаменить(Стр, "/", "\/");
// Экранируем двойные кавычки
Возврат СтрЗаменить(СокрЛП(Стр), """", "\""");
КонецФункции
Важный нюанс: при использовании СтрЗаменить порядок операций критичен. Мы всегда должны начинать с замены самого символа обратного слэша \, иначе последующие замены (например, кавычки на \") приведут к ошибочному удвоению слэшей там, где это не нужно.
Выясним причину, по которой обычного экранирования кавычек часто недостаточно. При обмене данными с веб-сервисами или 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 конкатенация строк в цикле Итог = Итог + Символ работает медленно на очень больших текстах. Для оптимизации рекомендуем использовать объект Текст или внешние компоненты.
Рассмотрим более жесткий, но надежный метод подготовки данных. Вместо того чтобы искать "плохие" символы, мы оставим только "хорошие". Это особенно полезно при выгрузке данных в системы, критичные к кодировкам.
Разберем, как реализовать фильтрацию по разрешенному набору знаков:
Функция ОставитьРазрешенныеСимволы(СтрокаИсточник)
НовСтрока = "";
// Задаем набор допустимых символов: буквы, цифры и основные знаки пунктуации
Разрешенные = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя .,-()";
Для Сч = 1 По СтрДлина(СтрокаИсточник) Цикл
ТекСимв = Сред(СтрокаИсточник, Сч, 1);
Если Найти(Разрешенные, ТекСимв) > 0 Тогда
НовСтрока = НовСтрока + ТекСимв;
КонецЕсли;
КонецЦикла;
Возврат НовСтрока;
КонецФункции
Предупреждение: не забудьте включить в список разрешенных символов букву Ё и цифры, так как часто программисты забывают об этом при создании "белых списков", что приводит к потере данных (например, исчезают пробелы или номера домов в адресах).
Проанализируем специфическую задачу: передачу кодов маркировки. Они содержат непечатный разделитель GS1 (код символа 29). В 1С 7.7 хранение этого символа в обычных строковых реквизитах справочников может быть нестабильным. Это крайне важно учитывать, когда вы реализуете разрешительный режим на кассах для Честного знака, работающий через API запросы.
В некоторых случаях, например, осуществляя встраивание ТС ПИоТ в 1С 7.7 для работы с Атол, разработчику приходится вручную контролировать корректность передаваемых кодов. Также полезно изучить пример работы локального модуля Честный знак, который позволяет обрабатывать запросы даже при проблемах со связью.
Рассмотрим стратегию временной замены:
Симв(29) на печатную метку, например, (GS1).
// Пример подготовки для ККТ
КодДляПередачи = СтрЗаменить(СокрЛП(КодИзБазы), "(GS1)", Симв(29));
Если вам необходимо обрабатывать очень большие объемы текста в 1С 7.7 (например, выгрузку сотен тысяч строк номенклатуры), стандартные циклы будут работать долго. В таких случаях мы рекомендуем:
VBScript.RegExp через COM-соединение. Это позволит выполнять сложные замены и фильтрацию с помощью регулярных выражений.ADODB.Stream.\uXXXX, где XXXX — шестнадцатеричный код символа.Таким образом, мы рассмотрели основные способы обработки строк. Выбор конкретного метода зависит от вашей задачи: для простых выгрузок достаточно СтрЗаменить, а для надежного обмена данными с веб-серверами лучше комбинировать очистку от непечатных символов с последующим экранированием по стандарту RFC 8259.