К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить строку в 1С: способы и примеры

Как получить строку в 1С: функция Строка(), преобразование чисел и дат в строку, конкатенация, форматирование, типичные ошибки и примеры кода.

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

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

Отдельный сценарий — получение строки из внешних источников: текстового файла, запроса к базе, табличного документа. Здесь важны кодировка, разделители и обработка переносов строк. Ниже разобраны все основные способы с примерами кода, которые можно проверить в конфигураторе или через внешнюю обработку.

Задание строки литералом в коде

Простейший способ — написать строку прямо в модуле. Литерал заключается в двойные кавычки: Текст = "Привет, мир!";. Если внутри строки нужна сама кавычка, она удваивается: "Номенклатура ""Премиум"" в наличии". Это стандартный синтаксис платформы, он одинаков во всех версиях.

Многострочные литералы создаются символом вертикальной черты | в начале каждой следующей строки:

ТекстПисьма = "Уважаемый клиент!

|Ваш заказ принят в работу.

|Срок исполнения — 3 дня.";

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

Преобразование в строку функцией Строка()

Функция Строка(Значение) возвращает строковое представление почти любого значения: числа, даты, булево, ссылки, перечисления. Примеры:

ЧислоКод = 125.5;

Сообщить(Строка(ЧислоКод)); // "125.5"

ДатаДокумента = ТекущаяДатаСеанса();

Сообщить(Строка(ДатаДокумента)); // платформенный формат даты

Ссылка = Справочники.Номенклатура.НайтиПоКоду("000001");

Сообщить(Строка(Ссылка)); // наименование элемента

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

Для булево функция вернёт «Да» или «Нет» (зависит от региональных настроек кода), для Неопределено — пустую строку. Пустая строка также получится при преобразовании Null из запроса, поэтому перед выводом результата запроса стоит проверять значение функцией ЗначениеЗаполнено().

Контролируемое преобразование через Формат()

Когда результат Строка() не устраивает — например, нужна дата без времени или число с разделителями групп, — используется функция Формат(Значение, ФорматнаяСтрока). Она даёт точный контроль над видом результата:

Формат(ТекущаяДатаСеанса(), "ДЛФ=D");       // только дата

Формат(1234567.89, "ЧГ=0; ЧРД=,"); // 1234567,89 без групп

Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧН=0,00"); // фиксированный формат

Параметры форматной строки для чисел: ЧЦ — общее число знаков, ЧДЦ — знаков после запятой, ЧРД — разделитель дробной части, ЧГ — разделитель групп (0 — без групп), ЧН — представление нуля. Для дат применяются конструкции ДЛФ (локальный формат) и ДФ с шаблоном, например ДФ=dd.MM.yyyy.

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

bsl
Сумма = 1500000;
ТекстСуммы = Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧРД=,; ЧГ=3,");
Сообщить("Итого к оплате: " + ТекстСуммы + " руб.");

Получение строки из реквизитов и запросов

Если данные уже хранятся в базе, строка берётся из реквизита объекта напрямую. У строковых реквизитов значение уже имеет тип «Строка» и преобразование не требуется: Наименование = СправочникОбъект.Наименование;. У реквизитов других типов применяется Строка() или Формат().

В запросах строковые поля выбираются напрямую, а преобразование выполняется функцией языка запросов ПРЕДСТАВЛЕНИЕ() или ВЫРАЗИТЬ(... КАК Строка(N)). Обратите внимание: ВЫРАЗИТЬ со строкой фиксированной длины дополняет значение пробелами справа, из-за чего сравнение и соединение могут дать неожиданный результат.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Наименование, Код ИЗ Справочник.Номенклатура";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

СтрокаРезультата = Выборка.Наименование;

КонецЦикла;

Поле Код в справочниках обычно уже строковое, но если код числовой, при конкатенации с текстом платформа выполнит неявное преобразование. Явный вызов Строка() делает намерение понятнее и защищает от ошибок при смене типа реквизита.

Чтение строк из текстового файла

Для чтения строк из файлов используются объекты ЧтениеТекста и ЧтениеДанных. Объект ЧтениеТекста позволяет читать файл целиком или построчно с указанием кодировки:

Чтение = Новый ЧтениеТекста("C:\data\import.txt", КодировкаТекста.UTF8);

СтрокаФайла = Чтение.ПрочитатьСтроку();

Пока СтрокаФайла <> Неопределено Цикл

// обработка строки

СтрокаФайла = Чтение.ПрочитатьСтроку();

КонецЦикла;

Чтение.Закрыть();

