Как реализовать печать только выбранных строк табличной части во внешней печатной форме

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет
← На главную

При разработке внешних печатных форм (ВПФ) часто возникает задача ограничить вывод данных не всем документом целиком, а только конкретными строками, которые выделил пользователь. Типичный пример — документ График отпусков, где бухгалтеру или кадровику нужно распечатать уведомления об отпуске только для нескольких сотрудников из длинного списка. Рассмотрим подробно, как реализовать этот механизм, используя возможности современной платформы 1С:Предприятие 8.3 и Библиотеки стандартных подсистем (БСП).

Метод 1. Использование стандартного механизма БСП для печати выделенных строк

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

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

Рассмотрим пример кода, который можно разместить в форме документа для вызова печати только выделенных строк:


&НаКлиенте
Процедура КомандаПечатьУведомлений(Команда)
    
    // Получаем массив идентификаторов выделенных строк табличной части
    МассивВыделенныхСтрок = Элементы.Сотрудники.ВыделенныеСтроки;
    
    Если МассивВыделенныхСтрок.Количество() = 0 Тогда
        Предупреждение("Пожалуйста, выделите хотя бы одну строку в списке сотрудников!");
        Возврат;
    КонецЕсли;
    
    // Формируем параметры печати
    ПараметрыПечати = Новый Структура;
    ПараметрыПечати.Вставить("ВыбранныеСтроки", МассивВыделенныхСтрок);
    
    // Вызываем стандартный механизм печати БСП
    УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
        "Документ.ГрафикОтпусков", 
        "УведомлениеОбОтпуске", 
        Объект.Ссылка, 
        ЭтаФорма, 
        ПараметрыПечати);
        
КонецПроцедуры

Метод 2. Фильтрация данных в запросе внутри внешней печатной формы

Теперь разберем, как принять эти данные в самой внешней печатной форме. В модуле объекта ВПФ основная экспортная процедура Печать принимает массив объектов и структуру параметров. Именно здесь мы будем извлекать наши идентификаторы строк.

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


Процедура Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати) Экспорт
    
    // Проверяем наличие параметра фильтрации
    МассивВыбранныхСтрок = Неопределено;
    Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("ВыбранныеСтроки") Тогда
        МассивВыбранныхСтрок = ПараметрыПечати.ВыбранныеСтроки;
    КонецЕсли;
    
    // Формируем табличный документ
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "УведомлениеОбОтпуске");
    Если ПечатнаяФорма <> Неопределено Тогда
        ПечатнаяФорма.ТабличныйДокумент = СформироватьУведомления(МассивОбъектовНазначения, МассивВыбранныхСтрок);
        ПечатнаяФорма.СинонимМакета = "Уведомление об отпуске";
    КонецЕсли;
    
КонецПроцедуры

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

Метод 3. Создание вспомогательной формы выбора в ВПФ

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

Разберем этот алгоритм по шагам:

  1. При вызове команды печати из меню «Печать» программа открывает не сразу печатную форму, а основную форму внешней обработки.
  2. В процедуре ПриСозданииНаСервере формы ВПФ мы считываем данные табличной части документа-основания и заполняем ими временную таблицу на форме.
  3. Добавляем в эту таблицу колонку Печатать с типом Булево (флажок).
  4. Пользователь отмечает нужных сотрудников галочками.
  5. По нажатию кнопки «Сформировать» на форме ВПФ запускается алгоритм формирования печатной формы только по строкам с установленным флагом.

Для реализации этого метода в функции СведенияОВнешнейОбработке необходимо указать тип вызова ОткрытиеФормы:


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

Метод 4. Использование временных таблиц для сложной фильтрации

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

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

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

Резюме

Мы рассмотрели несколько подходов к решению задачи. Выбор конкретного метода зависит от ваших требований к интерфейсу:

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

← На главную