Работа с текстовыми данными в 1С:Предприятие 8.3 часто требует предварительной очистки строк от лишних символов — особенно когда речь идет о ведущих или завершающих нулях. Такие нули могут появляться при импорте данных из внешних систем, ручном вводе с клавиатуры (когда пользователь нажимает 0 перед номером документа) или при автоматической генерации кодов номенклатуры. Неудаленные нули искажают сортировку, усложняют поиск и даже приводят к ошибкам в отчетах, где строковые значения сравниваются как числа.

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

Материал будет полезен как бухгалтерам, которые сталкиваются с "засоренными" артикулами в справочниках, так и программистам , автоматизирующим обработку данных. Все примеры тестировались на платформе 1С:Предприятие 8.3.23, но подходят для более ранних и поздних версий (с учетом поддержки регулярных выражений).

📊 Как часто вам приходится очищать строки от лишних символов в 1С?
Ежедневно
Раз в неделю
Редко, но метко
Никогда не сталкивался

1. Базовый метод: функция СтрЗаменить()

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

Синтаксис функции:

СтрЗаменить(ИсходнаяСтрока, "0", "")

Пример использования для строки с артикулом "0012300":

Результат = СтрЗаменить("0012300", "0", "");

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

  • Плюсы: Простота, не требует дополнительных модулей, работает во всех версиях .
  • Минусы: Удаляет все нули, включая те, что могут быть частью значащего кода (например, в артикуле "A0B012" останется "AB12").
⚠️ Внимание: Если в строке есть нули, которые должны остаться (например, в серийных номерах оборудования), этот метод приведет к потере данных. Перед применением проверьте логику обработки!

Для удаления только ведущих нулей (в начале строки) можно использовать комбинацию СтрЗаменить() с циклом:

Функция УдалитьВедущиеНули(Строка)

Пока Лев(Строка, 1) = "0" И СтрДлина(Строка) > 1 Цикл

Строка = СтрЗаменить(Строка, "0", "", 1, 1);

КонецЦикла;

Возврат Строка;

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

2. Работа с регулярными выражениями

Для гибкой обработки строк, особенно когда нули нужно удалить только в начале, конце или по шаблону, удобно использовать регулярные выражения. В 1С 8.3 они доступны через объект РегулярноеВыражение (требует подключения библиотеки RegularExpressions в managed-режиме).

Пример удаления ведущих нулей:

РегВыр = Новый РегулярноеВыражение("^0+");

Результат = РегВыр.Заменить("00012345", "");

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

Для удаления завершающих нулей:

РегВыр = Новый РегулярноеВыражение("0+$");

Результат = РегВыр.Заменить("12345000", "");

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

Задача Регулярное выражение Пример Результат
Удалить все нули 0 "A0B0C0" "ABC"
Удалить ведущие нули ^0+ "000ABC" "ABC"
Удалить завершающие нули 0+$ "ABC000" "ABC"
Удалить нули между буквами (?<=[A-Za-z])0+(?=[A-Za-z]) "A00B00C" "ABC"

Регулярные выражения в 1С поддерживаются только в managed-режиме (тонкий клиент, веб-клиент, толстый клиент с managed-приложениями). В обычном приложении (толстый клиент без managed) этот метод работать не будет!

💡

Если регулярные выражения недоступны, используйте комбинацию функций Найти() и Лев()/Прав() для удаления нулей с краев строки.

3. Использование функций Лев(), Прав() и СтрДлина()

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

Удаление ведущих нулей:

Функция УбратьНулиСлева(Строка)

Пока Лев(Строка, 1) = "0" И СтрДлина(Строка) > 1 Цикл

Строка = Прав(Строка, СтрДлина(Строка) - 1);

КонецЦикла;

Возврат Строка;

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

Удаление завершающих нулей:

Функция УбратьНулиСправа(Строка)

Пока Прав(Строка, 1) = "0" И СтрДлина(Строка) > 1 Цикл

Строка = Лев(Строка, СтрДлина(Строка) - 1);

КонецЦикла;

Возврат Строка;

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

  • 🔹 Преимущества: Работает в любой конфигурации, включая устаревшие версии 1С 7.7 (с адаптацией синтаксиса).
  • 🔹 Ограничения: Не подходит для удаления нулей внутри строки (например, в "A0B0C").
  • 🔹 Совет: Для обработки больших объемов данных (например, в цикле по справочнику) закэшируйте длину строки в переменную, чтобы избежать повторных вычислений.

