Как в 1С:ЗУП 3.1 реализовать печатную форму приказа об изменении фамилии с выводом старых и новых данных?

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

При работе в 1С:Зарплата и Управление Персоналом 3.1 часто возникает необходимость создания произвольных печатных форм, которые не предусмотрены типовым функционалом. Одной из таких задач является формирование приказа об изменении персональных данных (например, при смене фамилии сотрудником). Основная трудность здесь заключается в том, чтобы корректно вытянуть из базы одновременно и «старую», и «новую» фамилию, а также актуальные кадровые сведения (должность и подразделение).

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

Разбор типичных ошибок в запросах

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


| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК ПриемНаРаботу 
| ПО ТекущиеКадровыеДанныеСотрудников.ТекущееПодразделение = ПриемНаРаботу.Подразделение

Проанализируем этот фрагмент. Соединение выполняется по полю Подразделение. Это в корне неверно, так как в одном подразделении может работать множество сотрудников. В результате такого «внутреннего соединения» данные могут либо размножиться (дубли), либо исчезнуть, если в таблице приемов нет точного соответствия. Запомните: любые кадровые сведения всегда должны привязываться к конкретному Сотруднику или его Физическому лицу.

Как получить историю ФИО: «старая» и «новая» фамилия

Данные о фамилиях хранятся в периодическом регистре сведений ФИОФизическихЛиц. Каждая запись имеет период — дату, с которой ФИО вступает в силу. Чтобы получить «предыдущую» фамилию, нам нужно обратиться к состоянию регистра на момент времени, предшествующий изменению.

Рассмотрим алгоритм действий в запросе:

  1. Определяем дату события: Это дата, когда фамилия была официально изменена в системе.
  2. Получаем новые данные: Используем срез последних на дату документа или дату изменения.
  3. Получаем старые данные: Делаем срез последних на секунду раньше даты изменения. Для этого в параметрах запроса можно использовать выражение ДОБАВИТЬКДАТЕ(&ДатаИзменения, СЕКУНДА, -1).

Посмотрим на пример правильного построения запроса для получения истории:


ВЫБРАТЬ
    ВР1.Сотрудник,
    ФИОСрезПоследних.Фамилия КАК НоваяФамилия,
    ФИОСрезПредыдущих.Фамилия КАК СтараяФамилия
ИЗ
    ВР1 КАК ВР1
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&ПериодНовый, ) КАК ФИОСрезПоследних
        ПО ВР1.ФизическоеЛицо = ФИОСрезПоследних.ФизическоеЛицо
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&ПериодСтарый, ) КАК ФИОСрезПредыдущих
        ПО ВР1.ФизическоеЛицо = ФИОСрезПредыдущих.ФизическоеЛицо

Корректное получение должности и подразделения

Выясним причину, почему данные о должности могут не выводиться. В ЗУП 3.1 кадровая история является интервальной. Для простого получения текущих данных лучше всего использовать регистр сведений ТекущиеКадровыеДанныеСотрудников. Если же нам нужны данные на конкретное число (например, на дату приказа), следует использовать КадроваяИсторияСотрудников.СрезПоследних.

Рассмотрим структуру запроса, который собирает все данные воедино:


ВЫБРАТЬ
    ДанныеДокумента.Сотрудник КАК Сотрудник,
    ДанныеДокумента.Дата КАК ДатаПриказа,
    КадровыеДанные.Подразделение КАК Подразделение,
    КадровыеДанные.Должность КАК Должность
ПОМЕСТИТЬ ВТ_ОсновныеДанные
ИЗ
    Документ.ПроизвольныйПриказ.Сотрудники КАК ДанныеДокумента
ГДЕ
    ДанныеДокумента.Ссылка В(&МассивОбъектов)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.Подразделение.Представление КАК ПодразделениеПредставление,
    ВТ.Должность.Представление КАК ДолжностьПредставление,
    ФИОНовое.Фамилия + " " + ФИОНовое.Имя + " " + ФИОНовое.Отчество КАК ФИОНовое,
    ФИОСтарое.Фамилия + " " + ФИОСтарое.Имя + " " + ФИОСтарое.Отчество КАК ФИОСтарое
ИЗ
    ВТ_ОсновныеДанные КАК ВТ
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&ДатаНовая, ) КАК ФИОНовое
        ПО ВТ.Сотрудник.ФизическоеЛицо = ФИОНовое.ФизическоеЛицо
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&ДатаСтарая, ) КАК ФИОСтарое
        ПО ВТ.Сотрудник.ФизическоеЛицо = ФИОСтарое.ФизическоеЛицо

Профессиональный подход: Использование функций БСП

Проанализируем ситуацию с точки зрения опытного разработчика 1С. Писать прямые запросы к регистрам сведений в ЗУП 3.1 — это трудоемко и рискованно, так как структура конфигурации может измениться с обновлениями. Программный интерфейс (API) конфигурации предлагает готовые функции в модуле КадровыйУчет.

Вместо написания сложного запроса, мы можем вызвать метод КадровыйУчет.КадровыеДанныеСотрудников. Разберем по шагам, как это работает:

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

Пример кода для получения данных через БСП:


СписокПолей = "Фамилия, Имя, Отчество, Подразделение, Должность";
КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, СписокПолей, ДатаПриказа);

Для Каждого СтрокаДанных Из КадровыеДанные Цикл
    // Здесь мы получаем готовую структуру с данными
    НоваяФамилия = СтрокаДанных.Фамилия;
КонецЦикла;

Для получения старой фамилии достаточно вызвать эту же функцию еще раз, передав в качестве параметра даты НачалоДня(ДатаИзменения) - 1.

Оформление печатной формы в макете

После того как данные получены, их нужно вывести в макет. Не забудьте, что в приказе часто требуется указывать ФИО в родительном или дательном падеже (например, «ПРИКАЗЫВАЮ: Изменить персональные данные сотруднику Ивановой Марии...»).

Для склонения в ЗУП 3.1 используйте функцию:

СклонениеФИО.Просклонять(ФИО, 3, Результат, Пол);

Где 3 — это номер падежа (дательный).

Подведем итоги

Для успешной реализации приказа об изменении персональных данных мы проделали следующую работу:

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

← На главную