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