Как правильно реализовать нумерацию документов на основании?

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

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача связать нумерацию создаваемого документа с документом-основанием. Например, требуется, чтобы новый документ имел номер вида 003.1, 003.2 и так далее, где 003 — это номер основания. Разберем, почему попытки прямого изменения системного номера являются плохой практикой и какие архитектурные подходы стоит использовать вместо этого.

Почему не стоит менять системный номер документа

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

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

Рекомендуемый подход: использование отдельного реквизита

Профессиональный подход к решению задачи заключается в разделении системного номера (который нужен платформе для идентификации объекта) и номера для печати (который нужен пользователю для визуализации связи). Рассмотрим этот процесс по шагам:

  1. Создание дополнительного реквизита: Внесите в объект (документ) новый реквизит, например, НомерДляПечати (тип Строка).
  2. Заполнение реквизита: При записи документа или при открытии формы заполняйте этот реквизит нужной вам комбинацией данных. Это сохранит целостность стандартного механизма нумерации платформы.
  3. Использование механизма подчиненности: Вместо «зашивания» номера в код, используйте стандартный механизм связей объектов 1С. Это позволит использовать стандартный отчет Структура подчиненности, где связи документов будут отображаться корректно и без программирования сложных префиксов.

Альтернативный вариант: механизм префиксации

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

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


// Пример защищенной записи с использованием блокировки
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.НашДокумент");
ЭлементБлокировки.УстановитьЗначение("Основание", СсылкаНаОснование);
Блокировка.Заблокировать();

// Далее идет код подсчета количества подчиненных документов 
// и присвоение номера новому объекту

Итоги и рекомендации

Для создания надежного решения придерживайтесь следующих правил:

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

← На главную