В какой процедуре/модуле 1С:БСП генерируется номер документа и как изменить префикс?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

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

  1. Префикс организации (АА): Этот префикс обычно состоит из двух символов (чаще всего букв или цифр). Он используется в тех случаях, когда в одной информационной базе ведется учет для нескольких юридических лиц или индивидуальных предпринимателей. Наличие префикса организации позволяет организовать сквозную, но при этом изолированную нумерацию документов для каждой организации. Например, документы ООО "Ромашка" будут иметь префикс "РМ", а документы ИП "Иванов" — "ИВ". Если префикс для организации не задан, система может использовать вместо него нули или вовсе опустить этот блок, в зависимости от настроек.
  2. Префикс информационной базы (BB): Также состоящий из двух символов, этот префикс служит уникальным идентификатором конкретной информационной базы. Его применение особенно важно при обмене данными между разными конфигурациями (например, между «Управлением торговлей» и «Бухгалтерией предприятия») или при работе с распределенными информационными базами (РИБ). Главная задача префикса ИБ — предотвратить дублирование номеров документов и кодов элементов справочников, создаваемых в разных базах, обеспечивая их уникальность во всей распределенной системе. Если префикс ИБ не указан явно, по умолчанию часто используется "00".
  3. Дополнительный пользовательский префикс (CC): Этот элемент шаблона является опциональным и может быть задан для определенных видов документов по мере необходимости. Например, он может быть использован для документов, которые были импортированы из внешних систем, или для специфических операций, таких как счета-фактуры на аванс. Его наличие позволяет добавить еще один уровень детализации и идентификации.
  4. Порядковый номер (000123): Это, собственно, сам уникальный порядковый номер документа в рамках заданных префиксов и периода нумерации. Система автоматически инкрементирует этот номер для каждого нового документа.

Таким образом, мы видим, что примерный формат номера может выглядеть как ААВВ-СС000123, где каждая часть играет свою роль в обеспечении уникальности и информативности номера документа.

Настройки нумерации документов в Конфигураторе 1С

Прежде чем погружаться в программное изменение префиксов, давайте рассмотрим, какие базовые настройки нумерации доступны нам в режиме Конфигуратора для каждого вида документа. Эти параметры определяют поведение системы по умолчанию при присвоении номеров.

  1. Автонумерация: Эта опция является основополагающей. Если она включена (установлена в значение Истина), система будет автоматически присваивать номер каждому новому документу при его создании и записи. Если же Автонумерация отключена, пользователю или программному коду придется вручную вводить номер документа.
  2. Длина номера: Здесь мы устанавливаем максимальную допустимую длину номера документа, включая все префиксы и сам порядковый номер. Этот параметр важен для стандартизации и обеспечения единообразия. Например, если установлена длина 11, а префиксы занимают 4 символа, то на сам порядковый номер останется 7 символов.
  3. Контроль уникальности: Включение этой опции предписывает системе проверять уникальность номера документа при его сохранении. Если номер уже существует в базе данных, система выдаст ошибку и не позволит записать документ с неуникальным номером. Это критически важно для корректного учета и предотвращения путаницы.
  4. Периодичность: Этот параметр определяет, в течение какого периода номер документа должен быть уникальным. Мы можем выбрать один из следующих вариантов:
    • Без ограничения: Номер документа должен быть уникальным на протяжении всего срока существования информационной базы. Нумерация продолжается по нарастающей.
    • По дню: Нумерация начинается с первого номера каждый новый день.
    • По месяцу: Нумерация начинается с первого номера каждый новый месяц.
    • По кварталу: Нумерация начинается с первого номера каждый новый квартал.
    • По году: Нумерация начинается с первого номера каждый новый год.

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

  5. Использование префиксов: В этом разделе мы можем указать, какие стандартные префиксы будут использоваться при формировании номера документа. Типовые конфигурации БСП предоставляют возможности использования префиксов по организации, складу, пользователю и другим измерениям. Например, мы можем указать, что для данного документа всегда должен использоваться префикс организации.

Понимание этих настроек является первым шагом к эффективному управлению нумерацией документов в 1С.

Ключевой механизм: Подписка на событие "ПриУстановкеНовогоНомера"

Основным инструментом, позволяющим нам тонко настроить или полностью переопределить логику генерации номера документа, является подписка на событие "ПриУстановкеНовогоНомера". Этот механизм особенно важен, когда стандартные настройки в Конфигураторе не позволяют достичь требуемого поведения, например, когда нам нужно присвоить документу специфический префикс, не зависящий от организации или узла обмена.

