Как реализовать индивидуальные префиксы документов для контрагентов в базовой версии 1С:УНФ

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

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

Анализ проблемы и выбор стратегии

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

Способ 1. Использование расширений конфигурации

Это самый современный и технологичный способ. Начиная с версии платформы 8.3.13, базовые версии программ 1С поддерживают работу с расширениями конфигурации (файлы формата .cfe). Несмотря на то, что вы не можете менять основную конфигурацию, вы можете подключить расширение, созданное в версии ПРОФ или учебной версии.

Рассмотрим алгоритм реализации через расширение:

  1. Создадим расширение и добавим в него документ РасходнаяНакладная.
  2. В расширении перехватим процедуру ПриУстановкеНовогоНомера (используя аннотацию &Вместо или &После).
  3. Добавим логику поиска префикса в дополнительном реквизите контрагента.

Пример программного кода для расширения:


&После("ПриУстановкеНовогоНомера")
Процедура Расш1_ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    
    // Получаем префикс из дополнительного реквизита контрагента
    // Предположим, имя доп. реквизита "ПрефиксДляДокументов"
    Если ЗначениеЗаполнено(ЭтотОбъект.Контрагент) Тогда
        ПрефиксКонтрагента = ОбщегоНазначения.ЗначениеДопРеквизитаОбъекта(ЭтотОбъект.Контрагент, "ПрефиксДляДокументов");
        Если ЗначениеЗаполнено(ПрефиксКонтрагента) Тогда
            Префикс = Префикс + СокрЛП(ПрефиксКонтрагента);
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Преимущество: Нумерация работает автоматически при создании документа. Риск: При обновлении конфигурации имена процедур могут измениться, что потребует адаптации расширения.

Способ 2. Внешние печатные формы (ВПФ) и «виртуальная» нумерация

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

Разберем этапы реализации этого метода:

  1. Создадим Дополнительный реквизит для документа «Расходная накладная» (например, «ВнутреннийНомер»).
  2. Разработаем ВПФ, которая при печати будет проверять заполнение этого реквизита.
  3. Если реквизит пуст, печатная форма находит последний использованный номер по данному контрагенту, увеличивает его на единицу, записывает в документ и выводит на печать.

Проанализируем фрагмент кода для вычисления такого номера в модуле печати:


Функция ПолучитьСформированныйНомер(ДокументСсылка)
    
    // Проверяем, не был ли номер присвоен ранее
    ТекНомер = ОбщегоНазначения.ЗначениеДопРеквизитаОбъекта(ДокументСсылка, "ВнутреннийНомер");
    Если ЗначениеЗаполнено(ТекНомер) Тогда
        Возврат ТекНомер;
    КонецЕсли;

    // Логика поиска максимального номера по контрагенту через запрос
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ МАКСИМУМ(ДополнительныеСведения.Значение) КАК МаксНомер
        |ИЗ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
        |ГДЕ ДополнительныеСведения.Объект.Контрагент = &Контрагент
        |  И ДополнительныеСведения.Свойство.Имя = ""ВнутреннийНомер""";
    
    // ... дальнейшая обработка и запись нового значения ...
    Возврат НовыйСформированныйНомер;
    
КонецФункции

Способ 3. Групповое изменение реквизитов (без программирования)

Для пользователей базовой версии, которые не хотят привлекать программистов, существует вариант с использованием стандартной обработки «Групповое изменение реквизитов» (встроена в БСП). Рассмотрим, как это применить для префиксации:

Создадим доп. реквизит «Префикс» у контрагента. Раз в день или раз в неделю пользователь запускает обработку, фильтрует документы по нужному контрагенту и через вкладку «Дополнительные параметры» выполняет произвольный алгоритм, который дописывает префикс к номеру. Однако этот метод неудобен тем, что требует ручных действий и может «сломать» автоматическую нумерацию 1С, так как номера станут разной длины или нарушится их строгая последовательность.

Критические риски и ограничения

При реализации индивидуальных префиксов важно учитывать несколько «подводных камней», которые могут проявиться не сразу, а через несколько месяцев работы:

Рекомендация для автоматизатора

Как отмечают опытные специалисты (вспомним концепцию «Граблей автоматизатора»), задача по изменению нумерации под каждого клиента часто является избыточной. Прежде чем приступать к реализации, попробуйте выяснить у заказчика истинную цель. Если цель — просто видеть, чей это документ в списке, то гораздо эффективнее настроить список документов, выведя туда колонку «Контрагент» или используя стандартные фильтры. Если же требование жесткое — используйте метод с расширением (Способ 1) как наиболее профессиональный и автоматизированный для базовой версии 1С.

← На главную