Как настроить единую сквозную нумерацию кадровых документов в 1С:ЗУП 3.0?

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

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

Попытки кадровиков вручную менять автонумерованные значения, добавлять суффиксы или буквы (например, «0000-000001ПР») часто приводят к тому, что стандартная автонумерация платформы сбивается. Разберем, почему происходят сбои, как правильно использовать штатные механизмы программы и как реализовать единую нумерацию доработкой на уровне кода.

Почему сбивается автонумерация при ручном вводе?

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

Когда создается новый документ, система выполняет следующие шаги:

  1. Выполняет запрос к базе данных для поиска максимального номера документа данного типа за текущий период (как правило, за год).
  2. Выделяет из найденной строки числовую часть.
  3. Увеличивает полученное число на единицу и формирует новый номер.

Если пользователь вручную редактирует номер (удаляет лидирующие нули, меняет дефисы или добавляет буквенные символы), строковая сортировка в СУБД начинает работать иначе. Номер с буквенным индексом может стать «максимальным» навсегда. В результате при создании следующих документов система перестает наращивать номер или постоянно выдает ошибку неуникальности.

Штатные варианты работы с номерами в 1С:ЗУП 3.0

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

  1. Реквизит «Печатать как»: В основных кадровых документах (ПриемНаРаботу, КадровыйПеревод, Увольнение) присутствует специальное поле «Печатать как». Оно позволяет оставить системный номер документа стандартным (чтобы не ломать автонумерацию), а в печатные формы и отчетность выводить требуемый индекс или номер с буквами.
  2. Отключение вывода префиксов: Если требуется избавить печатные формы от технических символов вроде «00-», перейдем в раздел Настройка -> Дополнительные настройки и установим флаг «Удалять префиксы организации и ИБ из номеров кадровых приказов».

Программная реализация единого нумератора через подписку на событие

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

Рассмотрим порядок действий по шагам:

  1. Создадим общий модуль с включенным признаком «Сервер».
  2. Создадим подписку на событие с видом ПриУстановкеНовогоНомера.
  3. В качестве источника укажем объекты, которые должны участвовать в единой нумерации: ДокументОбъект.ПриемНаРаботу, ДокументОбъект.КадровыйПеревод, ДокументОбъект.Увольнение, а также их списочные формы ДокументОбъект.ПриемНаРаботуСписком, ДокументОбъект.КадровыйПереводСписком и ДокументОбъект.УвольнениеСписком.
  4. Опишем обработчик события, в котором с помощью запроса найдем максимальный номер среди всех перечисленных типов документов за текущий год по выбранной организации.

Посмотрим на пример кода процедура-обработчика:


Процедура УстановкаНомераПоКадровымДокументамПриУстановкеНовогоНомера(Источник, СтандартнаяОбработка, Префикс) Экспорт

    // Получаем максимальный последний кадровый номер среди всех типов кадровых документов
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   МАКСИМУМ(НомераТЗ.Номер) КАК Номер
        |ИЗ
        |   (ВЫБРАТЬ
        |       МАКСИМУМ(ПриемНаРаботу.Номер) КАК Номер
        |   ИЗ
        |       Документ.ПриемНаРаботу КАК ПриемНаРаботу
        |   ГДЕ
        |       ПриемНаРаботу.Организация = &Организация
        |       И ГОД(ПриемНаРаботу.Дата) = &Год
        |   ИМЕЮЩИЕ
        |       НЕ МАКСИМУМ(ПриемНаРаботу.Номер) ЕСТЬ NULL
        |
        |   ОБЪЕДИНИТЬ ВСЕ
        |
        |   ВЫБРАТЬ
        |       МАКСИМУМ(Увольнение.Номер)
        |   ИЗ
        |       Документ.Увольнение КАК Увольнение
        |   ГДЕ
        |       Увольнение.Организация = &Организация
        |       И ГОД(Увольнение.Дата) = &Год
        |   ИМЕЮЩИЕ
        |       НЕ МАКСИМУМ(Увольнение.Номер) ЕСТЬ NULL
        |
        |   ОБЪЕДИНИТЬ ВСЕ
        |
        |   ВЫБРАТЬ
        |       МАКСИМУМ(КадровыйПеревод.Номер)
        |   ИЗ
        |       Документ.КадровыйПеревод КАК КадровыйПеревод
        |   ГДЕ
        |       КадровыйПеревод.Организация = &Организация
        |       И ГОД(КадровыйПеревод.Дата) = &Год
        |   ИМЕЮЩИЕ
        |       НЕ МАКСИМУМ(КадровыйПеревод.Номер) ЕСТЬ NULL
        |
        |   ОБЪЕДИНИТЬ ВСЕ
        |
        |   ВЫБРАТЬ
        |       МАКСИМУМ(УвольнениеСписком.Номер)
        |   ИЗ
        |       Документ.УвольнениеСписком КАК УвольнениеСписком
        |   ГДЕ
        |       УвольнениеСписком.Организация = &Организация
        |       И ГОД(УвольнениеСписком.Дата) = &Год
        |   ИМЕЮЩИЕ
        |       НЕ МАКСИМУМ(УвольнениеСписком.Номер) ЕСТЬ NULL
        |
        |   ОБЪЕДИНИТЬ ВСЕ
        |
        |   ВЫБРАТЬ
        |       МАКСИМУМ(КадровыйПереводСписком.Номер)
        |   ИЗ
        |       Документ.КадровыйПереводСписком КАК КадровыйПереводСписком
        |   ГДЕ
        |       КадровыйПереводСписком.Организация = &Организация
        |       И ГОД(КадровыйПереводСписком.Дата) = &Год
        |   ИМЕЮЩИЕ
        |       НЕ МАКСИМУМ(КадровыйПереводСписком.Номер) ЕСТЬ NULL
        |
        |   ОБЪЕДИНИТЬ ВСЕ
        |
        |   ВЫБРАТЬ
        |       МАКСИМУМ(ПриемНаРаботуСписком.Номер)
        |   ИЗ
        |       Документ.ПриемНаРаботуСписком КАК ПриемНаРаботуСписком
        |   ГДЕ
        |       ПриемНаРаботуСписком.Организация = &Организация
        |       И ГОД(ПриемНаРаботуСписком.Дата) = &Год
        |   ИМЕЮЩИЕ
        |       НЕ МАКСИМУМ(ПриемНаРаботуСписком.Номер) ЕСТЬ NULL) КАК НомераТЗ
        |
        |ИМЕЮЩИЕ
        |   НЕ МАКСИМУМ(НомераТЗ.Номер) ЕСТЬ NULL";

    Запрос.УстановитьПараметр("Организация", Источник.Организация);
    Запрос.УстановитьПараметр("Год", Год(Источник.Дата));

    РезультатЗапроса = Запрос.Выполнить();

    Если НЕ РезультатЗапроса.Пустой() Тогда
        СтандартнаяОбработка = Ложь;
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();

        // Выделяем числовую часть номера с помощью БСП
        НомерБезНолейИПрефикса = Число(ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Выборка.Номер, Истина, Истина));
        НомерБезНолейИПрефикса = НомерБезНолейИПрефикса + 1;

        // Формируем новый номер с сохранением префикса и дополнение нулями
        Источник.Номер = Префикс + СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Строка(НомерБезНолейИПрефикса), 6, "0", "Слева");
    КонецЕсли;

КонецПроцедуры

Разберем особенности этой реализации:

Благодаря данному алгоритму при создании любого из описанных документов система проверяет сквозную историю номеров за год и назначает следующий по порядку номер вне зависимости от типа кадрового приказа.

← На главную