Как реализовать печать текущей строки из табличной части документа во внешней печатной форме?

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

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

Проблема контекста: почему стандартная ВПФ «не видит» строку

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

Решение 1: Использование типа вызова «Открытие формы»

Разберем один из самых простых способов получения данных о выделенных строках без изменения кода конфигурации. При регистрации внешней печатной формы в справочнике «Дополнительные отчеты и обработки» можно указать тип вызова: Открытие формы.

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

  1. В модуле формы обработки обращаемся к свойству ВладелецФормы.
  2. Если печать вызвана из формы документа, владельцем будет сама форма документа.
  3. Через владельца мы получаем доступ к элементу управления (таблице) и его свойству ВыделенныеСтроки.

Пример кода в форме внешней обработки:


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

Решение 2: Использование расширений и дополнительных параметров БСП

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

  1. Создаем расширение и добавляем в него форму документа (например, «Прием на работу списком»).
  2. Перехватываем процедуру ПриСозданииНаСервере или используем программное добавление команд.
  3. В обработчик команды печати добавляем заполнение структуры параметров.

В модуле формы документа в расширении можно переопределить стандартную команду или добавить свою. Главная задача — передать массив идентификаторов строк. Рассмотрим пример кода:


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

Технический нюанс: Идентификаторы против Индексов

Важно помнить критическое различие: свойство ВыделенныеСтроки возвращает идентификаторы (ID) строк, а не их номера. Индексы строк могут меняться при сортировке или удалении, в то время как идентификатор остается неизменным в рамках текущего сеанса работы с формой. В коде внешней печатной формы (в модуле объекта) поиск строки должен выглядеть следующим образом:


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

Решение 3: Внешняя обработка заполнения (для ЗУП 3.1)

Рассмотрим ситуацию, когда конфигурацию менять нельзя совсем (даже через расширения). В этом случае можно использовать механизм Дополнительных обработок заполнения ТЧ. Вместо того чтобы нажимать «Печать», пользователь выбирает «Заполнить» -> «Печать договора для строки».

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

Нюансы фонового выполнения

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

Выводы и рекомендации

Подведем итог. Выбор метода зависит от ваших возможностей по модификации системы:

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

Такой подход делает работу пользователей в многострочных документах (таких как Ведомости, Приемы на работу списком, Заказы клиентов) значительно удобнее и эффективнее.

← На главную