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

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

Для чего нужна функция Символ() в 1С

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

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

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

Функция доступна во всех контекстах исполнения: на тонком и толстом клиенте, на сервере, во внешнем соединении. Это делает её универсальным инструментом как для прикладного разработчика, так и для администратора, пишущего разовые обработки.

Что делает функция Символ() и какой у неё синтаксис

Синтаксис предельно прост: Символ(<Код>), где параметр — целое число, код символа в таблице Unicode. Результат — строка длиной в один знак. Например, Символ(65) вернёт латинскую букву «A», а Символ(1040) — кириллическую «А».

Если передать код, которому не соответствует отображаемый знак (например, управляющие коды 0–31), функция вернёт служебный символ. Он может быть невидим при выводе, но будет присутствовать в строке и влиять на длину, сравнение и поиск подстроки. Это частая причина «фантомных» ошибок при сравнении строк, загруженных из файлов.

Где применяется Символ() на практике

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

Второе направление — обмен данными. При выгрузке в текстовые файлы, CSV, форматы банков и кассового оборудования часто требуются конкретные разделители и управляющие коды: табуляция (код 9), возврат каретки (13), перевод строки (10). Некоторые протоколы ККТ и сканеров штрихкодов завершают блоки данных символом CR или парой CRLF.

Третий сценарий — очистка и нормализация данных. Из Excel, веб-форм и старых баз в 1С попадают неразрывные пробелы (код 160), мягкие переносы, нулевые символы. Их находят и заменяют через СтрЗаменить(Текст, Символ(160), " ") и аналогичные конструкции.

Код 9Табуляция (Tab)

Разделитель колонок в текстовых выгрузках; константа Символы.Таб

Код 10Перевод строки LF

Стандартный перенос в 1С; константа Символы.ПС

Код 13Возврат каретки CR

Используется в паре CRLF в файлах Windows; константа Символы.ВК

Код 160Неразрывный пробел

Частый источник ошибок сравнения строк; константа Символы.НПП

Код 34Кавычка

Нужна при сборке строк с кавычками внутри, хотя удобнее удвоение кавычек

Символ() против объекта Символы: что выбрать

В 1С есть объект Символы с готовыми константами: Символы.ПС (перевод строки), Символы.ВК (возврат каретки), Символы.ВТаб, Символы.Таб, Символы.НПП (неразрывный пробел). Они покрывают большинство повседневных задач, и код с ними читается лучше: Символы.ПС понятнее, чем Символ(10).

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

Символ() или Символы.ПС

Символы.ПС, Символы.Таб, Символы.НПП

Подходят для стандартных переносов и пробелов. Код читается лучше, меньше риск ошибиться в номере. Ограничение: набор констант фиксирован.

Символ(Код)

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

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

Многострочное сообщение пользователю формируется через конкатенацию с Символы.ПС или явным кодом 10:

ТекстСообщения = "Проверьте заполнение документа:" + Символы.ПС

+ "— не указан контрагент;" + Символы.ПС

+ "— не заполнена табличная часть.";

Сообщить(ТекстСообщения);

Очистка строки от неразрывных пробелов и управляющих символов перед сравнением:

СтрокаОчищенная = СтрЗаменить(ИсходнаяСтрока, Символ(160), " ");

СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, Символы.Таб, " ");

СтрокаОчищенная = СокрЛП(СтрокаОчищенная);

Формирование строки CSV с табуляцией в качестве разделителя:

СтрокаФайла = Номенклатура.Код + Символы.Таб

+ Номенклатура.Наименование + Символы.Таб

+ Формат(Остаток, "ЧГ=");

bsl
// Перенос строки в сообщении
Сообщить("Строка 1" + Символы.ПС + "Строка 2");
// То же самое через код символа
Сообщить("Строка 1" + Символ(10) + "Строка 2");
// Узнать код первого символа строки
Код = КодСимвола("А"); // 1040

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

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

Для точечной диагностики пройдитесь по строке циклом с КодСимвола() и выведите коды всех знаков. Так вы увидите, где прячется неразрывный пробел (160) вместо обычного (32) или лишний возврат каретки (13) в конце строки, загруженной из файла.

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

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