Что такое подписки на события?

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

Событие "ПриУстановкеНовогоНомера"

Событие ПриУстановкеНовогоНомера вызывается в критически важный момент в процессе записи нового объекта документа. Оно происходит между событиями "ПередЗаписью" и "ПриЗаписи" модуля объекта документа. Это идеальное место для вмешательства в процесс формирования номера, поскольку на этом этапе все необходимые данные документа уже сформированы (событие "ПередЗаписью" уже отработало), но номер еще не окончательно установлен. Таким образом, мы можем определить или изменить префикс на основе данных самого объекта документа или любой другой нормативно-справочной информации, доступной в системе.

Где размещается обработчик события?

Обработчик события ПриУстановкеНовогоНомера может быть реализован в нескольких местах:

  1. В модуле объекта конкретного документа: Если нам нужно изменить префикс только для одного определенного вида документа, мы можем создать процедуру ПриУстановкеНовогоНомера непосредственно в модуле объекта этого документа. Это самый локализованный подход.
  2. В общем модуле: Если логика установки префикса сложная, или если она должна применяться к нескольким различным видам документов, целесообразно вынести эту логику в общий модуль. В этом случае подписка на событие будет указывать на процедуру в этом общем модуле. Это позволяет централизовать код и упростить его поддержку.

При использовании подписки на событие, мы указываем источник события (например, документ "РеализацияТоваровУслуг"), имя события (ПриУстановкеНовогоНомера) и имя процедуры-обработчика (например, УправлениеНумерациейДокументов.УстановитьПрефиксДокументаПриУстановкеНовогоНомера), которая находится в общем модуле.

Программная установка префикса с помощью метода УстановитьНовыйНомер()

После того как мы определились с желаемым префиксом, нам необходимо программно установить его для документа. Для этой цели в 1С предусмотрен специальный метод УстановитьНовыйНомер(<ПрефиксНомера>).

Давайте подробно рассмотрим этот метод:

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

Реализация пользовательского префикса "жп" для специфичных документов

Теперь давайте перейдем к решению нашей конкретной задачи: присвоить некоторым документам единый префикс "жп", независимо от организации и узла обмена, и при этом чтобы они не попадали в налоговую отчетность. Для этого мы будем использовать подписку на событие ПриУстановкеНовогоНомера.

Шаги по реализации:

  1. Определяем документ: Выясняем, для каких именно видов документов (например, "РеализацияТоваровУслуг", "ПоступлениеТоваровУслуг") нам необходимо изменить префикс.
  2. Создаем подписку на событие (или используем существующую):
    • В Конфигураторе мы открываем ветку "Общие" -> "Подписки на события".
    • Создаем новую подписку (или находим подходящую, если она уже существует для обработки установки нового номера).
    • В свойствах подписки указываем:
      • Имя: Осмысленное имя, например, "УстановкаПрефиксаЖПДляДокументов".
      • Событие: ПриУстановкеНовогоНомера.
      • Источник: Здесь мы перечисляем все виды документов, для которых хотим изменить префикс (например, Документ.РеализацияТоваровУслуг, Документ.АктВыполненныхРабот и т.д.).
      • Обработчик: Указываем процедуру в общем модуле, которая будет выполнять всю логику. Например, НашиРасширенияДокументов.ПриУстановкеНовогоНомераДокументовЖП. Важно, чтобы этот общий модуль был серверным и компилировался на клиенте, если это требуется.
  3. Пишем код обработчика в общем модуле: Создаем указанную процедуру в соответствующем общем модуле.

Пример кода в процедуре ПриУстановкеНовогоНомера (которая может находиться в модуле объекта документа или, что более предпочтительно, в общем модуле, если подписка на событие ведет туда):


// В общем модуле, который указан в ПодпискеНаСобытие
// Например, ОбщийМодуль.НашиРасширенияДокументов

