Как реализовать нумерацию счетов-фактур через дробь в 1С

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

Вопрос настройки нумерации в 1С с использованием разделителей, таких как косая черта (/), является классической задачей при автоматизации учета в организациях с обособленными подразделениями. Согласно законодательству (Постановление №1137), счета-фактуры, выставляемые филиалами, должны иметь порядковый номер, дополненный через дробь цифровым индексом этого подразделения. В этой статье мы подробно разберем, как реализовать такую задачу, сохранив при этом механизм автоматического присвоения номеров.

Проблема стандартной автонумерации при использовании дроби

Для начала проанализируем ситуацию с точки зрения платформы 1С:Предприятие. Стандартный механизм автонумерации работает по принципу поиска самой правой группы цифр в строке номера и увеличения ее на единицу. Если мы просто вручную установим номер 00001/03, то при создании следующего документа система может повести себя непредсказуемо: либо она попытается увеличить число после дроби (сделав 00001/04), либо выдаст ошибку, если длина номера превысит допустимый предел.

Рассмотрим основные способы решения этой задачи, от самых простых до более сложных программных методов.

Способ 1: Использование типового функционала (для современных конфигураций)

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

  1. Перейдем в карточку подразделения организации.
  2. Найдем поле Цифровой индекс подразделения для счета-фактуры.
  3. Введем нужное значение (например, 03).

В этом случае в самой базе данных документ может храниться с обычным номером (например, 000000001), а дробь /03 будет автоматически добавляться в печатную форму и при выгрузке отчетности (в книгу продаж и декларацию по НДС). Это самый безопасный вариант, так как он не нарушает логику хранения данных.

Способ 2: Модификация печатных форм (через глобальный модуль)

Если нам нужно, чтобы в журналах номер оставался «чистым», а в печатных формах и книге продаж фигурировал номер с дробью, мы можем воспользоваться методом правки общих функций. В типовых конфигурациях за вывод номера на печать часто отвечает функция глНомерНаПечать (или аналогичные методы в модулях менеджеров документов).

Проанализируем пример кода, который можно внедрить в процедуру печати:


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

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

Способ 3: Программная установка номера через событие

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

Выясним причину, по которой стандартный префикс нам не подходит: префикс всегда ставится в начало, а нам нужен постфикс. Рассмотрим программную реализацию:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    
    // Отключаем стандартную генерацию, если нужно полностью кастомное решение
    // Или используем префикс для разделения по организациям
    Префикс = Префикс + "ФЛ-"; // Например, префикс филиала
    
    // После установки номера системой (или в конце процедуры) 
    // можно добавить логику добавления дроби, но лучше делать это так:
    // Номер будет иметь вид ФЛ-0000001, а при выводе мы добавим /03
    
КонецПроцедуры

Важный нюанс: если вы решите записывать в поле Номер строку вида 00001/03, вам придется полностью переопределить алгоритм поиска «последнего» номера. Стандартный механизм ОбновитьНумерациюОбъектов() не поймет, что число до дроби нужно инкрементировать.

Способ 4: Кастомный алгоритм нумерации (ручной метод)

Если вы все же решили хранить дробь в номере, разберем, как реализовать поиск следующего номера программно. Нам нужно найти максимальный номер с конкретным постфиксом, извлечь из него цифровую часть, увеличить ее и собрать номер заново.

Пример реализации в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() И ПустаяСтрока(ЭтотОбъект.Номер) Тогда
        Постфикс = "/03";
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |	СчетФактура.Номер КАК Номер
            |ИЗ
            |	Документ.СчетФактураВыданный КАК СчетФактура
            |ГДЕ
            |	СчетФактура.Номер ПОДОБНО ""%"+ Постфикс + """
            |УПОРЯДОЧИТЬ ПО
            |	СчетФактура.Дата УБЫВ,
            |	СчетФактура.Номер УБЫВ";
        
        Результат = Запрос.Выполнить();
        Если Не Результат.Пустой() Тогда
            Выборка = Результат.Выбрать();
            Выборка.Следующий();
            ПоследнийНомер = Выборка.Номер;
            // Извлекаем числовую часть (до дроби)
            ЧистаяЧасть = Лев(ПоследнийНомер, Найти(ПоследнийНомер, "/") - 1);
            НовоеЧисло = Число(ЧистаяЧасть) + 1;
            // Форматируем с нулями (длина номера обычно 11 или 9 символов)
            ЭтотОбъект.Номер = Формат(НовоеЧисло, "ЧЦ=8; ЧВН=; ЧГ=") + Постфикс;
        Иначе
            ЭтотОбъект.Номер = "00000001" + Постфикс;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Риски и рекомендации

Рассмотрим важные моменты, которые часто упускают при реализации нумерации через дробь:

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

← На главную