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