Ситуация, когда пользователи вручную корректируют номера счетов-фактур, а через некоторое время система возвращает им стандартные значения или перенумеровывает их, встречается довольно часто. Выясним причину такого поведения конфигурации и разберем по шагам, как выявить источник изменений и зафиксировать номера.
Прежде чем отключать регламентные задания или писать программный код, необходимо точно определить, какой именно процесс или пользователь перезаписывает документы. Проанализируем события с помощью встроенного инструмента аудита.
СчетФактураВыданный, номер которого был самопроизвольно изменен.DefUser или системный сеанс фонового задания), в описании события будет видно имя фонового процесса.Чаще всего виновниками перезаписи номеров выступают следующие механизмы:
1С:Управление торговлей в 1С:Бухгалтерия), регламентное задание загрузки может заменять номер на значение из базы-источника.Если специфика учета требует жесткого сохранения введенного бухгалтером номера даже при программной перезаписи объекта фоновыми задачами, реализуем проверку в обработчике события ПередЗаписью документа. Рекомендуется делать это через расширение конфигурации, чтобы не снимать конфигурацию с поддержки.
Посмотрим на пример кода, предотвращающего перезапись номера для уже существующих документов:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Если документ уже существует в базе данных, восстанавливаем исходный номер
Если Не ЭтоНовый() Тогда
ЭтотОбъект.Номер = ЭтотОбъект.Ссылка.Номер;
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее логику работы данного кода: при любой попытке фонового процесса, внешней обработки или обмена перезаписать реквизит Номер, программа считывает текущий сохраненный номер из базы данных по ссылке Ссылка.Номер и возвращает его в записываемый объект. Таким образом, созданные вручную номера не будут сбрасываться.
Ручной ввод номеров с нарушением длины, добавлением нестандартных символов или префиксов сбивает внутренний механизм автонумерации платформы 1С. В результате при создании следующих документов система может выдавать ошибки неуникальности или пытаться заполнить номера заново.
Для устранения сбоя автонумератора выполним программный сброс кэша нумерации для соответствующего метаданного:
ОбновитьНумерациюОбъектов(Метаданные.Документы.СчетФактураВыданный);
Этот метод заставляет платформу пересчитать максимальный занятый номер в текущем периоде нумерации (как правило, в пределах календарного года) и восстанавливает корректный порядок генерации новых номеров.
Если в ходе проверки журнала регистрации выяснилось, что номера затираются при синхронизации, скорректируем правила конвертации данных:
СчетФактураВыданный отключим флаг Обновлять номер при загрузке.Номер, если объект не является новым в информационной базе приемника.