При переносе данных из старых версий программ (например, из 1С:УСН 7.7) в современную 1С:Бухгалтерия 3.0 (БП 3.0) пользователи часто сталкиваются с проблемой некорректного отображения номеров документов. Типичная ситуация: в базе номер выглядит как 0000-Р00ХХХ, а в печатной форме акта он превращается в РХХХ. Наша задача — разобраться, почему типовые механизмы очистки префиксов не справляются с буквой "Р", и найти способы ее удаления исключительно из печатной формы, не нарушая при этом нумерацию в самой информационной базе.
Для начала проанализируем, как работает система печати в конфигурациях на базе Библиотеки стандартных подсистем (БСП). За формирование красивого номера для бумажного носителя отвечает общая функция ПрефиксОбъектовКлиентСервер.ПолучитьНомерНаПечать. В норме она автоматически отсекает:
В рассматриваемом случае номер имеет формат 0000-Р00ХХХ. Система успешно находит системный префикс 0000- и удаляет его. Однако буква "Р" стоит сразу после дефиса. Для 1С 8.3 эта буква уже не является частью технического префикса, она воспринимается как содержательная часть самого номера, установленная пользователем вручную или пришедшая в результате миграции. Именно поэтому "Р" остается в печатной форме, так как программа боится удалить значащий разряд документа.
Разберем наиболее безопасный метод, который не требует изменения конфигурации и не влияет на уникальность номеров в базе. Мы можем создать внешнюю печатную форму с возможностью типового изменения макета, которая будет "на лету" очищать номер при выводе на печать.
Рассмотрим алгоритм действий (за основу можно взять специализированный Акт об оказании услуг для БП 3.0):
// В процессе формирования данных печати
ДанныеПечати.Номер = СтрЗаменить(ДанныеПечати.Номер, "Р", "");
// Если нужно убрать только первую букву Р
Если Лев(ДанныеПечати.Номер, 1) = "Р" Тогда
ДанныеПечати.Номер = Сред(ДанныеПечати.Номер, 2);
КонецЕсли;
Этот метод хорош тем, что в самой базе документы сохраняют свои оригинальные номера (что важно для синхронизации и сверок), а клиент видит в акте привычный номер без лишних букв.
Если мы хотим, чтобы изменения коснулись всех печатных форм документа без подключения внешних файлов, воспользуемся механизмом расширений. Нам нужно перехватить формирование данных в менеджере документа РеализацияТоваровУслуг.
Проанализируем ситуацию: данные для печати подготавливаются в функции, которая заполняет таблицу значений или структуру. Нам необходимо применить аннотацию &После к процедуре печати или подготовке данных.
Пример программного кода в расширении:
&После("ЗаполнитьПараметрыПечати")
Процедура Расш1_ЗаполнитьПараметрыПечати(ДанныеПечати, ПараметрыОбъекта)
// Допустим, НомерДокумента - это параметр макета
Если ТипЗнч(ДанныеПечати) = Тип("Структура") И ДанныеПечати.Свойство("Номер") Тогда
// Очищаем номер от буквы "Р" и лишних нулей
ВременныйНомер = СтрЗаменить(ДанныеПечати.Номер, "Р", "");
ДанныеПечати.Номер = ПрефиксОбъектовКлиентСервер.УдалитьЛидирующиеНули(ВременныйНомер);
КонецЕсли;
КонецПроцедуры
Важно помнить, что при использовании СтрЗаменить мы удаляем все вхождения буквы "Р". Если в середине номера может законно встретиться эта буква, лучше использовать функцию Лев() и Сред() для обработки только начальных символов.
Если вы решили, что буква "Р" не нужна не только в печатной форме, но и в самой базе, можно прибегнуть к обработке "Групповое изменение реквизитов". Это радикальный метод, поэтому перед его использованием обязательно создайте резервную копию базы.
Пример алгоритма для изменения номеров:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(Дата(2023,01,01), ТекущаяДата());
Пока Выборка.Следующий() Цикл
ОбъектДок = Выборка.ПолучитьОбъект();
СтарыйНомер = ОбъектДок.Номер;
// Удаляем Р и формируем новый номер с правильным префиксом
// Предположим, нужно оставить только цифровую часть после 0000-Р
НовыйНомер = СтрЗаменить(СтарыйНомер, "0000-Р", "0000-");
Если СтарыйНомер <> НовыйНомер Тогда
ОбъектДок.Номер = НовыйНомер;
ОбъектДок.Комментарий = "Номер изменен программно. Старый номер: " + СтарыйНомер;
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЦикла;
Внимание! Групповое изменение номеров может привести к тому, что в базе появятся дубли (ошибка "Номер не является уникальным"), если после удаления префикса номера совпадут с уже существующими документами. Также это может повлиять на поиск документов в журнале регистрации и на работу счетов-фактур.
Выясним причину, по которой возникла необходимость правки. Если это разовое требование для конкретного контрагента — используйте внешнюю печатную форму. Если вы хотите навсегда забыть о префиксах старой базы "7.7" во всех документах текущего года — лучшим решением станет расширение конфигурации. Оно сохранит целостность данных в базе и обеспечит нужный вид документов на печати.
Проанализируйте также регистр сведений Префиксы информационных баз. Хотя в сообщении 7 упоминалось ограничение в 3 символа, иногда настройка правильного префикса организации в сочетании с перенумерацией помогает системе начать "узнавать" свои префиксы и корректно их обрезать без дополнительного программирования.