При разработке сложных отчетов или выборок данных программисты часто сталкиваются с необходимостью сформировать красивое текстовое представление объекта прямо в тексте запроса. Типичный пример — создание поля INVOICE_NO, которое должно содержать префикс типа документа, его номер и дату. Однако при попытке сложить эти данные с помощью оператора "+" система часто выдает ошибку "Неверные параметры". Разберем детально, почему это происходит и какими способами можно решить эту задачу.
Первое, что нам необходимо понять: язык запросов 1С является строго типизированным и представляет собой надстройку над SQL. В отличие от встроенного языка 1С, где платформа может автоматически (неявно) преобразовать число или дату в строку при сложении, в запросе такая "магия" не работает. Рассмотрим причины возникновения ошибки "Неверные параметры +" подробнее:
"+" в запросе предназначен либо для арифметического сложения чисел, либо для конкатенации (сшивания) строк. Если один операнд является строкой (например, "РЕ-"), а второй — датой (Регистратор.Дата), система не знает, как их объединить, и выдает ошибку.ПРЕДСТАВЛЕНИЕ(Поле), чтобы получить строку. Однако важно помнить, что ПРЕДСТАВЛЕНИЕ — это специальный ссылочный тип, который вычисляется платформой уже после выполнения запроса к базе данных. Складывать результат этой функции с обычными строками внутри самого запроса нельзя.Проанализируем ситуацию, в которой оказался автор вопроса. В его коде используется конструкция ВЫБОР, возвращающая строку, к которой прибавляется номер (строка) — это работает. Но как только добавляется дата, запрос "ломается", так как дата не является строкой.
Это самый правильный и рекомендуемый метод, если вы создаете отчет. Вместо того чтобы пытаться заставить SQL-сервер склеивать разнородные типы данных, мы переносим эту задачу на уровень компоновки данных. Рассмотрим по шагам, как это реализовать:
Регистратор.Номер, Регистратор.Дата и тип документа (через ССЫЛКА).ПолныйНомер.Пример выражения в СКД:
ПредставлениеТипа + "-" + Номер + " от " + Формат(Дата, "ДФ=dd.MM.yyyy")
Поскольку СКД выполняет это выражение средствами встроенного языка 1С в процессе формирования результата, вы получите идеально отформатированную строку без ошибок в запросе.
Если данные нужны не в отчете, а в обработке или коде, лучше всего разделить получение данных и их представление. Разберем ситуацию: мы сначала получаем "сырые" данные из базы, а затем обходим выборку и формируем нужную строку.
Рассмотрим пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Партии.Регистратор КАК Документ,
| Партии.Регистратор.Номер КАК Номер,
| Партии.Регистратор.Дата КАК Дата
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах.Обороты КАК Партии";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Формируем префикс в зависимости от типа
Префикс = "";
Если ТипЗнч(Выборка.Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
Префикс = "РЕ";
КонецЕсли;
// Склеиваем итоговую строку программно
ИтоговаяСтрока = Префикс + "-" + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
Сообщить(ИтоговаяСтрока);
КонецЦикла;
Этот метод считается более производительным, так как операции со строками на стороне SQL-сервера могут быть довольно затратными, особенно на больших объемах данных.
Если вы работаете на современных версиях платформы 1С (начиная с 8.3.20) и режим совместимости конфигурации позволяет, вы можете использовать новые функции преобразования типов прямо в запросе. Выясним, как это выглядит.
В новых версиях появилась функция СТРОКА(), которую можно использовать в выражениях запроса. Однако будьте осторожны: преобразование даты в строку может зависеть от региональных настроек сервера. Тем не менее, для преобразования чисел (например, года или месяца) это может быть полезно.
Проанализируем еще одну проблему, с которой можно столкнуться при склейке строк в запросе. Если хотя бы одно из полей, которые вы объединяете через "+", окажется равным NULL (например, если регистратор не заполнен), то весь результат сложения станет NULL.
Чтобы избежать "исчезновения" строки, всегда используйте функцию ЕСТЬNULL. Посмотрим на примере:
ВЫБОР
КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА "РЕ-"
ИНАЧЕ "ПР-"
КОНЕЦ + ЕСТЬNULL(Регистратор.Номер, "") КАК Идентификатор
Если вам нужно добавить дату к строке в запросе 1С, помните следующие правила:
"+" в тексте запроса. Это приведет к ошибке.Формат().Формат(Дата, "ДФ=...") — ваш лучший друг.Выяснив эти причины и выбрав подходящий метод, вы сможете гибко настраивать вывод данных в ваших решениях на базе 1С, обеспечивая при этом стабильную работу системы без ошибок приведения типов.