В процессе кастомизации или отладки отчета Табель учета рабочего времени (Т-13) в конфигурации Зарплата и управление персоналом 3.1 программисты часто сталкиваются с вопросом: откуда именно "прилетает" табельный номер? На первый взгляд в макете системы компоновки данных (СКД) может не быть явного поля с таким заголовком, а в коде вывод данных кажется завуалированным. В этой статье мы подробно разберем механику работы этого реквизита, выясним, как СКД преобразует имена полей, и изучим функции программной постобработки.
Начнем с того, что проанализируем структуру набора данных в схеме компоновки отчета. В типовых решениях поле ТабельныйНомер часто является результатом обращения к реквизиту Код справочника Сотрудники. Однако здесь есть важный технический нюанс, связанный с именованием полей в СКД.
Разберем, почему в коде или в настройках вы можете видеть идентификатор СотрудникКод вместо привычного Сотрудник.Код. Когда система компоновки данных обрабатывает запрос, содержащий обращение через точку, она автоматически создает алиас (псевдоним) для этого поля. Так как правила именования переменных в 1С запрещают использование спецсимволов (в том числе точки) в именах полей наборов данных, точка заменяется на отсутствие разделителя, и имя поля "схлопывается".
Проанализируем пример формирования псевдонимов на простом запросе:
Выбрать
Т1.Ссылка,
Т1.Код,
Т1.ВидНоменклатуры.Наименование
Из
Справочник.Номенклатура Как Т1
В результате работы СКД, если мы не укажем псевдонимы вручную, система присвоит полям следующие имена:
СсылкаКодВидНоменклатурыНаименованиеПо этой же логике в отчете Т-13 поле ДанныеПоСотруднику.СотрудникКод — это и есть значение реквизита Код объекта СправочникСсылка.Сотрудники.
Рассмотрим более глубокий уровень формирования отчета. В современных версиях ЗУП 3.1 отчет Т-13 не является простым запросом к базе данных. Для его построения используется механизм сбора данных во временные таблицы через программный интерфейс. За это отвечают общие модули, такие как УчетРабочегоВремениРасширенный или ЗарплатаКадрыОтчеты.
Система сначала формирует таблицу ДанныеДляПечати. На этом этапе происходит заполнение поля ТабельныйНомер. Важно понимать, что в справочнике Сотрудники табельный номер хранится в стандартном поле Код. Если вам нужно программно вмешаться в процесс получения номера, следует искать место заполнения структуры ДанныеПоСотруднику.
Одной из главных проблем при выводе табельного номера является наличие префиксов (префикс организации, префикс информационной базы) и ведущих нулей. Рассмотрим ситуацию: в базе номер сотрудника выглядит как ЦБ-000012, а в печатной форме табеля кадровики хотят видеть просто 12.
В конфигурации для этого предусмотрена специальная экспортная функция. Выясним, как она работает, заглянув в общий модуль ЗарплатаКадрыОтчеты:
Функция ТабельныйНомерНаПечать(Знач ТабельныйНомер) Экспорт
Возврат ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(ТабельныйНомер, Истина, Истина);
КонецФункции
Эта функция обращается к универсальному механизму удаления префиксов. Проанализируем параметры функции УдалитьПрефиксыИзНомераОбъекта:
"0ФГЛ-000001234").Истина, будет отсечена часть до первого дефиса.Истина, будут удалены все лидирующие нули в номере.Посмотрим на примеры преобразования:
УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Истина, Истина) вернет "1234".УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Ложь, Истина) вернет "Ф-1234" (в зависимости от настроек префиксации).При работе с табельными номерами важно разделять две сущности: Физическое лицо и Сотрудник. В 1С:ЗУП табельный номер присваивается именно элементу справочника Сотрудники. При повторном приеме одного и того же человека на работу создается новый элемент Сотрудник, которому система автоматически присвоит новый уникальный код.
Рассмотрим аргументы "за" и "против" ручного редактирования табельных номеров. Существует старая практика (основанная на нормативных актах СССР), согласно которой при повторном приеме сотруднику желательно присваивать его старый табельный номер. В 1С это может вызвать конфликт уникальности кодов.
Чтобы разрешить использование дублирующих или специфических номеров, проанализируем настройки программы:
Важный момент: если вы решите обойти уникальность с помощью префиксов (например, основной сотрудник 001, а внутренний совместитель С001), функция ТабельныйНомерНаПечать может "схлопнуть" их до одинакового вида при выводе в отчет, если префиксы настроены стандартно. Проанализируем ситуацию: для системы это разные коды, но для печатной формы Т-13 они станут идентичными, что обычно и требуется кадровым службам.
Если вам необходимо изменить логику вывода табельного номера в Т-13, выполните следующие шаги:
Сотрудник.Код.СотрудникКод и посмотрите, какой путь к данным для него указан.ТабельныйНомерНаПечать в модуле объекта отчета или в общих модулях, отвечающих за заполнение данных для табеля.СотрудникКод в выборке — это строковый реквизит. Если вы хотите превратить его в число (чтобы убрать нули без использования функций БСП), можно использовать конструкцию ВЫРАЗИТЬ(Сотрудник.Код КАК ЧИСЛО) в запросе, но будьте осторожны: если в коде встретятся буквы, запрос упадет с ошибкой.Таким образом, мы выяснили, что табельный номер в отчете — это результат цепочки: Справочник Сотрудники (реквизит Код) -> Запрос/Временная таблица -> Псевдоним СКД -> Программная очистка от префиксов.