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