Многие пользователи 1С сталкиваются с необходимостью изменения стандартного формата нумерации документов, стремясь адаптировать его под специфические требования бизнеса или просто сделать более наглядным. В 1С:Бухгалтерии предприятия (БП) по умолчанию используется шаблон, включающий дату и порядковый номер, например, 01.01.2025 0000-000001. Однако возникает вопрос: можно ли настроить нумерацию по другому шаблону, например, месяц-день-порядковый номер (0109-01, 0109-02) или ПП-ММДД.001?
Мы проанализируем возможности и сложности такой доработки, опираясь на опыт специалистов 1С и типовые механизмы платформы.
Прежде чем мы приступим к рассмотрению изменений, давайте выясним, как работает стандартная нумерация документов в 1С. Номер документа в 1С является по своей сути строковым полем. Платформа обеспечивает его уникальность в рамках конкретного вида документа. По умолчанию длина номера часто составляет 11 символов, включая возможный префикс. За формирование следующего свободного номера, учет префиксов и обеспечение уникальности отвечают специальные функции, заложенные на уровне платформы и типовых конфигураций, в частности, в Библиотеке стандартных подсистем (БСП).
Префиксы являются штатным механизмом 1С, позволяющим добавить к номеру документа дополнительные символы, например, связанные с организацией (ОРГ-), структурным подразделением или годом. Префиксы располагаются перед основным номером и обычно отделяются от него символом, например, дефисом. Это позволяет структурировать нумерацию, но не изменяет формат основной части номера, которая генерируется автоматически.
Да, изменить шаблон нумерации документов, чтобы он выглядел как ММДД-ННН, 0109-01 или ПП-ММДД.001, возможно, но это потребует серьезной доработки конфигурации и не является штатной функцией. Мы рассмотрим, как это можно сделать, и какие подводные камни нас ожидают.
Изменение настроек нумерации на уровне платформы:
Для некоторых документов в свойствах объекта метаданных можно изменить периодичность нумерации с годовой на ежедневную или месячную. Это базовая настройка, которая влияет на сброс порядкового номера (например, каждый день начинается с 1). Однако, она не позволит вам встроить дату в середину номера или использовать произвольные разделители, как в примере ММДД-ННН. Это лишь механизм сброса счетчика.
Переработка функций формирования номера (БСП):
Основной способ реализации такого сложного шаблона – это изменение типовых функций, которые отвечают за установку нового номера документа. Эти функции обычно находятся в общих модулях БСП, например, в модулях, отвечающих за работу с номерами документов. Вам потребуется переписать логику, чтобы она формировала номер в соответствии с желаемым шаблоном: включала в себя часть даты (месяц, день, год), добавляла пользовательские разделители (точки, дефисы) и генерировала порядковый номер. Этот подход был подтвержден в обсуждении как требующий изменения БСП.
Например, чтобы получить формат типа ПП-ММДД.001 или БУБП-011001, необходимо будет изменить алгоритм формирования номера, который обычно работает с префиксами и автоинкрементом. При этом важно помнить, что номер документа остается строкой, и вы можете встраивать в него строковые представления даты.
Вы задавались вопросом, можно ли использовать черточки (дефисы) внутри номера, например, 0109-01. В стандартном понимании, дефис (-) часто используется как разделитель между префиксом и основным номером. Использование его *внутри* самого номера как составной части шаблона (например, для разделения месяца и дня) технически возможно, поскольку номер — это строка. Однако, как было отмечено в обсуждении, это может вызвать недопонимание или некорректную обработку со стороны стандартных функций, которые могут пытаться парсить номер, или у внешних систем, которые могут иметь свои ограничения на формат номера. Например, номер ПРЕФИКС-ММДД-ННН может быть неоднозначно интерпретирован, если первый дефис – разделитель префикса, а второй – часть номера.
В целом, платформа не запрещает использовать символы типа -, . или / внутри строкового номера, но их применение должно быть обоснованно и проверено на совместимость с существующей логикой (например, сортировка, поиск).
Специалисты 1С крайне не советуют вмешиваться в стандартные механизмы нумерации. На то есть несколько веских причин, подробно обсуждавшихся на форуме:
Сложности с обновлениями: Любое изменение типовых функций БСП делает вашу конфигурацию нетиповой. Это означает, что каждое обновление конфигурации потребует ручного слияния измененного кода. Этот процесс трудоемкий, дорогостоящий и чреват ошибками, особенно если изменения в БСП затрагивают модули нумерации. Вам придется регулярно анализировать изменения в типовой конфигурации и адаптировать под них свой код.
Нарушение последовательности и уникальности: Некорректно реализованная кастомная нумерация может привести к дублированию номеров документов или нарушению их уникальности и последовательности. Это серьезно скажется на бухгалтерском и управленческом учете, а также на отчетности. Стандартные механизмы гарантируют уникальность, а при собственной реализации эту гарантию придется обеспечивать самостоятельно.
Производительность: Если ваша логика формирования номера будет неоптимальной, это может негативно сказаться на производительности системы, особенно при большом объеме документов. Дополнительная логика для поиска следующего уникального номера или его формирования может занимать значительное время при записи каждого документа.
Целостность данных и совместимость: Измененные номера могут не корректно обрабатываться при обмене данными с другими системами, при выгрузке/загрузке или при анализе стандартными отчетами. Существуют хардкодная завязка на длину префикса и общую длину номера, что может вызвать проблемы.
Длина номера: Стандартная длина номера часто ограничена 11 символами. Если ваш новый шаблон требует большей длины (например, ПП-20250109-02), это потребует изменения длины поля номера во всех документах, затрагивая структуру метаданных. Хотя такое решение и встречается на практике (увеличение длины номера до 13 символов), оно усложняет миграцию и совместимость.
Потенциальное нарушение логики учета: Последовательность номеров критична для многих видов учета (например, кассовые документы, счета-фактуры). Изменение правил нумерации может нарушить эту логику.
Если вам все же необходим нестандартный номер для отображения или печати, но вы хотите избежать глубокой переработки конфигурации, рассмотрите следующие, менее инвазивные варианты:
Использование дополнительного строкового реквизита:
Это наиболее рекомендуемый подход, который позволяет получить желаемый вид номера без изменения основного механизма нумерации. Вы можете добавить в документ новый строковый реквизит, например, НомерДляПечати или ПользовательскийНомер. В этом реквизите будет храниться номер в желаемом формате (например, 0109-01 или МДД.ННН, как было упомянуто). Основной номер документа при этом останется стандартным (например, 0000-000001), что обеспечит легкие обновления.
Вы можете реализовать заполнение этого дополнительного реквизита при создании или записи документа через:
Подписку на событие ПриЗаписи: Создайте подписку на событие ПриЗаписи для нужных видов документов. В обработчике этой подписки программно формируйте и записывайте номер в ваш дополнительный реквизит.
// Пример кода в модуле подписки на событие
// для реквизита "НомерДляПечати"
Процедура УстановкаПользовательскогоНомераПриЗаписи(Источник, Отказ)
Если Источник.НомерДляПечати = "" Тогда
// Пример формирования номера "ММДД-ННН"
// Необходимо реализовать функцию, которая вернет уникальный номер для дня
// с учетом текущей даты и уже существующих номеров за этот день.
// Например, запрос к регистрам или перебор документов.
Источник.НомерДляПечати = СформироватьПользовательскийНомер(Источник.Дата);
КонецЕсли;
КонецПроцедуры
Функция СформироватьПользовательскийНомер(ДатаДокумента)
// Эта функция должна искать последний номер за текущий день
// и возвращать следующий.
// Пример упрощенной логики:
Перем НовыйНомерПорядка;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ МАКСИМУМ(Документ.НомерДляПечати) КАК МаксНомер
|ИЗ Документ.ВашВидДокумента КАК Документ
|ГДЕ НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &ДатаНачалаДня";
Запрос.УстановитьПараметр("ДатаНачалаДня", НачалоДня(ДатаДокумента));
Результат = Запрос.Выполнить().Выбрать();
НовыйНомерПорядка = 1;
Если Результат.Следующий() И ЗначениеЗаполнено(Результат.МаксНомер) Тогда
// Извлечь порядковый номер из строки "ММДД-ННН"
ПозицияДефиса = Найти(Результат.МаксНомер, "-");
Если ПозицияДефиса > 0 Тогда
ПорядковыйНомерСтрока = Прав(Результат.МаксНомер, СтрДлина(Результат.МаксНомер) - ПозицияДефиса);
НовыйНомерПорядка = Число(ПорядковыйНомерСтрока) + 1;
КонецЕсли;
КонецЕсли;
Возврат Формат(ДатаДокумента, "ДФ=ММДД") + "-" + Формат(НовыйНомерПорядка, "ЧЦ=2; ЧВН=; ЧГ=0");
КонецФункции
Обработка заполнения: В обработчике события ОбработкаЗаполнения при создании нового документа можно сформировать и присвоить значение дополнительному реквизиту. Это более простое решение, если номер должен генерироваться только при первичном создании и не изменяться.
Модификация печатных форм: В печатных формах вместо стандартного номера документа ([Документ.Номер]) вы будете выводить значение из вашего дополнительного реквизита (например, [Документ.НомерДляПечати]). Это позволяет получить нужный внешний вид на печать без изменения внутренней логики нумерации, что является очень распространенной практикой.
Этот метод значительно упрощает процесс обновления конфигурации, так как вы не трогаете типовые механизмы платформы и БСП, что делает его предпочтительным.
Подписка на событие "ПриУстановкеНовогоНомера" (для некоторых объектов):
Платформа 1С для некоторых объектов может предоставлять возможность перехватить процесс установки нового номера через подписки на события. Это более глубокий уровень вмешательства, чем использование дополнительного реквизита, но потенциально менее инвазивный, чем прямое изменение кода БСП. Однако, даже в этом случае, вы можете столкнуться с ограничениями по длине и составу символов, которые накладываются на стандартное поле номера документа.
Пример (концептуально, детали могут отличаться в зависимости от версии платформы и объекта):
// В модуле подписки на событие "ПриУстановкеНовогоНомера"
Процедура ПриУстановкеНовогоНомераДокумента(Источник, Префикс, СвободныйНомер, Отказ)
// Здесь можно переопределить логику формирования СвободныйНомер
// и установить его в соответствии с вашим шаблоном.
// Например:
// СвободныйНомер = Формат(Источник.Дата, "ДФ=ММДД") + "-" + СвободныйНомер;
// Отказ = Истина; // Чтобы стандартная нумерация не сработала и использовался ваш номер
// Важно! Обеспечить уникальность номера при таком подходе сложнее.
КонецПроцедуры
Внимание: Даже при использовании подписок, вам, возможно, придется учитывать стандартные правила нумерации 1С, чтобы избежать конфликтов и дублирования, а также соблюдать ограничения на длину поля номера.
Исходя из всех рассмотренных аспектов, мы даем следующие рекомендации:
Лучший вариант – не менять вообще: Если нет острой бизнес-необходимости, которая перевешивает все риски, мы настоятельно рекомендуем оставить стандартную нумерацию документов. Это обеспечивает стабильность работы системы, упрощает обновления и поддержку.
Если изменение критично: В случае, когда нестандартная нумерация является критически важной для бизнес-процессов (например, для интеграции с внешними системами, жестких требований законодательства или специфики отраслевого учета), мы рекомендуем использовать подход с дополнительным строковым реквизитом для печати и отображения. Это минимизирует риски, позволяет сохранить типовую конфигурацию и значительно снижает затраты на сопровождение.
Осторожность при изменении БСП: Если вы все же решитесь на изменение БСП или использование подписок на события для модификации основного номера документа, будьте готовы к значительным трудозатратам на разработку, тщательное тестирование и регулярное сопровождение при каждом обновлении. Обязательно учитывайте максимальную длину поля номера (по умолчанию 11 символов, но может быть увеличена до 13 и более при глубокой доработке) и особенности ее конвертации при обмене данными. Этот подход требует высокой квалификации программиста и готовности нести повышенные расходы на поддержку.
Помните, что любое вмешательство в типовую конфигурацию требует глубокого понимания платформы 1С и её механизмов. Перед принятием решения о подобных доработках тщательно взвесьте все "за" и "против", оцените риски и потенциальные затраты.