Разберем распространенную техническую проблему, с которой сталкиваются разработчики 1С:Предприятие 7.7 при настройке выборочной регистрации объектов в распределенных информационных базах (УРБД). Попытка отключить авторегистрацию в метаданных и вызвать метод РегистрацияИзменений() непосредственно в модуле формы или проведения приводит к ошибке: «Не могу перепозиционировать объект!».
Проанализируем, почему платформа выдает подобное сообщение. Метод РегистрацияИзменений() имеет жесткие контекстные ограничения:
СоздатьОбъект(): Данный метод доступен исключительно для объектов типа Справочник и Документ, созданных явно с помощью функции СоздатьОбъект(). Его невозможно вызвать через встроенный контекст модуля формы, контекст проведения или функции типа ТекущийДокумент().ПриЗаписи или ОбработкаПроведения).РегистрацияИзменений() должен вызываться строго после позиционирования объекта (например, вызова метода НайтиДокумент()), но до выполнения метода Записать(). При любом последующем перепозиционировании объекта режим регистрации сбрасывается к значению из метаданных.Рассмотрим рабочие способы реализации выборочной регистрации объектов для распределенных баз данных.
Разберем вариант, когда регистрация изменений выполняется вне контекста интерактивной формы документа (например, в отдельной обработке или внешней процедуре после завершения записи).
Посмотрим на пример кода:
Док = СоздатьОбъект("Документ.ПриходнаяНакладная");
Если Док.НайтиДокумент(КонкретныйДокумент) = 1 Тогда
// 1 - включить регистрацию, 0 - отменить регистрацию
Док.РегистрацияИзменений(1);
Док.Записать();
КонецЕсли;
Проанализируем работу со служебной таблицей базы данных 1С 7.7. Сведения о зарегистрированных изменениях для узлов УРБД хранятся в системной таблице _1SUPDTS. Работа с ней позволяет гибко управлять выгрузкой объектов.
Рассмотрим два подхода к реализации:
_1SUPDTS, куда передаются идентификатор узла-получателя (DBSIGN), тип объекта (TYPEID) и идентификатор объекта (OBJID)._1SUPDTS. Если документ не соответствует условиям для передачи в периферийную базу, после записи выполним удаление записи по данному объекту из таблицы _1SUPDTS.Разберем альтернативный подход, при котором авторегистрация остается включенной для всех объектов, а логика отбора переносится на этап создания файла обмена. При выполнении сеанса автообмена проверяем реквизиты объекта непосредственно перед формированием файла выгрузки и пропускаем те объекты, которые не должны отправляться в периферийную базу.
Подводя итоги: вызов метода РегистрацияИзменений() из модулей форм и проведения недопустим архитектурой платформы 1С 7.7. Для корректной организации выборочного обмена рекомендуется использовать вызов через отдельный объект СоздатьОбъект() или корректировать записи в таблице _1SUPDTS.