Разработка и Конфигурация · 9 мин
Как получить код символа в 1С
Как получить код символа в 1С: функция КодСимвола, обратная функция Символ, работа с Unicode, примеры кода, типичные ошибки и проверка результата.
Во встроенном языке 1С для получения числового кода символа используется функция КодСимвола() (в англоязычном синтаксисе — CharCode()). Она принимает строку и возвращает код символа в указанной позиции по стандарту Unicode. Это базовый инструмент при разборе строк, проверке ввода, обработке специальных и непечатаемых символов.
Обратная операция — получение символа по его коду — выполняется функцией Символ() (Char()). Вместе эти две функции закрывают большинство задач: перебор строки посимвольно, фильтрацию недопустимых знаков, генерацию служебных символов вроде табуляции или перевода строки.
Нумерация символов в строке в 1С начинается с единицы, а не с нуля — это частый источник ошибок у разработчиков, пришедших из других языков. Ниже разобран синтаксис, практические примеры, особенности Unicode и типичные проблемы.
Синтаксис функции КодСимвола
Функция имеет два параметра: КодСимвола(Строка, Позиция). Первый параметр — исходная строка, второй — номер позиции символа, код которого нужно получить. Позиция необязательна: если её опустить, функция вернёт код первого символа строки.
Пример простейшего вызова:
Код = КодСимвола("А"); // 1040 — код русской заглавной «А»
Код = КодСимвола("ABC", 2); // 66 — код символа «B»
Код = КодСимвола("0"); // 48 — код цифры «0»
Результат всегда имеет тип «Число». Для букв русского алфавита верхнего регистра коды лежат в диапазоне 1040–1071, для латиницы верхнего регистра — 65–90, для цифр — 48–57. Эти диапазоны удобно использовать при проверке ввода.
Обратная функция Символ
Функция Символ(Код) выполняет обратное преобразование: принимает числовой код и возвращает строку из одного символа. Типичное применение — формирование служебных символов, которых нет на клавиатуре, или сборка строки по кодам.
СимволТабуляции = Символ(9); // табуляция
СимволПС = Символ(10); // перевод строки
СимволВК = Символ(13); // возврат каретки
БукваА = Символ(1040); // «А»
Для перевода строки и табуляции в 1С есть также предопределённые значения объекта Символы.ПС, Символы.Таб, Символы.ВК — в новом коде предпочтительнее использовать их, так как запись читается лучше. Но Символ() незаменим, когда код вычисляется динамически.
Перебор строки посимвольно
Классическая задача — пройти по строке и проанализировать каждый символ. Для этого код символа получают в цикле от 1 до СтрДлина(Строка):
Строка = "Артикул-123";
Для Поз = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Поз);
Если Код >= 48 И Код <= 57 Тогда
// символ — цифра
КонецЕсли;
КонецЦикла;
Такой подход используют, когда нужно проверить, что строка состоит только из цифр, отфильтровать недопустимые символы в артикуле или найти позицию первого разделителя. Для простых проверок «состоит ли строка из цифр» часто достаточно СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() из библиотеки стандартных подсистем, если она есть в конфигурации.
- 1Определите строку и нужную позицию символа (нумерация с 1)
- 2Вызовите КодСимвола(Строка, Позиция) и сохраните результат в числовую переменную
- 3Сравните полученный код с нужным диапазоном или конкретным значением
- 4Для обратного преобразования используйте Символ(Код)
- 5Проверьте результат на контрольной строке с известными символами
Работа с Unicode и суррогатными парами
Функция КодСимвола() работает с кодами Unicode в диапазоне до 65535 (плоскость BMP). Символы с кодами выше 65535 — например, многие эмодзи и редкие иероглифы — в UTF-16 кодируются суррогатными парами из двух кодовых единиц. При посимвольном переборе такой символ будет выглядеть как два «символа» с кодами из диапазонов 55296–56319 и 56320–57343.
Если прикладное решение может встретить такие данные (например, имена клиентов с эмодзи из мобильного приложения), простой перебор по позициям может разорвать суррогатную пару и испортить строку. В таких случаях либо фильтруйте эти символы на входе, либо обрабатывайте пару как единое целое.
Практические сценарии применения
Проверка символа на принадлежность классу
Определить, является ли символ цифрой, латинской или русской буквой, можно сравнением кода с диапазонами:
Функция ЭтоРусскаяБуква(Симв)
Код = КодСимвола(Симв);
Возврат (Код >= 1040 И Код <= 1103) Или Код = 1025 Или Код = 1105; // Ё/ё
КонецФункции;
Обратите внимание: буквы «Ё» (1025) и «ё» (1105) стоят вне основного диапазона русского алфавита — их часто забывают, из-за чего проверка «все буквы русские» ложно срабатывает на фамилиях с «ё».
Поиск непечатаемых символов
Данные, загруженные из Excel или внешних систем, нередко содержат неразрывный пробел (код 160), нулевой пробел или управляющие символы. Визуально строка выглядит нормально, но сравнение строк не срабатывает. Диагностика — вывести коды всех символов:
Для Поз = 1 По СтрДлина(Строка) Цикл
Сообщить(Поз + ": " + КодСимвола(Строка, Поз));
КонецЦикла;
Код 160 (неразрывный пробел) — самая частая причина «строки одинаковые, а сравнение говорит, что разные». Лечится заменой СтрЗаменить(Строка, Символ(160), " ") с последующим СокрЛП().
Проверка результата и отладка
Убедиться, что функция работает как ожидается, можно вне изменения конфигурации — через внешнюю обработку с полем «Выполнить код» или консоль кода. Достаточно выполнить Сообщить(КодСимвола("А")) и сверить результат со значением 1040.
При отладке разбора строк полезно выводить не только код, но и сам символ рядом — так видно, где позиция сместилась. Для длинных строк выводите только «подозрительные» коды: меньше 32 (управляющие) и больше 126 вне ожидаемых алфавитов.
Как проверить результат
Возвращает 1040
Другое число или ошибка — проверьте, что передана именно строка
1 ≤ Позиция ≤ СтрДлина(Строка)
Позиция 0 или больше длины строки
Возвращает исходный символ
Символ отличается — возможна суррогатная пара
Альтернативы и смежные приёмы
Не для каждой задачи нужен именно код символа. Если требуется просто сравнить символ с конкретным значением, прямое сравнение строк (Если Симв = "А") читается лучше и работает быстрее. Коды оправданы, когда проверяется диапазон (цифры, алфавит) или ищутся невидимые символы.
Для получения подстроки из одного символа используйте Сред(Строка, Позиция, 1) — а уже к результату при необходимости применяйте КодСимвола() без указания позиции. Для сложных проверок формата строки (маски, шаблоны) в управляемых формах удобнее регулярные выражения через COM-объект VBScript.RegExp на сервере Windows либо штатные механизмы проверки.
Сравнение вариантов
Подходит для проверки диапазонов кодов и поиска непечатаемых символов; требует контроля позиции
Проще и читабельнее, когда нужно сравнить с конкретным символом; не работает для диапазонов
Предпочтительны для служебных символов, но покрывают только фиксированный набор
Частые вопросы
Что вернёт КодСимвола, если передать пустую строку?
Функция вызовет ошибку выполнения, так как символа в позиции 1 не существует. Перед вызовом проверяйте строку через ПустаяСтрока() или СтрДлина().
Как получить коды всех символов строки сразу?
Штатной функции «массив кодов» нет. Используйте цикл от 1 до СтрДлина(Строка) с вызовом КодСимвола(Строка, Позиция) и складывайте результаты в массив или строку для вывода.
Одинаковы ли коды в толстом клиенте, тонком клиенте и на сервере?
Да, функция работает одинаково во всех режимах и на всех платформах, коды соответствуют Unicode. Различий между клиентом и сервером для этой функции нет.
Как отличить русскую «А» от латинской «A»?
Визуально они неотличимы, но коды разные: латинская «A» — 65, русская «А» — 1040. Получите код через КодСимвола и сравните с нужным значением — это стандартный способ найти «подменённые» буквы в артикулах и наименованиях.
Можно ли получить код символа в запросе 1С?
В языке запросов функции КодСимвола нет. Если код нужен в выборке, вычислите его в коде после выполнения запроса при обходе результата либо предварительно заполните таблицу соответствия символов и кодов.
Что важно запомнить
Код символа получают функцией КодСимвола(Строка, Позиция), обратное преобразование — Символ(Код). Позиции нумеруются с 1, буквы Ё/ё стоят вне основного русского диапазона, неразрывный пробел имеет код 160, а символы выше 65535 образуют суррогатные пары, которые нельзя разрывать.