Как выделить последние цифры числа с сохранением ведущих нулей в 1С

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

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

В этой статье мы подробно разберем, как решить эту задачу различными методами: в программном коде, в системе компоновки данных (СКД) и выясним, можно ли реализовать это непосредственно в языке запросов.

Разбор проблемы: почему математика не всегда помогает

Рассмотрим ситуацию, описанную пользователем. При попытке выделить остаток от деления на 1000 с помощью математической формулы в запросе:


(ВЫРАЗИТЬ(ИсходныеДанные.Цена / 1000 - 0.5 КАК ЧИСЛО(10, 0))) * -1000 + ИсходныеДанные.Цена

Мы получаем числовой результат. Если исходное число 123090, то результатом вычисления будет число 90. Система 1С, работая с типом Число, игнорирует нули слева. Чтобы получить "090", нам необходимо перевести результат в тип Строка и применить специальное форматирование.

Решение через функцию Формат в программном коде

Самый простой и надежный способ преобразования числа в строку с заданным количеством знаков и ведущими нулями в модулях 1С — использование функции Формат(). Разберем основные параметры форматной строки, которые нам понадобятся:

  1. ЧЦ (Число Целых) — общее количество отображаемых разрядов целой части числа. В нашем случае ЧЦ=3.
  2. ЧВН (Число Ведущих Нулей) — этот параметр указывает системе, что пустые разряды слева нужно заполнить нулями, а не пробелами.
  3. ЧГ (Группировка) — по умолчанию 1С разделяет тысячи пробелом (например, "1 000"). Параметр ЧГ=0 отключает это разделение, что критично при работе с кодами и идентификаторами.

Проанализируем пример кода для получения последних трех знаков:


ИсходноеЧисло = 123090;
// Сначала получаем числовой остаток
Остаток = ИсходноеЧисло % 1000; 

// Преобразуем в строку с сохранением нулей
СтроковыйОстаток = Формат(Остаток, "ЧЦ=3; ЧВН=; ЧГ=0");
// Результат: "090"

Также можно использовать комбинацию функций Прав() и Формат(), если мы хотим сначала преобразовать все число в строку без разделителей, а затем "отрезать" хвост:

Результат = Прав(Формат(ИсходноеЧисло, "ЧГ=0"), 3);

Этот метод хорош тем, что он универсален, однако первый вариант с математическим выделением остатка % 1000 работает быстрее на больших объемах данных, так как строковые операции более ресурсоемки.

Решение в Системе компоновки данных (СКД)

Если задача стоит в рамках разработки отчета, то наиболее правильным подходом будет разделение логики: расчет данных оставляем в запросе, а визуальное представление настраиваем в оформлении компоновки. Рассмотрим, как это сделать по шагам:

  1. В схеме компоновки данных выделите поле, которое содержит ваш числовой остаток (например, 90).
  2. Перейдите на закладку "Наборы данных" или "Вычисляемые поля".
  3. В колонке "Оформление" нажмите на кнопку выбора.
  4. Найдите параметр "Формат".
  5. В открывшемся конструкторе форматной строки установите:
    • Минимальное количество группировок: 0 (параметр ЧГ=0).
    • Длина: 3 (параметр ЧЦ=3).
    • Выводить ведущие нули: Да (параметр ЧВН=).

В итоге в поле "Формат" появится строка: ЧЦ=3; ЧВН=; ЧГ=0. Теперь в отчете число 90 будет автоматически отображаться как "090", при этом в самой базе данных оно останется числом, что позволит корректно суммировать его или использовать в других расчетах.

Особенности работы в языке запросов

Многие разработчики интересуются: можно ли выполнить такое форматирование прямо в тексте запроса? Проанализируем ситуацию. В стандартном языке запросов 1С нет функции Формат() или Прав(). Это связано с тем, что запросы транслируются в SQL, где функции форматирования сильно зависят от конкретной СУБД (MS SQL, PostgreSQL и др.).

Если вам критически важно получить строку с нулями именно в запросе, придется использовать "математическую эмуляцию" с помощью конструкции ВЫБОР. Рассмотрим пример для получения трех знаков:


ВЫБРАТЬ
    ВЫБОР
        КОГДА (Цена % 1000) < 10 ТОГДА "00" + ПРЕДСТАВЛЕНИЕ(Цена % 1000)
        КОГДА (Цена % 1000) < 100 ТОГДА "0" + ПРЕДСТАВЛЕНИЕ(Цена % 1000)
        ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Цена % 1000)
    КОНЕЦ КАК КодСтрокой
ИЗ
    Справочник.Номенклатура

Важное примечание: Использование функции ПРЕДСТАВЛЕНИЕ() в запросе преобразует число в строку, но её поведение может зависеть от региональных настроек сервера. Это тот самый "мазохизм", о котором упоминали участники форума. Поэтому наиболее профессиональным подходом считается подготовка данных в коде после выполнения запроса или использование механизмов СКД.

Работа с отрицательными числами

Выясним еще один нюанс: что произойдет, если число отрицательное? Например, -123090. Математический остаток или форматная строка могут добавить знак "минус" в итоговую строку, что нарушит длину "090". Чтобы избежать этой ошибки, всегда используйте модуль числа перед форматированием:


ЧислоДляФормата = ?(Остаток < 0, -Остаток, Остаток);
Результат = Формат(ЧислоДляФормата, "ЧЦ=3; ЧВН=; ЧГ=0");

Или в запросе через ВЫБОР, проверяя значение на меньше нуля.

Резюме

Проанализировав все способы, можно сделать следующие выводы:

  1. Для форм и модулей используйте Формат(Число, "ЧЦ=3; ЧВН=; ЧГ=0").
  2. Для отчетов настраивайте поле "Формат" в оформлении компоновки данных (СКД).
  3. В запросах старайтесь возвращать числа, а форматирование оставляйте на уровень интерфейса или постобработки данных.

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

← На главную