Работа с текстом во встроенном языке 1С 8.3

· 9 мин

Содержание

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

Чаще всего путаница начинается с попытки склеить число или дату со строкой напрямую — платформа тут же выдаёт ошибку преобразования типа. Число и дату перед вставкой в строку нужно пропустить через Формат или Строка(). Разберём все способы собрать и показать текст в 1С 8.3 с интерфейсом «Такси»: от строковых функций встроенного языка до печатных макетов и форматированного документа.

Строковые функции встроенного языка

Основа любого текста — строковые функции. Строка в 1С это тип данных, и склеивать её можно только со строкой.

Базовый набор, который закрывает большинство задач:

  • 🔤 СтрДлина(Строка) — количество символов.
  • ✂️ Лев(Строка, N), Прав(Строка, N), Сред(Строка, Начало, Длина) — вырезать часть.
  • 🔍 СтрНайти(Строка, Подстрока) — позиция вхождения (0, если не найдено).
  • 🔁 СтрЗаменить(Строка, Что, НаЧто) — заменить все вхождения.
  • 🧹 СокрЛП(Строка) — убрать пробелы по краям; СокрЛ и СокрП — слева и справа.
  • 🔠 ВРег, НРег, ТРег — верхний, нижний регистр и первая заглавная.

Для построчной работы с многострочным текстом пригодятся ещё три функции:

  • 📄 СтрЧислоСтрок(Строка) — сколько строк (считает по переносам).
  • 🔢 СтрПолучитьСтроку(Строка, Номер) — вернуть строку с заданным номером.
  • ⬜ ПустаяСтрока(Строка) — Истина, если строка пустая или состоит только из пробелов.

Пройти текст построчно можно так:

Для Ном = 1 По СтрЧислоСтрок(МногострочныйТекст) Цикл
	Строка = СокрЛП(СтрПолучитьСтроку(МногострочныйТекст, Ном));
	Если НЕ ПустаяСтрока(Строка) Тогда
		Сообщить(Строка);
	КонецЕсли;
КонецЦикла;

У СтрНайти на платформе не ниже 8.3.6 есть дополнительные параметры: направление поиска, начальная позиция и номер вхождения — это удобно, когда нужно найти не первое, а последнее совпадение.

Для сборки и разбора строк по разделителю есть пара функций СтрРазделить и СтрСоединить. Они доступны на платформе не ниже 8.3.6:

Массив = СтрРазделить("Иванов;Петров;Сидоров", ";");
// Массив[0] = "Иванов", Массив[1] = "Петров", Массив[2] = "Сидоров"

Строка = СтрСоединить(Массив, ", ");
// Строка = "Иванов, Петров, Сидоров"

Когда нужно вставить значения в шаблон, удобнее СтрШаблон (платформа не ниже 8.3.7) — она сама приводит аргументы к строке:

Текст = СтрШаблон("Документ №%1 от %2 на сумму %3",
	Номер, Формат(Дата, "ДЛФ=D"), Формат(Сумма, "ЧДЦ=2"));

СтрШаблон читается лучше, чем длинная цепочка +, и не ломается, если забыть обернуть число в Строка(). На больших текстах предпочитайте её конкатенации.

Как вставить число, дату и перенос строки

Самая частая ошибка — приписать число к строке плюсом. Перед вставкой в строку число и дату обязательно форматируют. Иначе платформа попытается сложить строку с числом и остановится с ошибкой преобразования типа.

Функция Формат управляет видом значения:

Формат(1234.5, "ЧДЦ=2")       // "1 234,50" — два знака после запятой
Формат(1234.5, "ЧГ=0")        // "1234,5"   — без разделителя групп
Формат(ТекущаяДата(), "ДЛФ=D")// "8 ноября 2026 г."
Формат(Истина, "БЛ=нет; БИ=да") // "да"

Полезные параметры Формат под рукой:

  • ЧДЦ=2 — число знаков после запятой.
  • ЧГ=0 — убрать разделитель групп разрядов.
  • ЧН=0 — показывать ноль как пусто (ЧН= оставляет ноль).
  • ДЛФ=D — длинная дата, ДЛФ=DD — дата и время, ДФ=дд.ММ.гггг — свой шаблон.
  • БЛ=нет; БИ=да — как выводить булево Ложь/Истина.

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

Сообщение = "Первая строка" + Символы.ПС + "Вторая строка";

У объекта Символы есть и другие полезные значения: Символы.Таб — табуляция, Символы.ВК — возврат каретки. Если нужен символ по коду, используйте Символ(КодСимвола), например Символ(10) для перевода строки.

