При разработке внешних печатных форм в конфигурациях на платформе 1С:Предприятие 8.3 с управляемыми формами часто возникает задача сформировать документ не по всем данным табличной части, а только по конкретной строке (например, по сотруднику, на котором сейчас установлен курсор). Разберем, с какими ограничениями платформы и Библиотеки Стандартных Подсистем (БСП) приходится сталкиваться и как правильно реализовать данный сценарий.
По умолчанию большинство внешних печатных форм БСП регистрируются с вариантом использования команды «ВызовСерверногоМетода». В этом случае платформенный механизм формирует контекст на стороне сервера и передает в процедуру печати только массив ссылок на документы (МассивОбъектов).
На стороне сервера контекст клиентского окна отсутствует: сервер ничего не знает о положении курсора, текущей активной вкладке или выделенной строке. Поэтому свойство ТекущаяСтрока или ТекущиеДанные на сервере получить невозможно. Для решения задачи необходимо перенести точку входа команды печати на сторону клиента.
Проанализируем базовый способ решения в рамках БСП. В модуле объекта внешней печатной формы в функции СведенияОВнешнейОбработке() необходимо для команды указать вариант использования "ВызовКлиентскогоМетода".
Рассмотрим, как регистрируется такая команда:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДлительныеОперации.ПараметрыРегистрацииВнешнейОбработки();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.НачислениеЗарплаты");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать по текущему сотруднику";
НоваяКоманда.Идентификатор = "ПечатьПоТекущейСтроке";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Теперь в модуле формы внешней обработки реализуем клиентскую процедуру Печать(). Получим данные текущей строки из формы документа через ВладелецФормы:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
// Проверяем, что форма открыта из документа
ФормаДокумента = ЭтаФорма.ВладелецФормы;
Если ФормаДокумента = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем текущие данные строки табличной части
ТекущиеДанные = ФормаДокумента.Элементы.Начисления.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ПоказатьПредупреждение(, "Не выбрана строка в табличной части!");
Возврат;
КонецЕсли;
// Формируем параметры и передаем на сервер для формирования печатного документа
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("Сотрудник", ТекущиеДанные.Сотрудник);
ПараметрыПечати.Вставить("ДокументСсылка", ОбъектыНазначения[0]);
СформироватьИПоказатьПечатнуюФорму(ПараметрыПечати);
КонецПроцедуры
Разберем типичные ошибки и особенности, которые нужно учитывать при реализации логики:
Неопределено: Если табличная часть пуста или пользователь кликнул в командную панель/шапку, обращение к ТекущиеДанные.Сотрудник вызовет исключение. Всегда проверяйте результат на Неопределено.ТекущиеДанные на сервер в виде структуры параметров.Ctrl или Shift, используйте коллекцию Элементы.ТабличнаяЧасть.ВыделенныеСтроки, которая содержит массив идентификаторов выделенных строк.Если нет жесткого требования использовать именно подключаемую внешнюю печатную форму, гораздо удобнее создать Расширение конфигурации.
Выясним преимущества такого подхода:
Элементы.Начисления.ТекущиеДанные без необходимости обращаться через ВладелецФормы.В случаях, когда пользователю часто требуются различные варианты отборов (по одному сотруднику, по подразделению, по группе должностей), разработка отдельной печатной формы может быть нецелесообразна. Гораздо гибче реализовать отчет на базе Системы компоновки данных (СКД), где в качестве параметров или отборов пользователь сможет самостоятельно выбирать как документ-основание, так и конкретного сотрудника.