В конфигурации 1С:Управление нашей фирмой (УНФ), как и во многих современных решениях на платформе 1С:Предприятие 8.3, механизмы нумерации объектов реализованы с использованием Библиотеки стандартных подсистем (БСП). Это накладывает определенные особенности на процесс доработки: простое изменение префикса в коде не всегда приводит к желаемому результату, так как платформа учитывает уже существующие записи в информационной базе. В этой статье мы подробно разберем, как работает механизм префиксации, почему возникают ошибки в номерах и как правильно реализовать привязку нумерации к конкретной кассе.
Прежде всего, проанализируем, где именно происходит формирование номера. В типовых решениях за это отвечает подсистема «Префиксация объектов». Когда вы записываете новый документ, срабатывает подписка на событие ПриУстановкеНовогоНомераДокумента. Она перенаправляет выполнение в общий модуль, который собирает префикс из нескольких частей:
Рассмотрим ситуацию автора: документ должен иметь вид НФ04-00001, но получается НФ04-Н0001. Здесь НФ — префикс организации, 04 — префикс ИБ, а символ Н — это и есть та самая «добавка», которую платформа ошибочно считает частью следующего порядкового номера.
Выясним причину, по которой даже после изменения алгоритма в процедуре УстановитьПрефикс новые документы продолжают получать неверный номер. Платформа 1С работает по следующему алгоритму:
Когда вызывается метод УстановитьНовыйНомер(), система ищет в базе данных документ такого же типа с таким же префиксом и берет его максимальный номер. Если в базе уже есть хотя бы один документ с номером НФ04-Н0001, то для всех последующих документов с префиксом НФ04- платформа будет пытаться продолжить серию, начиная с Н....
Важно: Платформа воспринимает букву после дефиса как начало числового ряда, если не указать четко, где заканчивается префикс и начинается число.
Если нам необходимо, чтобы документы по разным кассам имели разную нумерацию (например, касса №1 — с префиксом «Н», остальные — без), мы можем модифицировать обработчик. Рассмотрим пример кода, который можно разместить в общем модуле, вызываемом из подписки на событие:
Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт
// Проверяем наличие реквизита Касса у объекта
Если Источник.Метаданные().Реквизиты.Найти("Касса") <> Неопределено Тогда
// Сравниваем кассу по коду или ссылке
Если Источник.Касса = Справочники.Кассы.НайтиПоКоду("000000001") Тогда
Префикс = "Н";
Иначе
// Чтобы платформа не подхватывала старые номера, можно явно указать "0"
Префикс = "";
КонецЕсли;
КонецЕсли;
// Вызов типовой процедуры БСП для формирования полного префикса (ОР+ИБ)
УстановитьПрефикс(Источник, Префикс, Истина, Ложь);
КонецПроцедуры
Однако, как мы выяснили, этого недостаточно, если в базе уже накоплены «ошибочные» номера.
Проанализируем ситуацию: если код уже изменен, но номера все равно «кривые», нужно выполнить следующие шаги:
НФ04-Н00047 на НФ04-000047).ОбновитьНумерациюОбъектов.Для обновления нумерации конкретного типа документов используйте следующий код (например, во внешней обработке):
МетаданныеДокумента = Метаданные.Документы.ПоступлениеВКассу;
ОбновитьНумерациюОбъектов(МетаданныеДокумента);
Сообщить("Нумерация документа '" + МетаданныеДокумента.Имя + "' успешно обновлена!");
Если стандартный механизм префиксации БСП слишком сложен для вашей задачи, можно пойти по пути явного переопределения номера в модуле объекта документа. Разберем этот вариант:
ПоступлениеВКассу.ПередЗаписью.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() И НЕ ЗначениеЗаполнено(Номер) Тогда
// Формируем свой префикс
ТекущийПрефикс = "НФ04-";
Если Касса.Код = "000000001" Тогда
ТекущийПрефикс = ТекущийПрефикс + "Н";
КонецЕсли;
// Устанавливаем номер с учетом нашего префикса
ЭтотОбъект.УстановитьНовыйНомер(ТекущийПрефикс);
КонецЕсли;
КонецПроцедуры
Важный нюанс: при использовании этого метода убедитесь, что в свойствах документа в конфигураторе длина номера достаточна для размещения префикса и числовой части. Для УНФ стандартная длина составляет 11 символов. Если префикс НФ04-Н занимает 6 символов, то на само число остается всего 5 знаков (00001).
Рассмотрим несколько практических советов, которые помогут избежать проблем с нумерацией в будущем:
ПриУстановкеНовогоНомера. Возможно, стороннее расширение перезаписывает ваш номер уже после выполнения вашего кода.Подводя итог, можно сказать, что для решения проблемы автора в УНФ 1.6 необходимо не только поправить код формирования префикса в процедуре УстановитьПрефиксИнформационнойБазы, но и обязательно очистить базу от документов с «неправильными» номерами, после чего программно обновить нумерацию объектов.