В практике разработки на платформе 1С часто возникает задача кастомизации стандартной нумерации документов. Например, когда бизнес-процесс требует добавления определенных буквенных индексов в зависимости от вида операции или других реквизитов документа Расходная накладная. В этой статье мы подробно разберем, как правильно вмешаться в механизмы платформы и БСП, чтобы реализовать нестандартную нумерацию, сохранив при этом стабильность системы.
Прежде чем приступать к написанию кода, проанализируем важный нюанс, упомянутый в обсуждении: различие между «номером в шапке» и фактическим номером документа. В современных конфигурациях 1С (УТ 11, ERP, БП 3.0) пользователю часто выводится не «сырой» номер из базы данных, а его строковое представление.
Разберем, почему это происходит. Платформа хранит номер в виде строки, например, 0000-000001. Однако при выводе в форму или печатную форму специальные функции (например, из общего модуля ПрефиксацияОбъектовКлиентСервер) могут отсекать лидирующие нули или префиксы организации. Если вы измените только отображение в форме, в базе данных номер останется прежним, что приведет к путанице. Наша задача — изменить именно алгоритм генерации самого номера при создании объекта.
Это базовый механизм платформы 1С. Рассмотрим ситуацию: нам нужно добавить литеру в номер в зависимости от вида операции документа. Самым правильным местом для этого будет создание Подписки на событие ПриУстановкеНовогоНомера.
Выясним, как это работает. Событие срабатывает, когда система вызывает метод УстановитьНовыйНомер() (обычно при первой записи объекта). Мы можем перехватить стандартный префикс и дополнить его своей логикой. Рассмотрим пример кода, который можно разместить в модуле подписки:
Процедура ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
// Проверяем, что работаем именно с Расходной накладной
Если ТипЗнч(Источник) = Тип("ДокументОбъект.РасходнаяНакладная") Тогда
// Определяем нужную литеру на основании вида операции
ДополнительныйПрефикс = "";
Если Источник.ВидОперации = Перечисления.ВидыОперацийРН.РеализацияВРозницу Тогда
ДополнительныйПрефикс = "Р";
ИначеЕсли Источник.ВидОперации = Перечисления.ВидыОперацийРН.Экспорт Тогда
ДополнительныйПрефикс = "Э";
КонецЕсли;
// Добавляем литеру к стандартному префиксу (организации и базы)
Префикс = Префикс + ДополнительныйПрефикс;
КонецЕсли;
КонецПроцедуры
Важный момент: Платформа 1С ожидает, что всё, что передано в параметр Префикс, будет добавлено перед числовой частью номера. Если вы добавите букву сюда, система автоматически поставит её перед дефисом или перед основным числовым блоком, что гарантирует сохранение автонумерации.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), то прямое вмешательство через подписки может конфликтовать с внутренними механизмами библиотеки. Проанализируем более «элегантный» путь — использование переопределяемых модулей.
Рассмотрим общий модуль ПрефиксацияОбъектовПереопределяемый. В нем существует процедура ПриУстановкеПрефикса. Именно здесь БСП формирует итоговый префикс документа, собирая его из кодов организации, подразделения и информационной базы. Посмотрим на пример реализации:
Процедура ПриУстановкеПрефикса(Объект, Префикс) Экспорт
// Проверяем тип объекта
Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "Метаданные").Имя = "РасходнаяНакладная" Тогда
// Логика добавления кастомного символа
Если Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийРН.ОсобаяОперация") Тогда
Префикс = Префикс + "С"; // Добавит букву 'С' в структуру префикса
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование этого метода позволяет избежать ошибок при обновлении конфигурации и корректно интегрируется в стандартную логику формирования номеров.
В исходном вопросе автор упоминал желание заменить «первый нолик после дефиса» на букву. Проанализируем, почему это решение технически опасно:
00-А00001, она может не распознать его как число и либо начнет нумерацию заново с 1, либо выдаст ошибку уникальности.Рекомендация: Вместо модификации цифровой части, всегда расширяйте префикс. Структура номера [ПРЕФИКС]-[НОМЕР] является стандартной. Всё, что находится до дефиса, 1С воспринимает как текстовую метку, а всё, что после — как число для инкремента.
Иногда требования бизнеса касаются только внешнего вида документов (счетов-фактур, накладных), а в самой базе номера должны оставаться стандартными. В этом случае нам не нужно менять логику записи документа. Разберем, куда вклиниться для изменения вывода.
Посмотрим на общий модуль ПрефиксацияОбъектовКлиентСервер и функцию ПолучитьНомерНаПечать. Если вы используете расширения, можно перехватить выполнение этой функции (через &Вместо или &После) и программно добавлять нужные буквы в возвращаемое значение. Это позволит сохранить «чистую» нумерацию в базе, но при этом удовлетворить требования заказчика по печати.
Чтобы не снимать конфигурацию с поддержки, крайне рекомендуется выполнять все описанные действия через Расширения. Создадим в расширении собственную подписку на событие ПриУстановкеНовогоНомера для документа РасходнаяНакладная. Это позволит:
Выясним алгоритм действий: создаем новое расширение, добавляем в него документ РасходнаяНакладная, создаем общий модуль и процедуру-обработчик, затем регистрируем подписку в дереве метаданных расширения.
Подводя итог, отметим, что правильный путь изменения нумерации — это всегда работа с префиксом. Это сохраняет логику платформы по автоматическому увеличению номера и избавляет от проблем с уникальностью в будущем. Мы проанализировали основные точки входа (подписки и модули БСП) и выяснили причины, по которым не стоит менять структуру цифровой части номера.