Как изменить логику нумерации документа Поступление в кассу в 1С:УНФ 1.6

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

В конфигурации 1С:Управление нашей фирмой (УНФ), как и во многих современных решениях на платформе 1С:Предприятие 8.3, механизмы нумерации объектов реализованы с использованием Библиотеки стандартных подсистем (БСП). Это накладывает определенные особенности на процесс доработки: простое изменение префикса в коде не всегда приводит к желаемому результату, так как платформа учитывает уже существующие записи в информационной базе. В этой статье мы подробно разберем, как работает механизм префиксации, почему возникают ошибки в номерах и как правильно реализовать привязку нумерации к конкретной кассе.

Разбор механизма нумерации в УНФ

Прежде всего, проанализируем, где именно происходит формирование номера. В типовых решениях за это отвечает подсистема «Префиксация объектов». Когда вы записываете новый документ, срабатывает подписка на событие ПриУстановкеНовогоНомераДокумента. Она перенаправляет выполнение в общий модуль, который собирает префикс из нескольких частей:

  1. Префикс организации: задается в карточке организации (2 символа).
  2. Префикс информационной базы: задается в настройках синхронизации данных (2 символа).
  3. Пользовательский префикс: добавляется программно или через расширение.

Рассмотрим ситуацию автора: документ должен иметь вид НФ04-00001, но получается НФ04-Н0001. Здесь НФ — префикс организации, 04 — префикс ИБ, а символ Н — это и есть та самая «добавка», которую платформа ошибочно считает частью следующего порядкового номера.

Почему номер не меняется после правки кода?

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

Когда вызывается метод УстановитьНовыйНомер(), система ищет в базе данных документ такого же типа с таким же префиксом и берет его максимальный номер. Если в базе уже есть хотя бы один документ с номером НФ04-Н0001, то для всех последующих документов с префиксом НФ04- платформа будет пытаться продолжить серию, начиная с Н....

Важно: Платформа воспринимает букву после дефиса как начало числового ряда, если не указать четко, где заканчивается префикс и начинается число.

Решение 1: Программная установка префикса в зависимости от кассы

Если нам необходимо, чтобы документы по разным кассам имели разную нумерацию (например, касса №1 — с префиксом «Н», остальные — без), мы можем модифицировать обработчик. Рассмотрим пример кода, который можно разместить в общем модуле, вызываемом из подписки на событие:


Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт
    // Проверяем наличие реквизита Касса у объекта
    Если Источник.Метаданные().Реквизиты.Найти("Касса") <> Неопределено Тогда
        // Сравниваем кассу по коду или ссылке
        Если Источник.Касса = Справочники.Кассы.НайтиПоКоду("000000001") Тогда
            Префикс = "Н";
        Иначе
            // Чтобы платформа не подхватывала старые номера, можно явно указать "0"
            Префикс = ""; 
        КонецЕсли;
    КонецЕсли;

    // Вызов типовой процедуры БСП для формирования полного префикса (ОР+ИБ)
    УстановитьПрефикс(Источник, Префикс, Истина, Ложь);
КонецПроцедуры

Однако, как мы выяснили, этого недостаточно, если в базе уже накоплены «ошибочные» номера.

Решение 2: Исправление существующих данных и обновление нумерации

Проанализируем ситуацию: если код уже изменен, но номера все равно «кривые», нужно выполнить следующие шаги:

  1. Поиск и перенумерация: Необходимо найти все документы «Поступление в кассу», в номерах которых присутствует лишний символ (например, «Н» там, где ее быть не должно). С помощью групповой обработки объектов или вручную измените номера этих документов на корректные (например, замените НФ04-Н00047 на НФ04-000047).
  2. Очистка кэша нумерации: Платформа кэширует последний использованный номер в оперативной памяти сервера. Чтобы изменения вступили в силу немедленно, нужно вызвать метод ОбновитьНумерациюОбъектов.

Для обновления нумерации конкретного типа документов используйте следующий код (например, во внешней обработке):


МетаданныеДокумента = Метаданные.Документы.ПоступлениеВКассу;
ОбновитьНумерациюОбъектов(МетаданныеДокумента);
Сообщить("Нумерация документа '" + МетаданныеДокумента.Имя + "' успешно обновлена!");

Решение 3: Использование метода УстановитьНовыйНомер()

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

  1. Откройте Модуль объекта документа ПоступлениеВКассу.
  2. Найдите или создайте процедуру ПередЗаписью.
  3. Вставьте логику установки номера.

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

Важный нюанс: при использовании этого метода убедитесь, что в свойствах документа в конфигураторе длина номера достаточна для размещения префикса и числовой части. Для УНФ стандартная длина составляет 11 символов. Если префикс НФ04-Н занимает 6 символов, то на само число остается всего 5 знаков (00001).

Рекомендации по работе с префиксами

Рассмотрим несколько практических советов, которые помогут избежать проблем с нумерацией в будущем:

Подводя итог, можно сказать, что для решения проблемы автора в УНФ 1.6 необходимо не только поправить код формирования префикса в процедуре УстановитьПрефиксИнформационнойБазы, но и обязательно очистить базу от документов с «неправильными» номерами, после чего программно обновить нумерацию объектов.

← На главную