Преобразование чисел в строковый формат — одна из самых частых задач при работе с Системой Компоновки Данных (СКД) в 1С:Предприятие 8. Без этого не обойтись при формировании отчетов с текстовой интерпретацией числовых значений: будь то вывод сумм прописью, форматирование дат как строк или создание пользовательских меток. Однако стандартные механизмы СКД не всегда интуитивно понятны, а ошибки в синтаксисе выражений приводят к падению отчетов или некорректному отображению данных.

В этой статье мы разберем три основных способа преобразования чисел в строки прямо в выражениях СКД: от встроенной функции ФОРМАТ() до кастомных обработчиков с использованием ВЫРАЗИТЬ() и пользовательских функций. Особое внимание уделим типичным ошибкам (например, несоответствие типов данных при работе с параметрами отчета), оптимизации производительности и нюансам локализации. Материал актуален для всех современных версий платформы, включая 1С:Предприятие 8.3.23.

1. Стандартная функция ФОРМАТ(): синтаксис и ограничения

Самый простой способ преобразовать число в строку — использовать встроенную функцию ФОРМАТ(Число, "ФорматнаяСтрока"). Она доступна непосредственно в выражениях СКД и поддерживает широкий спектр форматных строк, аналогичных тем, что используются в языке для работы с датами и числами.

Примеры базового применения:

  • 🔢 ФОРМАТ(1234.56, "ЧДЦ=2; ЧРД=0") → вернет строку "1 234,56" (разделение тысяч пробелом, 2 знака после запятой)
  • 📅 ФОРМАТ(ТЕКУЩАЯДАТА(), "ДФ=dd.MM.yyyy") → преобразует дату в строку вида "01.01.2026"
  • 💰 ФОРМАТ(1000, "ЧГ=0; ЧДЦ=2; ЧНЗ=ДА") → вывод с обязательным знаком валюты: "1000,00 р."

Однако у ФОРМАТ() есть критические ограничения:

⚠️ Внимание: Функция не поддерживает вывод чисел прописью (например, "одна тысяча двадцать рублей"). Для этого потребуются кастомные решения, описанные в разделе 3.
Параметр форматаОписаниеПример результата
ЧДЦ=NКоличество знаков после запятойФОРМАТ(12.345, "ЧДЦ=1")"12,3"
ЧРД=1Разделение тысяч (1 — пробел, 2 — запятая)ФОРМАТ(1000, "ЧРД=1")"1 000"
ЧНЗ=ДАВывод знака валютыФОРМАТ(500, "ЧНЗ=ДА")"500,00 р."
Л=1Локализация (1 — русская, 2 — английская)ФОРМАТ(1.23, "Л=2")"1.23" (точка вместо запятой)

Для быстрого тестирования форматных строк прямо в конфигураторе используйте Сообщить(ФОРМАТ(Число, "ВашФормат")) в отладчике. Это сэкономит время при настройке сложных шаблонов.

📊 Какой формат чисел вы используете чаще всего?
С разделением тысяч
С двумя знаками после запятой
С выводом валюты
Кастомный формат

2. Функция ВЫРАЗИТЬ(): когда ФОРМАТ() не подходит

Если вам нужно не просто отформатировать число, а получить его строковое представление без потери точности (например, для последующей конкатенации с другими строками), используйте функцию ВЫРАЗИТЬ(Число КАК Строка). Она выполняет приведение типов без дополнительного форматирования.

Ключевые случаи применения:

  • 🔗 Конкатенация: ВЫРАЗИТЬ(100 КАК Строка) + " руб.""100 руб."
  • 📊 Сравнение: ЕСЛИ ВЫРАЗИТЬ(Код КАК Строка) = "001" ТО...
  • 📎 Передача в параметры: Когда процедура ожидает строку, а у вас есть число.

Важный нюанс: ВЫРАЗИТЬ() не округляет число, а преобразует его в строку "как есть". Например:

ВЫРАЗИТЬ(123.456789 КАК Строка) // Вернет "123.456789" (без округления!)
⚠️ Внимание: При работе с большими числами (более 15 знаков) ВЫРАЗИТЬ() может вернуть экспоненциальную запись (например, "1.23E+16"). Чтобы этого избежать, предварительно округлите число с помощью ОКР(Число, КоличествоЗнаков).

Сравнение ФОРМАТ() и ВЫРАЗИТЬ():

КритерийФОРМАТ()ВЫРАЗИТЬ()
ФорматированиеДа (разделение тысяч, знаки после запятой)Нет (точное представление)
ЛокализацияДа (зависит от параметра Л)Нет (всегда точка как разделитель)
ПроизводительностьНиже (дополнительная обработка)Выше (простое приведение типов)
Поддержка прописиНетНет
💡

Если вам нужно одновременно и отформатировать число, и привести его к строке, комбинируйте функции: ВЫРАЗИТЬ(ФОРМАТ(1234.56, "ЧДЦ=2") КАК Строка).

