- Преобразовать число в строку в запросе 1С
- Функция Строка(): преобразование числа в строку в запросе
- Метод .ВСтроку(): альтернативный способ превратить число в строку
- Разделитель групп: неразрывный пробел при конвертации числа в строку
- Преобразование числа в строку: важные моменты
- Дополнительный пример: объединяем разные поля в одну строку
- Работа на старых версиях и обратная совместимость
- Практические советы
Функция Строка(): преобразование числа в строку в запросе
В языке запросов 1С, начиная с версии платформы 8.3.20, появилась функция Строка(). Её основное назначение – конвертировать значения примитивного типа (число, дата, булево и т.д.) в строку. Проще говоря, мы можем взять число и превратить его в текст прямо в запросе (это полезно при объединении разных полей в одну строку). Например, если вызвать Строка()(Цена), где Цена – это числовое поле, то результатом будет строковое представление этого числа. По умолчанию при этом в полученной строке сохраняются групповые разделители и десятичный разделитель по настройкам локали. Это значит, что число 12345.67 превратится в что-то вроде 12 345,67 (символ между 12 и 345 – неразрывный пробел). Ниже приведён простой пример запроса:
ВЫБРАТЬ Строка(Товары.Цена) КАК ЦенаСтрокой, Товары.Наименование ИЗ Справочник.Товары КАК Товары;
В этом запросе функция Строка() конвертирует числовое значение поля Цена в строку. Остальные поля в запросе остаются без изменений.
Метод .ВСтроку(): альтернативный способ превратить число в строку
Ещё один способ конвертации числового значения в строку в запросе – использовать метод .ВСтроку(), доступный у числовых полей или переменных. Например, если есть таблица Сотрудники с полем Оклад, то вызов Оклад.ВСтроку() вернёт строковое представление зарплаты. Метод .ВСтроку() по сути работает так же, как Строка(), он вернёт строку с учётом тех же форматов. Использовать его удобно, когда вы строите сложные выражения, например при конкатенации:
ВЫБРАТЬ "Оклад: " + Сотрудники.Оклад.ВСтроку() КАК ОкладСтрокой, Сотрудники.Фамилия ИЗ Справочник.Сотрудники КАК Сотрудники;
В этом примере строковый литерал "Оклад: " соединяется с результатом метода Оклад.ВСтроку(). Обратите внимание: метод .ВСтроку() работает только с простыми типами (число, дата, булево и т.д.). То есть применять .ВСтроку() к ссылочному полю или таблице нельзя. В случае ссылок можно воспользоваться свойством .Наименование или командой ВЫРАЗИТЬ для получения текста. Метод .ВСтроку() прост и нагляден – он помогает сразу «оживить» числовые данные в запросе.
Разделитель групп: неразрывный пробел при конвертации числа в строку
Важно помнить, что в результате конвертации число в строку в запросе может содержаться неразрывный пробел (код U+00A0) в качестве разделителя групп. Это стандартное поведение, связанное с региональными настройками формата числа в 1С. Для программиста это может быть неожиданностью: выглядя как обычный пробел, он не удаляется привычной функцией СтрЗаменить без дополнительных ухищрений. Если требуется убрать групповые разделители из результата, можно применить дополнительную обработку. Например, в языке запросов доступна функция СтрЗаменить, которая позволяет заменить Символ(160) (неразрывный пробел) на обычную строку:
ВЫБРАТЬ СтрЗаменить(Строка(Товары.Сумма), Символ(160), "") КАК СуммаБезРазделителей ИЗ Справочник.Товары КАК Товары;
Здесь после конвертации СтрЗаменить удаляет все неразрывные пробелы из строкового представления числа. Таким образом вы можете управлять тем, как выглядит конечный текст. Впрочем, не всегда нужно избавляться от разделителей: они помогают читать большие числа. Но если требуется экспорт без форматирования, это будет полезно.
(Кстати, по опыту: когда новичок видит такой загадочный неразрывный пробел в строковом результате, это всегда немного смущает. Он задаётся вопросом: «Почему число вдруг разделилось на части?» Обычно после объяснения всё становится понятным, и эта маленькая загадка вызывает улыбку. Ничего страшного, так бывает: это просто особенность формата, не надо переживать.)
Преобразование числа в строку: важные моменты
Стоит отметить, что оба рассмотренных способа (Строка() и .ВСтроку()) зависят от настроек локали. Если язык пользователя, например, русский, то дробная часть разделяется запятой, а тысячи – неразрывным пробелом. Если сменить язык или формат, разделители будут другими. Простое число 1000000 при конвертации может превратиться в строку 1 000 000. Такое поведение полезно, потому что оно уже учитывает общепринятый формат представления чисел. Однако иногда в отчётах или интеграциях нужен иной формат. В этом случае можно поступить иначе: сначала вызвать метод Представление() с заданным форматом, а потом Строка() или .ВСтроку(). Но это тема для отдельного обсуждения. Здесь же важно, что базовые инструменты уже дают красивый результат «из коробки». И да, действительно: число в строку конвертируется без лишних усилий. Например, в запросе можно сделать следующее:
ВЫБРАТЬ "Сумма: " + Строка(Документ.Сумма) КАК Сводка ИЗ Документ.Покупка КАК Документ;
В этом случае к тексту "Сумма: " прибавится строка с числовой суммой из документа. Всё автоматически преобразуется – простое, но эффективное решение.
При этом учтите: если вы пытаетесь применить конвертацию к ссылочному полю (например, КодНоменклатуры, являющемуся типом Ссылка), простой вызов Строка()(Поле) не сработает. Такое редко требуется в типовых запросах, потому что у ссылок есть свое представление (Наименование). Чаще достаточно писать Товар.Наименование или использовать команду ВЫРАЗИТЬ для явного преобразования ссылки к строке. Но это уже тонкости, с которыми столкнутся только продвинутые сценарии. Начинающим важно понять, что основные методы Строка и .ВСтроку предназначены именно для примитивов. Так что помните о типах, и всё получится!
Дополнительный пример: объединяем разные поля в одну строку
Чтобы убедиться в работе методов, напишем запрос, который объединяет текстовую и числовую информацию. Допустим, у нас есть справочник Номенклатура с полем Цена. Мы хотим получить строку вида "Товар: [Название], цена: [число]". Сделать это можно через конкатенацию:
ВЫБРАТЬ "Товар: " + Номенклатура.Наименование + ", цена: " + Номенклатура.Цена.ВСтроку() КАК Описание ИЗ Справочник.Номенклатура КАК Номенклатура;
Результатом будет поле Описание, содержащее, например, "Товар: Молоко, цена: 123,45" (с разделителем групп, если число большое). Очень удобно, что никакой дополнительный цикл или внешняя обработка не требуется. Несколько строк в ответе – и всё уже выводится красиво.
Оговоримся: мы показали примеры для русской локали, где разделитель дробной части – запятая, а тысячи разделяются пробелами. В английской локали тот же запрос вернёт, например, "123.45" или "1 000 000" с точкой как десятичным, а тысячи – как запятая (или без разделителя, в зависимости от формата). 1С автоматически учитывает эти настройки. Поэтому результат работы функций Строка и .ВСтроку изменится в зависимости от языка и региональных настроек пользователя. Удобно, что вам не нужно дополнительно контролировать локализацию в простых случаях. И вот так, буквально одной строчкой запроса, число превращается в строку с правильным видом.
Работа на старых версиях и обратная совместимость
Если вы всё ещё работаете на платформе до 8.3.20, этих функций может не быть. В старых версиях приходилось прибегать к нестандартным методам: например, записывать числовое значение через функцию Формат или вообще формировать строки уже на языке 1С после получения результатов запроса. Это добавляло дополнительный код и усложняло логику. С введением Строка() и .ВСтроку() работа упростилась: конвертация чисел в строку происходит прямо в запросе, без лишних ухищрений. Так что при возможности обновитесь до актуальной версии платформы – это экономит много времени и нервов.
Практические советы
Для применения Строка() и .ВСтроку() можно предложить такие рекомендации:
- Конкатенация строк и чисел: комбинируйте текстовые поля и вычисления прямо в запросе. Например:
"Сумма: " + Документы.Сумма.ВСтроку(). - Подготовка отчётов: используйте конвертацию, чтобы сразу получать готовые к печати поля, без дополнительной обработки после запроса.
- Чистота кода: избегайте громоздких циклов на языке 1С для конкатенации полей – вынесите логику в запрос через
Строка()и.ВСтроку(). - Проверка формата: если нужно специфическое форматирование, сначала можно применить
ФорматилиПредставление(), а затем конвертировать.
Эти простые правила делают запросы компактнее. Начинающему программисту удобно видеть, как цифры сразу оживают и превращаются в понятный текст. Впрочем, помните о том, что всё это работает только в версиях 8.3.20 и выше. Тут важно обновиться и использовать новые возможности.
Приведённые здесь подходы позволят начинающему 1С-программисту почувствовать уверенность: теперь число действительно легко превратить в строку прямо в запросе. Это экономит время и делает код чище. Уже ясно, что использовать эти возможности стоит при каждом удобном случае, когда нужен текстовый результат. А что дальше? Возможно, за новым вопросом кроется ещё больше возможностей в языке запросов...
(Кстати, несколько лет назад на одном хакатоне я видел команду, которая пыталась вручную соединять числа и текст в отчёте, потому что не знала о функции Строка(). Видеть их удивление было забавно: зачем изобретать велосипед, если готовый инструмент уже есть?)
Приведённые примеры – лишь начало. Как ещё можно упростить работу с данными прямо в запросе? Вопросы для размышления остаются открытыми. Может быть, именно в экспериментах с этими приёмами вы найдёте новые идеи и подходы – ведь язык запросов способен на очень многое, если знать нужные функции и методы.
Какой приём конвертации числа в строку вы попробуете применить первым?













































