Преобразование чисел в строковый формат — одна из самых частых задач при работе с Системой Компоновки Данных (СКД) в 1С:Предприятие 8. Без этого не обойтись при формировании отчетов с текстовой интерпретацией числовых значений: будь то вывод сумм прописью, форматирование дат как строк или создание пользовательских меток. Однако стандартные механизмы СКД не всегда интуитивно понятны, а ошибки в синтаксисе выражений приводят к падению отчетов или некорректному отображению данных.
В этой статье мы разберем три основных способа преобразования чисел в строки прямо в выражениях СКД: от встроенной функции ФОРМАТ() до кастомных обработчиков с использованием ВЫРАЗИТЬ() и пользовательских функций. Особое внимание уделим типичным ошибкам (например, несоответствие типов данных при работе с параметрами отчета), оптимизации производительности и нюансам локализации. Материал актуален для всех современных версий платформы, включая 1С:Предприятие 8.3.23.
1. Стандартная функция ФОРМАТ(): синтаксис и ограничения
Самый простой способ преобразовать число в строку — использовать встроенную функцию ФОРМАТ(Число, "ФорматнаяСтрока"). Она доступна непосредственно в выражениях СКД и поддерживает широкий спектр форматных строк, аналогичных тем, что используются в языке 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С, которая будет возвращать строку прописью, и вызовите её в выражении СКД через
ВЫЗВАТЬФУНКЦИЮ(). - Использование глобального метода. Если в вашей конфигурации уже есть функция для прописи (например,
ЧислоПрописью()из типовой "Бухгалтерии"), подключите её к СКД.
Пример реализации внешней функции:
&НаКлиенте
Функция ЧислоПрописьюСКД(Число, Род = 0, Валюта = "") Экспорт
// Род: 0 - мужской, 1 - женский, 2 - средний
// Валюта: "рубль", "доллар" и т.д.
Возврат ЧислоПрописью(Число, Род, Валюта);
КонецФункции
В выражении СКД вызовите её так:
ВЫЗВАТЬФУНКЦИЮ(&МодульОтчета, "ЧислоПрописьюСКД", СуммаДокумента, 0, "рубль")
Типичные ошибки при работе с прописью:
- 🚫 Неверный род. Например, "1 рубль" вместо "1 рубля" для сумм от 2 до 4.
- 🚫 Отсутствие обработки дробной части. Функция должна отдельно обрабатывать рубли и копейки.
- 🚫 Зависимость от локали. Для многовалютых отчетов нужна поддержка разных валют.
⚠️ Внимание: В типовой конфигурации "1С:Бухгалтерия 3.0" уже есть функцияЧислоПрописью()в общем модулеОбщегоНазначенияКлиентСервер. Не изобретайте велосипед — используйте её, подключив модуль к отчету через директиву#Использовать.
Как ускорить работу отчета с прописью?
Если отчет содержит тысячи строк с выводом чисел прописью, разместите логику преобразования на сервере (с пометкой &НаСервере). Это сократит нагрузку на клиент и ускорит формирование отчета в 2-3 раза.
4. Работа с параметрами отчета: преобразование на лету
Частая задача — преобразовать параметр отчета (например, введенное пользователем число) в строку для использования в заголовках или фильтрах. Здесь важно учитывать, что параметры в СКД могут иметь разные типы, и их нужно явным образом привести к строковому виду.
Пример: у вас есть параметр ПериодОтчета типа Дата, и вы хотите вывести его в заголовке отчета как строку:
// В выражении заголовка группы
"Отчет за период: " + ФОРМАТ(Параметры.ПериодОтчета, "ДФ=dd MMMM yyyy")
Типичные сценарии:
- 📅 Даты: Используйте
ФОРМАТ()с параметрамиДФ(формат даты) илиДЛФ(локализованный формат). - 🔢 Числа: Для параметров типа
ЧислоподойдетВЫРАЗИТЬ(Параметры.Количество КАК Строка). - 🔍 Булевы значения: Преобразуйте через
?("Да", "Нет", Параметры.Флаг).
Ошибка, которую допускают 90% разработчиков: попытка конкатенации строки с числом без приведения типов. Например, такой код вызовет ошибку:
"Сумма: " + Параметры.Сумма // ОШИБКА! Нужно: "Сумма: " + ВЫРАЗИТЬ(Параметры.Сумма КАК Строка)
Проверьте тип параметра в схеме СКД|Убедитесь, что параметр не равен NULL|Используйте явное приведение типов|Протестируйте отчет с пустыми параметрами-->
5. Оптимизация производительности: что замедляет отчет
Преобразование чисел в строки в больших отчетах может существенно тормозить формирование данных. Основные "узкие места":
- Сложные форматные строки. Например,
ФОРМАТ(Число, "ЧДЦ=10; ЧРД=1; Л=1; ЧНЗ=ДА")обрабатывается дольше, чемФОРМАТ(Число, "ЧДЦ=2"). - Вызов внешних функций. Каждый вызов
ВЫЗВАТЬФУНКЦИЮ()для прописи добавляет накладные расходы. - Неоптимальные выражения. Например, многократное преобразование одного и того же поля в разных колонках.
Как ускорить работу:
- ⚡ Кэшируйте результаты. Если одно и то же число преобразовывается несколько раз, сохраните результат в переменную.
- ⚡ Используйте серверные функции. Перенесите сложную логику (например, пропись) в серверные процедуры.
- ⚡ Упрощайте форматирование. Если не нужны тысячные разделители, используйте
ВЫРАЗИТЬ()вместоФОРМАТ().
Пример оптимизированного выражения для вывода суммы прописью:
// Вместо:
ВЫЗВАТЬФУНКЦИЮ(&МодульОтчета, "ЧислоПрописьюСКД", СуммаДокумента, 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"
)
Если в отчете нужно вывести сумму прописью на разных языках, потребуется:
- Создать отдельные функции для каждого языка (например,
ЧислоПрописьюEN(),ЧислоПрописьюDE()). - В СКД использовать конструкцию
ВЫБОР...КОГДАдля выбора нужной функции.
⚠️ Внимание: Локализация влияет не только на разделители, но и на названия валют. Например, в английской версии "рубль" должен выводиться как "ruble".
7. Типичные ошибки и их решение
Даже опытные разработчики сталкиваются с ошибками при преобразовании чисел в строки. Рассмотрим самые распространенные:
| Ошибка | Причина | Решение |
|---|---|---|
Ошибка приведение типа к строке | Попытка привести NULL к строке | Используйте ЕСЛИ Значение = NULL ТОГДА "" ИНАЧЕ ВЫРАЗИТЬ(Значение КАК Строка) |
Недопустимый формат | Опечатка в форматной строке ФОРМАТ() | Проверьте синтаксис: ЧДЦ, ЧРД, Л должны писаться заглавными буквами |
Функция не найдена | Неверное имя функции в ВЫЗВАТЬФУНКЦИЮ() | Убедитесь, что функция экспортируемая и модуль подключен директивой #Использовать |
Переполнение | Число слишком большое для строкового представления | Округлите число перед преобразованием: ВЫРАЗИТЬ(ОКР(БольшоеЧисло, 2) КАК Строка) |
Специфическая ошибка СКД: если в выражении используется параметр, который не задан в схеме отчета, вместо ошибки вы получите пустую строку. Всегда проверяйте:
- 🔍 Наличие параметра в коллекции
Параметры. - 🔍 Совпадение имен параметров (регистр важен!).
- 🔍 Тип параметра (число нельзя форматировать как дату).
Для отладки сложных выражений используйте промежуточные переменные:
ПЕРЕМ ОтладочнаяСтрока;
ОтладочнаяСтрока = ВЫРАЗИТЬ(Параметры.Сумма КАК Строка);
ЕСЛИ ОтладочнаяСтрока = "" ТОГДА
Сообщить("Ошибка: параметр Сумма пуст или не является числом!");
КОНЕЦЕСЛИ;
Если отчет падает с неясной ошибкой, временно упростите выражение до минимального рабочего варианта, затем постепенно добавляйте детали обратно.
FAQ: Ответы на частые вопросы
Как вывести число с ведущими нулями (например, "000123")?
Используйте функцию ФОРМАТ() с параметром ЧВН=N, где N — общее количество знаков:
ФОРМАТ(123, "ЧВН=6") // Вернет "000123"
Для динамического определения количества знаков используйте конкатенацию:
ФОРМАТ(Код, "ЧВН=" + ВЫРАЗИТЬ(ДлинаКода КАК Строка))
Почему ФОРМАТ() игнорирует мои настройки разделителей?
Скорее всего, вы не указали параметр Л (локализация). По умолчанию используется системная локаль. Явно задайте нужную:
ФОРМАТ(1234.56, "Л=1; ЧРД=1") // Для русской локали с пробелом-разделителем
Также проверьте настройки пользователя в 1С: они могут переопределять форматные строки.
Можно ли в СКД использовать функцию ЧислоПрописью() без внешнего модуля?
Нет, в чистом СКД такой функции нет. Варианты решения:
- Подключите типовой модуль с
ЧислоПрописью()(например, из "Бухгалтерии"). - Напишите свою функцию в модуле отчета и вызовите её через
ВЫЗВАТЬФУНКЦИЮ(). - Используйте внешнюю компоненту (например, NativeAPI), если нужна поддержка множества языков.
Как преобразовать массив чисел в строку (например, для вывода в одной ячейке)?
Используйте функцию СтрСокрЛП() в комбинации с ВЫРАЗИТЬ():
СТРСОКРЛП(
СТРОКА(МАССИВ.КоличествоЭлементов()) + " элемента: " +
СОЕДИНИТЬСТРОКИ(МАССИВ, ", ", "", ВЫРАЗИТЬ(ЭЛЕМЕНТ КАК Строка))
)
Для многомерных массивов потребуется рекурсивная функция обхода.
Почему при экспорте в Excel числа преобразуются в даты (например, 12.05 становится 12 мая)?
Это особенность Excel, который автоматически интерпретирует строки вида "ЧЧ.ММ" как даты. Решения:
- Добавьте пробел после числа:
ФОРМАТ(12.05, "ЧДЦ=2") + " ". - Используйте другой разделитель:
ФОРМАТ(12.05, "ЧДЦ=2; ЧРД=0")→"12,05". - Экспортируйте как текстовый файл (
.csv) с явным указанием формата ячеек.