Удаление первого символа из строки в 1С:Предприятие — задача, с которой сталкиваются и новички, и опытные разработчики. На первый взгляд операция кажется тривиальной, но в зависимости от контекста (версии платформы, типа данных, требований к производительности) подходы могут кардинально отличаться. Например, для строки "А12345" может потребоваться получить "12345" — но как это сделать корректно, если первый символ не всегда известен заранее или строка может быть пустой?
В этой статье мы разберём 5 проверенных методов: от стандартных функций 1С (Сред(), Левая()) до гибких регулярных выражений и пользовательских обработок. Особое внимание уделим нюансам работы с многобайтовыми кодировками (UTF-8), где "первый символ" может занимать несколько байт, а также оптимизации кода для больших массивов данных. Если вы работаете с 1С:Управление торговлей, 1С:Бухгалтерия или 1С:Зарплата и управление персоналом — здесь найдёте решение под вашу задачу.
Прежде чем переходить к коду, ответьте на вопрос: какой из сценариев актуален для вас?
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. Способ: регулярные выражения — для сложных шаблонов
Если первый символ строки соответствует определённому шаблону (например, это любая буква, цифра или специальный символ), регулярные выражения (регулярки) станут самым гибким решением. В 1С для этого используется объект РегулярноеВыражение (доступен с версии платформы 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 байта. Решение:
- Используйте регулярные выражения (см. раздел 4).
- Или преобразуйте строку в массив байт и удаляйте символы с учётом кодировки.
Пример для UTF-8:
ДвоичныеДанные = Новый ДвоичныеДанные(СтрокаИсходная, КодировкаТекста.UTF8);Если ДвоичныеДанные.Размер() > 0 Тогда
ДвоичныеДанные.УстановитьРазмер(ДвоичныеДанные.Размер() - 1); // Удаляем первый байт (НЕ символ!)
СтрокаРезультат = ДвоичныеДанные.ПолучитьСтроку(КодировкаТекста.UTF8);
КонецЕсли;
⚠️ Этот метод требует глубокого понимания кодировок!
Как удалить первый символ в запросе 1С?
В языке запросов 1С используйте функцию
ПОДСТРОКА():ВЫБРАТЬПОДСТРОКА(ПолеСтроки, 2) КАК СтрокаБезПервогоСимвола
ИЗ
Документ.ЗаказыКлиентов КАК Заказы
Обратите внимание: в запросах нет функции
Сред(), поэтому используетсяПОДСТРОКА()с аналогичной логикой.Можно ли отменить удаление символа (откат)?
Нет, в 1С нет встроенного механизма "отмены" для строковых операций. Решения:
- Сохраняйте исходную строку в отдельную переменную перед изменением.
- Используйте транзакции (для данных в базе):
НачатьТранзакцию();Попытка
Объект.Реквизит = УдалитьПервыйСимвол(Объект.Реквизит);
Записать();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;