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