В какой момент и где формируется табельный номер сотрудника в 1С:ЗУП 3.1

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

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

Анатомия табельного номера

Прежде всего, проанализируем структуру данных. В 1С:ЗУП 3.1 табельный номер не является отдельным уникальным реквизитом, созданным разработчиками конфигурации. Это стандартный реквизит Код справочника Сотрудники.

Важные характеристики этого реквизита:

  1. Тип данных: Строка. Это позволяет использовать в номере как цифры, так и префиксы (буквы).
  2. Автонумерация: Для справочника включено свойство "Автонумерация", что означает делегирование процесса создания нового номера платформе 1С:Предприятие.
  3. Контроль уникальности: Система автоматически проверяет, чтобы в рамках информационной базы (или организации, если настроены префиксы) коды не повторялись.

Механизм генерации номера и событие ПриУстановкеНовогоКода

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

Проанализируем ключевое событие — ПриУстановкеНовогоКода. Это специализированное событие модуля объекта справочника, которое вызывается платформой в тот момент, когда объекту требуется назначить новый номер (обычно при первом вызове метода Записать(), если код пустой).

В ЗУП 3.1, как и в других современных конфигурациях на базе БСП, логика этого события вынесена в подписки. Рассмотрим типичный путь исполнения:

  1. Платформа инициирует установку нового кода.
  2. Срабатывает подписка на событие (например, УстановитьПрефиксИнформационнойБазыИОрганизации).
  3. Вызывается процедура из общего модуля ПрефиксацияОбъектовСобытия.

Где формируется префикс

Как мы выяснили, префикс — это часть кода. Рассмотрим процедуру УстановитьПрефикс в общем модуле ПрефиксацияОбъектовСобытия. Здесь система собирает будущую "голову" табельного номера.

Префикс обычно складывается из двух составляющих:

  1. Префикс информационной базы: Настраивается в разделе "Администрирование — Синхронизация данных". Он нужен для того, чтобы при обмене данными между разными базами коды объектов не пересекались.
  2. Префикс организации: Задается в карточке организации на вкладке "Главное". Это позволяет вести раздельную нумерацию сотрудников для разных юридических лиц в одной базе.

Проанализируем код, который подготавливает префикс:


// Фрагмент логики в общем модуле
Процедура УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы = Истина, УстановитьПрефиксОрганизации = Истина) Экспорт
    
    // Получение префикса ИБ
    Если УстановитьПрефиксИнформационнойБазы Тогда
        Префикс = Префикс + ПрефиксацияОбъектовПовтИсп.ПрефиксИнформационнойБазы();
    КонецЕсли;
    
    // Получение префикса организации
    Если УстановитьПрефиксОрганизации Тогда
        // Система ищет реквизит Префикс у владельца или в самой организации
        Префикс = Префикс + ПрефиксацияОбъектовСобытия.ПрефиксОрганизации(Источник.Организация);
    КонецЕсли;
    
КонецПроцедуры

Как префикс соединяется с номером

Это самый важный момент для понимания. Разработчик в 1С не пишет код вида Код = Префикс + "0001" вручную в стандартном механизме.

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

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

Практическая задача: Как избавиться от префикса в табельном номере

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

Способ 1: Настройка данных (без программирования)

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

Способ 2: Программное вмешательство

Для того чтобы точечно отключить префиксацию только для справочника Сотрудники, выполним следующие действия:

  1. Найдем в модуле объекта справочника Сотрудники процедуру ПриУстановкеНовогоКода.
  2. Если она пустая, значит работает подписка. Мы можем создать свою подписку на это же событие, которая будет срабатывать позже стандартной.
  3. В своей процедуре-обработчике мы можем принудительно очистить префикс.

Посмотрим на пример кода в обработчике события:


Процедура ПередУстановкойНовогоКодаСотрудника(Источник, СтандартнаяОбработка, Префикс) Экспорт
    // Если мы хотим полностью убрать префиксы для сотрудников
    Префикс = ""; 
    // Платформа продолжит генерацию, используя пустой префикс,
    // и найдет максимальный свободный цифровой номер.
КонецПроцедуры

Важные нюансы и "сломанная" нумерация

Выясним, почему иногда автоматика перестает работать корректно. Поскольку Код — это строка, платформа использует посимвольное сравнение для поиска максимума.

Рассмотрим пример:

В базе есть номера: 001, 002, 003. Пользователь вручную вводит номер 999. Следующий автоматически созданный номер будет 1000 (если длина кода позволяет). Но если пользователь введет А99, а префикс у нас пустой, это может сбить алгоритм поиска максимального числа.

Если нумерация "сбилась" (например, начали присваиваться странные номера или выдается ошибка об уникальности), воспользуемся стандартной обработкой "Обновление нумерации объектов". Она пересчитывает внутренние счетчики платформы, исходя из реально существующих данных в таблице базы данных.

Связь сотрудника и физического лица

Проанализируем еще одну особенность ЗУП 3.1. При создании нового сотрудника для человека, который уже работал в компании (повторный прием), система создает новый элемент справочника Сотрудники. Несмотря на то, что ФизическоеЛицо остается прежним, ТабельныйНомер (Код) будет присвоен новый.

Это принципиальное отличие от версии 2.5, и оно обусловлено архитектурой учета: один человек может иметь несколько табельных номеров в разные периоды работы или при работе по внутреннему совместительству. Механизм формирования кода при этом остается стандартным — через те же события префиксации, о которых мы говорили выше.

Таким образом, мы разобрали полную цепочку формирования табельного номера: от платформенного свойства Код до работы общих модулей БСП. Понимание этого процесса позволяет гибко настраивать нумерацию под требования любого бизнеса.

← На главную