В практике программирования на платформе 1С:Предприятие часто возникает задача выделения части числового значения (например, копеек из цены или последних трех знаков кода) с необходимостью сохранить ведущие нули. Типичный пример: из числа 123090 нужно получить строковое представление "090". Если использовать обычные математические операции, результат будет 90, так как для числового типа данных ведущий ноль не имеет смысла. Однако для целей отображения в отчетах или формирования строковых идентификаторов нам требуется именно строковый формат.
В этой статье мы подробно разберем, как решить эту задачу различными методами: в программном коде, в системе компоновки данных (СКД) и выясним, можно ли реализовать это непосредственно в языке запросов.
Рассмотрим ситуацию, описанную пользователем. При попытке выделить остаток от деления на 1000 с помощью математической формулы в запросе:
(ВЫРАЗИТЬ(ИсходныеДанные.Цена / 1000 - 0.5 КАК ЧИСЛО(10, 0))) * -1000 + ИсходныеДанные.Цена
Мы получаем числовой результат. Если исходное число 123090, то результатом вычисления будет число 90. Система 1С, работая с типом Число, игнорирует нули слева. Чтобы получить "090", нам необходимо перевести результат в тип Строка и применить специальное форматирование.
Самый простой и надежный способ преобразования числа в строку с заданным количеством знаков и ведущими нулями в модулях 1С — использование функции Формат(). Разберем основные параметры форматной строки, которые нам понадобятся:
ЧЦ=3.ЧГ=0 отключает это разделение, что критично при работе с кодами и идентификаторами.Проанализируем пример кода для получения последних трех знаков:
ИсходноеЧисло = 123090;
// Сначала получаем числовой остаток
Остаток = ИсходноеЧисло % 1000;
// Преобразуем в строку с сохранением нулей
СтроковыйОстаток = Формат(Остаток, "ЧЦ=3; ЧВН=; ЧГ=0");
// Результат: "090"
Также можно использовать комбинацию функций Прав() и Формат(), если мы хотим сначала преобразовать все число в строку без разделителей, а затем "отрезать" хвост:
Результат = Прав(Формат(ИсходноеЧисло, "ЧГ=0"), 3);
Этот метод хорош тем, что он универсален, однако первый вариант с математическим выделением остатка % 1000 работает быстрее на больших объемах данных, так как строковые операции более ресурсоемки.
Если задача стоит в рамках разработки отчета, то наиболее правильным подходом будет разделение логики: расчет данных оставляем в запросе, а визуальное представление настраиваем в оформлении компоновки. Рассмотрим, как это сделать по шагам:
ЧГ=0).ЧЦ=3).ЧВН=).В итоге в поле "Формат" появится строка: ЧЦ=3; ЧВН=; ЧГ=0. Теперь в отчете число 90 будет автоматически отображаться как "090", при этом в самой базе данных оно останется числом, что позволит корректно суммировать его или использовать в других расчетах.
Многие разработчики интересуются: можно ли выполнить такое форматирование прямо в тексте запроса? Проанализируем ситуацию. В стандартном языке запросов 1С нет функции Формат() или Прав(). Это связано с тем, что запросы транслируются в SQL, где функции форматирования сильно зависят от конкретной СУБД (MS SQL, PostgreSQL и др.).
Если вам критически важно получить строку с нулями именно в запросе, придется использовать "математическую эмуляцию" с помощью конструкции ВЫБОР. Рассмотрим пример для получения трех знаков:
ВЫБРАТЬ
ВЫБОР
КОГДА (Цена % 1000) < 10 ТОГДА "00" + ПРЕДСТАВЛЕНИЕ(Цена % 1000)
КОГДА (Цена % 1000) < 100 ТОГДА "0" + ПРЕДСТАВЛЕНИЕ(Цена % 1000)
ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Цена % 1000)
КОНЕЦ КАК КодСтрокой
ИЗ
Справочник.Номенклатура
Важное примечание: Использование функции ПРЕДСТАВЛЕНИЕ() в запросе преобразует число в строку, но её поведение может зависеть от региональных настроек сервера. Это тот самый "мазохизм", о котором упоминали участники форума. Поэтому наиболее профессиональным подходом считается подготовка данных в коде после выполнения запроса или использование механизмов СКД.
Выясним еще один нюанс: что произойдет, если число отрицательное? Например, -123090. Математический остаток или форматная строка могут добавить знак "минус" в итоговую строку, что нарушит длину "090". Чтобы избежать этой ошибки, всегда используйте модуль числа перед форматированием:
ЧислоДляФормата = ?(Остаток < 0, -Остаток, Остаток);
Результат = Формат(ЧислоДляФормата, "ЧЦ=3; ЧВН=; ЧГ=0");
Или в запросе через ВЫБОР, проверяя значение на меньше нуля.
Проанализировав все способы, можно сделать следующие выводы:
Формат(Число, "ЧЦ=3; ЧВН=; ЧГ=0").Эти методы гарантируют, что ваши данные будут выглядеть корректно независимо от региональных настроек системы и специфики используемой базы данных.