Как правильно настроить отдельную нумерацию документов для конкретного контрагента в 1С?

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

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

Почему ломается нумерация при ручном изменении?

Рассмотрим ситуацию, с которой столкнулся автор вопроса. Задача состояла в том, чтобы для контрагента "ООО КЛЕВ" номера документов реализации выглядели как XXXX-0001К, то есть имели букву "К" в конце. Автор попытался решить это "в лоб": создал свой регистр для хранения последнего номера, вычислял его и принудительно присваивал документу строку вида "НЛ00-" + Номер + "К".

Сразу после создания такого документа стандартная нумерация для всех остальных контрагентов "сломалась". Вместо ожидаемого НЛ00-000045 система начала выдавать странные номера или ошибки уникальности. Давайте разберемся, почему это происходит.

Механизм автонумерации в 1С работает следующим образом:

  1. Номер документа хранится как строка.
  2. При создании нового документа платформа ищет максимальный номер в базе данных за определенный период (обычно год) в рамках текущего префикса.
  3. Поиск максимума происходит по правилам сортировки строк, а не чисел.
  4. Найдя максимальный номер, платформа пытается выделить из него правую цифровую часть и увеличить её на 1.

Если мы вручную записываем номер НЛ00-0001К, то для платформы этот номер (из-за наличия буквы в конце) перестает быть частью стандартной числовой последовательности, либо наоборот — воспринимается как "больший", чем обычные номера. Автоматический механизм инкрементации (увеличения на единицу) не умеет работать с буквами в суффиксе. В итоге механизм сбивается, что приводит к нарушению хронологии и проблемам с созданием новых документов.

Вывод: Никогда не добавляйте буквы или символы в конец номера документа, если вы хотите сохранить работоспособность автонумерации.

Правильное решение: Использование префиксов

Единственный архитектурно верный способ разделить нумерацию на несколько независимых потоков в 1С — это использование разных префиксов.

В 1С нумерация ведется в разрезе префиксов. Это значит, что для системы номера АА00-00001 и ББ00-00001 — это две параллельные вселенные, которые никак не пересекаются. Для решения нашей задачи (отделить документы по контрагенту "ООО КЛЕВ") нужно не добавлять букву "К" в конец, а изменить префикс документа.

Например, стандартный префикс организации — НЛ. Для особого контрагента мы можем программно установить префикс НК. Тогда документы будут выглядеть так:

Реализация через Расширение конфигурации

В современных конфигурациях, таких как 1С:Комплексная Автоматизация 2, 1С:ERP или Управление Торговлей 11, логика формирования префикса вынесена в общие модули. Вместо того чтобы править код самого документа или модуля объекта, мы используем механизм Расширений.

Нам необходимо перехватить процедуру установки префикса. Обычно за это отвечает подписка на событие или вызов процедуры общего модуля ПрефиксацияОбъектовСобытия или аналогичного (зависит от версии БСП, но принцип один).

Разберем пример кода, который нужно поместить в модуль расширения. Мы будем использовать аннотацию &Вместо (или &После, в зависимости от контекста) для процедуры УстановитьПрефикс.

Вот примерный алгоритм, который решает задачу:


&Вместо("УстановитьПрефикс")
Процедура Расш_УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации)
    
    // 1. Проверяем, что работаем с нужным типом документа
    // Получаем метаданные источника
    МетаданныеИсточника = Источник.Метаданные();
    
    // Определяем, является ли документ Реализацией или связанным документом
    // (в реальной базе лучше проверять по имени или типу)
    Если МетаданныеИсточника.Имя = "РеализацияТоваровУслуг" Тогда
        
        // 2. Проверяем наличие реквизита "Контрагент" и его значение
        // Используем Попытку или проверку метаданных, чтобы избежать ошибок
        Попытка
            Если ЗначениеЗаполнено(Источник.Контрагент) 
               И Источник.Контрагент.Наименование = "ООО КЛЕВ" Тогда
                
                // 3. Устанавливаем уникальный префикс для этого контрагента
                // Например, "НК" вместо стандартного префикса организации
                // Важно: Префикс информационной базы (если есть) добавится к этому значению
                
                Префикс = "НК"; 
                
                // Мы принудительно задали префикс, поэтому стандартные флаги можно сбросить,
                // либо оставить как есть, в зависимости от того, нужен ли префикс узла РИБ
                // УстановитьПрефиксОрганизации = Ложь; 
                
            КонецЕсли;
        Исключение
            // Обработка ситуации, если реквизита нет
        КонецПопытки;
        
    КонецЕсли;
    
    // 4. Вызываем стандартную логику для всех остальных случаев
    ПродолжитьВызов(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации);
    
КонецПроцедуры

Как это работает:

  1. Когда пользователь создает новый документ и записывает его, система вызывает процедуру формирования номера.
  2. Срабатывает наше расширение.
  3. Если контрагент — "ООО КЛЕВ", переменная Префикс меняется на "НК".
  4. Система ищет последний номер именно с префиксом "НК". Если это первый документ, номер будет НК00-000001.
  5. Если контрагент другой, код внутри условия не выполняется, и система формирует стандартный номер (например, НЛ00-000124).

Альтернативный вариант: Интеркампани

Если необходимость отдельной нумерации вызвана тем, что вы продаете товар между своими собственными организациями (как было упомянуто в обсуждении — "продаем сами себе"), то программирование может вовсе не потребоваться.

В 1С:Комплексная Автоматизация и 1С:ERP существует штатный механизм "Интеркампани" (Передачи товаров между организациями).

Как это настроить:

  1. Перейдите в раздел НСИ и администрирование -> Финансовый результат и контроллинг.
  2. Включите опцию Передачи товаров между организациями.
  3. Настройте схему передач: какая организация может продавать товар другой организации.

При использовании этой схемы, вы оформляете продажи конечному клиенту от лица компании-продавца (даже если товара нет на остатке). А в конце месяца (или оперативно) создается специальный документ Передача товаров между организациями. У этого документа есть свой собственный нумератор, отличный от Реализации товаров и услуг. Таким образом, внутренние перепродажи автоматически отделяются от внешних, имея свою сквозную нумерацию.

Вариант "Только на печать"

Иногда требование "видеть букву К в номере" исходит от бухгалтерии, но при этом менять системный номер и плодить префиксы нежелательно. В таком случае самым безопасным решением будет модификация печатной формы.

Суть метода:

  1. Системный номер документа остается стандартным (например, НЛ00-000123).
  2. В документ добавляется дополнительный реквизит (или используется алгоритм "на лету"), который формирует "Номер для печати".
  3. При формировании УПД, Счета-фактуры или Накладной в макет выводится не Ссылка.Номер, а модифицированная строка (Ссылка.Номер + "К").

Это решение не затрагивает базу данных и механизмы платформы, но нужно помнить про ЭДО (Электронный документооборот). Если вы отправляете документы через ЭДО, туда уйдет системный номер. Если требуется отправлять модифицированный номер, придется дорабатывать и модуль выгрузки в ЭДО.

Резюме

Подведем итог решения проблемы:

  1. Не используйте суффиксы в системном номере документа. Это ломает автонумерацию.
  2. Для разделения потоков документов используйте разные префиксы.
  3. Реализуйте подмену префикса через Расширение конфигурации в процедуре УстановитьПрефикс.
  4. Если речь идет о продажах между своими юрлицами, рассмотрите штатный функционал Интеркампани.
← На главную