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