Вывод текста пользователю на форме

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

Куда нужен текстЧем выводитьКогда применять
Подсказка внизу формыСообщениеПользователюнекритичные замечания, привязка к полю
Модальное окноПоказатьПредупреждение, Вопроснужно прервать и дождаться реакции
Постоянная надписьэлемент «Надпись»пояснение рядом с полем
Печатьмакет (ТабличныйДокумент)документы, счета, акты
ФайлТекстовыйДокументвыгрузка без оформления
ОтладкаСообщить, таблопроверка значений при разработке

Теперь по порядку. Показать текст работающему пользователю можно тремя способами, и выбор зависит от того, насколько сообщение важное.

Служебное сообщение внизу формы. Для некритичных подсказок подойдёт объект СообщениеПользователю. Старую функцию Сообщить() платформа ещё выполняет, но в новых конфигурациях рекомендуют объектный вариант — он умеет привязываться к конкретному полю:

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Заполните поле «Контрагент»";
Сообщение.Поле = "Контрагент";
Сообщение.Сообщить();

Всплывающее окно. Когда действие нужно прервать и дождаться реакции, вызывают ПоказатьПредупреждение() (асинхронный вызов) или Вопрос(). Эти методы останавливают пользователя и требуют нажать кнопку.

Надпись прямо на форме. Постоянный поясняющий текст делают элементом формы вида «Надпись» (декорация). Его заголовок можно менять из кода:

Элементы.ПоясняющаяНадпись.Заголовок = "Проведено документов: " + Строка(Счётчик);

Заголовок самой формы задаётся свойством ЗаголовокФормы или через Элементы.ПоясняющаяНадпись. Для управляемых форм надпись-декорацию добавляют в конфигураторе на вкладке элементов формы.

Сообщить() и СообщениеПользователю работают и на клиенте, и на сервере, но на сервере сообщение «доедет» до пользователя только после возврата управления на клиент. Не рассчитывайте увидеть его в середине длинной серверной процедуры.

Текст в печатных формах и отчётах

В печатной форме текст живёт не в коде, а в макете. Макет — это объект типа ТабличныйДокумент с именованными областями, куда код подставляет значения через параметры.

Порядок формирования печатной формы:

  1. Создать пустой табличный документ: ТабДок = Новый ТабличныйДокумент;.
  2. Получить макет: Макет = Документы.РеализацияТоваров.ПолучитьМакет("Макет");.
  3. Получить именованную область: Шапка = Макет.ПолучитьОбласть("Шапка");.
  4. Заполнить параметры области данными.
  5. Вывести область в документ: ТабДок.Вывести(Шапка);.
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.РеализацияТоваров.ПолучитьМакет("Макет");

Шапка = Макет.ПолучитьОбласть("Шапка");
Шапка.Параметры.НомерДокумента = Номер;
Шапка.Параметры.ДатаДокумента = Формат(Дата, "ДЛФ=D");
ТабДок.Вывести(Шапка);

ТабДок.Показать();

Параметр в макете создают так: выделяют ячейку, в свойстве «Заполнение» ставят «Параметр» и вписывают имя. Именно это имя потом фигурирует в Область.Параметры.ИмяПараметра. Если в ячейке нужен постоянный текст без подстановки, оставляют заполнение «Текст».

Готовый табличный документ не обязательно показывать на экране — его можно сохранить в файл. Для выгрузки в таблицу указывают тип файла:

ТабДок.Записать("C:\Выгрузка\schet.xlsx",
	ТипФайлаТабличногоДокумента.XLSX);

Чтобы пользователь не правил напечатанный документ, перед показом ставят ТабДок.ТолькоПросмотр = Истина;.

Для простого текстового файла без оформления подойдёт тип ТекстовыйДокумент:

Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Строка один");
Текст.ДобавитьСтроку("Строка два");
Текст.Записать("C:\Выгрузка\otchet.txt", КодировкаТекста.UTF8);

При записи файла всегда указывайте кодировку явно. По умолчанию платформа пишет в кодировке системы, и текст, собранный в UTF-8, в другой программе может открыться «кракозябрами».

Форматированный и HTML-текст

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

Форматированная строка (ФорматированнаяСтрока) — это текст с оформлением, который можно показать в заголовке формы, в сообщении или в поле форматированного документа:

Фрагмент = Новый ФорматированнаяСтрока("Внимание! ",
	Новый Шрифт(, , Истина), Цвет.Красный);

