Как грамотно реализовать нумерацию договоров в 1С для их последующей печати?

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

При автоматизации бизнес-процессов часто возникают задачи, требующие генерации уникальных номеров «на лету». Одной из таких типовых задач является создание печатной формы договора, номер которого формируется по принципу «Дата-ПорядковыйНомерЗаДень». Рассмотрим, как правильно организовать хранение этих данных в 1С:Управление торговлей 11, чтобы обеспечить возможность повторной печати документа с тем же самым номером через любой промежуток времени.

Почему важно правильно хранить данные?

Главная ошибка при решении этой задачи — попытка генерировать номер исключительно в момент вызова печатной формы. Если система не сохраняет сформированный номер, то при повторном нажатии кнопки «Печать» алгоритм каждый раз будет вычислять значение заново. В условиях многопользовательской работы или изменения состава договоров за прошлые дни это приведет к путанице и невозможности восстановить точную копию ранее выданного документа. Поэтому наша цель — организовать «источник правды» для каждого номера договора.

Выбор архитектурного решения

Рассмотрим несколько подходов, которые мы можем применить для решения данной задачи:

  1. Регистр сведений (Рекомендуемый метод). Это наиболее профессиональный и надежный способ. Мы создаем собственный непериодический регистр сведений, который будет выступать хранилищем истории всех выданных номеров.
  2. Дополнительные сведения. Механизм БСП (Библиотеки стандартных подсистем), позволяющий добавлять данные к объектам без изменения структуры метаданных. Однако для нумерации этот метод сложнее в поддержке, чем прямой запрос к регистру.

Реализация через Регистр сведений: пошаговое руководство

Разберем детально, как создать и настроить наш регистр сведений для обеспечения стабильной нумерации.

1. Создание структуры регистра

В конфигураторе создаем новый объект РегистрСведений. Назовем его, например, НомераДоговоровПоставки. Нам необходимо задать следующую структуру измерений и ресурсов:

2. Алгоритм генерации и получения номера

При вызове печатной формы мы должны реализовать следующий программный алгоритм:

Сначала мы проверяем, существует ли уже запись в нашем регистре для текущего контрагента и выбранной даты. Если запись есть — используем её. Если записи нет — генерируем новый номер.

Для поиска максимального номера за день используем запрос к базе данных:


// Пример запроса для получения максимального номера за день
ВЫБРАТЬ ПЕРВЫЕ 1
    НомераДоговоровПоставки.ПорядковыйНомер КАК ПоследнийНомер
ИЗ
    РегистрСведений.НомераДоговоровПоставки КАК НомераДоговоровПоставки
ГДЕ
    НомераДоговоровПоставки.ДатаДоговора = &ДатаДоговора
УПОРЯДОЧИТЬ ПО
    НомераДоговоровПоставки.ПорядковыйНомер УБЫВ

3. Обеспечение уникальности

Чтобы избежать коллизий, когда два пользователя одновременно пытаются сформировать договор для одного контрагента, необходимо использовать блокировку данных. В 1С это делается через механизм БлокировкаДанных. Мы накладываем блокировку на набор записей, чтобы гарантировать целостность наших расчетов.


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НомераДоговоровПоставки");
ЭлементБлокировки.УстановитьЗначение("ДатаДоговора", ТекущаяДата);
Блокировка.Заблокировать();

4. Логика записи в регистр

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

Такой подход обеспечивает:

Применяя этот метод, вы создадите устойчивую и масштабируемую систему нумерации, которая будет безотказно работать в вашей конфигурации 1С.

← На главную