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

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

Что значит символ в 1С и как с ним работать

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

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

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

Что такое символ во встроенном языке 1С

Символ — минимальная единица строки. Когда вы пишете Строка = "Привет", платформа хранит последовательность из семи символов. Обратиться к отдельному знаку можно функцией Сред(): выражение Сред("Привет", 2, 1) вернёт строку «р» — один символ.

Каждый символ имеет числовой код в кодировке Unicode. Буква «А» кириллическая, латинская «A» и даже невидимый перевод строки — всё это символы с собственными кодами. Именно поэтому визуально похожие знаки могут быть разными символами, что нередко становится причиной ошибок при сравнении строк и поиске данных.

Функция Символ(): как получить знак по коду

Функция Символ(КодСимвола) возвращает строку из одного символа по его числовому коду Unicode. Это основной способ вставить в строку знак, который нельзя набрать с клавиатуры напрямую: например, неразрывный пробел (код 160) или знак копирайта (код 169).

Типичный пример использования:

НеразрывныйПробел = Символ(160);

ТекстСообщения = "Итого:" + НеразрывныйПробел + "1 000 руб.";

Обратная функция — КодСимвола(Строка) — возвращает код первого символа переданной строки. С её помощью можно проверить, какой именно знак скрыт в данных: КодСимвола("А") покажет, кириллическая это буква (код 1040) или латинская (код 65). Это незаменимый приём при отладке, когда строки «на вид одинаковые», но сравнение возвращает Ложь.

bsl
Код = КодСимвола(Сред(ПроверяемаяСтрока, 5, 1));
Сообщить("Код пятого символа: " + Код);

Объект Символы: готовые служебные знаки

Чтобы не запоминать коды самых востребованных служебных символов, платформа предоставляет объект Символы. Он содержит набор свойств, каждое из которых — строка с нужным знаком.

СвойствоЧто содержитГде применяется
Символы.ПСПеревод строкиМногострочные сообщения, текстовые файлы
Символы.ВКВозврат кареткиОбмен с внешними системами, файлы Windows-формата
Символы.ТабТабуляцияРазделители колонок, отступы
Символы.НППНеразрывный пробелФорматирование чисел и сумм
Символы.ВТабВертикальная табуляцияРедкие форматы обмена
Символы.ПФПеревод формы (страницы)Печатные формы, текстовые документы

Самый частый сценарий — сборка многострочного текста: Текст = "Строка 1" + Символы.ПС + "Строка 2". Второй по популярности — очистка данных от неразрывных пробелов, которые приходят из Excel или веб-форм и ломают преобразование строки в число.

Невидимые символы в данных: почему строки «не совпадают»

Классическая проблема: два наименования контрагента выглядят одинаково, но поиск по справочнику ничего не находит, а запрос с условием равенства возвращает пустой результат. Почти всегда причина — скрытые символы: неразрывный пробел вместо обычного, перевод строки в конце значения, табуляция или латинская буква вместо кириллической.

Диагностика выполняется посимвольным разбором строки в цикле с выводом кода каждого знака через КодСимвола(). Если длина строки (СтрДлина()) больше, чем видимых знаков, — в данных точно есть невидимые символы.

Как найти скрытый символ в строке
  1. 1
    Проверьте длину строки функцией СтрДлина() и сравните с числом видимых знаков.
  2. 2
    Пройдите по строке циклом: для каждой позиции выведите Сред(Строка, Н, 1) и КодСимвола().
  3. 3
    Найдите коды, не соответствующие ожидаемым буквам и цифрам: 160 (неразрывный пробел), 10 (перевод строки), 9 (табуляция).
  4. 4
    Удалите лишние знаки через СтрЗаменить() или СокрЛП() и повторите сравнение.

Посимвольная обработка строк: типовые приёмы

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

Результат = "";

Для Н = 1 По СтрДлина(ИсходнаяСтрока) Цикл

ТекСимвол = Сред(ИсходнаяСтрока, Н, 1);

Если КодСимвола(ТекСимвол) >= 48 И КодСимвола(ТекСимвол) <= 57 Тогда

Результат = Результат + ТекСимвол;

КонецЕсли;

КонецЦикла;

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

