При работе в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с ситуацией, когда при выгрузке данных в текстовые файлы (например, для систем "Клиент-Банк", CSV-отчетов или обмена с сайтами) структура файла внезапно "разваливается". Строка обрывается посередине, и данные переносятся на новую строку, что делает файл непригодным для дальнейшей обработки. Проанализируем, почему это происходит и как эффективно решить данную проблему.
Разберем ситуацию: визуально в карточке товара или контрагента наименование выглядит корректно, но при выгрузке оно занимает две строки вместо одной. Причина кроется в наличии скрытых управляющих символов, которые попадают в базу данных при копировании текста из внешних источников: веб-страниц, PDF-документов или таблиц Excel. Рассмотрим основные символы-виновники:
Симв(13).Симв(10).Симв(9).160, часто встречающийся в HTML-верстке.Для диагностики таких символов рекомендуется использовать Hex-редактор. Если открыть сформированный файл в режиме отображения шестнадцатеричных кодов, мы увидим последовательности 0D и 0A (соответственно коды 13 и 10), которые и заставляют текстовые редакторы выполнять перенос строки.
Самый простой и надежный метод в 1С 7.7 — это последовательное удаление нежелательных символов перед тем, как записать строку в файл. Поскольку встроенного механизма работы с регулярными выражениями "из коробки" в 7.7 нет, воспользуемся функцией СтрЗаменить(). Проанализируем пример кода, который подготавливает данные:
// Функция для очистки строки от "мусора"
Функция ОчиститьСтрокуОтПереносов(Знач Стр)
// Убираем возвраты каретки
Стр = СтрЗаменить(Стр, Симв(13), " ");
// Убираем переводы строк
Стр = СтрЗаменить(Стр, Симв(10), " ");
// Убираем табуляцию (заменяем на пробел)
Стр = СтрЗаменить(Стр, Симв(9), " ");
// Убираем неразрывные пробелы (код 160)
Стр = СтрЗаменить(Стр, Симв(160), " ");
// Удаляем лишние пробелы по краям, которые могли образоваться
Возврат СокрЛП(Стр);
КонецФункции
Посмотрим на этот процесс подробнее: мы заменяем каждый спецсимвол на обычный пробел. Важно делать это последовательно. В операционных системах Windows стандартный перенос строки — это комбинация Симв(13) + Симв(10). Заменив оба символа на пробелы, мы гарантируем, что строка останется целостной.
Если объем данных велик или нужно реализовать сложную логику очистки (например, оставить только буквы и цифры), воспользуемся объектом 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.
Чтобы не бороться с последствиями при каждой выгрузке, целесообразно предотвращать попадание плохих символов в базу данных. Для этого добавим проверку непосредственно в форму элемента справочника (например, "Номенклатура" или "Контрагенты"). Проанализируем пример использования предопределенной процедуры ПриЗаписи():
Процедура ПриЗаписи()
// Проверяем наименование перед сохранением
Наименование = СтрЗаменить(Наименование, Симв(13), "");
Наименование = СтрЗаменить(Наименование, Симв(10), "");
Наименование = СтрЗаменить(Наименование, Симв(9), " ");
// Если поле содержит только пробелы после очистки, можно выдать предупреждение
Если ПустаяСтрока(СокрЛП(Наименование)) = 1 Тогда
Предупреждение("Наименование не может быть пустым!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Внедрение такой проверки на этапе записи гарантирует "чистоту" данных. Это избавит вас от необходимости писать функции очистки во всех обработках выгрузки, которые используют эти реквизиты.
Рассмотрим важный технический момент: если вы используете встроенный объект 1С СоздатьОбъект("Текст") и метод ДобавитьСтроку(), платформа сама добавляет в конец каждой строки системный маркер конца строки. Однако, если перенос строки находится внутри передаваемой переменной, метод воспримет его как команду разорвать текущую строку и начать новую. Это критично для формата CSV, где каждая запись должна строго занимать одну строку.
Практический совет: если вы формируете файл для экспорта в Excel, помните, что даже если вы сохраните переносы внутри ячеек (что Excel поддерживает), при попытке пересохранить этот файл из Excel в формат .txt или .csv, он снова превратит эти внутренние переносы в разрывы строк. Поэтому очистка данных на стороне 1С является единственным гарантированным способом избежать ошибок импорта в сторонние системы.
Подводя итог, можно сказать, что наиболее эффективным подходом является сочетание очистки существующих данных в обработках выгрузки и установка фильтров на вводе новых данных. Использование СтрЗаменить(Стр, Симв(10), " ") — это "золотой стандарт" для разработчика 1С 7.7, позволяющий избежать большинства проблем с обменом данными.