В процессе разработки в среде 1С часто возникает ситуация, когда пользователю необходимо вывести на печать не все позиции из табличной части документа или обработки, а только те, которые он предварительно отобрал с помощью интерактивных фильтров. Например, при печати ценников в обработке «Печать этикеток и ценников» менеджер может установить отбор по цене (например, «Цена > 100») или по конкретному производителю. Если просто отправить всю табличную часть на печать, принтер выдаст лишние листы. В данной статье мы разберем, как программно определить, какие строки видны пользователю, и сформировать из них выборку для печати.
Если мы работаем в Обычном приложении (толстый клиент), наиболее простым и надежным способом является использование метода ПроверитьСтроку(), который принадлежит объекту ТабличноеПоле. Важно понимать различие: мы обращаемся не к самой табличной части (данным объекта), а к элементу управления на форме, который эти данные отображает.
Проанализируем ситуацию: у нас есть табличная часть Товары, выведенная на форму. Пользователь наложил фильтры через контекстное меню или кнопку «Установить отбор и сортировку». Для того чтобы программа поняла, соответствует ли конкретная строка этим критериям, мы используем цикл. Рассмотрим пример реализации:
// Создаем временную таблицу, куда будем помещать отобранные строки
ТЧДляПечати = Товары.ВыгрузитьКолонки();
Для Каждого СтрокаТЧ Из Товары Цикл
// Проверяем строку на соответствие всем наложенным фильтрам в ТабличномПоле
Если ЭлементыФормы.Товары.ПроверитьСтроку(СтрокаТЧ) Тогда
НоваяСтр = ТЧДляПечати.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр, СтрокаТЧ);
КонецЕсли;
КонецЦикла;
// Теперь в переменной ТЧДляПечати находятся только нужные нам данные
Разберем, что происходит в этом коде. Метод ПроверитьСтроку() возвращает значение типа Булево. Он учитывает не только простые отборы, но и сложные условия, которые пользователь мог задать в настройках списка. Если метод возвращает Истина, значит, строка видима на экране.
Обратите внимание на использование метода ЗаполнитьЗначенияСвойств(). Часто начинающие разработчики совершают ошибку, вручную прописывая копирование каждого реквизита: НоваяСтр.Артикул = СтрокаТЧ.Артикул, НоваяСтр.Цена = СтрокаТЧ.Цена и так далее. Это делает код громоздким и трудноподдерживаемым — при добавлении новой колонки в ТЧ придется переписывать процедуру печати.
Использование ЗаполнитьЗначенияСвойств() позволяет нам автоматически скопировать данные из всех полей с совпадающими именами. Это стандарт «хорошего тона» в разработке 1С, который существенно сокращает объем кода и уменьшает вероятность ошибок. Проанализируем преимущество: одна строка кода заменяет десятки присвоений.
Выясним причину, почему метод с циклом может быть не всегда удобен. Если строк в табличной части тысячи, перебор в цикле и проверка каждой строки может занять заметное время. В таком случае мы можем воспользоваться объектом ПостроительОтчета. Этот объект обладает уникальной способностью — он может использовать в качестве источника данных ТабличноеПоле формы.
Посмотрим на пример того, как это работает:
Построитель = Новый ПостроительОтчета;
// Назначаем источником данных табличное поле с формы
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЭлементыФормы.Товары);
// Выполняем построение
Построитель.Выполнить();
// Получаем результат (выборку), которая уже содержит все фильтры и сортировки
РезультатОтбора = Построитель.Результат.Выгрузить();
Преимущество этого метода в том, что ПостроительОтчета автоматически подхватывает не только отборы, но и сортировку, которую установил пользователь. Если менеджер отсортировал товары по артикулу, то в печатной форме они появятся в том же порядке. Это решение является более профессиональным для сложных интерфейсов Обычного приложения.
Иногда программирование вовсе не требуется. Рассмотрим встроенный функционал платформы 1С. В любом табличном поле (как в Обычных, так и в Управляемых формах) доступна команда «Вывести список» (обычно находится в меню «Еще» или вызывается через правую кнопку мыши).
Когда пользователь выбирает эту команду, платформа предлагает сформировать текстовый или табличный документ. Главная особенность в том, что 1С по умолчанию выводит только те строки, которые видны в данный момент с учетом всех поисков и фильтров. Для оперативной печати реестра товаров этого бывает достаточно, однако это не заменяет полноценную печатную форму ценника или этикетки.
Проанализируем ситуацию в Управляемом приложении. Здесь работа с отборами табличных частей существенно отличается. В Управляемых формах таблица на форме напрямую связана с данными объекта (например, Объект.Товары), и метод ПроверитьСтроку() там отсутствует.
Если нам нужно реализовать печать с учетом отборов в УФ, мы должны учитывать следующее:
КомпоновщикНастроек.Отбор, мы можем прочитать эти настройки и применить их в запросе при формировании печатной формы.Таким образом, мы рассмотрели несколько способов решения задачи. Для Обычного приложения оптимальным выбором будет цикл с ПроверитьСтроку() или ПостроительОтчета. Эти методы позволяют гибко управлять процессом формирования печатной формы, гарантируя, что пользователь получит ровно тот результат, который видит на экране своего монитора.