Как организовать универсальный отбор данных в управляемых формах 1С, заменяя ПостроительОтчета, и как настроить отбор по интервалу дат?

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

При переходе от старых обработок, разработанных на обычных формах и использующих такой мощный инструмент, как ПостроительОтчета, к современным решениям на управляемых формах в 1С, часто возникает вопрос: как правильно организовать универсальный отбор данных? Мы сталкиваемся с необходимостью воспроизвести функциональность выбора по различным критериям — равно, не равно, в списке и так далее. Особую сложность обычно представляет настройка отбора по интервалу дат, который был легко доступен в ПостроителеОтчета.

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

Организация универсального отбора с помощью Системы Компоновки Данных (СКД)

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

Рассмотрим пошагово, как мы можем организовать такой отбор:

  1. Создание реквизита формы типа «КомпоновщикНастроекКомпоновкиДанных»

Нам потребуется добавить на управляемую форму реквизит с типом КомпоновщикНастроекКомпоновкиДанных. Этот объект является мостом между нашей формой и СКД, позволяя нам управлять настройками компоновки данных.


// Пример создания реквизита формы
// В конфигураторе, на вкладке "Реквизиты" формы, добавляем новый реквизит.
// Имя: КомпоновщикНастроек
// Тип: КомпоновщикНастроекКомпоновкиДанных

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

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

На следующем шаге мы должны программно связать наш реквизит формы типа КомпоновщикНастроекКомпоновкиДанных с созданным макетом СКД. Это обычно делается при создании на сервере или при открытии формы.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Получаем схему компоновки данных из макета.
    МакетСКД = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МойМакетСКД");
    СхемаКомпоновкиДанных = МакетСКД.ПолучитьМакпоновкуДанных();

    // Инициализируем КомпоновщикНастроек.
    КомпоновщикНастроек.Инициализировать(СхемаКомпоновкиДанных);

    // Устанавливаем настройки по умолчанию (если нужно)
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецПроцедуры

После этой инициализации КомпоновщикНастроек будет готов к использованию. Мы можем разместить на форме элемент управления типа "Таблица" или "Поле" с привязкой к этому реквизиту формы, чтобы пользователь мог интерактивно настраивать отборы, группировки и сортировки, как это делалось в ПостроителеОтчета.

Отборы также могут быть установлены программно через свойство КомпоновщикНастроек.Настройки.Отбор. Это позволяет нам гибко указывать левое и правое значения, а также вид сравнения, реализуя любую логику отбора.


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

Реализация отбора по интервалу дат в СКД

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

Подход 1: Использование двух отдельных условий

Самый простой и прямолинейный способ имитировать отбор по интервалу — это использовать два отдельных элемента отбора. Мы просто разбиваем интервал на две границы:

  1. "Дата больше или равно НачалоПериода"
  2. "Дата меньше или равно КонецПериода"

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

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


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

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

Подход 2: Использование параметра типа "СтандартныйПериод" (наиболее удобный и рекомендованный)

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

Разберем процесс настройки:

  1. Создание параметра типа "СтандартныйПериод" в схеме СКД

В схеме СКД (на вкладке "Параметры") создаем новый параметр, например, с именем ПериодОтчета. Ключевой момент: в свойствах этого параметра мы устанавливаем тип СтандартныйПериод.

Наш запрос в наборе данных СКД, скорее всего, уже содержит параметры для начала и конца периода (например, &НачалоПериода и &КонецПериода). Мы должны связать эти параметры запроса с нашим СтандартнымПериодом. Для этого в свойствах параметров НачалоПериода и КонецПериода (на вкладке "Параметры" схемы СКД) мы указываем выражения:

Эти выражения автоматически извлекут начальную и конечную даты из выбранного пользователем стандартного периода.

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

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

Преимущества "СтандартногоПериода":

Мы должны быть внимательными при использовании СтандартногоПериода с некоторыми виртуальными таблицами, такими как "Остатки" или "Обороты". Часто эти таблицы работают таким образом, что дата окончания периода включается до начала следующей секунды (или дня). Например, если выбран период "01.01.2023 - 31.01.2023", виртуальная таблица может интерпретировать конец периода как "31.01.2023 00:00:00", не включая весь последний день. В таких случаях нам может потребоваться программная корректировка даты окончания.

Мы можем добавить одну секунду к дате окончания периода, чтобы убедиться, что весь последний день включен в выборку. Это делается в коде при установке параметров СКД:


&НаСервере
Функция ПолучитьНастройкиСКДДляОтчета()
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    // Если используется параметр ПериодОтчета, корректируем его
    Для Каждого ЭлементПараметра Из Настройки.ПараметрыДанных.Элементы Цикл
        Если ЭлементПараметра.Параметр = Новый ПараметрКомпоновкиДанных("ПериодОтчета") Тогда
            Если ЭлементПараметра.Значение.Вид = ВидСтандартногоПериода.ПроизвольныйПериод Тогда
                ЭлементПараметра.Значение.ДатаОкончания = КонецДня(ЭлементПараметра.Значение.ДатаОкончания);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

    Возврат Настройки;
КонецФункции

Или, что более универсально, мы можем сделать это прямо в схеме СКД, изменив выражение для параметра КонецПериода:


// Для параметра &КонецПериода в схеме СКД
// Вместо &ПериодОтчета.ДатаОкончания
// Используем: КОНЕЦДНЯ(&ПериодОтчета.ДатаОкончания)

Это гарантирует, что при любых выбранных границах периода данные будут корректно включать весь последний день.

Отборы для динамических списков и других таблиц

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

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

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

Таким образом, переходя от ПостроителяОтчета на обычных формах к СКД на управляемых формах, мы получаем более гибкий и современный инструмент для организации универсального отбора. А для специфической задачи отбора по интервалу дат СКД предлагает элегантное и функциональное решение в виде параметра СтандартныйПериод, которое значительно улучшает пользовательский опыт.

← На главную