Удаление первого символа из строки в 1С:Предприятие — задача, с которой сталкиваются и новички, и опытные разработчики. На первый взгляд операция кажется тривиальной, но в зависимости от контекста (версии платформы, типа данных, требований к производительности) подходы могут кардинально отличаться. Например, для строки "А12345" может потребоваться получить "12345" — но как это сделать корректно, если первый символ не всегда известен заранее или строка может быть пустой?

В этой статье мы разберём 5 проверенных методов: от стандартных функций (Сред(), Левая()) до гибких регулярных выражений и пользовательских обработок. Особое внимание уделим нюансам работы с многобайтовыми кодировками (UTF-8), где "первый символ" может занимать несколько байт, а также оптимизации кода для больших массивов данных. Если вы работаете с 1С:Управление торговлей, 1С:Бухгалтерия или 1С:Зарплата и управление персоналом — здесь найдёте решение под вашу задачу.

Прежде чем переходить к коду, ответьте на вопрос: какой из сценариев актуален для вас?

📊 Для чего вам нужно удалить первый символ в 1С?
Очистка данных перед загрузкой из Excel
Форматирование артикулов/кодов номенклатуры
Обработка строк в отчётах
Разбор JSON/XML
Другой вариант

1. Способ: функция Сред() — самый простой и быстрый

Функция Сред(Строка, Начало, [Длина]) — базовый инструмент для извлечения подстроки. Чтобы удалить первый символ, достаточно указать начало со второго символа (Начало = 2) и не ограничивать длину. Этот метод работает во всех версиях 1С 8.x, включая устаревшие релизы, и не требует подключения дополнительных библиотек.

Пример кода:

СтрокаИсходная = "А12345";

СтрокаБезПервогоСимвола = Сред(СтрокаИсходная, 2);

// Результат: "12345"

Преимущества метода:

  • Мгновенное выполнение — функция оптимизирована на уровне платформы.
  • 🔄 Работает с любыми строками, включая пустые (вернёт пустую строку).
  • 📏 Не изменяет исходную строку (возвращает новое значение).

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

Убедитесь, что строка не пустая|Проверьте кодировку данных (ANSI/UTF-8)|Учтите, что для многобайтовых символов может потребоваться другой метод

-->

2. Способ: комбинация Правая() + СтрДлина() — для динамических строк

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

Пример:

СтрокаИсходная = "Пример_123";

ДлинаСтроки = СтрДлина(СтрокаИсходная);

СтрокаБезПервогоСимвола = Правая(СтрокаИсходная, ДлинаСтроки - 1);

// Результат: "ример_123"

Когда этот способ предпочтительнее Сред():

  • 📊 При работе с массивами строк, где длина варьируется.
  • 🔍 Если нужно логировать количество удалённых символов (например, для отладки).
  • 🛠️ В обработках, где строка может содержать Неопределённое значение.
⚠️ Внимание: Если строка состоит из одного символа, Правая(..., 0) вернёт пустую строку. В некоторых конфигурациях (например, 1С:Розница) это может вызвать ошибку при дальнейшей обработке. Всегда проверяйте результат на пустоту!

3. Способ: СтрЗаменить() — для удаления конкретного символа

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

Пример для удаления символа "#":

СтрокаИсходная = "#Товар001";

СтрокаБезПервогоСимвола = СтрЗаменить(СтрокаИсходная, "#", "", 1);

// Результат: "Товар001"

Где это актуально:

  • 🏷️ Очистка артикулов или штрихкодов от префиксов (например, "A" в начале кода номенклатуры).
  • 📄 Форматирование данных перед выгрузкой в Excel или XML.
  • 🔄 Обработка логов, где первый символ — маркер типа записи.

Ограничение метода: если первый символ непостоянный (например, может быть "А" или "Б"), придётся писать несколько вложенных СтрЗаменить() или использовать регулярные выражения.

Что будет, если не указать 4-й параметр в СтрЗаменить()?

