Разработка и Конфигурация · 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), " ") и аналогичные конструкции.
Разделитель колонок в текстовых выгрузках; константа Символы.Таб
Стандартный перенос в 1С; константа Символы.ПС
Используется в паре CRLF в файлах Windows; константа Символы.ВК
Частый источник ошибок сравнения строк; константа Символы.НПП
Нужна при сборке строк с кавычками внутри, хотя удобнее удвоение кавычек
Символ() против объекта Символы: что выбрать
В 1С есть объект Символы с готовыми константами: Символы.ПС (перевод строки), Символы.ВК (возврат каретки), Символы.ВТаб, Символы.Таб, Символы.НПП (неразрывный пробел). Они покрывают большинство повседневных задач, и код с ними читается лучше: Символы.ПС понятнее, чем Символ(10).
Функция Символ() остаётся незаменимой, когда нужного знака нет среди констант: буквы по коду, специфические управляющие символы протоколов обмена, знаки вроде «©» (169) или «№» (8470), а также когда код вычисляется динамически — например, при посимвольном разборе строки через КодСимвола().
Символ() или Символы.ПС
Подходят для стандартных переносов и пробелов. Код читается лучше, меньше риск ошибиться в номере. Ограничение: набор констант фиксирован.
Подходит для любых знаков Unicode и динамически вычисляемых кодов. Ограничение: «магические числа» в коде требуют комментариев, иначе сопровождение усложняется.
Примеры кода: переносы, табуляция, спецсимволы
Многострочное сообщение пользователю формируется через конкатенацию с Символы.ПС или явным кодом 10:
ТекстСообщения = "Проверьте заполнение документа:" + Символы.ПС
+ "— не указан контрагент;" + Символы.ПС
+ "— не заполнена табличная часть.";
Сообщить(ТекстСообщения);
Очистка строки от неразрывных пробелов и управляющих символов перед сравнением:
СтрокаОчищенная = СтрЗаменить(ИсходнаяСтрока, Символ(160), " ");
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, Символы.Таб, " ");
СтрокаОчищенная = СокрЛП(СтрокаОчищенная);
Формирование строки CSV с табуляцией в качестве разделителя:
СтрокаФайла = Номенклатура.Код + Символы.Таб
+ Номенклатура.Наименование + Символы.Таб
+ Формат(Остаток, "ЧГ=");
// Перенос строки в сообщении
Сообщить("Строка 1" + Символы.ПС + "Строка 2");
// То же самое через код символа
Сообщить("Строка 1" + Символ(10) + "Строка 2");
// Узнать код первого символа строки
Код = КодСимвола("А"); // 1040Как проверить, что символ вставлен правильно
Невидимые символы нельзя оценить «на глаз» в окне сообщения — их проверяют программно. Используйте СтрДлина(): если строка из двух видимых слов длиннее ожидаемого, внутри есть скрытые знаки. Функция СтрЧислоСтрок() покажет, сработал ли перенос: для текста с одним Символы.ПС она вернёт 2.
Для точечной диагностики пройдитесь по строке циклом с КодСимвола() и выведите коды всех знаков. Так вы увидите, где прячется неразрывный пробел (160) вместо обычного (32) или лишний возврат каретки (13) в конце строки, загруженной из файла.
Как проверить результат
СтрЧислоСтрок(Текст) возвращает ожидаемое число строк
Весь текст выводится одной строкой — перенос не вставлен или потерян при выводе
КодСимвола показывает 32 в позициях разделителей
Встречается код 160 — строка содержит неразрывные пробелы, сравнение может не сработать
Нет лишних кодов 13 перед кодом 10
Двойные переносы или «лишние» пустые строки при чтении файла
Типичные ошибки и ограничения
Самая распространённая ошибка — путать Символ() и КодСимвола(). Первая функция принимает число и возвращает знак, вторая делает наоборот. Передача строки в Символ() или числа в КодСимвола() приведёт к ошибке исполнения.
Вторая группа ошибок связана с ожиданиями от переносов. В многострочных текстовых полях формы перенос отображается корректно, но в некоторых местах — например, в заголовках, отдельных элементах табличных полей, при выводе в печатные формы табличных документов — перенос может игнорироваться или требовать специальной настройки (например, свойства «АвтоВысотаЯчейки» и переноса текста в макете).
Третий риск — кодировки файлов. Функция Символ() работает с Unicode внутри платформы, но при записи текста в файл через ЗаписьТекста итоговые байты зависят от выбранной кодировки (UTF-8, ANSI и др.). Если внешняя система ожидает конкретные управляющие коды, проверяйте и кодировку, и завершение строк (CRLF против LF).
Когда Символ() не нужен: альтернативы
Если задача — просто перенести строку внутри литерала в коде, в 1С можно использовать многострочные строковые литералы: закрывающая кавычка, вертикальная черта | в начале следующей строки. Это удобно для длинных шаблонов текстов и запросов.
Для подстановки значений в шаблон вместо ручной сборки со спецсимволами применяйте СтрШаблон(). Для разбора и сборки строк по разделителю полезны СтрРазделить() и СтрСоединить() — они принимают разделитель строкой, и Символы.ПС или Символы.Таб туда передаются напрямую, без вызова Символ().
Как выбрать подход
FAQ: частые вопросы о Символ() в 1С
Чем Символ(10) отличается от Символ(13)?
Код 10 — перевод строки (LF), код 13 — возврат каретки (CR). Внутри 1С для переноса обычно достаточно кода 10 (Символы.ПС). Пара CRLF (13+10) используется как завершение строки в текстовых файлах Windows и в некоторых протоколах обмена с оборудованием.
Как вставить кавычку внутрь строки в 1С?
Проще всего удвоить кавычку в литерале: "Он сказал ""привет""". Вариант через Символ(34) тоже работает, но читается хуже и применяется редко — например, при динамической сборке строк из частей.
Почему сравнение двух визуально одинаковых строк возвращает Ложь?
Чаще всего в одной из строк есть невидимые символы: неразрывный пробел (код 160), табуляция или возврат каретки. Проверьте СтрДлина() обеих строк и пройдитесь по ним КодСимвола() — расхождение покажет позицию скрытого знака.
Работает ли Символ() на сервере и в веб-клиенте?
Да, функция доступна во всех контекстах исполнения: тонкий, толстый и веб-клиент, сервер, внешнее соединение. Ограничений по директивам компиляции у неё нет.
Как узнать код символа, который пришёл из файла или со сканера?
Используйте обратную функцию КодСимвола(Строка, Позиция) — она вернёт числовой код знака в указанной позиции. Так можно определить, каким именно символом завершает данные сканер штрихкодов или какой разделитель используется в файле.
Можно ли с помощью Символ() вывести любой знак Unicode?
Да, функция принимает коды из диапазона Unicode, включая буквы разных алфавитов, значки валют и технические знаки. Однако отображение зависит от шрифта: если в шрифте нет нужного глифа, пользователь увидит пустой квадрат, хотя в строке символ будет присутствовать корректно.
Что важно запомнить
Символ(Код) преобразует числовой код Unicode в знак и нужен для переносов строк, табуляции, неразрывных пробелов и управляющих кодов при обмене данными. Для стандартных случаев предпочтительнее константы объекта Символы, а скрытые символы в строках диагностируйте через СтрДлина() и КодСимвола().