Как убрать лидирующие нули в коде номенклатуры в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в системе 1С программисты часто сталкиваются с необходимостью изменить визуальное представление кода номенклатуры или документа. Стандартно коды в 1С имеют фиксированную длину и дополняются лидирующими нулями (например, 000000128). Это необходимо для корректной строковой сортировки. Однако при выводе данных в отчеты, печатные формы или при обмене данными с другими системами часто требуется привести код к «человеческому» виду — 128. В этой статье мы подробно разберем, как эффективно решить эту задачу программными методами.

Использование функций Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП (что справедливо для большинства современных решений, таких как ERP, УТ 11, БП 3.0), наиболее правильным и быстрым способом будет использование готовых функций общего модуля. Разберем самый популярный метод — использование функции для удаления повторяющихся символов.

Рассмотрим применение функции СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы. Многие ошибочно полагают, что она удаляет все вхождения символа в строке, однако при правильном использовании она идеально подходит для очистки лидирующих нулей.


КодНоменклатуры = "00000128";
// По умолчанию функция удаляет символы только слева
Результат = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(КодНоменклатуры, "0");
// Результат будет "128"

Проанализируем, как работает эта функция внутри. Она проверяет крайние символы строки (слева или справа в зависимости от параметра) и удаляет их до тех пор, пока не встретит символ, отличный от указанного. Это гарантирует, что внутренние нули (например, в коде 000200) останутся нетронутыми, и вы получите корректное значение 200, а не 2.

Удаление нулей при обработке результата запроса

Важно понимать архитектурную особенность: выполнить удаление лидирующих нулей непосредственно внутри текста запроса 1С довольно сложно. Стандартные SQL-функции в языке запросов ограничены. Поэтому задачу очистки кода следует решать на этапе обработки выборки или таблицы значений.

Частая ошибка начинающих разработчиков — попытка изменить значение прямо в объекте выборки. Выясним, почему это не работает: выборка предназначена только для чтения данных. Если вам нужно выгрузить результат в таблицу значений (ТЗ) с уже очищенными кодами, необходимо выполнить обход.

Разберем правильный алгоритм действий:

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

// Предположим, ЗапросРезультат уже получен
ТаблицаРезультат = ЗапросРезультат.Выгрузить();

Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
    СтрокаТЗ.Код = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(СтрокаТЗ.Код, "0");
КонецЦикла;

После такого обхода ваша таблица значений будет содержать «чистые» коды, готовые для дальнейшего использования или вывода на экран.

Специализированные методы префиксации

В типовых конфигурациях существует еще более продвинутый модуль — ПрефиксацияОбъектовКлиентСервер. Рассмотрим функции, которые специально предназначены для работы с номерами и кодами. В отличие от общей работы со строками, они учитывают наличие префиксов организации или информационной базы.

Если ваша задача — получить номер для печати, где нужно отсечь не только нули, но и префиксы (например, превратить МСК-0000128 в 128), воспользуйтесь следующим методом:


// Удаляет и префиксы, и лидирующие нули
КодДляПечати = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Выборка.Код);

Также существует прямой метод ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНули(Код), который работает аналогично строковой функции, но считается более семантически верным в контексте работы с метаданными 1С.

Использование математического форматирования

Если вы на 100% уверены, что код номенклатуры состоит только из цифр и не содержит буквенных префиксов, можно прибегнуть к простому преобразованию типов. Рассмотрим, как это сделать с помощью функции Число() и Формат().

При преобразовании строки 0000128 в число, платформа автоматически отбросит все лидирующие нули. Однако, чтобы при обратном преобразовании в строку не появились разделители групп разрядов (например, пробел в числе 1 280), нужно использовать строку формата.

ЧистыйКод = Формат(Число(Выборка.Код), "ЧГ=0");

Параметр ЧГ=0 отключает группировку разрядов. Это самый быстрый способ «очистки», но будьте осторожны: если в коде попадется хотя бы одна буква, система вызовет ошибку времени выполнения.

Обратная задача: как добавить нули к коду

Иногда возникает обратная ситуация: у вас есть короткий код (например, 123), а система требует вернуть его в стандартный формат 00-00000123. Разберем элегантный способ решения этой задачи без использования громоздких условий Если ... Тогда.

Проанализируем метод использования функции Прав(). Мы добавляем к нашему коду строку из максимального количества нулей слева, а затем «отрезаем» нужную длину с правого края.


Префикс = "00-";
ДлинаКода = 8; // Желаемая длина цифровой части
ТекущийКод = "123";

// Добавляем нули и берем только нужную часть
НужныйКод = Префикс + Прав("00000000" + ТекущийКод, ДлинаКода);
// На выходе получим: "00-00000123"

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

Важные замечания и риски

При манипуляциях с кодами номенклатуры помните о следующих правилах:

  1. Уникальность: Если вы программно убираете нули и записываете это значение обратно в базу, вы можете нарушить уникальность кодов. В системе могут существовать коды 001 и 0001 как разные сущности, но после очистки они станут дублями.
  2. Сортировка: В списках 1С строки сортируются посимвольно. После удаления нулей код 10 будет стоять в списке выше, чем код 2, так как символ 1 меньше символа 2. Лидирующие нули как раз и нужны для того, чтобы 002 шло раньше 010.
  3. Производительность: Старайтесь выполнять преобразование кодов только в момент вывода данных пользователю, а не при каждом обращении к базе данных.

Мы рассмотрели основные способы управления нулями в кодах. Выбор конкретного метода зависит от наличия БСП в вашей конфигурации и того, гарантирована ли чисто числовая природа кода в вашем справочнике.

← На главную