Как программно добавить префикс или суффикс к номеру документа в 1С?

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

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

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

Выясним причину: почему номер документа не меняется

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


ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокОбъект.Номер = ДокОбъект.Номер + "/249";
ДокОбъект.Записать();

Если код выполняется без видимых ошибок, но номер не меняется, проанализируем устройство реквизита Номер в метаданных конфигурации:

  1. Строго ограниченная длина реквизита: В типовых конфигурациях 1С для документов (в частности, для счетов-фактур) длина реквизита Номер составляет 11 или 12 символов.
  2. Заполнение лидирующими нулями: Платформа хранит номера в формате 00000000001. Таким образом, весь лимит символов строкового поля уже полностью занят нулями и цифрами.
  3. Автоматическая обрезка: При попытке прибавить к значению длиной 11 символов еще 4 символа (/249) платформа автоматически обрезает полученную строку справа по максимальной длине реквизита. В результате добавочные символы просто отсекаются, и документ сохраняется со старым номером.

Решение 1: Формирование номера с отсечением лишних символов

Чтобы добавить суффикс и не выйти за пределы максимальной длины реквизита, необходимо сократить исходную строку номера — удалить лидирующие нули или оставить только нужную часть числового номера. Для этого используются функции СокрЛП() и Прав().

Посмотрим на пример корректной обработки номера документа:


Процедура ИзменитьНомераНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СчетФактураВыданный.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.СчетФактураВыданный КАК СчетФактураВыданный
        |ГДЕ
        |	СчетФактураВыданный.Дата МЕЖДУ &НачПериода И &КонПериода
        |	И СчетФактураВыданный.Проведен
        |	И СчетФактураВыданный.Контрагент = &Контрагент";
        
    Запрос.УстановитьПараметр("НачПериода", Объект.НачПериода);
    Запрос.УстановитьПараметр("КонПериода", КонецДня(Объект.КонПериода));
    Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
        
        // Получаем последние символы номера с учетом длины добавляемого суффикса
        // Например, если длина номера 11 знаков, а суффикс "/249" занимает 4 знака, 
        // оставим 7 знаков справа:
        ЗначениеНомера = Прав(СокрЛП(ДокОбъект.Номер), 7);
        
        ДокОбъект.Номер = ЗначениеНомера + "/249";
        
        // Для простого изменения реквизитов не требуется повторное проведение
        ДокОбъект.ОбменДанными.Загрузка = Истина; 
        ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    КонецЦикла;

КонецПроцедуры

Префикс или суффикс: в чем разница?

Рассмотрим терминологию платформы 1С:

  1. Префикс — добавляется в НАЧАЛО номера (например, 249 + ДокОбъект.Номер). В 1С префиксы организаций и узлов RIB часто задаются штатно.
  2. Суффикс — добавляется в КОНЕЦ номера (например, ДокОбъект.Номер + "/249").

Важные рекомендации по программной записи документов

Рассмотрим технические тонкости, которые необходимо учитывать при групповом изменении номеров в базе данных:

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

Альтернативный вариант: Групповое изменение реквизитов

В типовых конфигурациях 1С (Бухгалтерия предприятия, ERP, Комплексная автоматизация) не обязательно писать специальный код. Можно воспользоваться штатной обработкой:

  1. Перейдите в раздел Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов.
  2. Выберите элемент Счет-фактура выданный и настройте необходимые отборы по дате и контрагенту.
  3. В дополнительных настройках включите отображение служебных реквизитов и выполните исполняемый скрипт или установите формулу для поля Номер.
← На главную