Разработка и Конфигурация · 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.
Именно Формат() следует применять при формировании печатных форм, выгрузок и сообщений пользователю. Платформенный вывод Строка() может меняться в зависимости от настроек, а форматная строка фиксирует результат независимо от окружения.
Сумма = 1500000;
ТекстСуммы = Формат(Сумма, "ЧЦ=15; ЧДЦ=2; ЧРД=,; ЧГ=3,");
Сообщить("Итого к оплате: " + ТекстСуммы + " руб.");Получение строки из реквизитов и запросов
Если данные уже хранятся в базе, строка берётся из реквизита объекта напрямую. У строковых реквизитов значение уже имеет тип «Строка» и преобразование не требуется: Наименование = СправочникОбъект.Наименование;. У реквизитов других типов применяется Строка() или Формат().
В запросах строковые поля выбираются напрямую, а преобразование выполняется функцией языка запросов ПРЕДСТАВЛЕНИЕ() или ВЫРАЗИТЬ(... КАК Строка(N)). Обратите внимание: ВЫРАЗИТЬ со строкой фиксированной длины дополняет значение пробелами справа, из-за чего сравнение и соединение могут дать неожиданный результат.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Наименование, Код ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаРезультата = Выборка.Наименование;
КонецЦикла;
Поле Код в справочниках обычно уже строковое, но если код числовой, при конкатенации с текстом платформа выполнит неявное преобразование. Явный вызов Строка() делает намерение понятнее и защищает от ошибок при смене типа реквизита.
Чтение строк из текстового файла
Для чтения строк из файлов используются объекты ЧтениеТекста и ЧтениеДанных. Объект ЧтениеТекста позволяет читать файл целиком или построчно с указанием кодировки:
Чтение = Новый ЧтениеТекста("C:\data\import.txt", КодировкаТекста.UTF8);
СтрокаФайла = Чтение.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
// обработка строки
СтрокаФайла = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Неверно указанная кодировка — самая частая причина «кракозябр» при чтении. Если файл создан в Windows, чаще всего это ANSI или UTF-8 с BOM; файлы из Linux-систем обычно в UTF-8 без BOM. При сомнениях откройте файл в редакторе с отображением кодировки и сверьте с параметром чтения.
Метод Прочитать() без аргументов возвращает весь файл одной строкой — это удобно для небольших файлов, но для больших объёмов безопаснее построчное чтение, чтобы не расходовать память сервера.
- 1Проверьте существование файла через объект Файл и метод Существует()
- 2Определите кодировку файла по источнику или в редакторе
- 3Откройте файл через ЧтениеТекста с указанной кодировкой
- 4Читайте построчно в цикле до значения Неопределено
- 5Закройте чтение и проверьте первую и последнюю строки результата
Операции над полученной строкой
После получения строки типовые операции — соединение, выделение части и поиск. Конкатенация выполняется оператором +: ПолноеИмя = Фамилия + " " + Имя;. Для сборки длинных текстов из множества частей эффективнее массив строк с последующим СтрСоединить(), чем последовательная конкатенация в цикле.
Основные функции работы со строками: СтрДлина() — длина, Лев(), Прав(), Сред() — выделение подстроки, СтрНайти() — позиция вхождения, СтрЗаменить() — замена, СокрЛП() — удаление пробелов по краям, ВРег() и НРег() — смена регистра. Функции с префиксом Стр работают с учётом многострочности: СтрЧислоСтрок() и СтрПолучитьСтроку() удобны для разбора многострочных значений.
СтрокаАртикула = " АБВ-12345 ";
ЧистыйКод = СокрЛП(СтрокаАртикула); // "АБВ-12345"
Префикс = Лев(ЧистыйКод, 3); // "АБВ"
Если СтрНайти(ЧистыйКод, "-") > 0 Тогда
НомерЧасть = Сред(ЧистыйКод, СтрНайти(ЧистыйКод, "-") + 1);
КонецЕсли;
При разборе строк из внешних источников всегда применяйте СокрЛП() перед сравнением — неразрывные пробелы и невидимые символы из выгрузок регулярно ломают сопоставление данных. Для полной очистки нестандартных пробелов используется замена символа с кодом 160 на обычный пробел.
Как проверить результат
Проверка начинается с типа значения: функция ТипЗнч() в сочетании с Тип("Строка") подтверждает, что получена именно строка. Для проверки содержимого достаточно вывести значение через Сообщить() в тестовой обработке или посмотреть его в отладчике через табло.
Если строка формируется для передачи во внешнюю систему, сверьте длину и состав символов с требованиями приёмника: многие форматы обмена ограничивают длину полей и набор допустимых символов. Проверку длины выполняет СтрДлина(), а недопустимые символы отлавливаются через СтрНайти() по списку запрещённых.
Как проверить результат
ТипЗнч(Значение) = Тип("Строка")
Значение осталось числом или ссылкой
СтрДлина(Значение) = СтрДлина(СокрЛП(Значение))
Длина отличается — есть лишние пробелы
Строка отображается без кракозябр и знаков вопроса
Искажённые символы — неверная кодировка источника
Частые вопросы
Чем отличается Строка() от Формат()?
Строка() возвращает платформенное представление значения без настройки вида, а Формат() позволяет задать точный шаблон вывода — разделители, число знаков, формат даты. Для пользовательских сообщений и печати используйте Формат(), для служебных логов достаточно Строка().
Как преобразовать число в строку без разделителей групп?
Примените Формат() с параметром ЧГ=0: Формат(Число, "ЧГ=0"). Это уберёт пробелы-разделители тысяч, которые мешают при выгрузке в файлы и сравнении.
Почему сравнение двух одинаковых на вид строк даёт Ложь?
Чаще всего виноваты неразрывные пробелы (символ 160), краевые пробелы или разный регистр букв. Приведите обе строки через СокрЛП() и ВРег(), а неразрывные пробелы замените на обычные через СтрЗаменить() с Символ(160).
Как получить уникальную строку-идентификатор ссылки?
Используйте Строка(Ссылка.УникальныйИдентификатор()) — это гарантированно уникальное значение, пригодное для обмена между базами. Наименование через Строка(Ссылка) для идентификации не подходит.
Как объединить массив строк в одну строку?
Функция СтрСоединить(Массив, Разделитель) объединяет элементы массива через указанный разделитель. Обратная операция — СтрРазделить(Строка, Разделитель) — возвращает массив подстрок.
Можно ли получить строку из табличного документа?
Да, через область ячеек: ТабДок.Область("R5C2").Текст вернёт текст ячейки. Если в ячейке параметр, а не текст, предварительно убедитесь, что значение выведено, иначе текст будет пустым.
Что важно запомнить
Литерал задаётся в кавычках, Строка() преобразует любые типы в платформенном виде, Формат() даёт контролируемый вывод чисел и дат, файлы читаются через ЧтениеТекста с правильной кодировкой. Перед сравнением строк применяйте СокрЛП() и приведение регистра, а для идентификации ссылок используйте УникальныйИдентификатор, а не наименование.