Довольно часто от бухгалтерии поступает задача изменить стандартный механизм нумерации документов реализации и счетов-фактур. Например, пользователи хотят видеть номер вида ДДММГГ-№ с ежедневным сбросом счетчика. На первый взгляд задача кажется простой, однако в типовой конфигурации «1С:Бухгалтерия предприятия 3.0» на базе Библиотеки стандартных подсистем (БСП) такая доработка затрагивает множество механизмов — от префиксации до регламентированной отчетности по НДС. Разберем по шагам, где и как правильно переопределять номер, какие подводные камни необходимо учесть и как не сломать учет.
Первый вопрос, который возникает у разработчика: в каком событии документа выполнять модификацию? Попытка назначить номер вручную через запрос поиска максимума в процедуре ПередЗаписью — грубая ошибка. Выясним причину: при одновременной работе нескольких пользователей параллельная запись документов неизбежно приведет к чтению одного и того же максимального значения, возникновению дублей и ошибкам нарушения уникальности либо к блокировкам базы данных.
Штатный и наиболее надежный способ назначения номера в платформе «1С:Предприятие 8» — использование события ПриУстановкеНовогоНомера (через подписку на событие или расширение). Платформа сама управляет блокировками нумератора в транзакции, гарантируя корректное выделение следующего по порядку номера без коллизий. Однако в типовой БП 3.0 уже действует типовая подписка на это событие, отвечающая за механизм БСП. Чтобы внедрить свой алгоритм без конфликта с типовыми механизмами, переопределение логичнее выполнять через подсистему «Префиксация объектов», формируя нужную дату в качестве префикса документа.
Проанализируем структуру номера. Бухгалтеры часто просят формат ДДММГГ-№, однако с точки зрения сортировки строк этот формат крайне неудачен. Строка «010224» (1 февраля) при стандартной лексикографической сортировке в списках и журналах окажется раньше, чем «310124» (31 января). В результате нарушается сквозной хронологический порядок отображения документов. Если принято решение внедрять дату в номер, рекомендуется убедить заказчика использовать формат ГГММДД-№: в таком виде документы естественным образом выстраиваются строго по возрастанию дат.
Рассмотрим пример кода, в котором дата документа преобразуется в префиксную часть номера. Данный алгоритм можно разместить в общем модуле расширения, подключаемом к логике префиксации БСП:
Функция ДополнениеНулем(Число) Экспорт
Если СтрДлина(Строка(Число)) > 2 Тогда
Возврат Прав(Строка(Число), 2);
КонецЕсли;
Возврат ?(СтрДлина(Число) = 1, "0", "") + Строка(Число);
КонецФункции
Функция ПолучитьПрефиксПоДате(ДатаДокумента) Экспорт
// Формируем строку формата ДДММГГ или ГГММДД
ДеньСтр = ДополнениеНулем(День(ДатаДокумента));
МесяцСтр = ДополнениеНулем(Месяц(ДатаДокумента));
ГодСтр = Формат(ДатаДокумента, "ДФ=yy");
// Рекомендуемый порядок: Год + Месяц + День
Возврат ГодСтр + МесяцСтр + ДеньСтр + "-";
КонецФункции
Посмотрим на пример встраивания логики в общую функцию добавления префикса организации. Если в базе ведется учет по нескольким организациям, префикс организации должен обязательно предшествовать дате, иначе номера разных юрлиц пересекутся:
Процедура ДобавитьПрефиксОрганизации(ДокументОбъект, Префикс) Экспорт
ПрефиксОрганизации = "";
Если ДокументОбъект.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
ПрефиксОрганизации = СокрЛП(ДокументОбъект.Организация.Префикс);
КонецЕсли;
// Добавляем к префиксу организации сформированную дату
Префикс = ПрефиксОрганизации + ПолучитьПрефиксПоДате(ДокументОбъект.Дата);
КонецПроцедуры
Перед тем как внедрять подобную доработку, необходимо проанализировать целый ряд критических факторов:
Номер для документов реализации и счетов-фактур составляет всего 11 символов. Префикс даты с разделителем занимает 7 знаков (например, «240517-»). Если к этому добавить двухсимвольный префикс организации или префикс узла РИБ, под сам порядковый номер останется лишь 1–2 знака, чего категорически мало. Увеличение длины реквизита в метаданных снимет конфигурацию с полной поддержки и усложнит типовые обновления.НомерНаПечать(). Стандартный алгоритм отсекает лидирующие нули и префиксы до символа дефиса или косой черты. Если в номере присутствует дефис (например, «170524-001»), алгоритм может посчитать номером документа только то, что идет после дефиса («1»), либо исказить данные в декларации по НДС.Таким образом, реализовывать нестандартную нумерацию рекомендуется исключительно через расширение конфигурации, аккуратно переопределяя модули подсистемы префиксации БСП. Перед релизом обязательно протестируйте проведение авансовых счетов-фактур, печать УПД и формирование записей книги продаж.