При разработке внешних печатных форм часто возникает задача корректного отображения данных о подписанте. Одной из наиболее частых проблем является выбор «не того» сотрудника из справочника оснований права подписи. Давайте подробно разберем, как реализовать логику, при которой система будет правильно выбирать данные в зависимости от заполнения реквизита ЗаРуководителяПоПриказу.
Часто разработчики совершают ошибку, опираясь на результат ВыборкаДетальныеЗаписи, полученный из основного запроса документа. Если запрос настроен неверно, он может брать данные «по умолчанию» или из настроек пользователя, игнорируя конкретного человека, указанного в документе. Чтобы исправить это, мы должны четко контролировать, какой именно объект мы передаем в запрос в качестве параметра Сотрудник.
Первым делом определим, заполнено ли поле «За руководителя по приказу». Вместо использования устаревших сравнений с пустой ссылкой, мы будем использовать метод ЗначениеЗаполнено(). Это защитит наш код от ошибок при изменении типа данных или получении пустых значений.
Рассмотрим конструкцию, которая позволяет гибко управлять логикой:
Если ЗначениеЗаполнено(СсылкаНаОбъект.ЗаРуководителяПоПриказу) Тогда
// Если приказ заполнен, работаем с подписантом по приказу
Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.ЗаРуководителяПоПриказу);
Иначе
// Если пусто, берем руководителя из основного документа
Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.Руководитель);
КонецЕсли;
Чтобы избежать ошибок при поиске, убедимся, что наш запрос максимально точен. В секции ГДЕ мы должны сравнивать не только сотрудника, но и организацию, подразделение и должность. Однако помните: лучше не использовать декартово произведение (соединение справочника и документа через запятую), а передавать все данные из документа в запрос как параметры.
Рассмотрим правильный подход к формированию запроса:
// Передаем параметры для фильтрации
Запрос.УстановитьПараметр("Организация", СсылкаНаОбъект.Организация);
Запрос.УстановитьПараметр("Сотрудник", ТекущийПодписант);
Запрос.УстановитьПараметр("Должность", ВыбраннаяДолжность);
Запрос.Текст =
"ВЫБРАТЬ
| ОснованияПраваПодписи.Наименование КАК НомерДоверенности
|ИЗ
| Справочник.ОснованияПраваПодписи КАК ОснованияПраваПодписи
|ГДЕ
| ОснованияПраваПодписи.Организация = &Организация
| И ОснованияПраваПодписи.Сотрудник = &Сотрудник
| И ОснованияПраваПодписи.Сотрудник.Должность = &Должность";
После выполнения запроса, нам необходимо корректно обработать результат. Если запрос ничего не вернул, мы должны очистить поле в макете, чтобы в печатной форме не оставались старые данные.
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Доверенность.Параметры.НомерДоверенности = Выборка.НомерДоверенности;
Иначе
Доверенность.Параметры.НомерДоверенности = "";
КонецЕсли;
СсылкаНаОбъект.Руководитель и СсылкаНаОбъект.ЗаРуководителяПоПриказу являются ссылками на один и тот же тип справочника Сотрудники. Если типы различаются, поиск не даст результатов.ОтветственныеЛицаСервер. Это позволит получать данные о подписантах через типовой механизм, который уже учитывает специфику вашей конфигурации.Следуя этим шагам, вы сможете настроить корректное отображение доверенностей в печатных формах, избежав путаницы с сотрудниками и повысив стабильность работы вашей внешней обработки.