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