Неверно указанная кодировка — самая частая причина «кракозябр» при чтении. Если файл создан в Windows, чаще всего это ANSI или UTF-8 с BOM; файлы из Linux-систем обычно в UTF-8 без BOM. При сомнениях откройте файл в редакторе с отображением кодировки и сверьте с параметром чтения.

Метод Прочитать() без аргументов возвращает весь файл одной строкой — это удобно для небольших файлов, но для больших объёмов безопаснее построчное чтение, чтобы не расходовать память сервера.

Порядок действий при чтении файла
  1. 1
    Проверьте существование файла через объект Файл и метод Существует()
  2. 2
    Определите кодировку файла по источнику или в редакторе
  3. 3
    Откройте файл через ЧтениеТекста с указанной кодировкой
  4. 4
    Читайте построчно в цикле до значения Неопределено
  5. 5
    Закройте чтение и проверьте первую и последнюю строки результата

Операции над полученной строкой

После получения строки типовые операции — соединение, выделение части и поиск. Конкатенация выполняется оператором +: ПолноеИмя = Фамилия + " " + Имя;. Для сборки длинных текстов из множества частей эффективнее массив строк с последующим СтрСоединить(), чем последовательная конкатенация в цикле.

Основные функции работы со строками: СтрДлина() — длина, Лев(), Прав(), Сред() — выделение подстроки, СтрНайти() — позиция вхождения, СтрЗаменить() — замена, СокрЛП() — удаление пробелов по краям, ВРег() и НРег() — смена регистра. Функции с префиксом Стр работают с учётом многострочности: СтрЧислоСтрок() и СтрПолучитьСтроку() удобны для разбора многострочных значений.

СтрокаАртикула = "  АБВ-12345  ";

ЧистыйКод = СокрЛП(СтрокаАртикула); // "АБВ-12345"

Префикс = Лев(ЧистыйКод, 3); // "АБВ"

Если СтрНайти(ЧистыйКод, "-") > 0 Тогда

НомерЧасть = Сред(ЧистыйКод, СтрНайти(ЧистыйКод, "-") + 1);

КонецЕсли;

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

Типичные ошибки
01
Сравнение строк без СокрЛП и приведения регистра — совпадения не находятся из-за пробелов и регистра
02
Использование Строка() для дат в печатных формах вместо Формат() — формат вывода плавает
03
Конкатенация в цикле по большому массиву вместо СтрСоединить — падение производительности
04
Чтение файла без указания кодировки — искажённые символы в данных
05
Преобразование ссылки в строку для идентификации — наименования не уникальны, нужен УникальныйИдентификатор

Как проверить результат

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

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

Контрольные точки

Как проверить результат

Тип значения
Норма

ТипЗнч(Значение) = Тип("Строка")

Тревожный признак

Значение осталось числом или ссылкой

Краевые пробелы
Норма

СтрДлина(Значение) = СтрДлина(СокрЛП(Значение))

Тревожный признак

Длина отличается — есть лишние пробелы

Читаемость вывода
Норма

Строка отображается без кракозябр и знаков вопроса

Тревожный признак

Искажённые символы — неверная кодировка источника

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

Чем отличается Строка() от Формат()?

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

Как преобразовать число в строку без разделителей групп?

Примените Формат() с параметром ЧГ=0: Формат(Число, "ЧГ=0"). Это уберёт пробелы-разделители тысяч, которые мешают при выгрузке в файлы и сравнении.

Почему сравнение двух одинаковых на вид строк даёт Ложь?

Чаще всего виноваты неразрывные пробелы (символ 160), краевые пробелы или разный регистр букв. Приведите обе строки через СокрЛП() и ВРег(), а неразрывные пробелы замените на обычные через СтрЗаменить() с Символ(160).

Как получить уникальную строку-идентификатор ссылки?

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

Как объединить массив строк в одну строку?

Функция СтрСоединить(Массив, Разделитель) объединяет элементы массива через указанный разделитель. Обратная операция — СтрРазделить(Строка, Разделитель) — возвращает массив подстрок.

Можно ли получить строку из табличного документа?

Да, через область ячеек: ТабДок.Область("R5C2").Текст вернёт текст ячейки. Если в ячейке параметр, а не текст, предварительно убедитесь, что значение выведено, иначе текст будет пустым.

Итог

Что важно запомнить

Литерал задаётся в кавычках, Строка() преобразует любые типы в платформенном виде, Формат() даёт контролируемый вывод чисел и дат, файлы читаются через ЧтениеТекста с правильной кодировкой. Перед сравнением строк применяйте СокрЛП() и приведение регистра, а для идентификации ссылок используйте УникальныйИдентификатор, а не наименование.