Почему не работает отбор "В списке" в отчетах 1С и как его правильно настроить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с отчетами в системе 1С, особенно на управляемых формах, пользователи часто сталкиваются с ситуацией, когда настройка отбора по значению "В списке" не дает ожидаемого результата. Мы выбираем этот вид сравнения, указываем нужные значения, но отчет все равно выводит полный список данных, игнорируя наши фильтры. Чтобы избежать подобных проблем, важно проводить анализ конфигураций и отчетов на наличие ошибок, выявляя некорректные вызовы процедур. Давайте вместе разберем, почему это происходит и как правильно настроить такой отбор.

Основная причина кроется в нюансах работы Системы Компоновки Данных (СКД) и различиях между настройками, задаваемыми в структуре отчета (через кнопку "Настройки" или "Еще - Изменить вариант отчета"), и настройками, устанавливаемыми непосредственно на форме самого отчета в пользовательском режиме. Для расширения возможностей настройки на стороне клиента может использоваться инструмент Пользовательская СКД (поможет консоль запросов и СКД для анализа структуры), который дает больше гибкости при построении отчетов.

Когда мы пытаемся настроить отбор "В списке" через общие настройки отчета, СКД воспринимает этот отбор как часть общей структуры данных, а не как динамический список для конкретного элемента. Для корректной работы отбора "В списке" нам необходимо использовать специальные механизмы, позволяющие точно указать, к каким элементам отчета применяется данный фильтр.

Решение 1: Настройка отбора "В списке" через пользовательский интерфейс на форме отчета

Это наиболее распространенный и рекомендуемый способ для большинства стандартных отчетов, использующих управляемые формы. Часто такие возможности предоставляет универсальный отчет по метаданным, обладающий расширенным функционалом. Мы рассмотрим шаги, которые позволят нам успешно применить отбор "В списке" непосредственно в рабочей форме отчета.

  1. Откройте нужный отчет. Запустите отчет, в котором вы хотите применить отбор.
  2. Найдите блок отборов. Обычно на форме отчета присутствует область для быстрой настройки отборов. Мы можем найти кнопки типа "Добавить отбор", "Настроить" или аналогичные.
  3. Добавьте новый элемент отбора. Нажмите кнопку, которая позволяет добавить новый элемент отбора непосредственно на форме отчета. Это может быть кнопка с изображением плюса или надписью "Добавить новый элемент отбора".
  4. Выберите поле для отбора. Из появившегося списка полей выберите то, по которому мы хотим установить отбор (например, "Номенклатура", "Контрагент" и т.д.).
  5. Установите вид сравнения "В списке". Для выбранного поля в соответствующей колонке или выпадающем списке укажите вид сравнения "В списке". Если вам требуется более сложный поиск, можно использовать расширение для отборов по шаблону списком, которое дополняет стандартные виды сравнения.
  6. Заполните список значений. Появится поле для ввода или выбора значений. Мы можем:
    • Ввести значения вручную через запятую.
    • Использовать кнопку выбора (обычно с многоточием или стрелкой вниз) для открытия формы подбора значений, где мы можем выбрать несколько элементов из справочника или документа.
  7. Примените отбор. После заполнения списка значений нажмите кнопку "Сформировать" или "Применить" в отчете, чтобы обновить данные с учетом нового отбора.
  8. Сохраните настройки (опционально). Если мы хотим, чтобы эти настройки отбора применялись каждый раз при открытии отчета, мы можем сохранить вариант отчета. Для этого найдите на форме кнопку "Сохранить настройки отчета" или "Варианты отчета" и сохраните текущий вариант.

Важный момент: Отбор по группе элементов ("В списке") доступен только в том случае, когда мы задаем параметры отбора в режиме пользователя, то есть не через режим глобальных настроек отчета, а через интерактивные элементы управления на форме самого отчета. Отбор, заданный через глобальные настройки, применяется ко всему отчету в целом, а не к конкретной группе элементов, что и вызывает путаницу.

Решение 2: Программная настройка отбора "В списке" в СКД

В некоторых случаях, особенно когда разрабатываются отчеты СКД с двумя разными схемами или требуется сложная логика, может потребоваться программно настроить отбор "В списке". Это дает нам полный контроль над процессом и позволяет динамически формировать список значений.

