Как правильно выводить номер доверенности в печатной форме при выборе разных подписантов?

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

При разработке внешних печатных форм часто возникает задача корректного отображения данных о подписанте. Одной из наиболее частых проблем является выбор «не того» сотрудника из справочника оснований права подписи. Давайте подробно разберем, как реализовать логику, при которой система будет правильно выбирать данные в зависимости от заполнения реквизита ЗаРуководителяПоПриказу.

Анализ проблемы: почему подставляется не тот сотрудник?

Часто разработчики совершают ошибку, опираясь на результат ВыборкаДетальныеЗаписи, полученный из основного запроса документа. Если запрос настроен неверно, он может брать данные «по умолчанию» или из настроек пользователя, игнорируя конкретного человека, указанного в документе. Чтобы исправить это, мы должны четко контролировать, какой именно объект мы передаем в запрос в качестве параметра Сотрудник.

Шаг 1: Правильная проверка заполненности реквизита

Первым делом определим, заполнено ли поле «За руководителя по приказу». Вместо использования устаревших сравнений с пустой ссылкой, мы будем использовать метод ЗначениеЗаполнено(). Это защитит наш код от ошибок при изменении типа данных или получении пустых значений.

Рассмотрим конструкцию, которая позволяет гибко управлять логикой:


Если ЗначениеЗаполнено(СсылкаНаОбъект.ЗаРуководителяПоПриказу) Тогда
    // Если приказ заполнен, работаем с подписантом по приказу
    Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.ЗаРуководителяПоПриказу);
Иначе
    // Если пусто, берем руководителя из основного документа
    Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.Руководитель);
КонецЕсли;

Шаг 2: Оптимизация запроса к справочнику оснований

Чтобы избежать ошибок при поиске, убедимся, что наш запрос максимально точен. В секции ГДЕ мы должны сравнивать не только сотрудника, но и организацию, подразделение и должность. Однако помните: лучше не использовать декартово произведение (соединение справочника и документа через запятую), а передавать все данные из документа в запрос как параметры.

Рассмотрим правильный подход к формированию запроса:


// Передаем параметры для фильтрации
Запрос.УстановитьПараметр("Организация", СсылкаНаОбъект.Организация);
Запрос.УстановитьПараметр("Сотрудник", ТекущийПодписант); 
Запрос.УстановитьПараметр("Должность", ВыбраннаяДолжность);

Запрос.Текст = 
    "ВЫБРАТЬ
    |    ОснованияПраваПодписи.Наименование КАК НомерДоверенности
    |ИЗ
    |    Справочник.ОснованияПраваПодписи КАК ОснованияПраваПодписи
    |ГДЕ
    |    ОснованияПраваПодписи.Организация = &Организация
    |    И ОснованияПраваПодписи.Сотрудник = &Сотрудник
    |    И ОснованияПраваПодписи.Сотрудник.Должность = &Должность";

Шаг 3: Обработка результатов и вывод в макет

После выполнения запроса, нам необходимо корректно обработать результат. Если запрос ничего не вернул, мы должны очистить поле в макете, чтобы в печатной форме не оставались старые данные.


РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Доверенность.Параметры.НомерДоверенности = Выборка.НомерДоверенности;
Иначе
    Доверенность.Параметры.НомерДоверенности = "";
КонецЕсли;

Основные рекомендации по доработке:

  1. Контроль данных: Всегда проверяйте, что СсылкаНаОбъект.Руководитель и СсылкаНаОбъект.ЗаРуководителяПоПриказу являются ссылками на один и тот же тип справочника Сотрудники. Если типы различаются, поиск не даст результатов.
  2. Отказ от лишних соединений: Старайтесь не соединять документ и справочник в одном запросе. Получите данные из документа в переменные 1С, а затем используйте их для поиска в справочнике. Это ускоряет работу системы.
  3. Использование БСП: Если ваша конфигурация поддерживает БСП (Библиотеку стандартных подсистем), рассмотрите возможность использования функций общего модуля ОтветственныеЛицаСервер. Это позволит получать данные о подписантах через типовой механизм, который уже учитывает специфику вашей конфигурации.

Следуя этим шагам, вы сможете настроить корректное отображение доверенностей в печатных формах, избежав путаницы с сотрудниками и повысив стабильность работы вашей внешней обработки.

← На главную