Как в 1С:Бухгалтерия 3.0 печатать номера счетов-фактур с нулями, но без префиксов

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

При переходе с устаревших систем (например, 1С:Предприятие 7.7) на современные конфигурации на базе 1С:Бухгалтерия 3.0 (БП 3.0) пользователи часто сталкиваются с изменением логики формирования печатных номеров. В "семерке" номера счетов-фактур традиционно содержали лидирующие нули (например, 00000015), в то время как в БП 3.0 по умолчанию срабатывают механизмы Библиотеки стандартных подсистем (БСП), которые обрезают и префиксы, и нули, оставляя лишь значимую часть (15). Это может вызвать неудобства при сверке с контрагентами или при требованиях учетной политики предприятия. В этой статье мы подробно разберем, как вернуть нули в печатные формы и книги учета, сохранив при этом отсутствие буквенных префиксов.

Разберем механизм префиксации в 1С v8.3

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


Функция НомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) Экспорт
    
    // {Обработчик: ПриПолученииНомераНаПечать} Начало
    СтандартнаяОбработка = Истина;
    ПрефиксацияОбъектовКлиентСерверПереопределяемый.ПриПолученииНомераНаПечать(НомерОбъекта, СтандартнаяОбработка,
        УдалитьПрефиксИнформационнойБазы, УдалитьПользовательскийПрефикс);
    
    Если СтандартнаяОбработка = Ложь Тогда
        Возврат НомерОбъекта;
    КонецЕсли;
    // {Обработчик: ПриПолученииНомераНаПечать} Окончание
    
    НомерОбъекта = СокрЛП(НомерОбъекта);
    
    // Удаляем пользовательские префиксы (например, префикс организации)
    Если УдалитьПользовательскийПрефикс Тогда
        НомерОбъекта = УдалитьПользовательскиеПрефиксыИзНомераОбъекта(НомерОбъекта);
    КонецЕсли;
    
    // Удаляем лидирующие нули - именно эта строка "виновата" в исчезновении нулей
    НомерОбъекта = УдалитьЛидирующиеНулиИзНомераОбъекта(НомерОбъекта);
    
    // Удаляем префиксы ИБ и организации
    НомерОбъекта = УдалитьПрефиксыИзНомераОбъекта(НомерОбъекта, Истина, УдалитьПрефиксИнформационнойБазы);
    
    Возврат НомерОбъекта;
КонецФункции

Как мы видим, система жестко прописывает удаление нулей. Если мы просто закомментируем строку НомерОбъекта = УдалитьЛидирующиеНулиИзНомераОбъекта(НомерОбъекта); напрямую в конфигурации, это решит проблему, но создаст огромные сложности при последующем обновлении программы. Поэтому мы будем использовать более корректные методы.

Способ 1. Использование переопределяемого модуля (Рекомендуется)

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

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


Процедура ПриПолученииНомераНаПечать(НомерОбъекта, СтандартнаяОбработка, УдалитьПрефиксИнформационнойБазы, УдалитьПользовательскийПрефикс) Экспорт
    
    // Проверяем, что работаем с номером счета-фактуры (логика может зависеть от контекста)
    // Если нужно сохранить нули для всех документов, можно убрать условия.
    
    СтандартнаяОбработка = Ложь; // Отключаем встроенный алгоритм БСП
    
    // Самостоятельно удаляем только префиксы, не трогая нули
    // Для этого вызываем функции из основного модуля, но без удаления нулей
    НомерОбъекта = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(НомерОбъекта, Истина, УдалитьПрефиксИнформационнойБазы);
    
КонецПроцедуры

Важный нюанс: Чтобы этот код заработал максимально чисто, рекомендуется реализовать его через Расширение конфигурации. Создайте расширение, добавьте в него модуль ПрефиксацияОбъектовКлиентСерверПереопределяемый и используйте аннотацию &Вместо или &После для изменения поведения системы.

Способ 2. Работа с регистром «Данные первичных документов»

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

Если вы уже создали документы и они отображаются в книге без нулей, простое изменение кода не поможет старым записям. Выполним следующие шаги:

  1. Обновление данных в регистре: После внедрения программных правок (Способ 1), необходимо перезаписать данные в регистре сведений ДанныеПервичныхДокументов.
  2. Групповое перепроведение: Самый простой способ обновить регистр — это групповое перепроведение документов за нужный период. При проведении документа система вызывает функции префиксации и записывает "готовый" номер на печать в этот регистр.
  3. Использование обработки: Если перепроводить документы нельзя (период закрыт), можно воспользоваться консолью запросов или небольшой обработкой, которая программно обновит поле Номер в регистре ДанныеПервичныхДокументов на основании номера самого документа.

Особенности для счетов-фактур на аванс

Рассмотрим подробнее работу со специфическими префиксами. Счета-фактуры на аванс часто имеют префикс А. Если мы полностью отключим стандартную обработку, этот префикс может остаться в номере (например, А000000015). Если ваша задача — оставить нули, но убрать все буквы, код в переопределяемом модуле должен быть более детальным:


// Пример очистки букв, но сохранения нулей
НомерОбъекта = СокрЛП(НомерОбъекта);
Пока Лев(НомерОбъекта, 1) <> "" И Найти("0123456789", Лев(НомерОбъекта, 1)) = 0 Цикл
    НомерОбъекта = Сред(НомерОбъекта, 2);
КонецЦикла;

Этот фрагмент кода удаляет любые символы с начала строки, пока не встретит первую цифру (включая ноль). Таким образом, префиксы А, БП или УТ исчезнут, а лидирующие нули останутся на месте.

Влияние на налоговую отчетность и ЭДО

Посмотрим на ситуацию с точки зрения налоговых рисков. ФНС через автоматизированную систему АСК НДС-2 сверяет данные продавца и покупателя. Очень важно, чтобы:

Если вы программно изменили только печатную форму, но не обновили регистр ДанныеПервичныхДокументов, возникнет разрыв: в бумажной версии будет номер с нулями, а в XML-файле декларации — без нулей. Это может привести к требованию пояснений от налоговой. Поэтому всегда проверяйте соответствие печатной формы и данных в книге продаж после внесения изменений.

При использовании Электронного документооборота (ЭДО) ситуация аналогична. Система формирования XML-файла электронного счета-фактуры может использовать те же функции префиксации. Убедитесь, что в отправленном через ЭДО документе номер соответствует вашим ожиданиям.

Подведем итоги

Для реализации печати с нулями в 1С 8.3 БП 3.0 необходимо:

  1. Создать расширение и изменить логику функции в переопределяемом модуле префиксации.
  2. Убедиться, что стандартная функция УдалитьЛидирующиеНулиИзНомераОбъекта не вызывается для нужных вам типов документов.
  3. Актуализировать регистр ДанныеПервичныхДокументов путем перепроведения или специальной обработкой.
  4. Проверить корректность отображения номеров в Книге продаж и Книге покупок.

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

← На главную