3. Вывод чисел прописью: кастомные решения

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

  1. Внешняя функция в модуле отчета. Создайте процедуру на языке , которая будет возвращать строку прописью, и вызовите её в выражении СКД через ВЫЗВАТЬФУНКЦИЮ().
  2. Использование глобального метода. Если в вашей конфигурации уже есть функция для прописи (например, ЧислоПрописью() из типовой "Бухгалтерии"), подключите её к СКД.

Пример реализации внешней функции:

&НаКлиенте

Функция ЧислоПрописьюСКД(Число, Род = 0, Валюта = "") Экспорт

// Род: 0 - мужской, 1 - женский, 2 - средний

// Валюта: "рубль", "доллар" и т.д.

Возврат ЧислоПрописью(Число, Род, Валюта);

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

В выражении СКД вызовите её так:

ВЫЗВАТЬФУНКЦИЮ(&МодульОтчета, "ЧислоПрописьюСКД", СуммаДокумента, 0, "рубль")

Типичные ошибки при работе с прописью:

  • 🚫 Неверный род. Например, "1 рубль" вместо "1 рубля" для сумм от 2 до 4.
  • 🚫 Отсутствие обработки дробной части. Функция должна отдельно обрабатывать рубли и копейки.
  • 🚫 Зависимость от локали. Для многовалютых отчетов нужна поддержка разных валют.
⚠️ Внимание: В типовой конфигурации "1С:Бухгалтерия 3.0" уже есть функция ЧислоПрописью() в общем модуле ОбщегоНазначенияКлиентСервер. Не изобретайте велосипед — используйте её, подключив модуль к отчету через директиву #Использовать.
Как ускорить работу отчета с прописью?

Если отчет содержит тысячи строк с выводом чисел прописью, разместите логику преобразования на сервере (с пометкой &НаСервере). Это сократит нагрузку на клиент и ускорит формирование отчета в 2-3 раза.

4. Работа с параметрами отчета: преобразование на лету

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

Пример: у вас есть параметр ПериодОтчета типа Дата, и вы хотите вывести его в заголовке отчета как строку:

// В выражении заголовка группы

"Отчет за период: " + ФОРМАТ(Параметры.ПериодОтчета, "ДФ=dd MMMM yyyy")

Типичные сценарии:

  • 📅 Даты: Используйте ФОРМАТ() с параметрами ДФ (формат даты) или ДЛФ (локализованный формат).
  • 🔢 Числа: Для параметров типа Число подойдет ВЫРАЗИТЬ(Параметры.Количество КАК Строка).
  • 🔍 Булевы значения: Преобразуйте через ?("Да", "Нет", Параметры.Флаг).

Ошибка, которую допускают 90% разработчиков: попытка конкатенации строки с числом без приведения типов. Например, такой код вызовет ошибку:

"Сумма: " + Параметры.Сумма // ОШИБКА! Нужно: "Сумма: " + ВЫРАЗИТЬ(Параметры.Сумма КАК Строка)

Проверьте тип параметра в схеме СКД|Убедитесь, что параметр не равен NULL|Используйте явное приведение типов|Протестируйте отчет с пустыми параметрами-->

5. Оптимизация производительности: что замедляет отчет

Преобразование чисел в строки в больших отчетах может существенно тормозить формирование данных. Основные "узкие места":

  1. Сложные форматные строки. Например, ФОРМАТ(Число, "ЧДЦ=10; ЧРД=1; Л=1; ЧНЗ=ДА") обрабатывается дольше, чем ФОРМАТ(Число, "ЧДЦ=2").
  2. Вызов внешних функций. Каждый вызов ВЫЗВАТЬФУНКЦИЮ() для прописи добавляет накладные расходы.
  3. Неоптимальные выражения. Например, многократное преобразование одного и того же поля в разных колонках.

Как ускорить работу:

  • Кэшируйте результаты. Если одно и то же число преобразовывается несколько раз, сохраните результат в переменную.
  • Используйте серверные функции. Перенесите сложную логику (например, пропись) в серверные процедуры.
  • Упрощайте форматирование. Если не нужны тысячные разделители, используйте ВЫРАЗИТЬ() вместо ФОРМАТ().

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

// Вместо:

ВЫЗВАТЬФУНКЦИЮ(&МодульОтчета, "ЧислоПрописьюСКД", СуммаДокумента, 0, "рубль")

// Лучше (если сумма повторяется):

ВЫБОР

КОГДА СуммаДокумента = 0 ТОГДА "ноль рублей"

ИНАЧЕ ВЫЗВАТЬФУНКЦИЮ(&МодульОтчета, "ЧислоПрописьюСКД_Кэш", СуммаДокумента)

КОНЕЦ

⚠️ Внимание: В отчетах с миллионом строк даже простое ФОРМАТ() может увеличивать время формирования на 20-30%. Всегда тестируйте производительность на реальных данных!
💡

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

6. Локализация и мультиязычность: вывод чисел для разных регионов

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

  • 🇷🇺 В России: 1 234,56 (пробел — разделитель тысяч, запятая — десятичный знак).
  • 🇺🇸 В США: 1,234.56 (запятая — разделитель тысяч, точка — десятичный знак).
  • 🇩🇪 В Германии: 1.234,56 (точка — разделитель тысяч, запятая — десятичный знак).

