При настройке нумерации документов в платформе 1С:Предприятие 7.7 часто возникает необходимость формировать номера вида "99-ко", где к числовой части добавляется буквенный суффикс (постфикс). Однако стандартный метод УстановитьНовыйНомер() и штатный механизм автонумерации при таком формате начинают работать некорректно или полностью сбиваются. В этой статье мы разберем, почему платформа ведет себя подобным образом, и рассмотрим проверенные варианты решения задачи.
Выясним причину, по которой штатный механизм автонумерации не может работать с постфиксами. В платформах версии 7.7 при генерации нового номера система ищет максимальное существующее значение с учетом заданной периодичности. Алгоритм увеличивает правую числовую подстроку — ту часть номера, которая находится справа до первого нечислового символа.
Если в самом конце номера находятся буквенные символы (например, суффикс -ко), штатный алгоритм не видит цифр на конце строки. В результате автоматический инкремент номера ломается: система либо начинает присваивать всем новым документам номер 1, либо вызывает ошибку уникальности при попытке записи.
Наиболее надежный вариант с точки зрения архитектуры базы данных — оставить системную автонумерацию стандартной (числовой или с традиционным префиксом в начале), а постфикс выводить только там, где это требуется пользователю (в печатных формах, журналах или на форме документа).
Рассмотрим по шагам, как это реализовать:
НомерДок укажем выражение:
СокрЛП(НомерДок) + "-ко"
ПечатныйНомер). В событии ПриЗаписи() заполним его программно:
Процедура ПриЗаписи()
ПечатныйНомер = СокрЛП(НомерДок) + "-ко";
КонецПроцедуры
Преимущества: Сохраняется штатный контроль уникальности, автонумерация 1С 7.7 работает без сбоев, не возникают проблемы с сортировкой и периодичностью.
Если требование заказчика жестко заставляет хранить постфикс прямо в системном реквизите НомерДок, придется отключить штатную автонумерацию для данного вида документа и формировать номер вручную в модуле документа через предопределенную процедуру ВводНового().
Проанализируем пример кода с поиском максимального текущего номера через объект выборки:
Процедура ВводНового()
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Номер", "Число");
Доки = СоздатьОбъект("Документ.ВидДокумента");
// Выбираем документы за нужный период (например, с начала года)
Доки.ВыбратьДокументы(НачГода(РабочаяДата()), КонГода(РабочаяДата()));
Пока Доки.ПолучитьДокумент() = 1 Цикл
ТЗ.НоваяСтрока();
// Извлекаем числовую часть из номера вида "99-ко"
СтрНомера = СтрЗаменить(Доки.НомерДок, "-ко", "");
ТЗ.Номер = Число(СтрНомера);
КонецЦикла;
ТЗ.Сортировать("Номер-");
МаксНомер = 0;
Если ТЗ.ПолучитьСтроку() = 1 Тогда
МаксНомер = ТЗ.Номер;
КонецЕсли;
// Присваиваем следующий номер с суффиксом
НомерДок = СокрЛП(МаксНомер + 1) + "-ко";
КонецПроцедуры
Альтернативный простой вариант с использованием сохранения значения счетчика (подходит для однопользовательских баз):
Процедура ВводНового()
НомерДок1 = ВосстановитьЗначение("ПоследнийНомерДок");
НомерДок1 = Число(НомерДок1) + 1;
СохранитьЗначение("ПоследнийНомерДок", НомерДок1);
НомерДок = СокрЛП(НомерДок1) + "-ко";
КонецПроцедуры
При использовании ручной генерации номера важно учитывать следующие нюансы:
ВводНового() при большом документообороте может снижать скорость создания новых документов.НомерДок в Конфигураторе. Длина строки должна вмещать как максимальное число разрядов номера, так и сам постфикс.Резюме: Оптимальным решением для платформы 1С 7.7 является сохранение стандартной нумерации в поле НомерДок и добавление суффикса -ко исключительно при отображении или печати документов.