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