Работа с текстом во встроенном языке 1С 8.3
Содержание
«Сделать текст» в 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) для перевода строки.
Вывод текста пользователю на форме
Прежде чем выбирать способ, полезно держать в голове всю карту: один и тот же текст выводится в интерфейс, в печать или «для себя» при отладке — и методы у них разные.
| Куда нужен текст | Чем выводить | Когда применять |
|---|---|---|
| Подсказка внизу формы | СообщениеПользователю | некритичные замечания, привязка к полю |
| Модальное окно | ПоказатьПредупреждение, Вопрос | нужно прервать и дождаться реакции |
| Постоянная надпись | элемент «Надпись» | пояснение рядом с полем |
| Печать | макет (ТабличныйДокумент) | документы, счета, акты |
| Файл | ТекстовыйДокумент | выгрузка без оформления |
| Отладка | Сообщить, табло | проверка значений при разработке |
Теперь по порядку. Показать текст работающему пользователю можно тремя способами, и выбор зависит от того, насколько сообщение важное.
Служебное сообщение внизу формы. Для некритичных подсказок подойдёт объект СообщениеПользователю. Старую функцию Сообщить() платформа ещё выполняет, но в новых конфигурациях рекомендуют объектный вариант — он умеет привязываться к конкретному полю:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Заполните поле «Контрагент»";
Сообщение.Поле = "Контрагент";
Сообщение.Сообщить();
Всплывающее окно. Когда действие нужно прервать и дождаться реакции, вызывают ПоказатьПредупреждение() (асинхронный вызов) или Вопрос(). Эти методы останавливают пользователя и требуют нажать кнопку.
Надпись прямо на форме. Постоянный поясняющий текст делают элементом формы вида «Надпись» (декорация). Его заголовок можно менять из кода:
Элементы.ПоясняющаяНадпись.Заголовок = "Проведено документов: " + Строка(Счётчик);
Заголовок самой формы задаётся свойством ЗаголовокФормы или через Элементы.ПоясняющаяНадпись. Для управляемых форм надпись-декорацию добавляют в конфигураторе на вкладке элементов формы.
Сообщить() и СообщениеПользователю работают и на клиенте, и на сервере, но на сервере сообщение «доедет» до пользователя только после возврата управления на клиент. Не рассчитывайте увидеть его в середине длинной серверной процедуры.
Текст в печатных формах и отчётах
В печатной форме текст живёт не в коде, а в макете. Макет — это объект типа ТабличныйДокумент с именованными областями, куда код подставляет значения через параметры.
Порядок формирования печатной формы:
- Создать пустой табличный документ:
ТабДок = Новый ТабличныйДокумент;. - Получить макет:
Макет = Документы.РеализацияТоваров.ПолучитьМакет("Макет");. - Получить именованную область:
Шапка = Макет.ПолучитьОбласть("Шапка");. - Заполнить параметры области данными.
- Вывести область в документ:
ТабДок.Вывести(Шапка);.
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.РеализацияТоваров.ПолучитьМакет("Макет");
Шапка = Макет.ПолучитьОбласть("Шапка");
Шапка.Параметры.НомерДокумента = Номер;
Шапка.Параметры.ДатаДокумента = Формат(Дата, "ДЛФ=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явно. - ❌ Сравнение строк с учётом регистра.
"Иванов" = "иванов"даёт Ложь. Перед сравнением приводите обе строки к одному регистру черезВРег. - ❌ Лишние пробелы из выгрузки. Текст из внешнего файла часто содержит пробелы по краям — чистите
СокрЛПперед сравнением и поиском.
Склейка числа со строкой без Формат — причина примерно каждой второй ошибки у начинающих. Если видите в сообщении «Преобразование значения к типу Строка не может быть выполнено», ищите необёрнутое число или дату.
Частые вопросы
Как собрать строку из нескольких переменных?
+, но числа и даты предварительно прогоняют через Формат или Строка(). Для шаблона с несколькими подстановками удобнее СтрШаблон("...%1...%2", А, Б).Чем `СтрШаблон` лучше, чем склейка плюсами?
Почему текст из файла выводится «кракозябрами»?
Новый ЧтениеТекста(Файл, КодировкаТекста.UTF8). Чаще всего нужна UTF-8 или Windows-1251.Как в сообщении сделать перенос на новую строку?
Символы.ПС: "Строка 1" + Символы.ПС + "Строка 2". Символы \n в 1С переносом не являются.Как показать текст разным цветом или жирным?
ФорматированнаяСтрока. Полноценной вёрсткой — HTML-текстом в поле HTML-документа.