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

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

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

Рассмотрим особенности работы динамических списков платформы 1С:Предприятие на обычных формах и подробно разберем все способы реализации колонки с флажками.

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

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

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

Для решения задачи нам потребуется внешнее хранилище для помеченных ссылок (например, Соответствие или СписокЗначений) и перехват событий перерисовки и клика по табличному полю.

Способ 1. Хранение отметок в Соответствии с обработкой событий списка

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

Выполним настройку по шагам:

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

Теперь перейдем в модуль формы и реализуем инициализацию хранилища, перехват клика по флажку и отрисовку отметок.

Посмотрим на пример программного кода модуля формы:


Перем мОтмеченныеДокументы;

Процедура ПриОткрытии()
    мОтмеченныеДокументы = Новый Соответствие;
КонецПроцедуры

Процедура ТабличноеПолеСменаУстановкиФлажка(Элемент, Колонка)
    Если Колонка.Имя = "Пометка" Тогда
        ТекущиеДанныеСтроки = Элемент.ТекущиеДанные;
        Если ТекущиеДанныеСтроки <> Неопределено И НЕ ТекущиеДанныеСтроки.ЭтоГруппа Тогда
            СсылкаНаДокумент = ТекущиеДанныеСтроки.Ссылка;
            Если мОтмеченныеДокументы[СсылкаНаДокумент] = Истина Тогда
                мОтмеченныеДокументы.Удалить(СсылкаНаДокумент);
            Иначе
                мОтмеченныеДокументы.Вставить(СсылкаНаДокумент, Истина);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

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

Для обработки массива выбранных документов достаточно обойти коллекцию:


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

Способ 2. Замена ДокументСписок на ТаблицуЗначений

Если для работы требуется не просто отмечать документы, но и сортировать строки по установленному флажку или динамически фильтровать только отмеченные позиции, динамический список не подойдет. В этом случае данные списка загружаются в реквизит формы с типом ТаблицаЗначений.

Разберем последовательность действий для этого варианта:

  1. Создадим на форме реквизит с типом ТаблицаЗначений (например, СписокДокументов) и добавим в него колонки: Пометка (тип Булево), Ссылка, Номер, Дата и другие необходимые реквизиты.
  2. Установим данную таблицу значений в качестве источника данных для табличного поля на форме.
  3. Для колонки Пометка укажем свойство Данные = Пометка, РежимРедактирования = Непосредственно.
  4. Заполним таблицу значений с помощью запроса при открытии формы или по нажатию кнопки отбора.

Посмотрим на пример заполнения таблицы значений:


Процедура ЗаполнитьСписокДокументов()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЛОЖЬ КАК Пометка,
        |	Заказ.Ссылка КАК Ссылка,
        |	Заказ.Номер КАК Номер,
        |	Заказ.Дата КАК Дата,
        |	Заказ.Контрагент КАК Контрагент,
        |	Заказ.СуммаДокумента КАК СуммаДокумента
        |ИЗ
        |	Документ.ЗаказПокупателя КАК Заказ
        |ГДЕ
        |	Заказ.Проведен = ИСТИНА";
    
    СписокДокументов = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
КонецПроцедуры

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

Способ 3. Использование стандартного множественного выбора

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

Разберем настройку этого механизма:

  1. В свойствах табличного поля установим флаг МножественныйВыбор в значение Истина.
  2. Пользователь сможет выделять строки привычными комбинациями клавиш: Ctrl + клик мышью или Shift + стрелки клавиатуры.
  3. Для получения списка выбранных документов в обработчике команды обратимся к свойству ВыделенныеСтроки:

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

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

← На главную