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