Почему в 1С:Управлении торговлей 11 сбивается автонумерация документов и как это исправить?

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

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

В этой статье мы подробно разберем, почему стандартные механизмы исправления нумерации часто не дают результатов в современных конфигурациях на базе БСП (включая «1С:Управление торговлей 11», «1С:Комплексная автоматизация 2» и «1С:ERP Управление предприятием 2»), и пошагово рассмотрим методы полного решения этой проблемы.

В чем кроется причина проблемы?

Для начала проанализируем ситуацию. В более ранних версиях платформ и конфигураций «1С:Предприятие» для восстановления автонумерации было достаточно исправить некорректный номер в документе-первоисточнике и выполнить метод ОбновитьНумерациюОбъектов(). В крайнем случае требовалось перезапустить службу сервера 1С, чтобы очистить кэш выданных номеров.

В современных конфигурациях ситуация усложнилась из-за двух ключевых факторов:

  1. Использование общих нумераторов. Многие документы (например, «Реализация товаров и услуг» и «Акт выполненных работ») подчинены единому объекту метаданных — нумератору. Если мы обновляем нумерацию только для одного типа документа, кэш самого нумератора в платформе может не сброситься.
  2. Вспомогательный регистр сведений РеестрДокументов. Это главный виновник того, почему «не работают» стандартные методы. Для оптимизации работы динамических списков и ускорения механизмов RLS (разграничения прав на уровне записей) разработчики БСП вынесли отображение списков документов в отдельный индексированный регистр. В нем хранятся реквизиты НомерДокументаИБ и ДатаДокументаИБ. Именно из этого регистра система часто считывает данные для отображения в журналах и для некоторых алгоритмов префиксации. Если мы изменили номер документа программно в обход стандартных подписок на события (например, с включенным режимом ОбменДанными.Загрузка = Истина), данные в регистре остаются старыми.

Рассмотрим по шагам, как правильно и в какой последовательности локализовать и устранить сбой автонумерации.

---

Шаг 1. Поиск и исправление ошибочных номеров в базе данных

Прежде чем приступать к сбросу системных кэшей, нам необходимо убедиться, что в базе данных действительно не осталось документов со сбитыми номерами. Сделать это лучше всего с помощью простого запроса в консоли запросов. Напишем и выполним следующий запрос для анализа номеров документов РеализацияТоваровУслуг:


ВЫБРАТЬ Ссылка, Номер, Дата
ИЗ Документ.РеализацияТоваровУслуг КАК Реализация
УПОРЯДОЧИТЬ ПО Номер УБЫВ

Внимательно изучим результат запроса. Обратим внимание на символы в номерах. Распространенная ошибка — использование схожих по написанию русских и латинских букв (например, «О» и «0», «Х» и «X»). Платформа сортирует их по-разному, и визуально незаметный символ может уводить диапазон нумерации в неверную сторону. Если обнаружены некорректные документы, исправим их номера на правильные.

---

Шаг 2. Проверка использования общего нумератора

Выясним, назначен ли для нашего документа общий нумератор. Для этого откроем конфигуратор, найдем документ РеализацияТоваровУслуг и перейдем на вкладку «Нумерация». Если поле «Нумератор» заполнено, значит, автонумерация этого документа не является независимой.

Если нумератор используется, то вызов метода обновления нумерации по конкретному метаданному документа не принесет результата. Нам потребуется обновить нумерацию для всего нумератора в целом.

---

Шаг 3. Сброс кэша нумерации на стороне платформы

Для того чтобы принудительно заставить платформу забыть старый диапазон номеров, выполним метод ОбновитьНумерациюОбъектов(). Напишем небольшую внешнюю обработку или воспользуемся обработкой «Групповое изменение реквизитов» для выполнения произвольного алгоритма на сервере:


// Если документ имеет индивидуальную нумерацию:
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);

// Если документ использует общий нумератор (подставим имя нумератора из конфигуратора):
ОбновитьНумерациюОбъектов(Метаданные.НумераторыДокументов.Продажи);

// Универсальный вариант (выполняет обновление нумерации по всей базе данных):
ОбновитьНумерациюОбъектов();

После выполнения данного кода настоятельно рекомендуется произвести полный перезапуск службы сервера «1С:Предприятие». Дело в том, что рабочие процессы сервера (rphost) кэшируют пулы свободных номеров. Чтобы гарантированно очистить оперативную память процессов от старого кэша, остановим службу сервера 1С, убедимся в диспетчере задач операционной системы, что все процессы rphost, rmngr и ragent успешно завершены, и запустим службу вновь. В случае работы на тестовом сервере самым надежным решением будет полная перезагрузка операционной системы сервера.

---

Шаг 4. Актуализация регистра сведений «Реестр документов»

Проанализируем ситуацию: мы исправили номера в документах, очистили серверный кэш, но при создании нового документа система снова предлагает некорректный номер. Это явный признак того, что данные зависли в регистре РеестрДокументов.

Давайте убедимся в этом. Откроем функции для технического специалиста, найдем регистр сведений Реестр документов и настроим отбор по типу нашего документа. Мы увидим, что в колонке Номер документа (ИБ) для измененных документов все еще отображаются старые ошибочные значения.

Чтобы исправить это рассогласование, нам необходимо принудительно перезаписать записи регистра. Сделать это можно двумя способами.

Способ А. Программная перезапись документов

Напишем простую обработку, которая переберет измененные документы и запишет их в обычном режиме (без использования флага загрузки обмена данными). При обычной записи автоматически сработают подписки на события БСП, которые обновят записи в регистре сведений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Реализация.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК Реализация
    |ГДЕ
    |	Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
    // Записываем документ в режиме Запись, чтобы обновился РеестрДокументов
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Способ Б. Безкодовый метод с использованием группового изменения реквизитов

Если у нас нет возможности писать код в базе данных, воспользуемся стандартной обработкой «Групповое изменение реквизитов»:

  1. Откроем обработку и выберем объект «Реализация товаров и услуг». Настроим отбор по периоду или конкретным измененным документам.
  2. Перейдем в «Дополнительные параметры» обработки и установим флажки «Показывать служебные реквизиты» и «Режим разработчика».
  3. В списке доступных для изменения реквизитов найдем поле «Номер».
  4. Установим для этого поля значение 0 (ноль) и нажмем кнопку «Изменить реквизиты». Все выбранные документы получат нулевые номера.
  5. Повторно настроим групповое изменение реквизитов для этих же документов, но теперь в дополнительных параметрах отключим «Режим разработчика» (оставив включенным показ служебных реквизитов).
  6. Для реквизита «Номер» выберем значение [Установить автоматически] (или [Авто]) и запустим процесс изменения.

При использовании этого метода система последовательно и корректно присвоит документам новые правильные номера, при этом автоматически отработают все подписки на события БСП, и данные в регистре сведений РеестрДокументов синхронизируются без риска возникновения ошибок дублирования ключей.

---

Резюме

При устранении проблем с автонумерацией в современных решениях на платформе «1С:Предприятие 8.3» необходимо действовать комплексно. Не ограничивайтесь простым исправлением номера в документе. Всегда проверяйте наличие общего нумератора, сбрасывайте кэш транзакций сервера с помощью метода ОбновитьНумерациюОбъектов() и обязательно актуализируйте вспомогательные регистры сведений, такие как РеестрДокументов.

← На главную