Что происходит с движениями документа в 1С при изменении конфигурации или кода проведения?

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

В процессе разработки и сопровождения конфигураций на платформе «1С:Предприятие 8» программисты регулярно сталкиваются с необходимостью изменить логику проведения документов. Иногда требуется полностью отказаться от формирования движений конкретного документа по определенному регистру (например, по РегистрБухгалтерии1 или регистру накопления).

В такой ситуации возникает закономерный вопрос: что произойдет с уже существующими в базе данных движениями? Удалятся ли они автоматически? Останутся ли «висеть» в СУБД в виде битых ссылок со значением «Объект не найден...»? И как эти процессы отражаются на уровне таблиц базы данных под управлением MS SQL Server или PostgreSQL?

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

---

Сценарий 1: Документ исключают из списка «Регистраторы» в Конфигураторе

Рассмотрим ситуацию, когда разработчик открывает Конфигуратор, находит нужный регистр (например, регистр бухгалтерии или регистр накопления), переходит на вкладку «Регистраторы» и снимает галочку у определенного документа (например, у Документ1). После этого выполняется обновление конфигурации базы данных (клавиша F7).

Проанализируем, что происходит в этот момент на уровне СУБД и в самой платформе:

  1. Реструктуризация таблиц на уровне СУБД: При исключении документа из списка регистраторов платформа 1С инициирует процесс реструктуризации базы данных. Это не просто изменение логической схемы, это физическая операция над таблицами СУБД. Платформа обязана гарантировать целостность данных, поэтому она физически очищает таблицу регистра от всех записей, связанных с удаленным регистратором.
  2. Как это выглядит "под капотом" СУБД: В зависимости от объема данных и версии платформы, это происходит либо через выполнение прямого SQL-запроса на удаление данных (например, DELETE FROM _AccRegXXX WHERE _RecorderTRef = ...), либо через создание временной таблицы. Во втором случае создается новая таблица регистра с обновленной структурой, в нее копируются только валидные данные (записи по оставшимся регистраторам), после чего старая таблица удаляется, а новая переименовывается.
  3. Влияние на производительность: На больших базах данных эта операция может выполняться крайне медленно — от десятков минут до нескольких часов. Это связано с тем, что СУБД приходится перестраивать все индексы таблицы регистра, а также таблицы итогов. Во время этого процесса таблицы полностью блокируются, что делает невозможной работу пользователей.
  4. Появление битых ссылок: Будет ли отображаться <Объект не найден...>? Нет, не будет. Поскольку платформа полностью и безвозвратно удаляет строки из таблицы физического регистра на уровне СУБД, никаких «ошметков» или записей с битыми ссылками в этом регистре не останется.

---

Сценарий 2: Изменение программного кода проведения в модуле документа

Теперь разберем второй, более частый сценарий. Разработчик оставляет документ в списке регистраторов в Конфигураторе, но заходит в модуль этого документа и комментирует или удаляет код формирования движений внутри процедуры ОбработкаПроведения (или в обработчиках подписок на события).

Выясним, к чему приведет простое обновление конфигурации в этом случае:

Существующие записи в СУБД не изменятся автоматически. Само по себе изменение программного кода в модуле объекта при обновлении базы данных никак не влияет на уже записанные в СУБД строки в таблицах регистров. Все старые проводки и движения существующих документов останутся лежать в базе в первозданном виде.

Что произойдет с движениями при дальнейших действиях пользователей с конкретным документом?

---

Откуда берется «Объект не найден...» в полях регистраторов?

Иногда при формировании отчетов или просмотре движений в регистрах программисты видят в поле Регистратор битую ссылку вида <Объект не найден...> (83:af8700155d05070111e3b2e9bc83a152).

Рассмотрим причины возникновения этой проблемы. Строка <Объект не найден...> появляется только тогда, когда сам документ-источник был физически удален из базы данных, но записи по нему в таблице регистра остались.

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

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

Как исправить битые ссылки в регистрах?

Для устранения этой проблемы рекомендуется выполнить процедуру «Тестирование и исправление» (ТиИ) через Конфигуратор:

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


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

---

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода «отмены» движений зависит от ваших конечных целей:

← На главную