Как исправить ошибку «Не могу перепозиционировать объект!» при вызове метода РегистрацияИзменений в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Выясним причину ошибки и ограничения платформы

Проанализируем, почему платформа выдает подобное сообщение. Метод РегистрацияИзменений() имеет жесткие контекстные ограничения:

  1. Доступность только через СоздатьОбъект(): Данный метод доступен исключительно для объектов типа Справочник и Документ, созданных явно с помощью функции СоздатьОбъект(). Его невозможно вызвать через встроенный контекст модуля формы, контекст проведения или функции типа ТекущийДокумент().
  2. Конфликт позиционирования: Ошибка «Не могу перепозиционировать объект!» возникает в тот момент, когда процедура пытаются применить метод к объекту, привязанному к активному интерактивному контексту формы или текущей транзакции записи/проведения (например, в процедурах ПриЗаписи или ОбработкаПроведения).
  3. Порядок вызова: Метод РегистрацияИзменений() должен вызываться строго после позиционирования объекта (например, вызова метода НайтиДокумент()), но до выполнения метода Записать(). При любом последующем перепозиционировании объекта режим регистрации сбрасывается к значению из метаданных.

Решения для выборочной регистрации изменений УРБД

Рассмотрим рабочие способы реализации выборочной регистрации объектов для распределенных баз данных.

Способ 1. Регистрация через отдельно созданный объект

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

Посмотрим на пример кода:


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

Способ 2. Управление регистрацией через системную таблицу _1SUPDTS

Проанализируем работу со служебной таблицей базы данных 1С 7.7. Сведения о зарегистрированных изменениях для узлов УРБД хранятся в системной таблице _1SUPDTS. Работа с ней позволяет гибко управлять выгрузкой объектов.

Рассмотрим два подхода к реализации:

  1. При отключенной авторегистрации: Флаг «Авто регистрация изменений» в метаданных снимается. В коде при выполнении определенных условий программно добавляется запись в таблицу _1SUPDTS, куда передаются идентификатор узла-получателя (DBSIGN), тип объекта (TYPEID) и идентификатор объекта (OBJID).
  2. При включенной авторегистрации (очистка изменений): Флаг авторегистрации остаётся включенным. Платформа при сохранении документа автоматически добавляет запись в _1SUPDTS. Если документ не соответствует условиям для передачи в периферийную базу, после записи выполним удаление записи по данному объекту из таблицы _1SUPDTS.

Способ 3. Фильтрация данных при формировании обмена

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

Подводя итоги: вызов метода РегистрацияИзменений() из модулей форм и проведения недопустим архитектурой платформы 1С 7.7. Для корректной организации выборочного обмена рекомендуется использовать вызов через отдельный объект СоздатьОбъект() или корректировать записи в таблице _1SUPDTS.

← На главную