В системе 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) вопрос формирования табельных номеров часто вызывает затруднения у разработчиков. Это связано с тем, что логика распределена между платформенными механизмами, кодом конфигурации и Библиотекой стандартных подсистем (БСП). Разберем детально, как работает этот механизм, где искать код формирования и как можно на него повлиять.
Прежде всего, проанализируем структуру данных. В 1С:ЗУП 3.1 табельный номер не является отдельным уникальным реквизитом, созданным разработчиками конфигурации. Это стандартный реквизит Код справочника Сотрудники.
Важные характеристики этого реквизита:
Многие разработчики ошибочно ищут момент формирования номера в процедуре ПриЗаписи или ПередЗаписью. На самом деле, когда выполнение кода доходит до ПриЗаписи, номер в большинстве случаев уже сформирован.
Проанализируем ключевое событие — ПриУстановкеНовогоКода. Это специализированное событие модуля объекта справочника, которое вызывается платформой в тот момент, когда объекту требуется назначить новый номер (обычно при первом вызове метода Записать(), если код пустой).
В ЗУП 3.1, как и в других современных конфигурациях на базе БСП, логика этого события вынесена в подписки. Рассмотрим типичный путь исполнения:
УстановитьПрефиксИнформационнойБазыИОрганизации).ПрефиксацияОбъектовСобытия.Как мы выяснили, префикс — это часть кода. Рассмотрим процедуру УстановитьПрефикс в общем модуле ПрефиксацияОбъектовСобытия. Здесь система собирает будущую "голову" табельного номера.
Префикс обычно складывается из двух составляющих:
Проанализируем код, который подготавливает префикс:
// Фрагмент логики в общем модуле
Процедура УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы = Истина, УстановитьПрефиксОрганизации = Истина) Экспорт
// Получение префикса ИБ
Если УстановитьПрефиксИнформационнойБазы Тогда
Префикс = Префикс + ПрефиксацияОбъектовПовтИсп.ПрефиксИнформационнойБазы();
КонецЕсли;
// Получение префикса организации
Если УстановитьПрефиксОрганизации Тогда
// Система ищет реквизит Префикс у владельца или в самой организации
Префикс = Префикс + ПрефиксацияОбъектовСобытия.ПрефиксОрганизации(Источник.Организация);
КонецЕсли;
КонецПроцедуры
Это самый важный момент для понимания. Разработчик в 1С не пишет код вида Код = Префикс + "0001" вручную в стандартном механизме.
Выясним, что происходит дальше: после того как в процедуре УстановитьПрефикс переменная Префикс была заполнена (например, значением "МС"), управление возвращается платформе. Платформа берет этот префикс, идет в таблицу справочника Сотрудники в базе данных, находит там самый большой существующий код, начинающийся на "МС", извлекает из него числовую часть, увеличивает ее на 1 и дополняет нулями.
Если вы хотите вмешаться в этот процесс, вам нужно использовать параметр Префикс в соответствующих процедурах. Если вы измените его на пустую строку, платформа будет искать максимальный чисто числовой код.
Рассмотрим ситуацию, когда заказчик просит, чтобы табельные номера были строго цифровыми, несмотря на наличие нескольких организаций. Разберем по шагам, как это реализовать.
Способ 1: Настройка данных (без программирования)
Проанализируем настройки. Если мы удалим префиксы в карточках всех организаций и в настройках синхронизации, система естественным образом начнет генерировать только цифровые коды. Однако это может быть невозможно, если префиксы нужны для других документов (счетов, приказов).
Способ 2: Программное вмешательство
Для того чтобы точечно отключить префиксацию только для справочника Сотрудники, выполним следующие действия:
Сотрудники процедуру ПриУстановкеНовогоКода.Посмотрим на пример кода в обработчике события:
Процедура ПередУстановкойНовогоКодаСотрудника(Источник, СтандартнаяОбработка, Префикс) Экспорт
// Если мы хотим полностью убрать префиксы для сотрудников
Префикс = "";
// Платформа продолжит генерацию, используя пустой префикс,
// и найдет максимальный свободный цифровой номер.
КонецПроцедуры
Выясним, почему иногда автоматика перестает работать корректно. Поскольку Код — это строка, платформа использует посимвольное сравнение для поиска максимума.
Рассмотрим пример:
В базе есть номера: 001, 002, 003. Пользователь вручную вводит номер 999. Следующий автоматически созданный номер будет 1000 (если длина кода позволяет). Но если пользователь введет А99, а префикс у нас пустой, это может сбить алгоритм поиска максимального числа.
Если нумерация "сбилась" (например, начали присваиваться странные номера или выдается ошибка об уникальности), воспользуемся стандартной обработкой "Обновление нумерации объектов". Она пересчитывает внутренние счетчики платформы, исходя из реально существующих данных в таблице базы данных.
Проанализируем еще одну особенность ЗУП 3.1. При создании нового сотрудника для человека, который уже работал в компании (повторный прием), система создает новый элемент справочника Сотрудники. Несмотря на то, что ФизическоеЛицо остается прежним, ТабельныйНомер (Код) будет присвоен новый.
Это принципиальное отличие от версии 2.5, и оно обусловлено архитектурой учета: один человек может иметь несколько табельных номеров в разные периоды работы или при работе по внутреннему совместительству. Механизм формирования кода при этом остается стандартным — через те же события префиксации, о которых мы говорили выше.
Таким образом, мы разобрали полную цепочку формирования табельного номера: от платформенного свойства Код до работы общих модулей БСП. Понимание этого процесса позволяет гибко настраивать нумерацию под требования любого бизнеса.