Как программно получить и вывести основание подписи в печатную форму

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Управленческий учет
← На главную

При разработке внешних печатных форм в системе 1С программисты часто сталкиваются с ситуацией, когда в макет необходимо вывести данные, которых нет в реквизитах самого документа. Типичный пример — вывод Основания подписи (номера доверенности или приказа) в счете на оплату. В типовых конфигурациях, таких как "Бухгалтерия предприятия 3.0", данные о праве подписи хранятся в отдельном справочнике ОснованияПраваПодписи, но прямой ссылки на него в документе может не быть. Разберем подробно, как правильно найти и извлечь эти данные.

Анализ структуры данных: реквизит формы против реквизита объекта

Первое, с чем нужно разобраться — это различие между тем, что мы видим на экране, и тем, как данные хранятся в базе. Рассмотрим ситуацию: на форме элемента справочника вы видите поле с заголовком "Основание", но в конфигураторе у этого справочника такого реквизита нет. Как выяснилось в ходе обсуждения, в данном случае заголовок "Основание" просто назначен стандартному реквизиту Наименование. Это распространенная практика для улучшения пользовательского интерфейса.

Проанализируем, почему не стоит использовать метод НайтиПоНаименованию для решения этой задачи. Если мы напишем код:


ОснованиеСсылка = Справочники.ОснованияПраваПодписи.НайтиПоНаименованию("Доверенность №1");

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

Алгоритм динамического поиска основания

Выясним, по каким критериям можно связать документ (например, "Счет на оплату") и справочник ОснованияПраваПодписи, если между ними нет прямой ссылки. Для корректного подбора нам понадобятся три составляющие:

  1. Организация: Основание должно принадлежать той же организации, что и документ.
  2. Сотрудник (Физическое лицо): Нужно понимать, кто именно подписывает документ.
  3. Дата документа: Доверенность или приказ имеют период действия, и дата счета должна входить в этот интервал.

Рассмотрим, как реализовать этот поиск с помощью запроса. Это наиболее правильный и производительный метод в системе 1С:Предприятие.

Реализация поиска через запрос

Предположим, у нас есть объект документа СсылкаНаДокумент. Нам нужно извлечь из него дату, организацию и руководителя. Разберем по шагам создание запроса к справочнику ОснованияПраваПодписи:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	Основания.Наименование КАК Наименование
    |ИЗ
    |	Справочник.ОснованияПраваПодписи КАК Основания
    |ГДЕ
    |	Основания.Владелец = &Организация
    |	И Основания.ФизическоеЛицо = &ФизЛицо
    |	И Основания.ДатаНачала <= &ДатаДокумента
    |	И (Основания.ДатаОкончания >= &ДатаДокумента 
    |		ИЛИ Основания.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1))
    |	И НЕ Основания.ПометкаУдаления";

Запрос.УстановитьПараметр("Организация", СсылкаНаДокумент.Организация);
Запрос.УстановитьПараметр("ФизЛицо", СсылкаНаДокумент.Руководитель); // Или другой подписант
Запрос.УстановитьПараметр("ДатаДокумента", СсылкаНаДокумент.Дата);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Проанализируем важные моменты в этом коде. Обратите внимание на условие по дате окончания: Основания.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1). Это проверка на пустую дату, которая в 1С означает, что документ бессрочный. Также мы используем ВЫБРАТЬ ПЕРВЫЕ 1, чтобы получить только одну актуальную запись, если их вдруг окажется несколько.

Интеграция в процесс печати

Теперь рассмотрим, как применить полученное значение в коде формирования печатной формы. Обычно работа с макетом строится через получение областей и заполнение параметров. Разберем пример вывода секции подвала документа, где указывается основание подписи:


// Получаем область из макета
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

// Заполняем параметры области
ОбластьПодвал.Параметры.ДолжностьРуководителя = СсылкаНаДокумент.Руководитель.Должность;
ОбластьПодвал.Параметры.ФИОРуководителя = ФизическиеЛица.ФамилияИнициалы(СсылкаНаДокумент.Руководитель);

// Используем наш алгоритм поиска основания (код запроса выше)
// ... (здесь вставляется логика получения ЗначениеОснования)

ОбластьПодвал.Параметры.ОснованиеПодписи = ЗначениеОснования;

// Выводим область в итоговый табличный документ
ТабДок.Вывести(ОбластьПодвал);

Важно помнить, что если вы разрабатываете именно внешнюю печатную форму, данные о подписантах часто уже подготовлены в основной процедуре печати типовой конфигурации. Рекомендуется заглянуть в модуль менеджера соответствующего документа и посмотреть, как там вызываются функции вроде СведенияОМенеджереПечати или ПодготовитьДанныеДляПечати. При необходимости можно использовать готовую внешнюю печатную форму счета на оплату с подписями и факсимиле для БП 3.0.

Использование типовых механизмов БСП

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

В конфигурации "Бухгалтерия предприятия" часто используется модуль ОтветственныеЛицаБП. Проанализируем примерный вызов функции для получения сведений о подписанте:


СведенияОПодписанте = ОтветственныеЛицаБП.СведенияОМенеджере(
    СсылкаНаДокумент.Организация, 
    СсылкаНаДокумент.Дата, 
    СсылкаНаДокумент.Руководитель
);

// Теперь мы можем достать основание, если оно было заполнено
Если СведенияОПодписанте.Свойство("Основание") Тогда
    ЗначениеОснования = СведенияОПодписанте.Основание;
КонецЕсли;

Преимущество использования типовых функций в том, что они автоматически обрабатывают приоритеты: если в самом документе (через гиперссылку "Подписи") пользователь вручную указал конкретное основание, типовой механизм вернет именно его. Если же в документе пусто — функция выполнит поиск по регистру сведений или справочнику согласно установленным настройкам организации. Для модификации типовых макетов без правки конфигурации можно применить инструмент постобработки печатных форм на базе механизмов БСП.

Заключение

Подведем итоги. Чтобы "вытащить" реквизит, который есть на форме, но отсутствует в прямой связи с документом, мы должны:

  1. Определить реальное имя реквизита в метаданных (через конфигуратор или отладчик).
  2. Выявить логическую связь между объектами (Организация + Физлицо + Период).
  3. Реализовать получение данных через запрос для обеспечения динамичности и производительности.
  4. По возможности использовать функции типовых подсистем конфигурации, чтобы не "изобретать велосипед" и сохранить совместимость с обновлениями.

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

← На главную