При работе с отчетами в системе 1С, особенно на управляемых формах, пользователи часто сталкиваются с ситуацией, когда настройка отбора по значению "В списке" не дает ожидаемого результата. Мы выбираем этот вид сравнения, указываем нужные значения, но отчет все равно выводит полный список данных, игнорируя наши фильтры. Чтобы избежать подобных проблем, важно проводить анализ конфигураций и отчетов на наличие ошибок, выявляя некорректные вызовы процедур. Давайте вместе разберем, почему это происходит и как правильно настроить такой отбор.
Основная причина кроется в нюансах работы Системы Компоновки Данных (СКД) и различиях между настройками, задаваемыми в структуре отчета (через кнопку "Настройки" или "Еще - Изменить вариант отчета"), и настройками, устанавливаемыми непосредственно на форме самого отчета в пользовательском режиме. Для расширения возможностей настройки на стороне клиента может использоваться инструмент Пользовательская СКД (поможет консоль запросов и СКД для анализа структуры), который дает больше гибкости при построении отчетов.
Когда мы пытаемся настроить отбор "В списке" через общие настройки отчета, СКД воспринимает этот отбор как часть общей структуры данных, а не как динамический список для конкретного элемента. Для корректной работы отбора "В списке" нам необходимо использовать специальные механизмы, позволяющие точно указать, к каким элементам отчета применяется данный фильтр.
Это наиболее распространенный и рекомендуемый способ для большинства стандартных отчетов, использующих управляемые формы. Часто такие возможности предоставляет универсальный отчет по метаданным, обладающий расширенным функционалом. Мы рассмотрим шаги, которые позволят нам успешно применить отбор "В списке" непосредственно в рабочей форме отчета.
Важный момент: Отбор по группе элементов ("В списке") доступен только в том случае, когда мы задаем параметры отбора в режиме пользователя, то есть не через режим глобальных настроек отчета, а через интерактивные элементы управления на форме самого отчета. Отбор, заданный через глобальные настройки, применяется ко всему отчету в целом, а не к конкретной группе элементов, что и вызывает путаницу.
В некоторых случаях, особенно когда разрабатываются отчеты СКД с двумя разными схемами или требуется сложная логика, может потребоваться программно настроить отбор "В списке". Это дает нам полный контроль над процессом и позволяет динамически формировать список значений.
Для программной настройки отбора мы будем работать с объектом ОтборКомпоновкиДанных и его свойствами. Для предварительной отладки структуры данных и запросов удобно использовать консоль запросов для управляемых форм. Рассмотрим пример кода, который демонстрирует, как добавить отбор "В списке" для поля "Номенклатура" со списком определенных значений.
Предположим, у нас есть программно формируемый отчет на СКД, и мы хотим добавить в него отбор.
// Получаем объект настроек СКД
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;
// Создаем новый элемент отбора
НовыйЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// Устанавливаем поле, по которому будем отбирать
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
// Устанавливаем вид сравнения "В списке"
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
// Создаем список значений для отбора
СписокЗначенийОтбора = Новый СписокЗначений;
СписокЗначенийОтбора.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));
СписокЗначенийОтбора.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 2"));
СписокЗначенийОтбора.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 3"));
// Присваиваем список значений правому значению элемента отбора
НовыйЭлементОтбора.ПравоеЗначение = СписокЗначенийОтбора;
// Активируем элемент отбора
НовыйЭлементОтбора.Использование = Истина;
// Теперь мы можем применить эти настройки к отчету
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Разберем этот код подробнее:
ОтчетОбъект.КомпоновщикНастроек.Настройки.ЭлементОтбораКомпоновкиДанных и добавляем его в коллекцию Настройки.Отбор.Элементы.ЛевоеЗначение – это поле, по которому будет производиться отбор. В данном случае это Номенклатура.ВидСравнения в ВидСравненияКомпоновкиДанных.ВСписке. Это ключевой момент для отбора "В списке".СписокЗначений, в который добавляем все необходимые элементы справочника или других объектов, по которым хотим выполнить отбор. Важно, чтобы тип значений в списке соответствовал типу поля, по которому мы отбираем.СписокЗначений свойству ПравоеЗначение нашего элемента отбора.Использование = Истина, чтобы активировать этот отбор.Если нам нужно добавить отбор не к основным элементам отчета, а к группировкам, мы можем использовать следующую структуру:
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;
// Добавляем отбор к группировкам, а не к общему отбору
НовыйЭлементОтбораГруппировки = Настройки.Отбор.Группировки.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
НовыйЭлементОтбораГруппировки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбораГруппировки.Элементы[0].ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МоеПоле");
НовыйЭлементОтбораГруппировки.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
НовыйЭлементОтбораГруппировки.Элементы[0].ПравоеЗначение = МойСписокЗначений; // Заполненный список значений
НовыйЭлементОтбораГруппировки.Элементы[0].Использование = Истина;
// Активируем группировку отбора
НовыйЭлементОтбораГруппировки.Использование = Истина;
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Здесь мы создаем не просто ЭлементОтбораКомпоновкиДанных, а ОтборКомпоновкиДанных для группировки, а затем уже внутри него добавляем обычные элементы отбора.
При работе с отборами "В списке" мы можем столкнуться с несколькими распространенными проблемами:
Правильная настройка отбора "В списке" значительно повышает гибкость и удобство использования отчетов в 1С. Используя описанные подходы, мы сможем эффективно фильтровать данные и получать именно ту информацию, которая нам необходима.