Почему при печати документов в 1С не выводятся префиксы и ведущие нули и как это исправить?

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

При формировании печатных форм первичных документов (например, товарной накладной ТОРГ-12, акта об оказании услуг или счета-фактуры) пользователи часто сталкиваются с ситуацией, когда номер документа в программе отличается от номера на печатном бланке. Номер вида АА-000318 на листе превращается в 318 или АА318. Разберем детально, почему типовые конфигурации 1С ведут себя подобным образом, как устроен этот механизм изнутри и какими способами можно решить задачу сохранения префикса без нарушения целостности учета.

Назначение префиксов и логика работы типовых конфигураций

Префиксы в системе «1С:Предприятие» несут строго служебную и технологическую функцию. Они предназначены для двух основных задач:

  1. Разделение документов по организациям: в базах с многофирменным учетом префикс организации обеспечивает сквозную независимую нумерацию документов для каждого юридического лица.
  2. Разделение потоков в распределенных информационных базах (РИБ): префикс узла информационной базы предотвращает коллизии и дублирование номеров при параллельном создании документов в разных филиалах.

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

Программный анализ: как формируется номер на печать

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


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

Проанализируем этот алгоритм:

  1. Стандарт БСП (Библиотеки стандартных подсистем): функция проверяет наличие дефиса на 5-й позиции номера (шаблон ББОО-ЧЧЧЧЧЧЧЧ, где два знака — префикс базы, два знака — префикс организации). Если структура строго соответствует стандарту, вызывается метод ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать.
  2. Резервный алгоритм: если длина префиксов нестандартная (например, задан трехзначный префикс вместо двухзначного), проверка Сред(Номер, 5, 1) = "-" не срабатывает. Код переходит ко второму блоку, где префикс организации и префикс ИБ удаляются посимвольно в цикле вместе с дефисом и ведущими нулями.
  3. Появление некорректных номеров (например, «АА318»): если в регистре сведений ПрефиксыИнформационныхБаз или в справочнике Организации длина префикса не согласована с шаблоном, алгоритм может удалить дефис и нули, но оставить буквенную часть номера.

Варианты решения задачи

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

Решение 1. Подключение внешней печатной формы (ВПФ)

Разберем самый безопасный и корректный способ, если бухгалтерии или клиентам обязательно требуется видеть полный номер с префиксами в печатных документах.

  1. Создаем внешнюю обработку печатной формы (например, для ТОРГ-12).
  2. В модуле объекта внешней обработки находим место, где вызывается функция ПолучитьНомерНаПечать, и заменяем ее на прямое обращение к номеру документа:
    
    // Вместо вызова:
    // НомерДокумента = ОбщегоНазначения.ПолучитьНомерНаПечать(Шапка.Ссылка);
    
    // Используем исходный номер объекта без обрезки:
    НомерДокумента = СокрЛП(Шапка.Номер);
    
  3. Подключаем внешнюю печатную форму через меню справочника дополнительных отчетов и обработок без снятия конфигурации с поддержки.

Решение 2. Синхронизация номеров в источнике данных (базе торговли)

Часто разногласия возникают из-за того, что клиенты получают первичку из программы «1С:Управление торговлей» с полными номерами, а бухгалтерия пытается сопоставить их с номерами в «1С:Бухгалтерии». В таком случае правильнее стандартизировать печать на стороне базы торговли:

  1. Использовать во внешней торговой системе печатные формы, применяющие единый стандарт очистки префиксов.
  2. Скорректировать правила обмена данными (в «1С:Конвертации данных»), чтобы при выгрузке или загрузке номера документов формировались по единому регламенту компании.

Решение 3. Использование символа дроби для обособленных подразделений

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

Важный вывод: прямое вмешательство в функцию ПолучитьНомерНаПечать внутри типовой конфигурации нежелательно, так как за ней закреплено формирование номеров для книги покупок, книги продаж и деклараций по НДС. Оптимальным решением является использование внешних печатных форм либо приведение номеров к стандарту через правила обмена.

← На главную