Форматированный документ — элемент формы с реквизитом типа ФорматированныйДокумент. В него пользователь вводит текст с картинками и форматированием, а код получает содержимое в виде HTML:

ТекстHTML = "";
Картинки = Новый Структура;
Элементы.КомментарийФД.Документ.ПолучитьHTML(ТекстHTML, Картинки);

Обратная операция — УстановитьHTML(ТекстHTML, Картинки). Структура Картинки хранит вложенные изображения: ключ — имя картинки из HTML, значение — двоичные данные. Чистый текст без разметки достаёт метод ПолучитьТекст().

Если нужно отрисовать произвольный HTML (например, письмо или сложный отчёт), на форму кладут элемент вида «Поле HTML документа». В его реквизит записывают строку с HTML-разметкой, и платформа отображает её встроенным браузером. Тот же HTML-текст можно положить в тело письма при отправке через ИнтернетПочтовоеСообщение — так рассылки получают оформление, а не голый текст.

Форматированная строка хороша для короткого выделения внутри интерфейса. Полноценную вёрстку письма или печать с картинками удобнее собирать HTML-текстом и показывать в поле HTML-документа.

Вывод текста при отладке

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

Сообщить("Контрагент: " + Контрагент.Наименование
	+ ", сумма: " + Формат(Сумма, "ЧДЦ=2"));

Для разбора значений переменных в точке останова удобнее не Сообщить, а средства отладчика:

  • 🔎 Табло — закрепляет выражения и показывает их значения на каждом шаге.
  • 🧮 Вычислить выражение — считает любое выражение в текущем контексте, не меняя код.
  • 👁 Наведение курсора на переменную в точке останова показывает её значение во всплывающей подсказке.

Когда ошибку нужно зафиксировать в работающей базе, а не в отладчике, пишут в журнал регистрации:

ЗаписьЖурналаРегистрации("МойОбмен.Загрузка",
	УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);

Запись в журнал переживёт закрытие сеанса — в отличие от окна сообщений. Её потом смотрят в разделе Администрирование → Обслуживание → Журнал регистрации.

Отладочные Сообщить — это временный инструмент. Перед передачей кода в работу их убирают: в рабочей базе лишние сообщения мешают пользователю и могут раскрыть служебные данные. Для постоянной диагностики используйте журнал регистрации, а не окно сообщений.

Частые ошибки при работе с текстом

Ошибки с текстом почти всегда сводятся к типам данных и кодировкам.

  • ❌ Число или дата плюсом к строке. "Сумма: " + Сумма падает с ошибкой типа. Оборачивайте в Формат или Строка().
  • ❌ Перенос строки через \n. В 1С это не работает — обратная косая здесь просто два символа. Перенос задаётся через Символы.ПС.
  • ❌ Файл записан без указания кодировки. В другой программе открывается нечитаемо. Указывайте КодировкаТекста.UTF8 явно.
  • ❌ Сравнение строк с учётом регистра. "Иванов" = "иванов" даёт Ложь. Перед сравнением приводите обе строки к одному регистру через ВРег.
  • ❌ Лишние пробелы из выгрузки. Текст из внешнего файла часто содержит пробелы по краям — чистите СокрЛП перед сравнением и поиском.

Склейка числа со строкой без Формат — причина примерно каждой второй ошибки у начинающих. Если видите в сообщении «Преобразование значения к типу Строка не может быть выполнено», ищите необёрнутое число или дату.

Проверка перед выводом текста
Выполнено: 0 / 6

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

Как собрать строку из нескольких переменных?
Конкатенацией через +, но числа и даты предварительно прогоняют через Формат или Строка(). Для шаблона с несколькими подстановками удобнее СтрШаблон("...%1...%2", А, Б).
Чем `СтрШаблон` лучше, чем склейка плюсами?
Она сама приводит аргументы к строке и читается как обычное предложение. Меньше шансов забыть обернуть число и получить ошибку типа.
Почему текст из файла выводится «кракозябрами»?
Не совпала кодировка. При чтении и записи указывайте её явно: Новый ЧтениеТекста(Файл, КодировкаТекста.UTF8). Чаще всего нужна UTF-8 или Windows-1251.
Как в сообщении сделать перенос на новую строку?
Через Символы.ПС: "Строка 1" + Символы.ПС + "Строка 2". Символы \n в 1С переносом не являются.
Как показать текст разным цветом или жирным?
Коротким фрагментом в интерфейсе — через ФорматированнаяСтрока. Полноценной вёрсткой — HTML-текстом в поле HTML-документа.