Определите, какие нули нужно удалить (ведущие/завершающие/все)

Создайте резервную копию данных (особенно для справочников)

Протестируйте функцию на копии базы

Учтите влияние на связанные документы (если меняете коды номенклатуры)-->

4. Обработка строк с сохранением формата

Часто нули в строках являются частью форматированных данных — например, в артикулах с фиксированной длиной ("000-123-45") или в кодах с разделителями ("AB-0012-XY"). В таких случаях простое удаление нулей нарушит структуру. Решение — сохранять разделители и удалять нули только в числовых сегментах.

Пример обработки артикула с дефисами:

Функция ОчиститьАртикул(Строка)

Части = СтрРазделить(Строка, "-");

Для Каждого Часть Из Части Цикл

Если ЗначениеЗаполнено(Часть) Тогда

Часть = УбратьНулиСлева(Часть); // Используем функцию из предыдущего раздела

КонецЕсли;

КонецЦикла;

Возврат СтрСоединить(Части, "-");

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

// Пример:

Результат = ОчиститьАртикул("000-0123-004500");

// Результат: "0-123-4500"

Для более сложных шаблонов (например, с буквами и цифрами) можно использовать регулярные выражения с группами захвата:

РегВыр = Новый РегулярноеВыражение("([A-Za-z]+)0+([0-9]+)");

Результат = РегВыр.Заменить("ABC000123XYZ", "$1$2");

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

⚠️ Внимание: При работе с форматированными строками всегда согласуйте изменения с бизнес-пользователями! Например, в штрихкодах EAN-13 ведущие нули являются частью стандарта и их удаление сделает код невалидным.

5. Автоматическая очистка при вводе данных

Чтобы предотвратить попадание лишних нулей в базу, настройте автоматическую очистку на этапе ввода данных. Это можно сделать через:

  1. Обработчики событий в формах (например, ПриИзменении для поля ввода).
  2. Проверку заполнения в модуле объекта (для справочников и документов).
  3. Подписки на события для массовой обработки.

Пример кода для обработчика ПриИзменении поля ввода:

Процедура АртикулПриИзменении(Элемент)

Элемент.Значение = УбратьНулиСлева(Элемент.Значение);

// Дополнительно: проверка на уникальность после очистки

Если НЕ ЗначениеЗаполнено(Элемент.Значение) Тогда

Сообщить("Артикул не может быть пустым!");

КонецЕсли;

КонецПроцедуры

Для справочников добавьте проверку в модуле объекта:

Процедура ПередЗаписью(Отказ)

Если НЕ ПустаяСтрока(Код) Тогда

Код = УбратьНулиСлева(Код);

КонецЕсли;

КонецПроцедуры

Как отладить автоматическую очистку?

1. Включите режим отладки в конфигураторе (F5).

2. Установите точку останова на обработчике события.

3. Введите тестовое значение с нулями (например, "00123").

4. Проверьте, что функция очистки срабатывает и возвращает корректный результат ("123").

5. Убедитесь, что очищенное значение сохраняется в базе (просмотрите таблицу справочника после записи).

6. Массовая очистка данных в справочниках

Если нули уже попали в базу и требуется массовая очистка, используйте обработку с циклом по элементам справочника. Важно учитывать:

  • 📌 Производительность: Для больших справочников (100 000+ записей) используйте пакетную обработку с транзакциями.
  • 📌 Связанные объекты: Изменение кодов номенклатуры может нарушить ссылки в документах.
  • 📌 Резервное копирование: Обязательно создайте бэкап перед массовыми изменениями!

Пример кода для массовой очистки кодов в справочнике "Номенклатура":

Процедура ОчиститьКодыНоменклатуры()

НачатьТранзакцию();

Попытка

Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл

Если НЕ ПустаяСтрока(Выборка.Код) Тогда

НовыйКод = УбратьНулиСлева(Выборка.Код);

Если НовыйКод <> Выборка.Код Тогда

Выборка.Код = НовыйКод;

Выборка.Записать();

КонецЕсли;

КонецЕсли;

КонецЦикла;

ЗафиксироватьТранзакцию();

Исключение

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

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

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

