Как реализовать дробную нумерацию документов в 1С при их разделении

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

В процессе разработки или доработки систем на базе 1С часто возникает задача разделения одного документа (например, «Заказа покупателя») на несколько составляющих. Это может быть связано с тем, что часть товаров закупается у разных поставщиков или производится в разных цехах. Одной из главных сложностей здесь становится сохранение логической связи между документами через их номера. Рассмотрим, как правильно реализовать нумерацию вида 0005/1, 0005/2 и какие технические преграды могут встретиться на этом пути.

Проблема стандартной автонумерации

Перед тем как внедрять изменения, проанализируем, как работает встроенный механизм 1С. Платформа управляет номерами документов, ориентируясь на тип данных Строка. При создании нового объекта система ищет максимальное значение номера в пределах заданного периода и увеличивает его числовую часть. Как только мы добавляем в номер спецсимвол, например косую черту (/), стандартный алгоритм может «споткнуться».

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

Метод 1: Использование суффиксов (дробная часть)

Этот метод кажется наиболее интуитивным. Мы сохраняем основной номер документа и добавляем к нему порядковый номер части через разделитель. Рассмотрим, как это реализовать технически. Нам потребуется перехватить событие ПриУстановкеНовогоНомера в модуле объекта документа.

Проанализируем пример логики, которую необходимо внедрить:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    // Если это новый документ, созданный на основании разделения
    Если ЭтоРазбивка Тогда
        СтандартнаяОбработка = Ложь; // Отключаем типовой механизм
        
        // Получаем номер родительского документа (без суффикса)
        ОсновнойНомер = СокращенныйНомер(ОбъектОснование.Номер); 
        
        // Ищем в базе последний использованный индекс для этого номера
        ПоследнийИндекс = НайтиПоследнийИндексРазбивки(ОсновнойНомер);
        НовыйИндекс = ПоследнийИндекс + 1;
        
        // Формируем новый номер с учетом длины поля (например, 8 символов)
        ЭтотОбъект.Номер = ОсновнойНомер + "/" + НовыйИндекс;
    КонецЕсли;
КонецПроцедуры

Важно помнить о длине номера. Если в конфигураторе длина номера ограничена 8 символами, то номер 00005/10 уже не поместится. Рассмотрим это заранее: под основную нумерацию стоит оставить 5-6 символов, а остальные зарезервировать под разделитель и индекс.

Метод 2: Работа с префиксами

Некоторые разработчики предлагают использовать префиксы вместо суффиксов. Это менее визуально наглядно для связи документов, но более безопасно для платформы. Например, ОТД1-0005 и ОТД2-0005. Однако, как отмечают участники обсуждения, такой подход затрудняет отслеживание «материнского» заказа, если отделов или поставщиков много. Префиксы лучше использовать, когда документы принадлежат разным организациям или филиалам, а не когда один логический процесс дробится внутри одной фирмы.

Метод 3: Использование подчиненности (архитектурный подход)

Выясним, действительно ли нам нужно менять номер. В 1С существует мощный механизм «Критерии отчета» и «Структура подчиненности». Вместо того чтобы ломать строковый номер, мы можем создать в документе реквизит ДокументОснование или РодительскийЗаказ.

Разберем преимущества этого подхода:

  1. Сохранение чистоты нумерации: Каждый документ имеет свой уникальный, стандартный номер (например, 00125, 00126).
  2. Связь через ссылки: В любом отчете мы можем сгруппировать данные по полю РодительскийЗаказ.
  3. Визуализация для пользователя: В списках документов можно программно выводить вычисляемую колонку, которая будет показывать «Виртуальный номер» (например, НомерРодителя + Индекс), не меняя реальный номер в базе данных.

Посмотрим, как можно реализовать вывод такого виртуального номера в списке:


// В обработчике ПриВыводеСтроки табличного поля списка документов
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ЗначениеЗаполнено(ДанныеСтроки.РодительскийЗаказ) Тогда
        ОформлениеСтроки.Ячейки.Номер.УстановитьТекст(
            СокрЛП(ДанныеСтроки.РодительскийЗаказ.Номер) + "/" + ДанныеСтроки.НомерРазбивки
        );
    КонецЕсли;
КонецПроцедуры

Подводные камни и риски

Проанализируем ситуацию с сортировкой. Номер в 1С — это строка. Посмотрим на пример: строки сортируются посимвольно. Это значит, что номер 005/10 при стандартной сортировке может оказаться выше, чем 005/2, так как символ "1" идет раньше "2". Чтобы этого избежать, суффиксы должны иметь фиксированную длину с лидирующими нулями, например: 005/01, 005/02... 005/10.

Также стоит учитывать вопросы интеграции. Если ваша база обменивается данными с 1С:Бухгалтерией или системами электронного документооборота (ЭДО), дробные номера могут вызвать ошибки при загрузке или сопоставлении. Контролирующие органы также могут иметь свои требования к формату номеров в печатных формах счетов-фактур.

Рекомендации по реализации

Подводя итог, выделим оптимальный алгоритм действий при разработке функционала разбиения:

  1. Определите максимальное количество возможных разбивок. Если их не более 9, достаточно одного символа после дроби.
  2. Проверьте длину реквизита Номер в метаданных документа. При необходимости увеличьте её с запасом.
  3. Используйте отдельный реквизит для хранения ссылки на исходный документ. Это «золотой стандарт» разработки в 1С.
  4. Если бизнес-процесс требует именно визуального дробного номера, реализуйте его через ПриУстановкеНовогоНомера, обязательно добавляя лидирующие нули в суффикс (например, /01 вместо /1).
  5. Создайте вспомогательную функцию, которая будет очищать номер от суффиксов для поиска основного документа.

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

← На главную