В процессе разработки или доработки систем на базе 1С часто возникает задача разделения одного документа (например, «Заказа покупателя») на несколько составляющих. Это может быть связано с тем, что часть товаров закупается у разных поставщиков или производится в разных цехах. Одной из главных сложностей здесь становится сохранение логической связи между документами через их номера. Рассмотрим, как правильно реализовать нумерацию вида 0005/1, 0005/2 и какие технические преграды могут встретиться на этом пути.
Перед тем как внедрять изменения, проанализируем, как работает встроенный механизм 1С. Платформа управляет номерами документов, ориентируясь на тип данных Строка. При создании нового объекта система ищет максимальное значение номера в пределах заданного периода и увеличивает его числовую часть. Как только мы добавляем в номер спецсимвол, например косую черту (/), стандартный алгоритм может «споткнуться».
Разберем ситуацию: если в базе уже есть номер 00005/1, при попытке создать новый (целый) заказ, платформа может не понять, какое число увеличивать следующее. В худшем случае автоматическая выдача номеров может заблокироваться или начать выдавать ошибки уникальности. Поэтому, выбирая путь модификации номера, мы берем на себя ответственность за управление этим процессом программно.
Этот метод кажется наиболее интуитивным. Мы сохраняем основной номер документа и добавляем к нему порядковый номер части через разделитель. Рассмотрим, как это реализовать технически. Нам потребуется перехватить событие ПриУстановкеНовогоНомера в модуле объекта документа.
Проанализируем пример логики, которую необходимо внедрить:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Если это новый документ, созданный на основании разделения
Если ЭтоРазбивка Тогда
СтандартнаяОбработка = Ложь; // Отключаем типовой механизм
// Получаем номер родительского документа (без суффикса)
ОсновнойНомер = СокращенныйНомер(ОбъектОснование.Номер);
// Ищем в базе последний использованный индекс для этого номера
ПоследнийИндекс = НайтиПоследнийИндексРазбивки(ОсновнойНомер);
НовыйИндекс = ПоследнийИндекс + 1;
// Формируем новый номер с учетом длины поля (например, 8 символов)
ЭтотОбъект.Номер = ОсновнойНомер + "/" + НовыйИндекс;
КонецЕсли;
КонецПроцедуры
Важно помнить о длине номера. Если в конфигураторе длина номера ограничена 8 символами, то номер 00005/10 уже не поместится. Рассмотрим это заранее: под основную нумерацию стоит оставить 5-6 символов, а остальные зарезервировать под разделитель и индекс.
Некоторые разработчики предлагают использовать префиксы вместо суффиксов. Это менее визуально наглядно для связи документов, но более безопасно для платформы. Например, ОТД1-0005 и ОТД2-0005. Однако, как отмечают участники обсуждения, такой подход затрудняет отслеживание «материнского» заказа, если отделов или поставщиков много. Префиксы лучше использовать, когда документы принадлежат разным организациям или филиалам, а не когда один логический процесс дробится внутри одной фирмы.
Выясним, действительно ли нам нужно менять номер. В 1С существует мощный механизм «Критерии отчета» и «Структура подчиненности». Вместо того чтобы ломать строковый номер, мы можем создать в документе реквизит ДокументОснование или РодительскийЗаказ.
Разберем преимущества этого подхода:
00125, 00126).РодительскийЗаказ.Посмотрим, как можно реализовать вывод такого виртуального номера в списке:
// В обработчике ПриВыводеСтроки табличного поля списка документов
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ЗначениеЗаполнено(ДанныеСтроки.РодительскийЗаказ) Тогда
ОформлениеСтроки.Ячейки.Номер.УстановитьТекст(
СокрЛП(ДанныеСтроки.РодительскийЗаказ.Номер) + "/" + ДанныеСтроки.НомерРазбивки
);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию с сортировкой. Номер в 1С — это строка. Посмотрим на пример: строки сортируются посимвольно. Это значит, что номер 005/10 при стандартной сортировке может оказаться выше, чем 005/2, так как символ "1" идет раньше "2". Чтобы этого избежать, суффиксы должны иметь фиксированную длину с лидирующими нулями, например: 005/01, 005/02... 005/10.
Также стоит учитывать вопросы интеграции. Если ваша база обменивается данными с 1С:Бухгалтерией или системами электронного документооборота (ЭДО), дробные номера могут вызвать ошибки при загрузке или сопоставлении. Контролирующие органы также могут иметь свои требования к формату номеров в печатных формах счетов-фактур.
Подводя итог, выделим оптимальный алгоритм действий при разработке функционала разбиения:
Номер в метаданных документа. При необходимости увеличьте её с запасом.ПриУстановкеНовогоНомера, обязательно добавляя лидирующие нули в суффикс (например, /01 вместо /1).Выясним, какой способ лучше. Если база полностью «самописная» и внешние обмены отсутствуют, суффиксы — это быстрое и наглядное решение. Однако для масштабируемых систем лучше использовать связку «уникальный номер + ссылка на родителя».