Как отобрать документы по интервалу дат в динамическом списке на обычных формах?

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

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

Механизм работы динамического списка в обычных формах

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

Разберем исходный код, который выполняет инициализацию такого списка:


МассивТиповДокументов = Новый Массив;
МассивТиповДокументов.Добавить(Тип("ДокументСписок." + ТипДокумента1С));

ЭлементыФормы.Документы1С.ТипЗначения = Новый ОписаниеТипов(МассивТиповДокументов);            
ЭлементыФормы.Документы1С.СоздатьКолонки();

Здесь важно понимать: как только мы установили ТипЗначения и вызвали СоздатьКолонки(), объект Документы1С (тип которого теперь ТабличноеПоле) связывается с внутренним объектом типа ДокументСписок. Именно у этого внутреннего объекта есть свойство Отбор, с которым нам предстоит работать.

Установка интервала дат через свойство Отбор

Самый правильный и надежный способ ограничить документы по времени — использовать встроенный механизм отборов. Выясним, как программно обратиться к полю Дата и установить для него вид сравнения «Интервал».

Рассмотрим по шагам процесс настройки фильтра:

  1. Доступ к объекту списка: Сначала нужно получить сам объект списка, который «живет» внутри табличного поля. Это делается через обращение к значению табличного поля.
  2. Поиск нужного поля отбора: В коллекции отборов находим поле Дата.
  3. Настройка параметров: Устанавливаем вид сравнения, значения начала и конца периода, а также активируем использование отбора.

Посмотрим на пример кода, который решает эту задачу:


// Предположим, у нас есть переменные ДатаНачала и ДатаКонца
// Обращаемся к отбору через свойство Значение табличного поля
ОтборПоДате = ЭлементыФормы.Документы1С.Значение.Отбор.Дата;

// Устанавливаем вид сравнения для работы с периодом
ОтборПоДате.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;

// Задаем границы периода
ОтборПоДате.ЗначениеС = НачалоДня(ДатаНачала);
ОтборПоДате.ЗначениеПо = КонецДня(ДатаКонца);

// Обязательно включаем использование отбора
ОтборПоДате.Использовать = Истина;

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

Использование стандартного периода

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

Пример краткой установки даты начала:

ЭлементыФормы.Документы1С.СтандартныйПериод.ДатаНачала = Дата('20210101');

Тем не менее, для точного контроля (особенно если нужно программно менять ВидСравнения на «Больше», «Меньше» или «Равно»), рекомендуется использовать первый способ с коллекцией Отбор.

Оптимизация вывода данных: событие ПриПолученииДанных

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

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

Рассмотрим пример реализации:


Процедура Документы1СПриПолученииДанных(Элемент, ОформленияСтрок)
    
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Получаем ссылку на документ из данных строки
        СсылкаНаДок = ОформлениеСтроки.ДанныеСтроки.Ссылка;
        
        // Пример вывода названия (ссылки) в вычисляемую колонку
        ОформлениеСтроки.Ячейки.Название.Значение = СокрЛП(СсылкаНаДок); 
        
        // Проверяем наличие табличной части и считаем строки
        Если ЗначениеЗаполнено(ИмяТабличнойЧасти1С) Тогда
            КоличествоТоваров = СсылкаНаДок[ИмяТабличнойЧасти1С].Количество();
            Если КоличествоТоваров > 0 Тогда
                ОформлениеСтроки.Ячейки.КоличествоСтрок.Значение = Строка(КоличествоТоваров);
            Иначе
                ОформлениеСтроки.Ячейки.КоличествоСтрок.Значение = "";
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Обратите внимание: Для работы этого кода у вашего табличного поля должны быть добавлены соответствующие колонки (в нашем примере — «Название» и «КоличествоСтрок»), которые не связаны напрямую с данными (пустое свойство Данные).

Заключение и рекомендации

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

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

Если вам требуется предоставить пользователю возможность самостоятельно менять период, вы можете добавить на форму стандартную командную панель, связать ее с вашим табличным полем и включить автозаполнение. Кнопка «Установить интервал дат» (иконка с календарем) появится автоматически и будет управлять тем самым отбором, который мы разобрали выше.

← На главную