Перенос строки в 1С 8.3: от поля формы до выгрузки в CSV

· 9 мин

Содержание

Чтобы перенести строку в 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 оператор можно разбить на несколько строк где угодно: язык не требует знака продолжения. Исключение одно — строковый литерал.

Строка в кавычках продолжается на следующей строке модуля, только если та начинается с вертикальной черты |. Перенос строки между частями литерала входит в значение строки.

ТекстПисьма = "Добрый день!
|Направляем акт сверки за квартал.
|Просим подписать и вернуть до конца месяца.";

В переменной ТекстПисьма окажутся три строки, разделённые Символы.ПС. Пробелы и табуляция перед | в значение не попадают.

Так же записывают тексты запросов. Конструктор запроса сам расставляет |, а табуляцию после черты оставляет для читаемости:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Контрагенты.Ссылка,
|	Контрагенты.Наименование
|ИЗ
|	Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|	НЕ Контрагенты.ПометкаУдаления";

Если забыть | в начале строки, модуль не пройдёт синтаксический контроль: компилятор увидит незакрытую кавычку. Конфигуратор подсветит строку с ошибкой, ищите её на одну строку выше подсвеченной.

Нужен перенос внутри результата запроса, например «Наименование + новая строка + ИНН» в одном поле? Надёжнее собрать строку уже в коде, после выполнения запроса, через Символы.ПС. Язык запросов для этого неудобен.

Перенос строки в печатной форме и макете

Здесь требуются две вещи: символ переноса в значении и правильная настройка ячейки.

Настройка ячейки макета

  1. Откройте макет печатной формы. В типовых БП 3.0, ЗУП 3.1 и УТ 11 без Конфигуратора это делается через Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм.
  2. Выделите ячейку с параметром (например, Грузополучатель) и откройте её свойства.
  3. В свойстве Размещение выберите значение Переносить. Другие варианты — Авто, Обрезать, Забивать: при них длинный текст обрезается или уходит за границу ячейки.
  4. Если у строки макета задана фиксированная высота, текст не поместится. Снимите фиксацию, чтобы высота подстраивалась под содержимое.
  5. Сохраните макет и сформируйте печатную форму заново.

Отредактированный через Макеты печатных форм макет хранится в базе отдельно от конфигурации. При обновлении релиза программа может предупредить, что типовой макет изменился, и предложить сравнить версии.

Перенос в значении параметра

Если ячейка должна разбиваться в строго заданном месте, а не там, где закончилась ширина, перенос передают в значении параметра:

Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Грузополучатель = Наименование + Символы.ПС + Адрес;
ТабДок.Вывести(Область);

В тексте самого макета (заполнение «Текст» или «Шаблон») перенос вводят в многострочном редакторе свойства Текст в палитре свойств ячейки.

ЗадачаЧем решитьКогда подходит
Длинный адрес не влезаетРазмещение = Переноситьширина колонки фиксирована, место разрыва неважно
Адрес строго с новой строкиСимволы.ПС в параметренужна чёткая структура: название, затем адрес
Правка типовой формыМакеты печатных форм или расширениеконфигурация на поддержке, код трогать нельзя

В отчётах на СКД перенос включают в оформлении поля: размещение текста «Переносить». Без этого длинные комментарии в колонке будут обрезаны.

Переносы строк при загрузке и выгрузке файлов

Обмен с внешними файлами — главный источник проблем. Программы по-разному понимают конец строки.

Запись текстового файла

У объекта ЗаписьТекста можно явно задать, чем заменять переносы при записи. Пятый параметр — разделитель строк в файле:

Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, Символы.ПС, Ложь, Символы.ВК + Символы.ПС);
Запись.ЗаписатьСтроку("Номер;Дата;Комментарий");
Запись.Закрыть();

Здесь каждый Символы.ПС из текста превратится в файле в пару ВК + ПС. Блокнот Windows и большинство старых программ откроют такой файл без сюрпризов.

CSV и многострочные поля

В CSV конец строки означает конец записи. Если в комментарии есть перенос, одна запись превращается в две, и колонки съезжают.

Варианты решения:

  1. ✅ Перед выгрузкой заменить перенос на пробел или на «; »: СтрЗаменить(Комментарий, Символы.ПС, " ").
  2. ✅ Взять поле в двойные кавычки, а кавычки внутри текста удвоить. Excel такой CSV прочитает правильно.
  3. ✅ Выгружать в XLSX через табличный документ: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Перенос внутри ячейки сохранится.

