Перенос строки в 1С 8.3: от поля формы до выгрузки в CSV
Содержание
Чтобы перенести строку в 1С, в коде добавьте к тексту Символы.ПС (это символ с кодом 10, то же самое, что Символ(10)). В форме новую строку можно начать клавишей Enter, но только в многострочном поле. В печатной форме перенос появится, если у ячейки макета включено размещение текста «Переносить».
Типичная ситуация: бухгалтер просит, чтобы в счёте адрес грузополучателя стоял под наименованием, а не тянулся в одну строку на всю ширину. Или выгрузка в CSV «рассыпается», потому что в комментарии к документу кто-то нажал Enter. Перенос строки в 1С: Предприятии везде один и тот же символ, но в каждом контексте он ведёт себя по-своему.
Как перенести строку при вводе текста в форме 1С
В интерфейсе «Такси» всё решает тип поля, а не клавиша.
- 📝 Многострочное поле (комментарий в карточке, текст письма, описание номенклатуры). Enter начинает новую строку, текст сохраняется вместе с переносом.
- ➖ Однострочное поле (наименование, номер, ИНН). Enter завершает ввод и переводит фокус дальше. Перенос сюда не вставить, и это правильно: такие реквизиты печатаются и ищутся как одна строка.
- 📊 Ячейка табличного документа (отчёт, открытый для редактирования, файл
.mxl). Enter завершает редактирование ячейки. Длинный текст переносится по словам, если для ячейки задано размещение «Переносить».
Если в типовой форме нужное поле однострочное, а переносы нужны регулярно, форму можно поправить через расширение конфигурации
. У элемента формы ПолеВвода за это отвечает свойство МногострочныйРежим. Типовую конфигурацию
при этом снимать с поддержки не нужно.
Текст с переносами, вставленный из буфера в однострочное поле, обычно склеивается в одну строку. Если из Word или Excel вставили адрес, а он «слипся», проверьте, какое поле вы заполняете.
Символы переноса строки в языке 1С: ПС, ВК и Символ(10)
Во встроенном языке есть системное перечисление Символы. Для переноса используют два значения:
| Константа | Код | Что это | Где встречается |
|---|---|---|---|
Символы.ПС | 10 | перевод строки (LF) | стандарт для 1С, Linux, Excel внутри ячейки |
Символы.ВК | 13 | возврат каретки (CR) | в паре ВК + ПС — конец строки в файлах Windows |
Символы.Таб | 9 | табуляция | выравнивание, TSV-файлы |
Символы.ВТаб | 11 | вертикальная табуляция | встречается в тексте из Word |
Символы.ПФ | 12 | перевод формы | разрыв страницы в текстовых файлах |
Символы.НПП | 160 | неразрывный пробел | не перенос, но часто путается рядом |
Внутри 1С достаточно одного Символы.ПС. Пара ВК + ПС нужна только при записи файлов для программ, которые ждут формат Windows.
Текст = "ООО «Ромашка»" + Символы.ПС + "г. Москва, ул. Лесная, д. 5";
// То же самое через код символа
Текст = "ООО «Ромашка»" + Символ(10) + "г. Москва, ул. Лесная, д. 5";
// Две строки текста и пустая строка между ними
Текст = "Счёт № 15" + Символы.ПС + Символы.ПС + "Оплатить до 20-го числа";
Сообщения пользователю тоже понимают перенос:
Сообщить("Документ не проведён." + Символы.ПС + "Не заполнен склад в строке 3.");
Для работы с многострочным текстом пригодятся функции платформы:
- 🔢
СтрЧислоСтрок(Текст)— сколько строк в тексте. - 🔎
СтрПолучитьСтроку(Текст, НомерСтроки)— строка по номеру, нумерация с 1. - ✂️
СтрРазделить(Текст, Символы.ПС, Ложь)— массив строк без пустых (платформа 8.3.6 и выше). - 🔗
СтрСоединить(Массив, Символы.ПС)— обратная операция: склеить массив через перенос. - 🔤
КодСимвола(Текст, Позиция)— код символа, если нужно понять, что за «невидимка» стоит в строке.
Строки = СтрРазделить(Текст, Символы.ПС, Ложь);
Для Каждого Стр Из Строки Цикл
Сообщить(СокрЛП(Стр));
КонецЦикла;
Перенос работает и в надписях управляемой формы. Если у декорации-надписи есть заголовок, собранный кодом с Символы.ПС, на экране он будет в несколько строк. Для форматированной строки это тоже верно: Новый ФорматированнаяСтрока("Итого:" + Символы.ПС + "1 250 руб.") даст две строки в одной надписи. Чтобы надпись не обрезалась, у элемента должна хватать высоты или быть включена растяжка по вертикали.
Многострочный текст в редакторе кода и тексте запроса
В Конфигураторе и в EDT оператор можно разбить на несколько строк где угодно: язык не требует знака продолжения. Исключение одно — строковый литерал.
Строка в кавычках продолжается на следующей строке модуля, только если та начинается с вертикальной черты |. Перенос строки между частями литерала входит в значение строки.
ТекстПисьма = "Добрый день!
|Направляем акт сверки за квартал.
|Просим подписать и вернуть до конца месяца.";
В переменной ТекстПисьма окажутся три строки, разделённые Символы.ПС. Пробелы и табуляция перед | в значение не попадают.
Так же записывают тексты запросов. Конструктор запроса сам расставляет |, а табуляцию после черты оставляет для читаемости:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка,
| Контрагенты.Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления";
Если забыть | в начале строки, модуль не пройдёт синтаксический контроль: компилятор увидит незакрытую кавычку. Конфигуратор подсветит строку с ошибкой, ищите её на одну строку выше подсвеченной.
Нужен перенос внутри результата запроса, например «Наименование + новая строка + ИНН» в одном поле? Надёжнее собрать строку уже в коде, после выполнения запроса, через Символы.ПС. Язык запросов для этого неудобен.
Перенос строки в печатной форме и макете
Здесь требуются две вещи: символ переноса в значении и правильная настройка ячейки.
Настройка ячейки макета
- Откройте макет печатной формы. В типовых БП 3.0, ЗУП 3.1 и УТ 11 без Конфигуратора это делается через
Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. - Выделите ячейку с параметром (например,
Грузополучатель) и откройте её свойства. - В свойстве
Размещениевыберите значениеПереносить. Другие варианты —Авто,Обрезать,Забивать: при них длинный текст обрезается или уходит за границу ячейки. - Если у строки макета задана фиксированная высота, текст не поместится. Снимите фиксацию, чтобы высота подстраивалась под содержимое.
- Сохраните макет и сформируйте печатную форму заново.
Отредактированный через Макеты печатных форм макет хранится в базе отдельно от конфигурации. При обновлении релиза программа может предупредить, что типовой макет изменился, и предложить сравнить версии.
Перенос в значении параметра
Если ячейка должна разбиваться в строго заданном месте, а не там, где закончилась ширина, перенос передают в значении параметра:
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Грузополучатель = Наименование + Символы.ПС + Адрес;
ТабДок.Вывести(Область);
В тексте самого макета (заполнение «Текст» или «Шаблон») перенос вводят в многострочном редакторе свойства Текст в палитре свойств ячейки.
| Задача | Чем решить | Когда подходит |
|---|---|---|
| Длинный адрес не влезает | Размещение = Переносить | ширина колонки фиксирована, место разрыва неважно |
| Адрес строго с новой строки | Символы.ПС в параметре | нужна чёткая структура: название, затем адрес |
| Правка типовой формы | Макеты печатных форм или расширение | конфигурация на поддержке, код трогать нельзя |
В отчётах на СКД перенос включают в оформлении поля: размещение текста «Переносить». Без этого длинные комментарии в колонке будут обрезаны.
Переносы строк при загрузке и выгрузке файлов
Обмен с внешними файлами — главный источник проблем. Программы по-разному понимают конец строки.
Запись текстового файла
У объекта ЗаписьТекста можно явно задать, чем заменять переносы при записи. Пятый параметр — разделитель строк в файле:
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, Символы.ПС, Ложь, Символы.ВК + Символы.ПС);
Запись.ЗаписатьСтроку("Номер;Дата;Комментарий");
Запись.Закрыть();
Здесь каждый Символы.ПС из текста превратится в файле в пару ВК + ПС. Блокнот Windows и большинство старых программ откроют такой файл без сюрпризов.
CSV и многострочные поля
В CSV конец строки означает конец записи. Если в комментарии есть перенос, одна запись превращается в две, и колонки съезжают.
Варианты решения:
- ✅ Перед выгрузкой заменить перенос на пробел или на «; »:
СтрЗаменить(Комментарий, Символы.ПС, " "). - ✅ Взять поле в двойные кавычки, а кавычки внутри текста удвоить. Excel такой CSV прочитает правильно.
- ✅ Выгружать в XLSX через табличный документ:
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Перенос внутри ячейки сохранится.
Чтение файлов
ЧтениеТекста.ПрочитатьСтроку() читает до ближайшего переноса и не знает о кавычках CSV. Многострочное поле в кавычках будет прочитано как несколько записей. Для таких файлов собирайте запись построчно, пока не закроется кавычка, или загружайте файл через Excel и табличный документ.
Excel хранит перенос внутри ячейки (Alt+Enter) как символ с кодом 10. При загрузке из XLSX в 1С он приходит как Символы.ПС, ничего переделывать не нужно.
В JSON и XML переносы экранируются автоматически. ЗаписьJSON запишет \n, ЗаписьXML сохранит символ в тексте элемента. При разборе файлов штатными объектами чтения перенос вернётся на место.
Если после загрузки из файла в тексте видны «двойные» пустые строки, почти всегда виноват ВК, оставшийся от формата Windows. Лечится нормализацией, код ниже.
Как найти и заменить переносы строк в базе
Иногда нужно разом убрать переносы из реквизита: например, из комментариев к реализациям, чтобы выгрузка в банк или маркетплейс перестала ломаться. Штатной обработки «найти и заменить часть текста» в типовых конфигурациях нет, поэтому пишут внешнюю обработку .
Перед массовым изменением данных сделайте резервную копию базы и проверьте обработку на копии.
Сначала функция, которая приводит любые варианты переноса к одному виду:
Функция НормализоватьПереносы(Знач Текст)
Текст = СтрЗаменить(Текст, Символы.ВК + Символы.ПС, Символы.ПС);
Текст = СтрЗаменить(Текст, Символы.ВК, Символы.ПС);
Возврат Текст;
КонецФункции
Затем поиск документов и замена (выполнять на сервере):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| (Док.Комментарий ПОДОБНО &СПС
| ИЛИ Док.Комментарий ПОДОБНО &СВК)";
Запрос.УстановитьПараметр("СПС", "%" + Символы.ПС + "%");
Запрос.УстановитьПараметр("СВК", "%" + Символы.ВК + "%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
Текст = НормализоватьПереносы(ДокОбъект.Комментарий);
ДокОбъект.Комментарий = СтрЗаменить(Текст, Символы.ПС, " ");
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать();
КонецЦикла;
Что здесь происходит:
- 🔍
ПОДОБНОс%по краям находит строки, где перенос стоит в любом месте. Сам перенос не спецсимвол шаблона, экранировать его не надо. - 🛠️
ОбменДанными.Загрузка = Истиназаписывает объект без обработчиков и проверок. Проведённый документ остаётся проведённым, движения не перезаписываются. - 📌 Меняется только комментарий. Если меняете реквизит, который влияет на движения, этот приём не подходит: нужна обычная запись с перепроведением.
Если база работает с обменом (РИБ, синхронизация с УТ или розницей), изменённые документы попадут в ближайший обмен. Учитывайте это при обработке тысяч объектов.
Почему перенос строки в 1С не срабатывает
Ещё одна неочевидная ловушка — сравнение строк. Тексты «Москва» и «Москва» + Символы.ПС для 1С разные. Если поиск контрагента по наименованию ничего не находит, а на экране всё совпадает, проверьте хвост строки через СокрЛП(): она убирает и пробелы, и переносы по краям.