Перенос строки в сообщении
Норма

СтрЧислоСтрок(Текст) возвращает ожидаемое число строк

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

Весь текст выводится одной строкой — перенос не вставлен или потерян при выводе

Пробелы в строке
Норма

КодСимвола показывает 32 в позициях разделителей

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

Встречается код 160 — строка содержит неразрывные пробелы, сравнение может не сработать

Конец строки из файла
Норма

Нет лишних кодов 13 перед кодом 10

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

Двойные переносы или «лишние» пустые строки при чтении файла

Типичные ошибки и ограничения

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

Вторая группа ошибок связана с ожиданиями от переносов. В многострочных текстовых полях формы перенос отображается корректно, но в некоторых местах — например, в заголовках, отдельных элементах табличных полей, при выводе в печатные формы табличных документов — перенос может игнорироваться или требовать специальной настройки (например, свойства «АвтоВысотаЯчейки» и переноса текста в макете).

Третий риск — кодировки файлов. Функция Символ() работает с Unicode внутри платформы, но при записи текста в файл через ЗаписьТекста итоговые байты зависят от выбранной кодировки (UTF-8, ANSI и др.). Если внешняя система ожидает конкретные управляющие коды, проверяйте и кодировку, и завершение строк (CRLF против LF).

Типичные ошибки
01
Использование «магических чисел» вроде Символ(10) без комментария — код сложно читать; лучше Символы.ПС
02
Сравнение строк без очистки от неразрывных пробелов (код 160) — условие не срабатывает, хотя строки выглядят одинаково
03
Ожидание, что перенос строки отобразится в заголовке или однострочном поле — там он игнорируется
04
Запись файла без учёта кодировки — внешняя система получает «кракозябры» вместо спецсимволов
05
Передача в Символ() строки вместо числа — ошибка исполнения; нужна КодСимвола()

Когда Символ() не нужен: альтернативы

Если задача — просто перенести строку внутри литерала в коде, в 1С можно использовать многострочные строковые литералы: закрывающая кавычка, вертикальная черта | в начале следующей строки. Это удобно для длинных шаблонов текстов и запросов.

Для подстановки значений в шаблон вместо ручной сборки со спецсимволами применяйте СтрШаблон(). Для разбора и сборки строк по разделителю полезны СтрРазделить() и СтрСоединить() — они принимают разделитель строкой, и Символы.ПС или Символы.Таб туда передаются напрямую, без вызова Символ().

Маршрут решения

Как выбрать подход

Нужен стандартный перенос строки, табуляция или неразрывный пробелИспользуйте константы объекта Символы (Символы.ПС, Символы.Таб, Символы.НПП)
Нужен знак по произвольному коду Unicode или код вычисляется динамическиИспользуйте Символ(Код) с комментарием, что это за знак
Нужно убрать скрытые символы из загруженных данныхПримените СтрЗаменить с Символ(160), Символы.Таб и СокрЛП
Формируете длинный многострочный текст-шаблонРассмотрите многострочный литерал с вертикальной чертой или СтрШаблон

FAQ: частые вопросы о Символ() в 1С

Чем Символ(10) отличается от Символ(13)?

Код 10 — перевод строки (LF), код 13 — возврат каретки (CR). Внутри 1С для переноса обычно достаточно кода 10 (Символы.ПС). Пара CRLF (13+10) используется как завершение строки в текстовых файлах Windows и в некоторых протоколах обмена с оборудованием.

Как вставить кавычку внутрь строки в 1С?

Проще всего удвоить кавычку в литерале: "Он сказал ""привет""". Вариант через Символ(34) тоже работает, но читается хуже и применяется редко — например, при динамической сборке строк из частей.

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

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

Работает ли Символ() на сервере и в веб-клиенте?

Да, функция доступна во всех контекстах исполнения: тонкий, толстый и веб-клиент, сервер, внешнее соединение. Ограничений по директивам компиляции у неё нет.

Как узнать код символа, который пришёл из файла или со сканера?

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

Можно ли с помощью Символ() вывести любой знак Unicode?

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

Итог

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

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