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

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

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

Почему стандартный серверный метод печати не подходит

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

На стороне сервера контекст клиентского окна отсутствует: сервер ничего не знает о положении курсора, текущей активной вкладке или выделенной строке. Поэтому свойство ТекущаяСтрока или ТекущиеДанные на сервере получить невозможно. Для решения задачи необходимо перенести точку входа команды печати на сторону клиента.

Решение 1: Использование типа команды «ВызовКлиентскогоМетода»

Проанализируем базовый способ решения в рамках БСП. В модуле объекта внешней печатной формы в функции СведенияОВнешнейОбработке() необходимо для команды указать вариант использования "ВызовКлиентскогоМетода".

Рассмотрим, как регистрируется такая команда:


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

Теперь в модуле формы внешней обработки реализуем клиентскую процедуру Печать(). Получим данные текущей строки из формы документа через ВладелецФормы:


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

Важные нюансы работы с данными формы на клиенте

Разберем типичные ошибки и особенности, которые нужно учитывать при реализации логики:

  1. Проверка на Неопределено: Если табличная часть пуста или пользователь кликнул в командную панель/шапку, обращение к ТекущиеДанные.Сотрудник вызовет исключение. Всегда проверяйте результат на Неопределено.
  2. Несохраненные данные: Если пользователь изменил значения в строке документа и не нажал «Записать», при выполнении запроса к базе данных на сервере вернутся старые данные. Если печать должна учитывать введенные, но еще не сохраненные данные, передавайте значения реквизитов напрямую из структуры ТекущиеДанные на сервер в виде структуры параметров.
  3. Множественный выбор строк: Если пользователю нужно выделить несколько строк через Ctrl или Shift, используйте коллекцию Элементы.ТабличнаяЧасть.ВыделенныеСтроки, которая содержит массив идентификаторов выделенных строк.

Решение 2: Добавление команды через Расширение конфигурации

Если нет жесткого требования использовать именно подключаемую внешнюю печатную форму, гораздо удобнее создать Расширение конфигурации.

Выясним преимущества такого подхода:

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

Решение 3: Отчет на СКД вместо печатной формы

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

← На главную