В типовой конфигурации «1С:Зарплата и управление персоналом», редакция 3.1, реализована логика раздельной нумерации для каждого вида документа. Это означает, что документы Прием на работу имеют свой счетчик, Отпуск — свой, а Кадровый перевод — свой. Однако во многих организациях согласно правилам внутреннего делопроизводства требуется вести единый реестр кадровых приказов, где номера идут строго по порядку, независимо от типа операции (например: Приказ №1 — прием, Приказ №2 — отпуск, Приказ №3 — перевод). Для формирования сводного реестра приказов и кадровых событий можно использовать отчет для ведения журнала кадровых документов и приказов.
В этой статье мы подробно разберем, почему стандартных настроек для этого недостаточно, и рассмотрим технические способы реализации сквозной нумерации с помощью расширения конфигурации.
Прежде чем переходить к доработкам, проанализируем, как работает система «из коробки». В 1С:ЗУП номера уникальны в пределах одного типа документа и, как правило, в пределах календарного года. Существует распространенное заблуждение, что нумерация ведется «в пределах сотрудника», но на самом деле программа просто ищет последний номер для конкретного метаданного (например, для всех «Приемов на работу» по организации).
Если вам требуется лишь изредка менять номер, обратите внимание на поле «Печатать как», которое доступно в некоторых кадровых документах на вкладке «Дополнительно». Рассмотрим его особенности:
Печатать как вписать нужный вам номер.Для автоматизации сквозной нумерации нам потребуется создать расширение конфигурации. Это позволит сохранить поддержку программы и не изменять основную конфигурацию. Разберем алгоритм реализации, основанный на использовании подписки на события и запроса к базе данных.
Основная идея заключается в том, чтобы при записи нового документа программа просматривала все таблицы кадровых документов, находила самый большой номер в текущем году и присваивала следующему документу номер МаксНомер + 1.
Нам необходимо написать функцию, которая объединит данные из разных таблиц (Приемы, Переводы, Увольнения и т.д.) и вернет актуальный свободный номер. Проанализируем пример кода для общего модуля в расширении:
Функция ПолучитьПоследнийНомер(Организация, Дата) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриемНаРаботу.Номер КАК Номер
|ПОМЕСТИТЬ КадровыеДокументы
|ИЗ
| Документ.ПриемНаРаботу КАК ПриемНаРаботу
|ГДЕ
| ПриемНаРаботу.Организация = &Организация
| И ПриемНаРаботу.Дата МЕЖДУ &ДатаН И &ДатаК
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Увольнение.Номер
|ИЗ
| Документ.Увольнение КАК Увольнение
|ГДЕ
| Увольнение.Организация = &Организация
| И Увольнение.Дата МЕЖДУ &ДатаН И &ДатаК
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| КадровыйПеревод.Номер
|ИЗ
| Документ.КадровыйПеревод КАК КадровыйПеревод
|ГДЕ
| КадровыйПеревод.Организация = &Организация
| И КадровыйПеревод.Дата МЕЖДУ &ДатаН И &ДатаК
|;
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| КадровыеДокументы.Номер КАК Номер
|ИЗ
| КадровыеДокументы КАК КадровыеДокументы
|УПОРЯДОЧИТЬ ПО
| КадровыеДокументы.Номер УБЫВ";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаН", НачалоГода(Дата));
Запрос.УстановитьПараметр("ДатаК", КонецГода(Дата));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
// Извлекаем префикс и вычисляем новый номер
НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Выборка.Номер, Истина, Истина);
Префикс = Лев(Выборка.Номер, СтрДлина(Выборка.Номер) - СтрДлина(НомерНаПечать));
Попытка
НовоеЧисло = Число(НомерНаПечать) + 1;
Возврат ДобавитьПрефиксИНули(НовоеЧисло, Префикс);
Исключение
Возврат "";
КонецПопытки;
Иначе
// Если документов в году еще нет, формируем первый номер
Префикс = Организация.Префикс + "00-"; // Пример формирования префикса
Возврат ДобавитьПрефиксИНули(1, Префикс);
КонецЕсли;
КонецФункции
В этом коде мы используем оператор ОБЪЕДИНИТЬ ВСЕ, чтобы собрать номера из всех интересующих нас типов документов. Важно ограничивать выборку периодом (начало и конец года), так как нумерация в 1С обычно обнуляется ежегодно.
Чтобы номер выглядел корректно (с лидирующими нулями и префиксами), создадим вспомогательную процедуру. Рассмотрим пример:
Функция ДобавитьПрефиксИНули(НомерПоПорядку, Префикс)
// Стандартная длина номера в ЗУП 3.1 — 11 символов
ДлинаНомера = 11;
ТекстНомера = Строка(Формат(НомерПоПорядку, "ЧГ=0"));
Нули = "";
Для итератор = 1 По (ДлинаНомера - СтрДлина(Префикс) - СтрДлина(ТекстНомера)) Цикл
Нули = Нули + "0";
КонецЦикла;
Возврат Префикс + Нули + ТекстНомера;
КонецФункции
Чтобы механизм срабатывал автоматически, создадим в расширении объект Подписка на событие. В качестве источника выберем необходимые документы (или ДокументОбъект для широкого охвата), а событие установим ПередЗаписью.
В обработчике подписки пропишем логику проверки:
Процедура ПриУстановкеНовогоНомераПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Номер присваиваем только для новых документов
Если Источник.ЭтоНовый() Тогда
НовыйНомер = ПолучитьПоследнийНомер(Источник.Организация, Источник.Дата);
Если ЗначениеЗаполнено(НовыйНомер) Тогда
Источник.Номер = НовыйНомер;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем возможные сложности, с которыми вы можете столкнуться при внедрении сквозной нумерации:
Регистр сведений для хранения текущего значения счетчика и механизм управляемых блокировок.Префикс организации и Префикс информационной базы. Метод ПрефиксацияОбъектовКлиентСервер.НомерНаПечать помогает отделить цифровую часть от префикса, чтобы корректно инкрементировать номер.ПередЗаписью, если пользователь создаст документ, система зарезервирует номер, но если запись будет отменена (например, из-за ошибки заполнения), в нумерации может возникнуть пропуск. В большинстве случаев (как отмечено в обсуждениях) это не критично для кадрового учета.ТипДокумента, Организация, ТекущийНомер.Таким образом, мы выяснили, что штатная настройка сквозной нумерации в ЗУП 3.1 отсутствует, но задача успешно решается с помощью расширения. Использование программного перехвата события ПередЗаписью совместно с грамотно составленным запросом к таблицам документов позволяет автоматизировать процесс и избежать ручного ввода номеров в поле Печатать как. Если требуется готовое решение без самостоятельного программирования, можно применить расширение для гибкой настройки нумерации документов в ЗУП 3.1.