Для того чтобы не формировать справки "2-НДФЛ для сотрудника", а печатать их из документа "2-НДФЛ для передачи в ИФНС" в типовой конфигурации ЗУП 3.1.9 уже есть соответствующая печатная форма, но в ней при печати выходят справки на всех сотрудников в документе. Между тем справки 2-НДФЛ обычно просят не все сотрудники. Бухгалтера попросили добавить функционал печати справок по выбранному в документе сотруднику.
Для реализации необходимо определить, на какой строке установлен курсор в печатаемом документе, это можно сделать только на клиенте, по этому вид использования в описании обработки ставим "ОткрытиеФормы":
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.СправкиНДФЛДляПередачиВНалоговыйОрган");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Справка о доходах (2-НДФЛ) по сотруднику"); ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма 'Справка о доходах (2-НДФЛ) по сотруднику'");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Справка о доходах (2-НДФЛ) по сотруднику", "Справка о доходах (2-НДФЛ) по сотруднику", "ОткрытиеФормы", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Далее в форме обработки находим открытую форму печатаемого документа и получаем текущую строку табличной части:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт //Здесь МассивОбъектов и есть ссылка или ссылки на документ или справочник, в который добавлена обработка
Для Каждого Элемент Из МассивОбъектов Цикл
ФормаОкна = ПолучитьОкноДляОтладки(Элемент.Значение);
ТекСотрудник = ФормаОкна.Элементы.Сотрудники.ТекущиеДанные.Сотрудник;
Доки = Новый Массив;
Доки.Добавить(Элемент.Значение);
ТабДокумент = ПечатьНаСервере(Доки, ТекСотрудник);
КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("Справка2НДФЛ");
ПечатнаяФорма = УправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, "Справка2НДФЛ");
ПечатнаяФорма.СинонимМакета = "Справка2НДФЛ";
ПечатнаяФорма.ТабличныйДокумент = ТабДокумент;
ПечатнаяФорма.ИмяФайлаПечатнойФормы = "Справка2НДФЛ";
ОбластиОбъектов = Новый СписокЗначений;
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
КонецЦикла;
КонецПроцедуры
//Эта функция поиска окна позаимствована, источник не помню.
&НаКлиенте
Функция ПолучитьОкноДляОтладки(Элемент)
//Зададим ключ поиска документа, из которого вызвана данная обработка,
//чтобы получить ссылку на редактирумый документ в удобном виде для
//функции ОткрытьФорму()
КлючПоиска = Новый Структура("Ключ", Элемент);
//Но нам не надо открывать новую форму (окно) для изменяемого документа, а
//Нам надо все изменения показать в уже открытых у клиента окнах
Окна = ПолучитьОкна();
Для каждого Окно1 из Окна Цикл
//Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому
//сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна
//изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться
//Наименование, номер и дата нужного документа - будем изменять
Если НЕ Окно1.Основное
И Найти(Окно1.Заголовок, Элемент) Тогда
//Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне
//в функцию ОткрытьФорму()
//Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного
Форма = ОткрытьФорму("Документ.СправкиНДФЛДляПередачиВНалоговыйОрган.Форма.ФормаДокумента",КлючПоиска,,,Окно1);
Возврат Форма;
КонецЕсли;
КонецЦикла;
КонецФункции
В результате формируется печатная форма по выделенному в документе сотруднику.