В процессе разработки отчетов на системе компоновки данных (СКД) в 1С можно столкнуться с загадочной ошибкой «Неверные параметры». Часто она возникает в сценарии, когда отчет без проблем формируется в продвинутой консоли запросов, но при запуске в режиме «Предприятие» выдает сбой. Проанализируем типичную ситуацию, когда такая ошибка появляется при попытке использовать оператор ПОДОБНО с конкатенацией строк прямо в тексте запроса, и разберем надежные способы ее решения.
Представим ситуацию: у нас есть отчет на СКД, в тексте запроса которого присутствует следующее условие для фильтрации по имени менеджера:
{ГДЕ
(ДополнительныеСведения.Значение ПОДОБНО "%" + &ИмяМенеджера + "%"
И (ЗаказКлиента.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания))}
На первый взгляд, конструкция выглядит логичной — мы пытаемся найти все записи, где в поле ДополнительныеСведения.Значение содержится имя менеджера, переданное в параметре &ИмяМенеджера. Однако именно такая конструкция часто становится источником проблемы. Давайте выясним, почему так происходит и как это исправить.
Ошибка «Неверные параметры» в данном контексте, как правило, вызвана одной из двух фундаментальных причин или их комбинацией.
Несоответствие типов данных. Это самая частая причина. Оператор языка запросов ПОДОБНО предназначен для работы исключительно со значениями строкового типа. Если в параметр &ИмяМенеджера передается значение другого типа (например, СправочникСсылка.Пользователи, Неопределено или, как в обсуждаемом на форуме случае, составной тип Характеристика.ДополнительныеРеквизитыИСведения), система не может выполнить операцию сравнения строк и генерирует ошибку. Платформа 1С не выполняет автоматическое приведение типов в этом месте запроса.
Попытка конкатенации строк внутри текста запроса. Конструкция "%" + &ИмяМенеджера + "%" является попыткой объединить (конкатенировать) строки непосредственно на уровне языка запросов. Хотя в некоторых диалектах SQL это может сработать, в языке запросов 1С, особенно в контексте СКД, такая операция не является надежной и часто приводит к ошибкам. Система компоновки данных обрабатывает параметры особым образом, и попытка выполнить арифметические или строковые операции с ними прямо в тексте запроса может быть интерпретирована неверно.
Таким образом, наша задача — передать в запрос уже полностью готовую к использованию строку для поиска, а также убедиться, что ее тип — именно строка.
Наиболее правильный и надежный подход — это перенести логику формирования строки для поиска из текста запроса в код 1С, который выполняется перед формированием отчета. Разберем этот процесс по шагам.
Шаг 1. Упрощаем текст запроса в СКД
Первым делом необходимо изменить текст запроса, убрав из него операцию конкатенации. Условие должно стать максимально простым и ожидать уже готовую строку с символами %.
Было:
{ГДЕ
(ДополнительныеСведения.Значение ПОДОБНО "%" + &ИмяМенеджера + "%")}
Стало:
{ГДЕ
(ДополнительныеСведения.Значение ПОДОБНО &ИмяМенеджера)}
Теперь запрос ожидает, что в параметр &ИмяМенеджера придет уже готовая строка для поиска, например, "%Иванов%".
Шаг 2. Добавляем код для обработки параметра
Теперь нужно добавить код в модуль объекта отчета, который будет подготавливать значение параметра перед тем, как СКД начнет выполнять запрос. Идеальное место для этого — обработчик события ПриКомпоновкеРезультата.
В этом обработчике мы выполним следующие действия:
%.Посмотрим на пример кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартную обработку, чтобы выполнить свою
// Получаем текущие настройки отчета
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Находим значение параметра "ИмяМенеджера"
ЭлементПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ИмяМенеджера"));
// Проверяем, что параметр найден, доступен и его значение заполнено
Если ЭлементПараметра <> Неопределено И ЭлементПараметра.Использование И ЗначениеЗаполнено(ЭлементПараметра.Значение) Тогда
// Получаем исходное значение и приводим его к строке
ИсходноеЗначение = ЭлементПараметра.Значение;
СтрокаДляПоиска = Строка(ИсходноеЗначение);
// Формируем шаблон для оператора ПОДОБНО
ГотовыйПараметр = "%" + СокрЛП(СтрокаДляПоиска) + "%";
// Устанавливаем новое, подготовленное значение параметра
ЭлементПараметра.Значение = ГотовыйПараметр;
Иначе
// Если параметр не задан, то можно установить его недоступным,
// чтобы условие {ГДЕ...} в запросе не сработало
ЭлементПараметра.Использование = Ложь;
КонецЕсли;
// Выполняем компоновку с измененными настройками
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Что делает этот код? Он перехватывает процесс формирования отчета, модифицирует параметр &ИмяМенеджера, превращая его в готовую строку для поиска, и только после этого запускает стандартный механизм компоновки. Такой подход полностью решает обе проблемы: и несоответствие типов, и некорректную конкатенацию в запросе. Это особенно важно для оптимизации отчетов, где точность передачи параметров напрямую влияет на результат.
Существует и альтернативный, более простой путь, который перекладывает задачу фильтрации на пользователя.
Суть метода: вы убираете условие с ПОДОБНО из текста запроса СКД, но делаете поле ДополнительныеСведения.Значение доступным для отбора в пользовательских настройках.
Как это сделать:
{ГДЕ (ДополнительныеСведения.Значение ПОДОБНО ...)} из набора данных в СКД.Значение (или как вы его назвали) доступно для отбора. Для этого в дереве настроек найдите секцию «Отбор» и проверьте, что у нужного поля установлен флажок.После этого пользователь в режиме «Предприятие» сможет самостоятельно настроить нужный ему фильтр:
ПОДОБНО для пользовательского интерфейса. Для реализации более сложных сценариев фильтрации по шаблону можно использовать специальное расширение Подобно в списке.Преимущества этого способа: простота реализации для разработчика и гибкость для пользователя.
Недостатки: требует от пользователя дополнительных действий и знаний о том, как настраивать отчеты. Если фильтр является обязательным, этот способ не подойдет.
Ошибка «Неверные параметры» при использовании оператора ПОДОБНО в отчетах на СКД — это сигнал о том, что вы либо пытаетесь сравнить данные несовместимых типов, либо используете некорректную конструкцию прямо в тексте запроса.
ПриКомпоновкеРезультата. Это гарантирует, что в запрос попадет значение правильного типа и в нужном формате.Выбирая первый способ, вы создаете более предсказуемый и стабильно работающий отчет, который не зависит от действий пользователя.