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

Программист 1С v7.7
← На главную

При работе в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с ситуацией, когда при выгрузке данных в текстовые файлы (например, для систем "Клиент-Банк", CSV-отчетов или обмена с сайтами) структура файла внезапно "разваливается". Строка обрывается посередине, и данные переносятся на новую строку, что делает файл непригодным для дальнейшей обработки. Проанализируем, почему это происходит и как эффективно решить данную проблему.

Выясняем причину возникновения коллизий

Разберем ситуацию: визуально в карточке товара или контрагента наименование выглядит корректно, но при выгрузке оно занимает две строки вместо одной. Причина кроется в наличии скрытых управляющих символов, которые попадают в базу данных при копировании текста из внешних источников: веб-страниц, PDF-документов или таблиц Excel. Рассмотрим основные символы-виновники:

Для диагностики таких символов рекомендуется использовать Hex-редактор. Если открыть сформированный файл в режиме отображения шестнадцатеричных кодов, мы увидим последовательности 0D и 0A (соответственно коды 13 и 10), которые и заставляют текстовые редакторы выполнять перенос строки.

Способ 1: Программная очистка строки через СтрЗаменить

Самый простой и надежный метод в 1С 7.7 — это последовательное удаление нежелательных символов перед тем, как записать строку в файл. Поскольку встроенного механизма работы с регулярными выражениями "из коробки" в 7.7 нет, воспользуемся функцией СтрЗаменить(). Проанализируем пример кода, который подготавливает данные:


// Функция для очистки строки от "мусора"
Функция ОчиститьСтрокуОтПереносов(Знач Стр)
    // Убираем возвраты каретки
    Стр = СтрЗаменить(Стр, Симв(13), " ");
    // Убираем переводы строк
    Стр = СтрЗаменить(Стр, Симв(10), " ");
    // Убираем табуляцию (заменяем на пробел)
    Стр = СтрЗаменить(Стр, Симв(9), " ");
    // Убираем неразрывные пробелы (код 160)
    Стр = СтрЗаменить(Стр, Симв(160), " ");
    
    // Удаляем лишние пробелы по краям, которые могли образоваться
    Возврат СокрЛП(Стр);
КонецФункции

Посмотрим на этот процесс подробнее: мы заменяем каждый спецсимвол на обычный пробел. Важно делать это последовательно. В операционных системах Windows стандартный перенос строки — это комбинация Симв(13) + Симв(10). Заменив оба символа на пробелы, мы гарантируем, что строка останется целостной.

Способ 2: Использование регулярных выражений (RegExp)

Если объем данных велик или нужно реализовать сложную логику очистки (например, оставить только буквы и цифры), воспользуемся объектом VBScript.RegExp через механизмы Windows Script Host. Это более продвинутый метод, который позволяет очистить строку одной командой. Разберем, как это реализовать в 1С 7.7:


Процедура ОчиститьЧерезRegExp(Текст)
    РегВыр = СоздатьОбъект("VBScript.RegExp");
    РегВыр.Global = 1; // Искать все вхождения
    РегВыр.MultiLine = 1;
    
    // Шаблон [\r\n\t] ищет перенос каретки, новую строку и табуляцию
    РегВыр.Pattern = "[\r\n\t\v\f]"; 
    
    Результат = РегВыр.Replace(Текст, " ");
    Сообщить("Очищенный текст: " + СокрЛП(Результат));
КонецПроцедуры

Использование регулярных выражений особенно эффективно, когда нужно избавиться не только от переносов, но и от любого "непечатного" мусора. Объект VBScript.RegExp доступен практически на любой системе с Windows, что делает этот способ универсальным для 1С 7.7.

Способ 3: Профилактика на этапе ввода данных

Чтобы не бороться с последствиями при каждой выгрузке, целесообразно предотвращать попадание плохих символов в базу данных. Для этого добавим проверку непосредственно в форму элемента справочника (например, "Номенклатура" или "Контрагенты"). Проанализируем пример использования предопределенной процедуры ПриЗаписи():


Процедура ПриЗаписи()
    // Проверяем наименование перед сохранением
    Наименование = СтрЗаменить(Наименование, Симв(13), "");
    Наименование = СтрЗаменить(Наименование, Симв(10), "");
    Наименование = СтрЗаменить(Наименование, Симв(9), " ");
    
    // Если поле содержит только пробелы после очистки, можно выдать предупреждение
    Если ПустаяСтрока(СокрЛП(Наименование)) = 1 Тогда
        Предупреждение("Наименование не может быть пустым!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

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

Нюансы работы с объектом "Текст" и выгрузкой в CSV

Рассмотрим важный технический момент: если вы используете встроенный объект 1С СоздатьОбъект("Текст") и метод ДобавитьСтроку(), платформа сама добавляет в конец каждой строки системный маркер конца строки. Однако, если перенос строки находится внутри передаваемой переменной, метод воспримет его как команду разорвать текущую строку и начать новую. Это критично для формата CSV, где каждая запись должна строго занимать одну строку.

Практический совет: если вы формируете файл для экспорта в Excel, помните, что даже если вы сохраните переносы внутри ячеек (что Excel поддерживает), при попытке пересохранить этот файл из Excel в формат .txt или .csv, он снова превратит эти внутренние переносы в разрывы строк. Поэтому очистка данных на стороне 1С является единственным гарантированным способом избежать ошибок импорта в сторонние системы.

Подводя итог, можно сказать, что наиболее эффективным подходом является сочетание очистки существующих данных в обработках выгрузки и установка фильтров на вводе новых данных. Использование СтрЗаменить(Стр, Симв(10), " ") — это "золотой стандарт" для разработчика 1С 7.7, позволяющий избежать большинства проблем с обменом данными.

← На главную