Процедура ПриУстановкеНовогоНомераДокументовЖП(Источник, СтандартнаяОбработка, Префикс) Экспорт

    // Источник - это сам объект документа, например, ДокументОбъект.РеализацияТоваровУслуг
    // СтандартнаяОбработка - булево, можно установить в Ложь, чтобы полностью отменить стандартную логику
    // Префикс - строка, которую мы можем изменить (передается по ссылке)

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

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

    // В более общем случае, если префикс "ЖП" должен быть для всех документов,
    // которые имеют некий флаг (например, реквизит "ВидОперацииСпецифический"),
    // мы можем сделать так:
    Попытка
        Если Источник.Метаданные().Реквизиты.Найти("ВидОперацииСпецифический") <> Неопределено Тогда
            Если Источник.ВидОперацииСпецифический Тогда
                Префикс = "ЖП";
            КонецЕсли;
        КонецПопытки;
    Исключение
        // Обработка исключения, если реквизит отсутствует или произошла другая ошибка.
        // Можно записать в журнал регистрации для отладки.
        ЗаписьЖурналаРегистрации("УстановкаПрефикса", УровеньЖурналаРегистрации.Ошибка, 
                                ТипЗнч(Источник), Источник, 
                                "Ошибка при проверке реквизита 'ВидОперацииСпецифический': " + ОписаниеОшибки());
    КонецИсключения;

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

В этом примере мы видим, что переменная Префикс передается в процедуру по ссылке. Это означает, что любое изменение ее значения внутри процедуры напрямую повлияет на окончательный префикс документа. Мы также можем использовать параметр СтандартнаяОбработка: если установить его в Ложь, то вся стандартная логика формирования префиксов будет отменена, и система будет использовать только тот префикс, который мы задали. Однако, для простого изменения префикса, как в нашем случае, достаточно просто присвоить новое значение переменной Префикс, а стандартная обработка продолжит свою работу, используя уже измененный нами префикс для добавления порядкового номера.

Важный момент: Мы должны обеспечить, чтобы логика, определяющая, нужно ли присваивать префикс "жп", была надежной. Это может быть отдельный реквизит документа ("НеПоказыватьНалоговой", "ДляВнутреннегоУчета"), или определенный вид операции, или комбинация других условий. Реквизиты можно добавить в режиме конфигуратора или через механизм дополнительных реквизитов.

Важные нюансы и рекомендации

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

  1. Использование общих модулей для сложной логики: Если логика установки префикса является нетривиальной, содержит множество условий или должна применяться к большому количеству различных документов, категорически рекомендуется выносить ее в отдельный общий модуль. Это значительно повышает читаемость кода, упрощает его отладку и поддержку. Представьте, что вам нужно внести изменение в логику для десяти разных документов – гораздо проще это сделать в одном месте, чем редактировать десять модулей объектов.
  2. Влияние на существующие префиксы: Мы должны понимать, что изменение префикса организации, информационной базы или программное переопределение префикса через подписку на событие влияет только на вновь создаваемые документы. Номера ранее созданных документов не изменятся автоматически. Если возникнет необходимость в поддержании сквозной нумерации или изменении префиксов для уже существующих документов, это потребует ручного редактирования номеров или разработки специальной обработки для пакетного изменения, что является трудоемкой и потенциально рискованной операцией.
  3. Обеспечение уникальности номеров: При любом изменении стандартной логики нумерации мы должны быть уверены, что новая схема по-прежнему гарантирует уникальность номеров документов. Дублирование номеров может привести к серьезным проблемам в учете, отчетности и обмене данными. Всегда проверяйте, что ваш новый префикс в сочетании с порядковым номером и периодичностью нумерации не создает коллизий.
  4. Консистентность при обмене данными: Если ваша база участвует в обмене данными с другими информационными базами (например, через РИБ или универсальный обмен), изменение префиксов может нарушить уникальность номеров в объединенной системе или привести к ошибкам при загрузке данных. Необходимо тщательно протестировать все сценарии обмена после внесения изменений в механизм нумерации. Убедитесь, что пользовательские префиксы не вступают в конфликт с префиксами узлов обмена.
  5. Расширения конфигурации: В современных версиях 1С:Предприятия 8.3 для внесения таких изменений предпочтительно использовать расширения конфигурации. Это позволяет модифицировать поведение системы без изменения основной конфигурации, что значительно упрощает ее обновление. Подписку на событие и общий модуль с нашим обработчиком можно создать в расширении. Это считается лучшей практикой разработки.
  6. Критически важное действие: Резервное копирование: Перед внесением абсолютно любых изменений в конфигурацию, особенно в механизмы, влияющие на ключевые аспекты учета, такие как нумерация документов, обязательно сделайте полную архивную копию информационной базы! Некорректные действия или ошибки в коде могут привести к потере данных, нарушению целостности базы или блокировке работы системы, и резервная копия будет единственным способом быстро восстановить работоспособность.

Следуя этим рекомендациям, мы можем эффективно и безопасно настроить нумерацию документов в 1С, решая специфические задачи нашего учета, такие как присвоение пользовательского префикса "жп".

← На главную