КонецПроцедуры

Для ускорения обработки можно использовать прямые SQL-запросы (если конфигурация поддерживает):

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка,

| Код КАК СтарыйКод

|ИЗ

| Справочник.Номенклатура

|ГДЕ

| НЕ Код ПОДОБНО ''%[^0]%''"; // Только строки с хотя бы одним не-нулем

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

НовыйКод = УбратьНулиСлева(Результат.СтарыйКод);

Если НовыйКод <> Результат.СтарыйКод Тогда

Объект = Результат.Ссылка.ПолучитьОбъект();

Объект.Код = НовыйКод;

Объект.Записать();

КонецЕсли;

КонецЦикла;

⚠️ Внимание: Прямые SQL-запросы на модификацию данных могут нарушить целостность базы, если не учтены ограничения ссылочной целостности. Используйте их только в крайних случаях и после тестирования на копии базы!
💡

Массовая очистка данных всегда должна выполняться в транзакции и с предварительным бэкапом. Даже небольшая ошибка в коде может привести к потере или искажению критически важных данных.

FAQ: Частые вопросы по удалению нулей в 1С

Можно ли удалить нули из строки без программирования?

Да, в некоторых случаях это можно сделать через текстовые документы или внешние обработки:

  1. Экспортируйте данные в Excel или CSV через Универсальный отчет.
  2. Используйте функцию НАЙТИ И ЗАМЕНИТЬ в Excel для удаления нулей.
  3. Импортируйте данные обратно в через Универсальный обмен данными.

Однако этот метод подходит только для одноразовых операций и требует осторожности при работе с большими объемами данных.

Почему после удаления нулей нарушилась сортировка в отчетах?

Это происходит потому, что по умолчанию сортирует строки как текст, а не как числа. Например, после очистки строки "001", "010", "100" превратятся в "1", "10", "100", и их порядок изменится с лексикографического ("001" < "010" < "100") на числовой ("1" < "10" < "100").

Решения:

  • Добавьте ведущие нули обратно при выводе в отчет (используйте функцию Формат() с шаблоном "000").
  • Настройте сортировку в отчете по числовому полю, а не по строковому коду.
Как удалить нули из строки, но оставить их внутри числа (например, в "100500")?

Используйте регулярное выражение, которое удаляет нули только на границах строки, но сохраняет их внутри:

РегВыр = Новый РегулярноеВыражение("^0+|0+$");

Результат = РегВыр.Заменить("0010050000", "");

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

Здесь шаблон "^0+" удаляет нули в начале строки, а "0+$" — в конце.

Можно ли настроить автоматическое удаление нулей при загрузке данных из Excel?

Да, для этого модифицируйте обработку загрузки:

  1. В модуле обработки найдите процедуру, которая присваивает значения полям (обычно это ОбработатьСтроку()).
  2. Добавьте вызов функции очистки перед присваиванием:
Процедура ОбработатьСтроку(СтрокаДанных)

// ...

Данные.Артикул = УбратьНулиСлева(СтрокаДанных.Артикул); // Очистка перед сохранением

// ...

КонецПроцедуры

Если вы используете универсальные обработки (например, "Загрузка данных из табличного документа"), создайте свою обработку на их основе с добавленной логикой очистки.

Что делать, если после удаления нулей перестали работать ссылки в документах?

Это типичная проблема при изменении кодов справочников, на которые ссылаются документы. Решения:

  1. Восстановите старые коды и используйте дополнительные реквизиты для хранения "очищенных" значений.
  2. Настройте обработку, которая обновляет ссылки в связанных документах:
Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| ДокументСсылка,

| НоменклатураСсылка КАК СтараяСсылка

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары

|ГДЕ

| Номенклатура.Код ПОДОБНО ''0%''"; // Находим документы со "старыми" кодами

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

Док = Результат.ДокументСсылка.ПолучитьОбъект();

Для Каждого Строка Из Док.Товары Цикл

Если Строка.Номенклатура.Код = Результат.СтараяСсылка.Код Тогда

Строка.Номенклатура = НайтиПоКоду(УбратьНулиСлева(Результат.СтараяСсылка.Код));

КонецЕсли;

КонецЦикла;

Док.Записать();

КонецЦикла;

Для крупных баз такое обновление лучше выполнять в фоновом задании.