При программном формировании текстовых данных в 1С разработчики часто сталкиваются с ситуацией, когда сформированная многострочная строка отлично вставляется в MS Word или MS Excel с разделением по строкам, однако при вставке в классический «Блокнот» (Windows Notepad) весь текст сливается в одну длинную строку. Разберем причинно-следственные связи этой проблемы и проанализируем решения, как правильно передавать спецсимволы переноса в буфер обмена.
Разница в обработке переносов строк связана со стандартами кодирования текстовых файлов в различных операционных системах и приложениях:
Символы.ПС. Программы вроде MS Word, MS Excel и большинство современных редакторов автоматически распознают этот символ как конец строки.Символы.ПС или только Символы.ВК, Блокнот игнорирует разделитель и выводит всё содержимое одной строкой.Таким образом, для корректного отображения текста в Блокноте необходимо явно формировать составную последовательность Символы.ВК + Символы.ПС.
Рассмотрим распространенный в обычных формах 1С способ поместить текст в буфер обмена Windows с помощью COM-объекта ПолеHTMLДокумента. Чтобы перенос строк работал корректно во всех сторонних редакторах, скомпонуем текстовые фрагменты с использованием комбинации Символы.ВК + Символы.ПС.
Проанализируем пример кода 1С:
// Формируем многострочный текст с явным указанием комбинации ВК + ПС
СписокТоваров = "Первая строка" + Символы.ВК + Символы.ПС
+ "Вторая строка" + Символы.ВК + Символы.ПС
+ "Третья строка";
// Добавляем временно элемент формы для работы с объектом HTML
ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "ПолеHTMLДокумента", Ложь);
Окно = ЭлементыФормы.ПолеHTMLДокумента.Документ.ParentWindow;
// Помещаем сформированный текст в буфер обмена
Окно.ClipboardData.SetData("Text", СписокТоваров);
// Удаляем временный элемент формы
ЭлементыФормы.Удалить(ЭлементыФормы.Индекс(ЭлементыФормы.Найти("ПолеHTMLДокумента")));
После использования такой комбинации символов вставка через Ctrl+V в Блокнот будет корректно разбивать текст на отдельные строки.
Использование ClipboardData через объект ПолеHTMLДокумента зависит от компонент Internet Explorer и может вызывать предупреждения системы безопасности или блокироваться в современных версиях Windows и на Linux-клиентах. Рассмотрим альтернативные методы решения задачи.
В современных версиях платформы 1С появится возможность работать с буфером обмена напрямую без использования HTML-полей и COM-объектов:
ТекстДляВставки = "Строка 1" + Символы.ВК + Символы.ПС + "Строка 2";
ЭлементБуфера = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, ТекстДляВставки);
Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(ЭлементБуфера);
Если задача заключается в том, чтобы предоставить пользователю заполненный текст в Блокноте, гораздо надежнее сформировать временный файл и запустить приложение напрямую. Объект ТекстовыйДокумент автоматически подготавливает переносы строк в формате CRLF, корректно считываемом Блокнотом.
Рассмотрим реализацию через запись временного файла:
ПутьКФайлу = ПолучитьИмяВременногоФайла("txt");
ТекстДокумент = Новый ТекстовыйДокумент;
ТекстДокумент.ДобавитьСтроку("Первая строка");
ТекстДокумент.ДобавитьСтроку("Вторая строка");
ТекстДокумент.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
// Запускаем Блокнот с созданным файлом
ЗапуститьПриложение("notepad.exe """ + ПутьКФайлу + """");
Этот подход исключает проблемы с системным буфером обмена и гарантирует корректное отображение переносов строк на любом компьютере под управлением ОС Windows.