Как правильно использовать разделитель «новая строка» в 1С и функции СтрСоединить?

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

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

Использование функции СтрСоединить с переносом строки

Начнем с самого простого и часто используемого способа. Если нам необходимо собрать массив строк в одну многострочную строку, мы используем встроенную функцию СтрСоединить. В качестве второго параметра (разделителя) мы указываем системную константу Символы.ПС (перевод строки).

Рассмотрим пример кода:


МассивСтрок = Новый Массив;
МассивСтрок.Добавить("Первая строка");
МассивСтрок.Добавить("Вторая строка");
МассивСтрок.Добавить("Третья строка");

Результат = СтрСоединить(МассивСтрок, Символы.ПС);

В данном случае переменная Результат будет содержать текст, где строки разделены одиночным символом с кодом 10 (LF). Это стандартное поведение платформы 1С для работы со строками в оперативной памяти.

Анатомия символов переноса строки: ПС против ВК

Чтобы понимать, как 1С работает с текстом, проанализируем разницу между двумя основными управляющими символами:

  1. Символы.ПС (Line Feed, LF) — код символа 10. В среде 1С это основной символ перевода строки.
  2. Символы.ВК (Carriage Return, CR) — код символа 13. Возврат каретки.

Исторически в ОС Windows для обозначения новой строки используется комбинация Символы.ВК + Символы.ПС (CRLF, коды 13 и 10). В ОС Linux и современных macOS используется только Символы.ПС (LF, код 10). Проверим это с помощью встроенных функций платформы:


КодПС = КодСимвола(Символы.ПС); // Вернет 10
КодВК = КодСимвола(Символы.ВК); // Вернет 13

Автоматическая конвертация при записи в файл

Многие разработчики заблуждаются, считая, что Символы.ПС — это и есть два байта 0D 0A (CRLF). На самом деле это не так. Путаница возникает из-за поведения объекта ЗаписьТекста. Проанализируем ситуацию: когда мы записываем строку в файл в операционной системе Windows, 1С по умолчанию выполняет конвертацию.

Рассмотрим по шагам, что происходит при выполнении следующего кода:


Стр = "Строка1" + Символы.ПС + "Строка2";
Текст = Новый ЗаписьТекста("C:\temp\test.txt", КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку(Стр);
Текст.Закрыть();

Если мы откроем полученный файл в шестнадцатеричном (HEX) редакторе, мы увидим между словами байты 0D 0A. Откуда взялся 0D (символ ВК), если мы его не добавляли? Это результат работы параметра КонвертируемыйРазделительСтрок конструктора ЗаписьТекста. По умолчанию он настроен так, чтобы заменять одиночный ПС на системный разделитель текущей ОС (для Windows это CRLF).

Управление разделителями в ЗаписьТекста

Выясним, как изменить это поведение. Если нам нужно, чтобы в файл попал только символ ПС без добавления ВК, мы должны явно указать это в конструкторе объекта ЗаписьТекста. Пятый параметр конструктора отвечает за то, что именно считать разделителем при конвертации.

Посмотрим на пример принудительной установки разделителя:


// Указываем в конце ПС, чтобы платформа не добавляла ВК автоматически
Текст = Новый ЗаписьТекста("C:\temp\linux_style.txt",,,, Символы.ПС);
Текст.ЗаписатьСтроку("Данные" + Символы.ПС + "Еще данные");
Текст.Закрыть();

В этом случае, даже работая в Windows, в файл будет записан только код 0A. Это критически важно при формировании файлов для специфических систем или обмена данными с веб-серверами на Linux.

Нюансы работы с HTTP-запросами и API

Проанализируем ситуацию с передачей данных по сети. Согласно стандартам RFC (например, для протокола HTTP или SMTP), разделителем строк часто должен выступать строго CRLF. Если мы используем метод УстановитьТелоИзСтроки() объекта HTTPЗапрос, 1С не выполняет автоматическую конвертацию символов.

Рассмотрим пример:


ТелоЗапроса = "Параметр1=Значение1" + Символы.ПС + "Параметр2=Значение2";
Запрос = Новый HTTPЗапрос();
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
// В теле уйдет: 31 0A 32 (только ПС)

Если вызываемое API требует строгого соблюдения стандартов, нам необходимо формировать строку явно с использованием обоих символов:


Разделитель = Символы.ВК + Символы.ПС;
ТелоЗапроса = "Линия1" + Разделитель + "Линия2";

Особенности ХранилищаЗначения и сериализации

Интересно ведет себя платформа при работе с ХранилищеЗначения. При помещении строки в хранилище и последующем сохранении в базу данных (особенно в СУБД MS SQL Server), платформа также может производить нормализацию строк, превращая одиночные ПС в пару ВК+ПС. Это внутренняя «кухня» 1С, направленная на то, чтобы при чтении данных в Windows-клиенте текст отображался корректно с переносами.

Однако при получении двоичных данных напрямую из строки ситуация иная:


Двоичные = ПолучитьДвоичныеДанныеИзСтроки("1" + Символы.ПС + "2");
// Результат будет содержать только байт 0A для перехода

Рекомендации для разработчиков

Подводя итог нашему анализу, сформулируем основные правила работы с разделителями строк в 1С:

  1. Для внутреннего использования в коде, объединения массивов через СтрСоединить и вывода сообщений пользователю всегда используйте Символы.ПС.
  2. Если вы готовите текстовый файл для Windows-приложений (например, для старого Блокнота), полагайтесь на поведение ЗаписьТекста по умолчанию — она сама добавит необходимые Символы.ВК.
  3. Если вы формируете файл для Linux-систем или специфическое тело HTTP-запроса, где ВК недопустим, явно указывайте Символы.ПС в параметрах ЗаписьТекста или используйте Записать() вместо ЗаписатьСтроку().
  4. При работе с внешними API всегда уточняйте требования стандарта. Если требуется CRLF, конструируйте разделитель как Символы.ВК + Символы.ПС вручную.
  5. Помните о производительности: функция СтрСоединить работает гораздо быстрее, чем конкатенация строк через оператор + в цикле, так как она оптимизирует выделение памяти под итоговый результат.

Таким образом, понимание того, как 1С интерпретирует Символы.ПС и в каких случаях происходит автоматическая подстановка Символы.ВК, позволяет избежать ошибок при обмене данными и интеграции с внешними системами.

← На главную