В процессе работы с программами «1С:Предприятие» (например, «Управление торговлей 10.3») пользователи иногда совершают ошибки при вводе префиксов организаций. Типичный сценарий: оператор случайно вводит длинное слово вместо одной буквы в поле префикса организации, проводит или записывает несколько документов, а затем возвращает правильный краткий префикс. Однако при создании или копировании новых документов платформа «1С» продолжает настойчиво предлагать старый, ошибочный длинный префикс. Выясним причину этого поведения платформы, разберемся, где именно физически хранятся префиксы, и рассмотрим пошаговый алгоритм решения этой проблемы.
Для того чтобы понять, почему программа продолжает подставлять неверные данные, проанализируем внутренний механизм автонумерации платформы «1С:Предприятие 8». Многие разработчики ошибочно полагают, что в базе данных существует специальная системная таблица, в которой хранится последний выданный номер или счетчик для каждого вида документа. На самом деле это не так.
Платформа работает по следующему алгоритму:
_Number соответствующей таблицы СУБД, например _DocumentXXX).rphost для клиент-серверного варианта) или в оперативной памяти локального компьютера (для файлового варианта работы). При создании последующих документов в рамках сессии сервер больше не обращается к таблицам СУБД для поиска номера, а просто берет кэшированное значение, увеличивает его на единицу и выдает пользователю. Это сделано для оптимизации производительности СУБД и исключения блокировок таблиц при одновременной работе множества пользователей.Когда оператор вводит ошибочный длинный префикс (например, слово «Тестовый» вместо буквы «Т») и сохраняет документы, система записывает их в базу данных. Впоследствии, даже если префикс в справочнике Организации был изменен обратно на букву «Т», менеджер автонумерации сталкивается с понятием зависимости префиксов. Поскольку буква «Т» целиком входит в состав ошибочного префикса «Тестовый», платформа считает префикс «Т» зависимым от префикса «Тестовый». Менеджер автонумерации видит в своей оперативной памяти более «сильный» сохраненный префикс и продолжает генерировать новые номера на его основе.
Разберем структуру хранения префиксов в типовой конфигурации «Управление торговлей 10.3». Нам важно понимать, где именно прописываются настройки префиксации, чтобы полностью очистить базу от ошибочных данных:
Префикс. Это основное место хранения префикса конкретного юридического лица. Именно отсюда система считывает префикс при формировании номера нового документа.Номер документов, которые успел провести или записать оператор.Рассмотрим подробнее процесс восстановления корректной автонумерации без повреждения структуры базы данных и без нарушения лицензионного соглашения «1С» (то есть исключительно штатными средствами платформы).
Пока в базе данных физически присутствует хотя бы один документ с некорректным длинным префиксом, любые попытки очистить кэш сервера будут иметь лишь временный эффект. При первом же поиске максимального номера платформа снова найдет этот документ в СУБД и вернет ошибочный префикс в оперативную память.
Для исправления номеров документов выполним следующие действия:
Посмотрим на пример кода обработки, которая находит некорректные документы вида РеализацияТоваровУслуг и заменяет их номера на правильные:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
Если Найти(Выборка.Номер, "Тестовый") = 1 Тогда
ДокументОбъект = Выборка.ПолучитьОбъект();
// Заменяем ошибочную часть номера на нужный префикс "Т"
НовыйНомер = СтрЗаменить(Выборка.Номер, "Тестовый", "Т");
ДокументОбъект.Номер = НовыйНомер;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Исправлен документ: " + Выборка.Ссылка + " на номер: " + НовыйНомер);
КонецЕсли;
КонецЦикла;
Важно: Перед выполнением группового изменения номеров обязательно создайте резервную копию информационной базы!
После того как все документы в базе данных были приведены в порядок и физически не осталось ни одного номера с некорректным префиксом, нам необходимо принудительно очистить оперативную память сервера «1С:Предприятия». Если этого не сделать, менеджер автонумерации в процессе rphost продолжит выдавать старые закэшированные префиксы.
Для сброса кэша платформы предназначен специальный метод ОбновитьНумерациюОбъектов(). Мы можем запустить его глобально для всех типов документов или локально для конкретного метаданного, что гораздо предпочтительнее для больших и нагруженных баз.
Разберем по шагам, как выполнить это программно. Создадим внешнюю обработку и пропишем в модуле формы следующую команду:
// Пример обновления нумерации для конкретного вида документов
МетаданныеОбъекта = Метаданные.Документы.РеализацияТоваровУслуг;
ОбновитьНумерациюОбъектов(МетаданныеОбъекта);
Сообщить("Кэш автонумерации для документа 'Реализация товаров и услуг' успешно сброшен!");
Если сбой затронул несколько видов документов, мы можем выполнить обновление нумерации для массива метаданных либо вызвать метод без параметров (в этом случае пересчитается нумерация абсолютно всех объектов в системе):
// Полный сброс кэша автонумерации для всех объектов конфигурации
ОбновитьНумерациюОбъектов();
Сообщить("Глобальный пересчет нумерации объектов завершен.");
Проанализируем еще одну возможность очистки кэша автонумерации. Поскольку менеджер автонумерации хранит кэшированные префиксы исключительно в оперативной памяти рабочих процессов сервера «1С:Предприятия», физическое уничтожение этих процессов гарантирует полный сброс кэша.
Для файловых версий баз данных достаточно просто закрыть все активные сеансы пользователей и заново запустить «1С:Предприятие».
Для клиент-серверного варианта администратор базы данных может выполнить одно из следующих действий:
1C:Enterprise 8.3 Server Agent.rphost, обслуживающих данную информационную базу.После перезапуска процессов первый же пользователь, создавший документ, инициирует обращение платформы напрямую к СУБД. Система прочитает реальные исправленные номера документов и начнет корректную автонумерацию с правильным кратким префиксом.
Выяснив причину проблемы, дадим несколько практических советов по предотвращению подобных инцидентов:
Префикс в справочнике Организации. Данное поле должно быть доступно для изменения только пользователям с административными правами.