Чтение файлов

ЧтениеТекста.ПрочитатьСтроку() читает до ближайшего переноса и не знает о кавычках CSV. Многострочное поле в кавычках будет прочитано как несколько записей. Для таких файлов собирайте запись построчно, пока не закроется кавычка, или загружайте файл через Excel и табличный документ.

Excel хранит перенос внутри ячейки (Alt+Enter) как символ с кодом 10. При загрузке из XLSX в 1С он приходит как Символы.ПС, ничего переделывать не нужно.

В JSON и XML переносы экранируются автоматически. ЗаписьJSON запишет \n, ЗаписьXML сохранит символ в тексте элемента. При разборе файлов штатными объектами чтения перенос вернётся на место.

Если после загрузки из файла в тексте видны «двойные» пустые строки, почти всегда виноват ВК, оставшийся от формата Windows. Лечится нормализацией, код ниже.

Как найти и заменить переносы строк в базе

Иногда нужно разом убрать переносы из реквизита: например, из комментариев к реализациям, чтобы выгрузка в банк или маркетплейс перестала ломаться. Штатной обработки «найти и заменить часть текста» в типовых конфигурациях нет, поэтому пишут внешнюю обработку .

Перед массовым изменением данных сделайте резервную копию базы и проверьте обработку на копии.

Сначала функция, которая приводит любые варианты переноса к одному виду:

Функция НормализоватьПереносы(Знач Текст)
    Текст = СтрЗаменить(Текст, Символы.ВК + Символы.ПС, Символы.ПС);
    Текст = СтрЗаменить(Текст, Символы.ВК, Символы.ПС);
    Возврат Текст;
КонецФункции

Затем поиск документов и замена (выполнять на сервере):

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Док.Ссылка КАК Ссылка
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
|	(Док.Комментарий ПОДОБНО &СПС
|		ИЛИ Док.Комментарий ПОДОБНО &СВК)";
Запрос.УстановитьПараметр("СПС", "%" + Символы.ПС + "%");
Запрос.УстановитьПараметр("СВК", "%" + Символы.ВК + "%");

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
    Текст = НормализоватьПереносы(ДокОбъект.Комментарий);
    ДокОбъект.Комментарий = СтрЗаменить(Текст, Символы.ПС, " ");
    ДокОбъект.ОбменДанными.Загрузка = Истина;
    ДокОбъект.Записать();
КонецЦикла;

Что здесь происходит:

  • 🔍 ПОДОБНО с % по краям находит строки, где перенос стоит в любом месте. Сам перенос не спецсимвол шаблона, экранировать его не надо.
  • 🛠️ ОбменДанными.Загрузка = Истина записывает объект без обработчиков и проверок. Проведённый документ остаётся проведённым, движения не перезаписываются.
  • 📌 Меняется только комментарий. Если меняете реквизит, который влияет на движения, этот приём не подходит: нужна обычная запись с перепроведением.

Если база работает с обменом (РИБ, синхронизация с УТ или розницей), изменённые документы попадут в ближайший обмен. Учитывайте это при обработке тысяч объектов.

Почему перенос строки в 1С не срабатывает

Диагностика: выберите симптом

Ещё одна неочевидная ловушка — сравнение строк. Тексты «Москва» и «Москва» + Символы.ПС для 1С разные. Если поиск контрагента по наименованию ничего не находит, а на экране всё совпадает, проверьте хвост строки через СокрЛП(): она убирает и пробелы, и переносы по краям.

Частые вопросы

Чем Символы.ПС отличается от Символ(10)?
Ничем по результату: обе записи дают один и тот же символ с кодом 10. Символы.ПС читается понятнее, поэтому его используют чаще.
Можно ли вставить перенос в наименование элемента справочника?
Технически кодом можно, но делать этого не стоит. Наименование используется в поиске, списках и печати в одну строку, перенос там создаст путаницу.
Как увидеть невидимые символы в строке?
Пройдите строку циклом и выведите КодСимвола для каждой позиции. Коды 10 и 13 — переносы, 9 — табуляция, 160 — неразрывный пробел.
Как сделать перенос в тексте HTML-письма из 1С?
В HTML символ переноса игнорируется браузером. Замените Символы.ПС на тег br через СтрЗаменить перед отправкой.
Работает ли перенос строки в ПоказатьПредупреждение и Вопрос?
Да, окна предупреждения и вопроса показывают текст с Символы.ПС в несколько строк.