Для программной настройки отбора мы будем работать с объектом ОтборКомпоновкиДанных и его свойствами. Для предварительной отладки структуры данных и запросов удобно использовать консоль запросов для управляемых форм. Рассмотрим пример кода, который демонстрирует, как добавить отбор "В списке" для поля "Номенклатура" со списком определенных значений.

Предположим, у нас есть программно формируемый отчет на СКД, и мы хотим добавить в него отбор.


// Получаем объект настроек СКД
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;

// Создаем новый элемент отбора
НовыйЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Устанавливаем поле, по которому будем отбирать
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");

// Устанавливаем вид сравнения "В списке"
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

// Создаем список значений для отбора
СписокЗначенийОтбора = Новый СписокЗначений;
СписокЗначенийОтбора.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));
СписокЗначенийОтбора.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 2"));
СписокЗначенийОтбора.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 3"));

// Присваиваем список значений правому значению элемента отбора
НовыйЭлементОтбора.ПравоеЗначение = СписокЗначенийОтбора;

// Активируем элемент отбора
НовыйЭлементОтбора.Использование = Истина;

// Теперь мы можем применить эти настройки к отчету
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

Разберем этот код подробнее:

  1. Мы получаем доступ к текущим настройкам отчета через ОтчетОбъект.КомпоновщикНастроек.Настройки.
  2. Создаем новый элемент отбора типа ЭлементОтбораКомпоновкиДанных и добавляем его в коллекцию Настройки.Отбор.Элементы.
  3. Для нового элемента отбора мы указываем ЛевоеЗначение – это поле, по которому будет производиться отбор. В данном случае это Номенклатура.
  4. Устанавливаем ВидСравнения в ВидСравненияКомпоновкиДанных.ВСписке. Это ключевой момент для отбора "В списке".
  5. Формируем объект СписокЗначений, в который добавляем все необходимые элементы справочника или других объектов, по которым хотим выполнить отбор. Важно, чтобы тип значений в списке соответствовал типу поля, по которому мы отбираем.
  6. Присваиваем этот СписокЗначений свойству ПравоеЗначение нашего элемента отбора.
  7. Устанавливаем Использование = Истина, чтобы активировать этот отбор.
  8. Наконец, загружаем измененные настройки обратно в компоновщик настроек отчета, чтобы они вступили в силу.

Если нам нужно добавить отбор не к основным элементам отчета, а к группировкам, мы можем использовать следующую структуру:


Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;

// Добавляем отбор к группировкам, а не к общему отбору
НовыйЭлементОтбораГруппировки = Настройки.Отбор.Группировки.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
НовыйЭлементОтбораГруппировки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбораГруппировки.Элементы[0].ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МоеПоле");
НовыйЭлементОтбораГруппировки.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
НовыйЭлементОтбораГруппировки.Элементы[0].ПравоеЗначение = МойСписокЗначений; // Заполненный список значений
НовыйЭлементОтбораГруппировки.Элементы[0].Использование = Истина;

// Активируем группировку отбора
НовыйЭлементОтбораГруппировки.Использование = Истина;

ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

Здесь мы создаем не просто ЭлементОтбораКомпоновкиДанных, а ОтборКомпоновкиДанных для группировки, а затем уже внутри него добавляем обычные элементы отбора.

Распространенные ошибки и рекомендации

При работе с отборами "В списке" мы можем столкнуться с несколькими распространенными проблемами:

  1. Несоответствие типов значений: Убедитесь, что тип значений, которые мы добавляем в список для отбора, соответствует типу поля, по которому производится отбор. Если поле имеет тип "СправочникСсылка.Номенклатура", то в списке должны быть именно ссылки на элементы справочника "Номенклатура", а не их строки наименований или коды.
  2. Неправильное место настройки: Как мы уже выяснили, попытка настроить отбор "В списке" через глобальные настройки структуры отчета (в режиме конфигуратора или через "Изменить вариант отчета") часто не приводит к желаемому результату. Всегда используйте интерактивные элементы управления на форме отчета для настройки отбора в пользовательском режиме.
  3. Пустой или некорректно заполненный список: Проверьте, что список значений для отбора не пуст и содержит корректные, существующие в базе данных значения.
  4. Отсутствие поля в СКД: Убедитесь, что поле, по которому мы пытаемся установить отбор, присутствует в доступных полях СКД отчета.

Правильная настройка отбора "В списке" значительно повышает гибкость и удобство использования отчетов в 1С. Используя описанные подходы, мы сможем эффективно фильтровать данные и получать именно ту информацию, которая нам необходима.

← На главную