Без параметра [КоличествоЗамен] функция заменит все вхождения подстроки во всей строке. Например, для строки "А1А2А3" и замены "А" на "" результат будет "123", а не "1А2А3".

4. Способ: регулярные выражения — для сложных шаблонов

Если первый символ строки соответствует определённому шаблону (например, это любая буква, цифра или специальный символ), регулярные выражения (регулярки) станут самым гибким решением. В для этого используется объект РегулярноеВыражение (доступен с версии платформы 8.3.10).

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

РегВыражение = Новый РегулярноеВыражение("^[а-яА-Яa-zA-Z]");

СтрокаИсходная = "x12345";

СтрокаБезПервогоСимвола = РегВыражение.Заменить(СтрокаИсходная, "");

// Результат: "12345"

Преимущества регулярных выражений:

  • 🎯 Точное соответствие шаблону (например, удалить только латинские буквы или только цифры).
  • 🔄 Обработка многобайтовых символов (UTF-8) без ошибок.
  • 📌 Возможность сохранить шаблон для повторного использования.

Недостатки:

  • ⚠️ Требует версии платформы 8.3.10+.
  • ⏳ Медленнее стандартных функций при обработке больших массивов.
  • 📚 Нужны знания синтаксиса регулярных выражений.
⚠️ Внимание: В конфигурациях с управляемыми формами (например, 1С:ERP) регулярные выражения могут не работать в клиентских процедурах. Выполняйте их на сервере или в модуле объекта.

5. Способ: пользовательская функция — для повторного использования

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

Пример функции:

Функция УдалитьПервыйСимвол(Знач Строка) Экспорт

Если СтрДлина(Строка) = 0 Тогда

Возврат "";

КонецЕсли;

Возврат Сред(Строка, 2);

КонецФункции

Как использовать:

СтрокаРезультат = УдалитьПервыйСимвол("!Важно");

// Результат: "Важно"

Дополнительные возможности функции:

  • 🔧 Легко расширяется (например, можно добавить параметр КоличествоСимволов для удаления нескольких символов).
  • 📂 Централизованное хранение логики (изменения в одном месте отразятся во всех вызовах).
  • 🛡️ Защита от ошибок (проверка на Неопределённое или NULL).

Для типизированных конфигураций (например, 1С:Бухгалтерия 3.0) размещайте функцию в общем модуле с правом вызова Сервер или КлиентИСервер.

💡

Если функция используется часто, добавьте её в глобальный общий модуль и присвойте имя вида Стр_УдалитьПервыйСимвол — это упростит поиск по коду.

Сравнение методов: какой выбрать?

Выбор способа зависит от контекста задачи, версии платформы и требований к производительности. Ниже таблица сравнения ключевых характеристик:

Метод Скорость UTF-8 Гибкость Минимальная версия 1С
Сред() ⚡ Мгновенно ❌ Риск обрезки многобайтовых символов Низкая 8.0
Правая() + СтрДлина() ⚡ Мгновенно ❌ Риск обрезки Средняя 8.0
СтрЗаменить() ⚡ Быстро ✅ Корректно Низкая (только известные символы) 8.0
Регулярные выражения 🐢 Медленнее ✅ Корректно Высокая 8.3.10
Пользовательская функция Зависит от реализации ✅ Можно доработать Высокая 8.0

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

💡

Для строк с многобайтовыми символами (UTF-8) всегда проверяйте результат визуально — стандартные функции 1С могут обрезать символы неправильно, особенно в старых версиях платформы.

Типичные ошибки и как их избежать

Даже в простой операции удаления символа разработчики часто сталкиваются с неочевидными проблемами. Рассмотрим самые распространённые:

1. Пустые строки и NULL:

Если не проверить строку на пустоту, функции Сред() или Правая() могут вернуть неожиданный результат или вызвать ошибку. Всегда добавляйте проверку:

Если НЕ ЗначениеЗаполнено(СтрокаИсходная) Тогда

