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