При формировании печатных форм первичных документов (например, товарной накладной ТОРГ-12, акта об оказании услуг или счета-фактуры) пользователи часто сталкиваются с ситуацией, когда номер документа в программе отличается от номера на печатном бланке. Номер вида АА-000318 на листе превращается в 318 или АА318. Разберем детально, почему типовые конфигурации 1С ведут себя подобным образом, как устроен этот механизм изнутри и какими способами можно решить задачу сохранения префикса без нарушения целостности учета.
Префиксы в системе «1С:Предприятие» несут строго служебную и технологическую функцию. Они предназначены для двух основных задач:
Согласно методологии фирмы «1С» и нормам законодательства (включая требования к оформлению счетов-фактур и книг продаж), технологические префиксы и лидирующие нули не являются обязательными идентификаторами для контрагентов и контролирующих органов. По этой причине в типовых решениях номер документа при выводе на печать очищается от служебных символов.
Выясним причину такого поведения на уровне исходного кода. В конфигурации за преобразование номера отвечает экспортная функция, которая вызывается перед заполнением табличного документа печатной формы. Рассмотрим типовой фрагмент формирования номера:
Функция ПолучитьНомерНаПечать(Документ, МассивПрефиксов = Неопределено) Экспорт
Если Документ = Неопределено Тогда
Возврат 0;
КонецЕсли;
Номер = СокрЛП(Документ.Номер);
// Если номер документа по стандарту БСП, формируем номер через стандартную процедуру
Если ПолучитьФункциональнуюОпцию("ИспользоватьОбменДанными") = Истина Тогда
Если Сред(Номер, 5, 1) = "-" Тогда
Номер = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(
Номер,
Ложь, // УдалитьПрефиксИнформационнойБазы
Истина // УдалитьПользовательскийПрефикс
);
Возврат Номер;
КонецЕсли;
КонецЕсли;
Префикс = "";
Если МассивПрефиксов = Неопределено Тогда
Организация = Неопределено;
Если ТипЗнч(Документ) = Тип("ВыборкаИзРезультатаЗапроса") ИЛИ ТипЗнч(Документ) = Тип("Структура") Тогда
Организация = Документ.Организация;
Иначе
МетаданныеДокумента = Документ.Метаданные();
Если ЕстьРеквизитДокумента("Организация", МетаданныеДокумента) Тогда
Организация = Документ.Организация;
КонецЕсли;
КонецЕсли;
МассивПрефиксовДляОбхода = СформироватьМассивПрефиксовДляРИБИОрганизации(Организация);
Иначе
МассивПрефиксовДляОбхода = МассивПрефиксов;
КонецЕсли;
Для Каждого ТекущийПрефикс ИЗ МассивПрефиксовДляОбхода Цикл
// Удаление префикса из номера документа
Если Найти(Номер, ТекущийПрефикс) = 1 Тогда
Номер = Сред(Номер, СтрДлина(ТекущийПрефикс) + 1);
КонецЕсли;
// Удаление дефиса в начале номера
Если Лев(Номер, 1) = "-" Тогда
Номер = Сред(Номер, 2);
КонецЕсли;
// Удаление ведущих нулей
Пока Лев(Номер, 1) = "0" Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
КонецЦикла;
Возврат Номер;
КонецФункции
Проанализируем этот алгоритм:
ББОО-ЧЧЧЧЧЧЧЧ, где два знака — префикс базы, два знака — префикс организации). Если структура строго соответствует стандарту, вызывается метод ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать.Сред(Номер, 5, 1) = "-" не срабатывает. Код переходит ко второму блоку, где префикс организации и префикс ИБ удаляются посимвольно в цикле вместе с дефисом и ведущими нулями.ПрефиксыИнформационныхБаз или в справочнике Организации длина префикса не согласована с шаблоном, алгоритм может удалить дефис и нули, но оставить буквенную часть номера.В типовых конфигурациях «1С:Бухгалтерия предприятия 2.0» нет пользовательской настройки или константы, которая отключала бы удаление префиксов. Вносить изменения напрямую в конфигурацию не рекомендуется, так как это усложнит обновление и может нарушить правила нумерации в регламентированных отчетах и книге продаж. Рассмотрим правильные способы решения проблемы.
Разберем самый безопасный и корректный способ, если бухгалтерии или клиентам обязательно требуется видеть полный номер с префиксами в печатных документах.
ПолучитьНомерНаПечать, и заменяем ее на прямое обращение к номеру документа:
// Вместо вызова:
// НомерДокумента = ОбщегоНазначения.ПолучитьНомерНаПечать(Шапка.Ссылка);
// Используем исходный номер объекта без обрезки:
НомерДокумента = СокрЛП(Шапка.Номер);
Часто разногласия возникают из-за того, что клиенты получают первичку из программы «1С:Управление торговлей» с полными номерами, а бухгалтерия пытается сопоставить их с номерами в «1С:Бухгалтерии». В таком случае правильнее стандартизировать печать на стороне базы торговли:
Если префикс в номере необходим для обозначения обособленного подразделения, не следует использовать дефис. По стандартам нумерации счетов-фактур и БСП разделителем для подразделений служит символ косой черты (слэш /). Алгоритмы префиксации распознают дробь как значащую часть номера подразделения и не удаляют символы, идущие после нее.
Важный вывод: прямое вмешательство в функцию ПолучитьНомерНаПечать внутри типовой конфигурации нежелательно, так как за ней закреплено формирование номеров для книги покупок, книги продаж и деклараций по НДС. Оптимальным решением является использование внешних печатных форм либо приведение номеров к стандарту через правила обмена.