Возврат "";

КонецЕсли;

2. Многобайтовые символы (UTF-8):

В строках с иероглифами, смайликами или символами из расширенных алфавитов (например, грузинского) стандартные функции могут срезать только часть символа. Пример:

СтрокаИсходная = "😊Привет"; // Смайлик занимает 4 байта

СтрокаОшибка = Сред(СтрокаИсходная, 2); // Вернёт битый символ

// Правильно: использовать регулярные выражения или специализированные функции.

3. Неучтённые пробелы:

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

СтрокаИсходная = " Пример";

СтрокаБезПробелов = СокрЛП(СтрокаИсходная); // Удаляет все пробелы слева

4. Ошибки при работе с БД:

Если строка извлекается из базы данных (например, из реквизита справочника), убедитесь, что она имеет тип Строка. Иногда поля возвращаются как Неопределённое или NULL, что вызовет ошибку.

⚠️ Внимание: В 1С:Управление торговлей 11 и 1С:ERP 2 при работе с ДокументОбъект.Реквизит всегда проверяйте тип значения перед обработкой строки. Используйте ТипЗнч():

Если ТипЗнч(Документ.Комментарий) = Тип("Строка") Тогда

// Обработка строки

КонецЕсли;

FAQ: ответы на частые вопросы

Можно ли удалить первый символ в строке 1С 7.7?

Да, в 1С:Предприятие 7.7 для этого используйте функцию Копир() (аналог Сред() в 8.x):

СтрокаРезультат = Копир(СтрокаИсходная, 2);

Обратите внимание, что в 7.7 нет поддержки UTF-8, поэтому проблемы с многобайтовыми символами маловероятны.

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

Используйте Сред() с параметром Начало = N + 1:

СтрокаБезТрехСимволов = Сред(СтрокаИсходная, 4); // Удаляет первые 3 символа

Для динамического количества:

КоличествоУдаляемых = 3;

СтрокаРезультат = Сред(СтрокаИсходная, КоличествоУдаляемых + 1);

Почему после удаления первого символа строка стала короче на 2 символа?

Это типичная проблема с многобайтовыми символами (например, иероглифами или смайликами). Один визуальный символ может занимать 2–4 байта. Решение:

  1. Используйте регулярные выражения (см. раздел 4).
  2. Или преобразуйте строку в массив байт и удаляйте символы с учётом кодировки.

Пример для UTF-8:

ДвоичныеДанные = Новый ДвоичныеДанные(СтрокаИсходная, КодировкаТекста.UTF8);

Если ДвоичныеДанные.Размер() > 0 Тогда

ДвоичныеДанные.УстановитьРазмер(ДвоичныеДанные.Размер() - 1); // Удаляем первый байт (НЕ символ!)

СтрокаРезультат = ДвоичныеДанные.ПолучитьСтроку(КодировкаТекста.UTF8);

КонецЕсли;

⚠️ Этот метод требует глубокого понимания кодировок!

Как удалить первый символ в запросе 1С?

В языке запросов используйте функцию ПОДСТРОКА():

ВЫБРАТЬ

ПОДСТРОКА(ПолеСтроки, 2) КАК СтрокаБезПервогоСимвола

ИЗ

Документ.ЗаказыКлиентов КАК Заказы

Обратите внимание: в запросах нет функции Сред(), поэтому используется ПОДСТРОКА() с аналогичной логикой.

Можно ли отменить удаление символа (откат)?

Нет, в нет встроенного механизма "отмены" для строковых операций. Решения:

  • Сохраняйте исходную строку в отдельную переменную перед изменением.
  • Используйте транзакции (для данных в базе):
НачатьТранзакцию();

Попытка

Объект.Реквизит = УдалитьПервыйСимвол(Объект.Реквизит);

Записать();

Исключение

ОтменитьТранзакцию();

Сообщить("Ошибка: " + ОписаниеОшибки());

КонецПопытки;