В процессе разработки на платформе 1С:Предприятие часто возникает задача объединения массива строк в один текстовый блок с переносами. Основным инструментом для этого выступает функция СтрСоединить. Однако у разработчиков часто возникают вопросы: какой именно символ использовать в качестве разделителя, почему в текстовых файлах появляются «лишние» символы и как обеспечить корректное отображение текста в разных операционных системах. Разберем эти нюансы подробно.
Начнем с самого простого и часто используемого способа. Если нам необходимо собрать массив строк в одну многострочную строку, мы используем встроенную функцию СтрСоединить. В качестве второго параметра (разделителя) мы указываем системную константу Символы.ПС (перевод строки).
Рассмотрим пример кода:
МассивСтрок = Новый Массив;
МассивСтрок.Добавить("Первая строка");
МассивСтрок.Добавить("Вторая строка");
МассивСтрок.Добавить("Третья строка");
Результат = СтрСоединить(МассивСтрок, Символы.ПС);
В данном случае переменная Результат будет содержать текст, где строки разделены одиночным символом с кодом 10 (LF). Это стандартное поведение платформы 1С для работы со строками в оперативной памяти.
Чтобы понимать, как 1С работает с текстом, проанализируем разницу между двумя основными управляющими символами:
Исторически в ОС 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.
Проанализируем ситуацию с передачей данных по сети. Согласно стандартам 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С интерпретирует Символы.ПС и в каких случаях происходит автоматическая подстановка Символы.ВК, позволяет избежать ошибок при обмене данными и интеграции с внешними системами.