В делопроизводстве государственных учреждений и крупных коммерческих организаций часто возникает задача ведения двойного учета обращений граждан. Типичный сценарий выглядит следующим образом:
Стандартная архитектура программы 1С:Документооборот (как версии 2.1, так и 3.0) предусматривает наличие только одного основного реквизита РегистрационныйНомер для каждого документа. В этой статье мы подробно разберем, как решить задачу двойной нумерации с помощью штатных механизмов системы, гибких настроек без изменения конфигурации, а также с использованием программных обработчиков бизнес-событий.
---
Первую часть задачи — сквозную нумерацию для письменных, устных и личных обращений — мы можем полностью настроить в пользовательском режиме без написания кода. Для этого воспользуемся механизмом общих нумераторов.
Рассмотрим пошагово, как это сделать:
Письменное обращениеУстное обращениеЛичное обращениеОбщий нумератор обращений граждан.Письменное обращение, Устное обращение и Личное обращение.После записи этой настройки система начнет автоматически выделять очередной порядковый номер из единой последовательности, независимо от того, какой именно вид обращения регистрирует делопроизводитель. Первая часть задачи успешно решена типовыми средствами!
---
Поскольку стандартный реквизит номера уже занят сквозным нумератором, для ведения второго реестра нам понадобятся альтернативные проектные решения. Проанализируем три наиболее эффективных варианта реализации этой задачи.
Этот способ идеально подходит организациям, которые хотят остаться строго в рамках типового функционала и избежать написания скриптов. Вместо попытки записать два разных регистрационных номера в одну карточку документа, мы разделим сущности в системе.
Разберем этот процесс по шагам:
Обращение гражданина. Для него настраиваем сквозной нумератор (как описано в Шаге 1). При регистрации этот документ всегда будет получать первый (общий) номер.Карточка письменного обращения или Дело по письменному обращению. Для этого вида документа настраиваем свой собственный, отдельный нумератор, который будет вести независимую последовательность номеров.Содержит / Входит в состав или На основании.Преимущества метода:
---
Если заказчик категорически требует, чтобы оба номера находились в одной карточке документа Письменное обращение, нам необходимо создать дополнительный реквизит и настроить его автоматическое заполнение.
Для начала создадим сам реквизит:
Письменное обращение и добавим новый дополнительный реквизит с наименованием Второй регистрационный номер (тип значения — Строка или Число).Если оставить настройку в таком виде, пользователям придется вводить второй номер вручную, что приведет к ошибкам и дублированию. На форуме предлагалось использовать регламентные задания БСП или расширения конфигурации, однако в 1С:Документооборот существует гораздо более элегантный механизм — Обработчики бизнес-событий, доступный прямо в пользовательском режиме (для версий КОРП и ДГУ).
Проанализируем, как написать скрипт автозаполнения. Нам необходимо обрабатывать событие Регистрация документа. При наступлении этого события скрипт должен определить следующий свободный номер для письменных обращений в текущем году и записать его в созданный нами дополнительный реквизит.
Важный технический нюанс: конкурентная запись и блокировка данных.
Если несколько делопроизводителей будут регистрировать письменные обращения одновременно, существует риск возникновения одинаковых номеров. Чтобы этого избежать, в коде обработчика обязательно нужно использовать объект БлокировкаДанных.
Посмотрим на пример шаблона кода для обработчика бизнес-события:
// Скрипт выполняется в контексте регистрации документа
ДокументОбъект = Событие.Источник;
Если ДокументОбъект.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Письменное обращение") Тогда
// Устанавливаем блокировку данных для предотвращения коллизий при параллельной работе
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ВнутренниеДокументы");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
// Определяем текущий год для сброса нумерации в начале года
ТекущийГод = НачалоГода(ТекущаяДата());
КонецГода = КонецГода(ТекущаяДата());
// Пишем запрос для поиска максимального номера в дополнительном реквизите за текущий год
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ВнутренниеДокументыДополнительныеРеквизиты.Значение) КАК МаксНомер
|ИЗ
| Справочник.ВнутренниеДокументы.ДополнительныеРеквизиты КАК ВнутренниеДокументыДополнительныеРеквизиты
|ГДЕ
| ВнутренниеДокументыДополнительныеРеквизиты.Свойство.Наименование = &ИмяРеквизита
| И ВнутренниеДокументыДополнительныеРеквизиты.Ссылка.ДатаРегистрации МЕЖДУ &НачалоГода И &КонецГода
| И ВнутренниеДокументыДополнительныеРеквизиты.Ссылка.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("ИмяРеквизита", "Второй регистрационный номер");
Запрос.УстановитьПараметр("НачалоГода", ТекущийГод);
Запрос.УстановитьПараметр("КонецГода", КонецГода);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
НовыйНомер = 1;
Если Выборка.Следующий() И ЗначениеЗаполнено(Выборка.МаксНомер) Тогда
// Приводим строковое значение к числу и увеличиваем на единицу
НовыйНомер = Число(Выборка.МаксНомер) + 1;
КонецЕсли;
// Записываем полученный номер в дополнительный реквизит документа
НайденнаяСтрока = ДокументОбъект.ДополнительныеРеквизиты.Найти(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Второй регистрационный номер"), "Свойство");
Если НайденнаяСтрока <> Неопределено Тогда
НайденнаяСтрока.Значение = НовыйНомер;
Иначе
НоваяСтрока = ДокументОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Второй регистрационный номер");
НоваяСтрока.Значение = НовыйНомер;
КонецЕсли;
// Сохраняем изменения в документе без вызова повторных событий
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.Записать();
ДокументОбъект.ОбменДанными.Загрузка = Ложь;
КонецЕсли;
Преимущества метода:
1С:Предприятие. Конфигурация остается полностью типовой, что гарантирует легкое и беспроблемное обновление программы в будущем.---
Иногда двойная нумерация требуется организации не столько для ведения поиска внутри базы данных, сколько для вывода этой информации на печатные формы (например, на печатную карточку документа или в автозаполняемый файл шаблона ответа гражданину).
Если это ваш случай, то физически хранить второй номер в базе данных в виде отдельного поля вовсе не обязательно. Выясним, как это реализовать:
DOCX и прикрепляем его к виду документа Письменное обращение.Этот способ позволяет избежать усложнения структуры метаданных и разгружает интерфейс карточки документа от лишних реквизитов.
---
Мы проанализировали различные подходы к реализации двойной нумерации обращений граждан в 1С:Документооборот. Выбор конкретного метода зависит от технических требований и готовности к написанию небольших скриптов: