Как объединить строку, номер и дату в одном поле запроса 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке сложных отчетов или выборок данных программисты часто сталкиваются с необходимостью сформировать красивое текстовое представление объекта прямо в тексте запроса. Типичный пример — создание поля INVOICE_NO, которое должно содержать префикс типа документа, его номер и дату. Однако при попытке сложить эти данные с помощью оператора "+" система часто выдает ошибку "Неверные параметры". Разберем детально, почему это происходит и какими способами можно решить эту задачу.

Почему возникает ошибка при сложении в запросе?

Первое, что нам необходимо понять: язык запросов 1С является строго типизированным и представляет собой надстройку над SQL. В отличие от встроенного языка 1С, где платформа может автоматически (неявно) преобразовать число или дату в строку при сложении, в запросе такая "магия" не работает. Рассмотрим причины возникновения ошибки "Неверные параметры +" подробнее:

  1. Отсутствие неявного приведения типов: Оператор "+" в запросе предназначен либо для арифметического сложения чисел, либо для конкатенации (сшивания) строк. Если один операнд является строкой (например, "РЕ-"), а второй — датой (Регистратор.Дата), система не знает, как их объединить, и выдает ошибку.
  2. Ограниченность функций преобразования: В классическом языке запросов 1С (до версии платформы 8.3.20) отсутствовали функции прямого приведения даты к строке.
  3. Особенности функции ПРЕДСТАВЛЕНИЕ(): Многие пытаются использовать ПРЕДСТАВЛЕНИЕ(Поле), чтобы получить строку. Однако важно помнить, что ПРЕДСТАВЛЕНИЕ — это специальный ссылочный тип, который вычисляется платформой уже после выполнения запроса к базе данных. Складывать результат этой функции с обычными строками внутри самого запроса нельзя.

Проанализируем ситуацию, в которой оказался автор вопроса. В его коде используется конструкция ВЫБОР, возвращающая строку, к которой прибавляется номер (строка) — это работает. Но как только добавляется дата, запрос "ломается", так как дата не является строкой.

Способ 1. Использование Системы компоновки данных (СКД)

Это самый правильный и рекомендуемый метод, если вы создаете отчет. Вместо того чтобы пытаться заставить SQL-сервер склеивать разнородные типы данных, мы переносим эту задачу на уровень компоновки данных. Рассмотрим по шагам, как это реализовать:

  1. В самом запросе выберите все необходимые поля отдельно: Регистратор.Номер, Регистратор.Дата и тип документа (через ССЫЛКА).
  2. Перейдите на закладку "Вычисляемые поля" в схеме компоновки данных.
  3. Добавьте новое поле ПолныйНомер.
  4. В колонке "Выражение" напишите код на языке 1С, который будет использовать стандартные функции форматирования:

Пример выражения в СКД:

ПредставлениеТипа + "-" + Номер + " от " + Формат(Дата, "ДФ=dd.MM.yyyy")

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

Способ 2. Программная обработка результата запроса

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

Рассмотрим пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Партии.Регистратор КАК Документ,
    |   Партии.Регистратор.Номер КАК Номер,
    |   Партии.Регистратор.Дата КАК Дата
    |ИЗ
    |   РегистрНакопления.ПартииТоваровНаСкладах.Обороты КАК Партии";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Формируем префикс в зависимости от типа
    Префикс = "";
    Если ТипЗнч(Выборка.Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
        Префикс = "РЕ";
    КонецЕсли;
    
    // Склеиваем итоговую строку программно
    ИтоговаяСтрока = Префикс + "-" + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
    
    Сообщить(ИтоговаяСтрока);
КонецЦикла;

Этот метод считается более производительным, так как операции со строками на стороне SQL-сервера могут быть довольно затратными, особенно на больших объемах данных.

Способ 3. Возможности современных версий платформы (8.3.20+)

Если вы работаете на современных версиях платформы 1С (начиная с 8.3.20) и режим совместимости конфигурации позволяет, вы можете использовать новые функции преобразования типов прямо в запросе. Выясним, как это выглядит.

В новых версиях появилась функция СТРОКА(), которую можно использовать в выражениях запроса. Однако будьте осторожны: преобразование даты в строку может зависеть от региональных настроек сервера. Тем не менее, для преобразования чисел (например, года или месяца) это может быть полезно.

Важный нюанс: обработка пустых значений (NULL)

Проанализируем еще одну проблему, с которой можно столкнуться при склейке строк в запросе. Если хотя бы одно из полей, которые вы объединяете через "+", окажется равным NULL (например, если регистратор не заполнен), то весь результат сложения станет NULL.

Чтобы избежать "исчезновения" строки, всегда используйте функцию ЕСТЬNULL. Посмотрим на примере:


ВЫБОР
    КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА "РЕ-"
    ИНАЧЕ "ПР-"
КОНЕЦ + ЕСТЬNULL(Регистратор.Номер, "") КАК Идентификатор

Подведем итоги

Если вам нужно добавить дату к строке в запросе 1С, помните следующие правила:

  1. Не пытайтесь складывать Дату и Строку напрямую через "+" в тексте запроса. Это приведет к ошибке.
  2. Используйте СКД и закладку "Вычисляемые поля" для отчетов. Там доступна функция Формат().
  3. Обрабатывайте результат в коде, если данные нужны для программной логики. Функция Формат(Дата, "ДФ=...") — ваш лучший друг.
  4. Помните про NULL. Всегда проверяйте поля на наличие значений перед склейкой, чтобы не потерять всю строку целиком.
  5. Функция ПРЕДСТАВЛЕНИЕ() полезна только для вывода данных на экран (в поля списка или ячейки табличного документа), но она бесполезна для манипуляций со строками внутри запроса.

Выяснив эти причины и выбрав подходящий метод, вы сможете гибко настраивать вывод данных в ваших решениях на базе 1С, обеспечивая при этом стабильную работу системы без ошибок приведения типов.

← На главную