В практике разработчика 1С часто возникает задача вывести данные в удобном для пользователя виде прямо в табличной части или отчете, например, превратить число «30» в строку «30 дней». Однако язык запросов 1С долгое время накладывал жесткие ограничения на приведение типов: прямое сложение числа и строки выдает ошибку о несовместимости типов. Разберем по шагам, как решить эту задачу в зависимости от вашей версии платформы и используемых инструментов.
Долгое время программисты ждали полноценного преобразования типов в запросах. Начиная с версии 8.3.20, платформа наконец-то предоставила такую возможность. Теперь мы можем использовать функцию СТРОКА() непосредственно в тексте запроса. Проанализируем пример использования:
ВЫБРАТЬ
СТРОКА(Документ.ДопустимоеЧислоДнейЗадолженности) + " дней" КАК СрокСтрокой
ИЗ
Документ.ДоговорКонтрагента КАК Документ
Важный нюанс: при использовании СТРОКА() в запросе платформа применяет стандартные региональные настройки. Это значит, что если число большое (например, 1000), в строке может появиться неразрывный пробел в качестве разделителя разрядов («1 000 дней»). Если вам нужно избавиться от пробелов, в последних версиях платформы можно добавить функцию СТРЗАМЕНИТЬ прямо в запрос.
Если ваша задача — вывести данные в отчете, то выполнять объединение в самом запросе не только сложно (в старых версиях), но и не всегда правильно с точки зрения производительности СУБД. В СКД для этого предназначены Вычисляемые поля.
Рассмотрим алгоритм настройки:
СрокДней.
Строка(ДопустимоеЧислоДнейЗадолженности) + " дней"
// Или с форматированием, чтобы убрать пробелы-разделители:
Формат(ДопустимоеЧислоДнейЗадолженности, "ЧГ=0") + " дней"
Этот метод считается наиболее «чистым», так как запрос остается простым и эффективным, а за оформление отвечает специальный механизм компоновки. Вы также можете использовать Макет поля, указав тип заполнения «Шаблон» и вписав текст вида [ЧислоПоле] дней. Для изучения практических приемов форматирования и вычислений подойдут примеры отчетов на СКД с использованием сложных выражений.
Если объединение нужно для экранной формы (динамического списка), проанализируем возможности свойств колонки. Начиная с версии 8.3.12, можно не менять запрос списка. Достаточно зайти в свойства поля в элементе формы и найти настройку Формат.
В конструкторе формата выберите вкладку Шаблон и задайте маску вывода. Например, [Число] дней. Платформа сама подставит значение из запроса в этот шаблон при отрисовке интерфейса. Это экономит ресурсы сервера, так как преобразование происходит на клиенте.
Если вы работаете на старой версии платформы (ниже 8.3.20) и вам критично получить строку именно в запросе (например, для передачи во внешнюю систему), придется использовать сложные конструкции. Один из самых надежных способов — создание соответствия цифр и их строковых представлений.
Рассмотрим пример построения числа до 99 через соединение таблиц:
// Создаем таблицу цифр
ВЫБРАТЬ 0 КАК Цифра, "0" КАК Текст ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 1, "1" ОБЪЕДИНИТЬ ВСЕ
// ... и так далее до 9
ВЫБРАТЬ 9, "9";
// Собираем число из десятков и единиц
ВЫБРАТЬ
Т1.Текст + Т2.Текст + " дней" КАК Результат
ИЗ
ВТ_Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цифры КАК Т1
ПО ВЫРАЗИТЬ(Данные.Число / 10 - 0.5 КАК ЧИСЛО(2, 0)) = Т1.Цифра
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цифры КАК Т2
ПО (Данные.Число - ВЫРАЗИТЬ(Данные.Число / 10 - 0.5 КАК ЧИСЛО(2, 0)) * 10) = Т2.Цифра
Этот метод выглядит громоздко, но он работает на любой версии платформы 8.x, так как использует только базовые операции ВЫРАЗИТЬ и математические действия. Выясним причину выбора такого метода: он гарантирует результат на уровне SQL, не требуя постобработки в коде 1С.
Существует еще один экзотический, но лаконичный способ преобразовать число в строку, используя работу с датами. Мы можем добавить число в качестве секунд к «нулевой» дате и извлечь символы из представления времени.
ВЫБРАТЬ
ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ЧислоПоле * 6)) / 6 + 1, 1) КАК Строка
ИЗ
ВТ_Данные
Здесь используется особенность функции СЕКУНДА и ПОДСТРОКА. Мы «прокручиваем» время и вычисляем позицию нужной цифры в эталонной строке. Однако стоит помнить, что этот метод сложен в отладке и сопровождении, поэтому рекомендуется только в исключительных случаях. Для быстрой проверки и отладки подобных алгоритмов можно использовать консоль запросов с поддержкой тонкого клиента и СКД.
Проанализировав все ситуации, можно вывести простое правило:
СТРОКА() прямо в запросе.Помните, что преобразование типов в запросе — это ресурсоемкая операция для СУБД. Всегда старайтесь переносить форматирование данных на «верхние» уровни системы (интерфейс или компоновка), оставляя запрос максимально легким.