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