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