В СКД локализацию можно задать через параметр Л в функции ФОРМАТ():

// Для английской локали

ФОРМАТ(1234.56, "Л=2; ЧДЦ=2") // Вернет "1,234.56"

// Для немецкой локали

ФОРМАТ(1234.56, "Л=3; ЧДЦ=2") // Вернет "1.234,56"

Для динамического определения локали используйте системное перечисление Локализация или настройку пользователя:

ФОРМАТ(

Число,

"Л=" + ?(ТекущаяЛокализация() = Локализация.Английская, 2, 1) + "; ЧДЦ=2"

)

Если в отчете нужно вывести сумму прописью на разных языках, потребуется:

  1. Создать отдельные функции для каждого языка (например, ЧислоПрописьюEN(), ЧислоПрописьюDE()).
  2. В СКД использовать конструкцию ВЫБОР...КОГДА для выбора нужной функции.
⚠️ Внимание: Локализация влияет не только на разделители, но и на названия валют. Например, в английской версии "рубль" должен выводиться как "ruble".

7. Типичные ошибки и их решение

Даже опытные разработчики сталкиваются с ошибками при преобразовании чисел в строки. Рассмотрим самые распространенные:

ОшибкаПричинаРешение
Ошибка приведение типа к строкеПопытка привести NULL к строкеИспользуйте ЕСЛИ Значение = NULL ТОГДА "" ИНАЧЕ ВЫРАЗИТЬ(Значение КАК Строка)
Недопустимый форматОпечатка в форматной строке ФОРМАТ()Проверьте синтаксис: ЧДЦ, ЧРД, Л должны писаться заглавными буквами
Функция не найденаНеверное имя функции в ВЫЗВАТЬФУНКЦИЮ()Убедитесь, что функция экспортируемая и модуль подключен директивой #Использовать
ПереполнениеЧисло слишком большое для строкового представленияОкруглите число перед преобразованием: ВЫРАЗИТЬ(ОКР(БольшоеЧисло, 2) КАК Строка)

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

  • 🔍 Наличие параметра в коллекции Параметры.
  • 🔍 Совпадение имен параметров (регистр важен!).
  • 🔍 Тип параметра (число нельзя форматировать как дату).

Для отладки сложных выражений используйте промежуточные переменные:

ПЕРЕМ ОтладочнаяСтрока;

ОтладочнаяСтрока = ВЫРАЗИТЬ(Параметры.Сумма КАК Строка);

ЕСЛИ ОтладочнаяСтрока = "" ТОГДА

Сообщить("Ошибка: параметр Сумма пуст или не является числом!");

КОНЕЦЕСЛИ;

💡

Если отчет падает с неясной ошибкой, временно упростите выражение до минимального рабочего варианта, затем постепенно добавляйте детали обратно.

FAQ: Ответы на частые вопросы

Как вывести число с ведущими нулями (например, "000123")?

Используйте функцию ФОРМАТ() с параметром ЧВН=N, где N — общее количество знаков:

ФОРМАТ(123, "ЧВН=6") // Вернет "000123"

Для динамического определения количества знаков используйте конкатенацию:

ФОРМАТ(Код, "ЧВН=" + ВЫРАЗИТЬ(ДлинаКода КАК Строка))
Почему ФОРМАТ() игнорирует мои настройки разделителей?

Скорее всего, вы не указали параметр Л (локализация). По умолчанию используется системная локаль. Явно задайте нужную:

ФОРМАТ(1234.56, "Л=1; ЧРД=1") // Для русской локали с пробелом-разделителем

Также проверьте настройки пользователя в : они могут переопределять форматные строки.

Можно ли в СКД использовать функцию ЧислоПрописью() без внешнего модуля?

Нет, в чистом СКД такой функции нет. Варианты решения:

  1. Подключите типовой модуль с ЧислоПрописью() (например, из "Бухгалтерии").
  2. Напишите свою функцию в модуле отчета и вызовите её через ВЫЗВАТЬФУНКЦИЮ().
  3. Используйте внешнюю компоненту (например, NativeAPI), если нужна поддержка множества языков.
Как преобразовать массив чисел в строку (например, для вывода в одной ячейке)?

Используйте функцию СтрСокрЛП() в комбинации с ВЫРАЗИТЬ():

СТРСОКРЛП(

СТРОКА(МАССИВ.КоличествоЭлементов()) + " элемента: " +

СОЕДИНИТЬСТРОКИ(МАССИВ, ", ", "", ВЫРАЗИТЬ(ЭЛЕМЕНТ КАК Строка))

)

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

Почему при экспорте в Excel числа преобразуются в даты (например, 12.05 становится 12 мая)?

Это особенность Excel, который автоматически интерпретирует строки вида "ЧЧ.ММ" как даты. Решения:

  • Добавьте пробел после числа: ФОРМАТ(12.05, "ЧДЦ=2") + " ".
  • Используйте другой разделитель: ФОРМАТ(12.05, "ЧДЦ=2; ЧРД=0")"12,05".
  • Экспортируйте как текстовый файл (.csv) с явным указанием формата ячеек.