Как распечатать только те товары из табличной части, на которые наложен отбор

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

В процессе разработки в среде 1С часто возникает ситуация, когда пользователю необходимо вывести на печать не все позиции из табличной части документа или обработки, а только те, которые он предварительно отобрал с помощью интерактивных фильтров. Например, при печати ценников в обработке «Печать этикеток и ценников» менеджер может установить отбор по цене (например, «Цена > 100») или по конкретному производителю. Если просто отправить всю табличную часть на печать, принтер выдаст лишние листы. В данной статье мы разберем, как программно определить, какие строки видны пользователю, и сформировать из них выборку для печати.

Метод ПроверитьСтроку() для Обычных форм

Если мы работаем в Обычном приложении (толстый клиент), наиболее простым и надежным способом является использование метода ПроверитьСтроку(), который принадлежит объекту ТабличноеПоле. Важно понимать различие: мы обращаемся не к самой табличной части (данным объекта), а к элементу управления на форме, который эти данные отображает.

Проанализируем ситуацию: у нас есть табличная часть Товары, выведенная на форму. Пользователь наложил фильтры через контекстное меню или кнопку «Установить отбор и сортировку». Для того чтобы программа поняла, соответствует ли конкретная строка этим критериям, мы используем цикл. Рассмотрим пример реализации:


// Создаем временную таблицу, куда будем помещать отобранные строки
ТЧДляПечати = Товары.ВыгрузитьКолонки();

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

// Теперь в переменной ТЧДляПечати находятся только нужные нам данные

Разберем, что происходит в этом коде. Метод ПроверитьСтроку() возвращает значение типа Булево. Он учитывает не только простые отборы, но и сложные условия, которые пользователь мог задать в настройках списка. Если метод возвращает Истина, значит, строка видима на экране.

Оптимизация кода с помощью ЗаполнитьЗначенияСвойств

Обратите внимание на использование метода ЗаполнитьЗначенияСвойств(). Часто начинающие разработчики совершают ошибку, вручную прописывая копирование каждого реквизита: НоваяСтр.Артикул = СтрокаТЧ.Артикул, НоваяСтр.Цена = СтрокаТЧ.Цена и так далее. Это делает код громоздким и трудноподдерживаемым — при добавлении новой колонки в ТЧ придется переписывать процедуру печати.

Использование ЗаполнитьЗначенияСвойств() позволяет нам автоматически скопировать данные из всех полей с совпадающими именами. Это стандарт «хорошего тона» в разработке 1С, который существенно сокращает объем кода и уменьшает вероятность ошибок. Проанализируем преимущество: одна строка кода заменяет десятки присвоений.

Использование Построителя отчета для программного получения данных

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

Посмотрим на пример того, как это работает:


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

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

Стандартная возможность: Вывести список

Иногда программирование вовсе не требуется. Рассмотрим встроенный функционал платформы 1С. В любом табличном поле (как в Обычных, так и в Управляемых формах) доступна команда «Вывести список» (обычно находится в меню «Еще» или вызывается через правую кнопку мыши).

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

Особенности для Управляемых форм (8.3)

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

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

  1. Если отбор наложен через стандартный поиск (Ctrl+F) или через «желтую» панель поиска, программно получить список этих строк крайне сложно, так как поиск работает на уровне визуального отображения клиента.
  2. Для решения этой задачи в современных конфигурациях (например, на базе БСП) рекомендуется использовать не фильтрацию в ТЧ, а предварительное заполнение данных через форму настроек отбора КомпоновщикНастроек.
  3. Если же отборы наложены программно через свойство элемента формы Отбор, мы можем прочитать эти настройки и применить их в запросе при формировании печатной формы.

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

← На главную