Работа с текстовыми данными в 1С:Предприятие 8.3 часто требует предварительной очистки строк от лишних символов — особенно когда речь идет о ведущих или завершающих нулях. Такие нули могут появляться при импорте данных из внешних систем, ручном вводе с клавиатуры (когда пользователь нажимает 0 перед номером документа) или при автоматической генерации кодов номенклатуры. Неудаленные нули искажают сортировку, усложняют поиск и даже приводят к ошибкам в отчетах, где строковые значения сравниваются как числа.
В этой статье мы разберем 5 практических способов удаления нулей из строк в 1С — от базовых функций встроенного языка до продвинутых техник с регулярными выражениями. Каждый метод проиллюстрирован примерами кода, которые можно сразу использовать в своих конфигурациях. Особое внимание уделим нюансам работы с ведущими нулями (в начале строки) и завершающими (в конце), а также случаям, когда нули находятся внутри строки между значащими символами.
Материал будет полезен как бухгалтерам, которые сталкиваются с "засоренными" артикулами в справочниках, так и программистам 1С, автоматизирующим обработку данных. Все примеры тестировались на платформе 1С:Предприятие 8.3.23, но подходят для более ранних и поздних версий (с учетом поддержки регулярных выражений).
1. Базовый метод: функция СтрЗаменить()
Самый простой способ удалить нули из строки — использовать встроенную функцию СтрЗаменить(). Она заменяет все вхождения одного подстроки на другую, что идеально подходит для удаления всех нулей в строке, независимо от их позиции.
Синтаксис функции:
СтрЗаменить(ИсходнаяСтрока, "0", "")
Пример использования для строки с артикулом "0012300":
Результат = СтрЗаменить("0012300", "0", "");
// Результат: "123"
- ✅ Плюсы: Простота, не требует дополнительных модулей, работает во всех версиях 1С.
- ❌ Минусы: Удаляет все нули, включая те, что могут быть частью значащего кода (например, в артикуле
"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С и не требует дополнительных библиотек.
Удаление ведущих нулей:
Функция УбратьНулиСлева(Строка)
Пока Лев(Строка, 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. Включите режим отладки в конфигураторе (F5).
2. Установите точку останова на обработчике события.
3. Введите тестовое значение с нулями (например, "00123").
4. Проверьте, что функция очистки срабатывает и возвращает корректный результат ("123").
5. Убедитесь, что очищенное значение сохраняется в базе (просмотрите таблицу справочника после записи).
6. Массовая очистка данных в справочниках
Если нули уже попали в базу и требуется массовая очистка, используйте обработку с циклом по элементам справочника. Важно учитывать:
- 📌 Производительность: Для больших справочников (100 000+ записей) используйте пакетную обработку с транзакциями.
- 📌 Связанные объекты: Изменение кодов номенклатуры может нарушить ссылки в документах.
- 📌 Резервное копирование: Обязательно создайте бэкап перед массовыми изменениями!
Пример кода для массовой очистки кодов в справочнике "Номенклатура":
Процедура ОчиститьКодыНоменклатуры()
НачатьТранзакцию();
Попытка
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ ПустаяСтрока(Выборка.Код) Тогда
НовыйКод = УбратьНулиСлева(Выборка.Код);
Если НовыйКод <> Выборка.Код Тогда
Выборка.Код = НовыйКод;
Выборка.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при очистке кодов: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для ускорения обработки можно использовать прямые SQL-запросы (если конфигурация поддерживает):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка,
| Код КАК СтарыйКод
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| НЕ Код ПОДОБНО ''%[^0]%''"; // Только строки с хотя бы одним не-нулем
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
НовыйКод = УбратьНулиСлева(Результат.СтарыйКод);
Если НовыйКод <> Результат.СтарыйКод Тогда
Объект = Результат.Ссылка.ПолучитьОбъект();
Объект.Код = НовыйКод;
Объект.Записать();
КонецЕсли;
КонецЦикла;
⚠️ Внимание: Прямые SQL-запросы на модификацию данных могут нарушить целостность базы, если не учтены ограничения ссылочной целостности. Используйте их только в крайних случаях и после тестирования на копии базы!
Массовая очистка данных всегда должна выполняться в транзакции и с предварительным бэкапом. Даже небольшая ошибка в коде может привести к потере или искажению критически важных данных.
FAQ: Частые вопросы по удалению нулей в 1С
Можно ли удалить нули из строки без программирования?
Да, в некоторых случаях это можно сделать через текстовые документы или внешние обработки:
- Экспортируйте данные в
ExcelилиCSVчерезУниверсальный отчет. - Используйте функцию
НАЙТИ И ЗАМЕНИТЬв Excel для удаления нулей. - Импортируйте данные обратно в 1С через
Универсальный обмен данными.
Однако этот метод подходит только для одноразовых операций и требует осторожности при работе с большими объемами данных.
Почему после удаления нулей нарушилась сортировка в отчетах?
Это происходит потому, что 1С по умолчанию сортирует строки как текст, а не как числа. Например, после очистки строки "001", "010", "100" превратятся в "1", "10", "100", и их порядок изменится с лексикографического ("001" < "010" < "100") на числовой ("1" < "10" < "100").
Решения:
- Добавьте ведущие нули обратно при выводе в отчет (используйте функцию
Формат()с шаблоном"000"). - Настройте сортировку в отчете по числовому полю, а не по строковому коду.
Как удалить нули из строки, но оставить их внутри числа (например, в "100500")?
Используйте регулярное выражение, которое удаляет нули только на границах строки, но сохраняет их внутри:
РегВыр = Новый РегулярноеВыражение("^0+|0+$");
Результат = РегВыр.Заменить("0010050000", "");
// Результат: "100500"
Здесь шаблон "^0+" удаляет нули в начале строки, а "0+$" — в конце.
Можно ли настроить автоматическое удаление нулей при загрузке данных из Excel?
Да, для этого модифицируйте обработку загрузки:
- В модуле обработки найдите процедуру, которая присваивает значения полям (обычно это
ОбработатьСтроку()). - Добавьте вызов функции очистки перед присваиванием:
Процедура ОбработатьСтроку(СтрокаДанных)
// ...
Данные.Артикул = УбратьНулиСлева(СтрокаДанных.Артикул); // Очистка перед сохранением
// ...
КонецПроцедуры
Если вы используете универсальные обработки (например, "Загрузка данных из табличного документа"), создайте свою обработку на их основе с добавленной логикой очистки.
Что делать, если после удаления нулей перестали работать ссылки в документах?
Это типичная проблема при изменении кодов справочников, на которые ссылаются документы. Решения:
- Восстановите старые коды и используйте дополнительные реквизиты для хранения "очищенных" значений.
- Настройте обработку, которая обновляет ссылки в связанных документах:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ДокументСсылка,
| НоменклатураСсылка КАК СтараяСсылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары
|ГДЕ
| Номенклатура.Код ПОДОБНО ''0%''"; // Находим документы со "старыми" кодами
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
Док = Результат.ДокументСсылка.ПолучитьОбъект();
Для Каждого Строка Из Док.Товары Цикл
Если Строка.Номенклатура.Код = Результат.СтараяСсылка.Код Тогда
Строка.Номенклатура = НайтиПоКоду(УбратьНулиСлева(Результат.СтараяСсылка.Код));
КонецЕсли;
КонецЦикла;
Док.Записать();
КонецЦикла;
Для крупных баз такое обновление лучше выполнять в фоновом задании.