При интеграции систем 1С с личным кабинетом «Честного Знака» (ГИС МТ) разработчики часто сталкиваются с необходимостью ручной выгрузки кодов маркировки (КМ) в формате CSV. Этот формат прост и удобен, однако имеет жесткие стандарты обработки спецсимволов. Если в коде маркировки (например, DataMatrix) присутствуют кавычки, запятые или точки с запятой, простая запись строки «как есть» приведет к ошибке разбора файла на стороне шлюза маркировки. В качестве альтернативы ручному файловому обмену можно использовать решение для взаимодействия с API «Честного Знака».
В этой статье мы подробно разберем, как правильно обрабатывать спецсимволы в строках программными средствами 1С, изучим официальные требования «Честного Знака» и напишем надежный алгоритм экранирования данных.
Рассмотрим стандартную ситуацию. Код маркировки может содержать самые разные символы, включая скобки, дефисы, запятые и кавычки: (01)04630084600894(21)-7bTmAVb,<0b),,,. Формат CSV (Comma-Separated Values) использует запятую (или точку с запятой) в качестве разделителя колонок, а двойные кавычки — в качестве ограничителя текстовых полей.
Если парсер «Честного Знака» встречает запятую внутри кода маркировки, он считает ее разделителем колонок. Данные «сдвигаются», структура файла ломается, и система выдает критическую ошибку импорта. Чаще всего это проявляется в виде сообщения: «Номер товарной позиции. Должно быть числовое значение». На самом деле проблема кроется не в номере позиции, а в некорректном экранировании соседнего поля с кодом маркировки.
Чтобы шлюз импорта корректно обработал ваш CSV-файл, необходимо строго соблюдать правила стандарта RFC 4180:
", его необходимо продублировать, превратив в "".Поскольку в платформе 1С:Предприятие нет специализированного объекта для записи сложных CSV-структур «на лету» (такого как встроенный сериализатор с автоматическим экранированием полей), разработчикам приходится собирать строки вручную с помощью объекта ЗаписьТекста. Простое использование функции СтрЗаменить(КодМаркировки, """", """""") решает проблему лишь частично — только для внутренних кавычек.
Разберем по шагам создание универсальной функции на языке 1С, которая гарантированно подготовит любой код маркировки к записи в CSV:
Функция ПодготовитьКодМаркировкиДляCSV(Знач ИсходныйКод) Экспорт
// Шаг 1. Дублируем все имеющиеся внутри кода двойные кавычки
Результат = СтрЗаменить(ИсходныйКод, """", """""");
// Шаг 2. Проверяем наличие зарезервированных спецсимволов (запятая, точка с запятой)
Если Найти(Результат, ",") > 0 Или Найти(Результат, ";") > 0 Тогда
// Если спецсимволы найдены, оборачиваем строку во внешние кавычки
Результат = """" + Результат + """";
КонецЕсли;
Возврат Результат;
КонецФункции
Проанализируем работу этой функции на примере строки: (01)046"300",<0b). На первом шаге функция заменит внутренние кавычки, получив (01)046""300"",<0b). На втором шаге, обнаружив запятую, она обернет строку целиком. На выходе мы получим корректный для CSV вид: "(01)046""300"",<0b)".
Посмотрим, как применить разработанную функцию при массовой выгрузке кодов маркировки из документа в текстовый файл. Для записи будем использовать объект ЗаписьТекста с кодировкой UTF-8:
Процедура ВыгрузитьКодыВCSV(ТаблицаКодов, ПутьКФайлу)
ФайлЗаписи = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
// Записываем шапку CSV-файла (например, Номер строки и Код маркировки)
ФайлЗаписи.ЗаписатьСтроку("LineNumber,MarkingCode");
Для Каждого СтрокаДанных Из ТаблицаКодов Цикл
НомерСтроки = СтрокаДанных.НомерСтроки;
ПодготовленныйКод = ПодготовитьКодМаркировкиДляCSV(СтрокаДанных.КодМаркировки);
// Формируем итоговую строку для CSV
СтрокаCSV = Строка(НомерСтроки) + "," + ПодготовленныйКод;
ФайлЗаписи.ЗаписатьСтроку(СтрокаCSV);
КонецЦикла;
ФайлЗаписи.Закрыть();
Предупреждение("Выгрузка успешно завершена!");
КонецПроцедуры
При работе с кодами DataMatrix крайне важно учитывать наличие непечатаемого управляющего символа GS (Group Separator, ASCII-код 29). В среде 1С он представляется как Символ(29). Этот символ разделяет группы данных внутри кода маркировки (например, код идентификации и код проверки).
При выгрузке в файл CSV символ GS записывается в своем исходном бинарном виде и отлично распознается порталом «Честного Знака». Однако здесь кроется главная опасность для пользователей:
4,63E+12). После сохранения такого файла в Excel коды маркировки станут непригодными для загрузки.Важный совет: Настоятельно рекомендуем открывать и проверять полученные CSV-файлы только через специализированные текстовые редакторы (Notepad++, Блокнот). Если необходимо импортировать файл в Excel для анализа, делайте это строго через вкладку «Данные» -> «Получить данные из текста/CSV» с обязательным указанием кодировки UTF-8 и текстового формата для всех колонок с кодами.