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