Как правильно экранировать спецсимволы и кавычки в кодах маркировки при выгрузке в CSV из 1С?

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

При интеграции систем 1С с личным кабинетом «Честного Знака» (ГИС МТ) разработчики часто сталкиваются с необходимостью ручной выгрузки кодов маркировки (КМ) в формате CSV. Этот формат прост и удобен, однако имеет жесткие стандарты обработки спецсимволов. Если в коде маркировки (например, DataMatrix) присутствуют кавычки, запятые или точки с запятой, простая запись строки «как есть» приведет к ошибке разбора файла на стороне шлюза маркировки. В качестве альтернативы ручному файловому обмену можно использовать решение для взаимодействия с API «Честного Знака».

В этой статье мы подробно разберем, как правильно обрабатывать спецсимволы в строках программными средствами 1С, изучим официальные требования «Честного Знака» и напишем надежный алгоритм экранирования данных.

Почему возникает проблема при выгрузке в CSV?

Рассмотрим стандартную ситуацию. Код маркировки может содержать самые разные символы, включая скобки, дефисы, запятые и кавычки: (01)04630084600894(21)-7bTmAVb,<0b),,,. Формат CSV (Comma-Separated Values) использует запятую (или точку с запятой) в качестве разделителя колонок, а двойные кавычки — в качестве ограничителя текстовых полей.

Если парсер «Честного Знака» встречает запятую внутри кода маркировки, он считает ее разделителем колонок. Данные «сдвигаются», структура файла ломается, и система выдает критическую ошибку импорта. Чаще всего это проявляется в виде сообщения: «Номер товарной позиции. Должно быть числовое значение». На самом деле проблема кроется не в номере позиции, а в некорректном экранировании соседнего поля с кодом маркировки.

Официальные правила экранирования для «Честного Знака»

Чтобы шлюз импорта корректно обработал ваш CSV-файл, необходимо строго соблюдать правила стандарта RFC 4180:

  1. Дублирование внутренних кавычек: Если внутри кода маркировки встречается символ двойной кавычки ", его необходимо продублировать, превратив в "".
  2. Обрамление строки внешними кавычками: Если в коде присутствует запятая, точка с запятой или перенос строки, весь код маркировки целиком должен быть взят во внешние двойные кавычки.
  3. Комбинированное правило: Если в коде присутствуют и кавычки, и запятые, сначала мы удваиваем внутренние кавычки, а затем оборачиваем всю получившуюся строку во внешние кавычки.

Реализация алгоритма экранирования в 1С

Поскольку в платформе 1С:Предприятие нет специализированного объекта для записи сложных CSV-структур «на лету» (такого как встроенный сериализатор с автоматическим экранированием полей), разработчикам приходится собирать строки вручную с помощью объекта ЗаписьТекста. Простое использование функции СтрЗаменить(КодМаркировки, """", """""") решает проблему лишь частично — только для внутренних кавычек.

Разберем по шагам создание универсальной функции на языке 1С, которая гарантированно подготовит любой код маркировки к записи в CSV:


Функция ПодготовитьКодМаркировкиДляCSV(Знач ИсходныйКод) Экспорт

    // Шаг 1. Дублируем все имеющиеся внутри кода двойные кавычки
    Результат = СтрЗаменить(ИсходныйКод, """", """""");
    
    // Шаг 2. Проверяем наличие зарезервированных спецсимволов (запятая, точка с запятой)
    Если Найти(Результат, ",") > 0 Или Найти(Результат, ";") > 0 Тогда
        // Если спецсимволы найдены, оборачиваем строку во внешние кавычки
        Результат = """" + Результат + """";
    КонецЕсли;
    
    Возврат Результат;

КонецФункции

Проанализируем работу этой функции на примере строки: (01)046"300",<0b). На первом шаге функция заменит внутренние кавычки, получив (01)046""300"",<0b). На втором шаге, обнаружив запятую, она обернет строку целиком. На выходе мы получим корректный для CSV вид: "(01)046""300"",<0b)".

Практический пример формирования CSV-файла

Посмотрим, как применить разработанную функцию при массовой выгрузке кодов маркировки из документа в текстовый файл. Для записи будем использовать объект ЗаписьТекста с кодировкой UTF-8:


Процедура ВыгрузитьКодыВCSV(ТаблицаКодов, ПутьКФайлу)

    ФайлЗаписи = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
    
    // Записываем шапку CSV-файла (например, Номер строки и Код маркировки)
    ФайлЗаписи.ЗаписатьСтроку("LineNumber,MarkingCode");
    
    Для Каждого СтрокаДанных Из ТаблицаКодов Цикл
        
        НомерСтроки = СтрокаДанных.НомерСтроки;
        ПодготовленныйКод = ПодготовитьКодМаркировкиДляCSV(СтрокаДанных.КодМаркировки);
        
        // Формируем итоговую строку для CSV
        СтрокаCSV = Строка(НомерСтроки) + "," + ПодготовленныйКод;
        ФайлЗаписи.ЗаписатьСтроку(СтрокаCSV);
        
    КонецЦикла;
    
    ФайлЗаписи.Закрыть();
    
    Предупреждение("Выгрузка успешно завершена!");

КонецПроцедуры

Проблема непечатаемого символа GS (ASCII 29)

При работе с кодами DataMatrix крайне важно учитывать наличие непечатаемого управляющего символа GS (Group Separator, ASCII-код 29). В среде 1С он представляется как Символ(29). Этот символ разделяет группы данных внутри кода маркировки (например, код идентификации и код проверки).

При выгрузке в файл CSV символ GS записывается в своем исходном бинарном виде и отлично распознается порталом «Честного Знака». Однако здесь кроется главная опасность для пользователей:

Важный совет: Настоятельно рекомендуем открывать и проверять полученные CSV-файлы только через специализированные текстовые редакторы (Notepad++, Блокнот). Если необходимо импортировать файл в Excel для анализа, делайте это строго через вкладку «Данные» -> «Получить данные из текста/CSV» с обязательным указанием кодировки UTF-8 и текстового формата для всех колонок с кодами.

← На главную