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

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

При переносе данных из старых версий программ (например, из 1С:УСН 7.7) в современную 1С:Бухгалтерия 3.0 (БП 3.0) пользователи часто сталкиваются с проблемой некорректного отображения номеров документов. Типичная ситуация: в базе номер выглядит как 0000-Р00ХХХ, а в печатной форме акта он превращается в РХХХ. Наша задача — разобраться, почему типовые механизмы очистки префиксов не справляются с буквой "Р", и найти способы ее удаления исключительно из печатной формы, не нарушая при этом нумерацию в самой информационной базе.

Почему стандартный механизм 1С не убирает префикс?

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

  1. Префикс организации (первые два символа).
  2. Префикс информационной базы (следующие два символа).
  3. Разделитель в виде дефиса.
  4. Лидирующие нули.

В рассматриваемом случае номер имеет формат 0000-Р00ХХХ. Система успешно находит системный префикс 0000- и удаляет его. Однако буква "Р" стоит сразу после дефиса. Для 1С 8.3 эта буква уже не является частью технического префикса, она воспринимается как содержательная часть самого номера, установленная пользователем вручную или пришедшая в результате миграции. Именно поэтому "Р" остается в печатной форме, так как программа боится удалить значащий разряд документа.

Способ 1. Создание внешней печатной формы

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

Рассмотрим алгоритм действий (за основу можно взять специализированный Акт об оказании услуг для БП 3.0):

  1. Выгрузим типовой макет акта об оказании услуг из конфигурации (также можно использовать конструктор печатных форм для быстрой настройки шаблона).
  2. В модуле обработки, в процедуре, где происходит заполнение структуры данных для печати (как это реализовано в универсальной внешней печатной форме акта и накладной), найдем поле номера.
  3. Добавим простую строку кода для очистки символа:

// В процессе формирования данных печати
ДанныеПечати.Номер = СтрЗаменить(ДанныеПечати.Номер, "Р", "");
// Если нужно убрать только первую букву Р
Если Лев(ДанныеПечати.Номер, 1) = "Р" Тогда
    ДанныеПечати.Номер = Сред(ДанныеПечати.Номер, 2);
КонецЕсли;

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

Способ 2. Использование расширения конфигурации

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

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

Пример программного кода в расширении:


&После("ЗаполнитьПараметрыПечати")
Процедура Расш1_ЗаполнитьПараметрыПечати(ДанныеПечати, ПараметрыОбъекта)
    // Допустим, НомерДокумента - это параметр макета
    Если ТипЗнч(ДанныеПечати) = Тип("Структура") И ДанныеПечати.Свойство("Номер") Тогда
        // Очищаем номер от буквы "Р" и лишних нулей
        ВременныйНомер = СтрЗаменить(ДанныеПечати.Номер, "Р", "");
        ДанныеПечати.Номер = ПрефиксОбъектовКлиентСервер.УдалитьЛидирующиеНули(ВременныйНомер);
    КонецЕсли;
КонецПроцедуры

Важно помнить, что при использовании СтрЗаменить мы удаляем все вхождения буквы "Р". Если в середине номера может законно встретиться эта буква, лучше использовать функцию Лев() и Сред() для обработки только начальных символов.

Способ 3. Групповое изменение номеров в базе данных

Если вы решили, что буква "Р" не нужна не только в печатной форме, но и в самой базе, можно прибегнуть к обработке "Групповое изменение реквизитов". Это радикальный метод, поэтому перед его использованием обязательно создайте резервную копию базы.

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. Выберем объект "Реализация (акты, накладные, УПД)".
  3. В дополнительных настройках включим возможность изменения служебных полей.
  4. Нажмем "Дополнительные параметры" и выберем режим "Выполнить произвольный алгоритм".

Пример алгоритма для изменения номеров:


Выборка = Документы.РеализацияТоваровУслуг.Выбрать(Дата(2023,01,01), ТекущаяДата());
Пока Выборка.Следующий() Цикл
    ОбъектДок = Выборка.ПолучитьОбъект();
    СтарыйНомер = ОбъектДок.Номер;
    // Удаляем Р и формируем новый номер с правильным префиксом
    // Предположим, нужно оставить только цифровую часть после 0000-Р
    НовыйНомер = СтрЗаменить(СтарыйНомер, "0000-Р", "0000-");
    
    Если СтарыйНомер <> НовыйНомер Тогда
        ОбъектДок.Номер = НовыйНомер;
        ОбъектДок.Комментарий = "Номер изменен программно. Старый номер: " + СтарыйНомер;
        ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
КонецЦикла;

Внимание! Групповое изменение номеров может привести к тому, что в базе появятся дубли (ошибка "Номер не является уникальным"), если после удаления префикса номера совпадут с уже существующими документами. Также это может повлиять на поиск документов в журнале регистрации и на работу счетов-фактур.

Рекомендации по выбору метода

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

Проанализируйте также регистр сведений Префиксы информационных баз. Хотя в сообщении 7 упоминалось ограничение в 3 символа, иногда настройка правильного префикса организации в сочетании с перенумерацией помогает системе начать "узнавать" свои префиксы и корректно их обрезать без дополнительного программирования.

← На главную