При обмене с внешними системами перевод строки может приходить в двух вариантах: только Символы.ПС (Unix-стиль) или пара Символы.ВК + Символы.ПС (Windows-стиль). Если текст «слипается» или, наоборот, появляются пустые строки, проверьте, какой вариант использует источник, и нормализуйте данные через СтрЗаменить().
ПЗ
Практическое замечание

Типичные ошибки при работе с символами

Типичные ошибки
01
Сравнение строк без очистки от неразрывных пробелов — поиск и запросы не находят визуально совпадающие значения.
02
Использование Символ(13) + Символ(10) вместо Символы.ПС там, где достаточно одного перевода строки — в тексте появляются лишние пустые строки.
03
Передача в КодСимвола() пустой строки или строки длиной больше 1 без указания позиции — ошибка выполнения или неожиданный результат.
04
Проверка букв на равенство без учёта раскладки: кириллическая «А» (1040) и латинская «A» (65) — разные символы.

Отдельная группа ошибок связана с числовым преобразованием. Строка «1 000» с неразрывным пробелом не преобразуется в число напрямую. Безопасный порядок: сначала СтрЗаменить(Значение, Символы.НПП, ""), затем удаление обычных пробелов и только потом вызов Число() в конструкции Попытка...Исключение.

Как проверить результат и выбрать подход

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

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

Сравнение очищенной строки с эталоном
Норма

Сравнение возвращает Истина, поиск находит элемент

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

Строки по-прежнему не равны — остались скрытые символы

Длина строки после очистки
Норма

СтрДлина() равна числу видимых знаков

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

Длина больше видимого текста — есть невидимые коды

Преобразование в число
Норма

Число() возвращает значение без исключения

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

Ошибка преобразования — проверьте НПП и разделители

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

Как выбрать действие

Нужно вставить перевод строки, табуляцию или неразрывный пробелИспользуйте объект Символы — это читаемее, чем числовые коды
Нужен редкий знак по известному коду UnicodeПрименяйте функцию Символ(Код)
Строки визуально одинаковы, но сравнение даёт ЛожьРазберите обе строки посимвольно через КодСимвола() и найдите различающийся код
Данные пришли из Excel или веб-формы и не преобразуются в числоУдалите Символы.НПП и пробелы через СтрЗаменить() перед вызовом Число()

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

Есть ли в 1С отдельный тип данных «символ»?

Нет. Одиночный символ — это обычная строка длиной 1. Все строковые функции платформы работают с ним как со строкой, поэтому специальных операций для типа «символ» не требуется.

Чем отличается Символ(160) от обычного пробела?

Обычный пробел имеет код 32, а Символ(160) — неразрывный пробел. Визуально они одинаковы, но неразрывный пробел не разрывает строку при переносе и не воспринимается функциями преобразования как разделитель, из-за чего ломает преобразование в число и сравнение строк.

Как узнать код символа, который вижу в данных?

Используйте функцию КодСимвола(): передайте ей сам знак или выделите его из строки через Сред(Строка, Позиция, 1). Полученное число — код Unicode, по которому можно определить, что это за символ.

Почему Символы.ПС не даёт переноса строки в поле ввода?

Однострочное поле ввода игнорирует переводы строк. Чтобы перенос отображался, у поля должно быть включено свойство «Многострочный режим», либо используйте многострочное текстовое поле.

Как удалить все невидимые символы из строки разом?

Универсальной одной функции нет. Практичный вариант — последовательно применить СтрЗаменить() для Символы.НПП, Символы.Таб, Символы.ПС и Символы.ВК, а затем СокрЛП(). Для строгой фильтрации используйте посимвольный цикл, оставляющий только допустимые коды.

Можно ли использовать Символ() для вставки спецзнаков в печатные формы?

Да, если используемый шрифт содержит этот знак. Перед выводом проверьте результат на тестовой печати: при отсутствии глифа в шрифте вместо символа появится пустой квадрат или знак вопроса.

Итог

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

Символ в 1С — это строка длиной 1 с кодом Unicode. Функция Символ() создаёт знак по коду, КодСимвола() возвращает код знака, объект Символы даёт готовые служебные знаки. Большинство проблем со строками связано с невидимыми символами — диагностируйте их посимвольным разбором и очищайте данные перед сравнением или преобразованием.