При работе с компонентой «Управление распределенными ИБ» (УРБД) в платформе 1С:Предприятие 7.7 разработчики и администраторы нередко сталкиваются с ситуацией, когда изменения, внесенные в периферийной информационной базе (ПБ), бесследно исчезают после сеанса синхронизации, заменяясь версией документа из центральной базы (ЦБ). Разберем, как устроен механизм регистрации изменений в 1С 7.7, почему время редактирования не защищает данные от перезаписи и как правильно организовать обмен, чтобы исключить потерю информации.
Проанализируем ключевую архитектурную особенность платформы 1С 7.7. В отличие от современных версий платформы, где существуют гибкие правила разрешения коллизий, в 1С 7.7 заложен жесткий принцип: центральная информационная база всегда имеет абсолютный приоритет над периферийными.
Для платформы понятие времени между двумя сеансами обмена считается единым неделимым моментом времени. Если один и тот же объект был изменен и в центральной, и в периферийной базе, платформа не сравнивает системное время или метки изменения объектов. При загрузке пакета из ЦБ в ПБ версия центрального узла безусловно перетрет все локальные правки.
Рассмотрим, как работает фиксация и квитирование (подтверждение) изменений:
_1SUPDTS (или файле 1SUPDTS.DBF), а служебная информация о переданных и принятых пакетах — в таблице 1SDWNLDS. Структура узлов описывается в 1SDBSET.Поскольку встроенных событий перехвата коллизий на этапе загрузки пакета в 1С 7.7 нет, наиболее надежный способ предотвратить потерю данных — исключить саму возможность одновременного редактирования одного документа в разных базах.
Выясним, с помощью каких встроенных функций УРБД можно определить происхождение объекта и текущий узел:
ИБСозданияОбъекта(<Объект>) — возвращает строковый трехсимвольный идентификатор информационной базы, где объект был изначально создан.ТекущаяИБЦентральная() — возвращает 1, если код выполняется в центральной базе, и 0, если в периферийной.ТекущаяИБКод() — возвращает код текущей базы данных.Посмотрим на пример реализации проверки в модуле формы документа в процедуре ПриОткрытии:
Процедура ПриОткрытии()
// Запрещаем редактирование документов периферийной базы в центральной
Если ТекущаяИБЦентральная() = 1 Тогда
Если ИБСозданияОбъекта(ТекущийДокумент()) <> ТекущаяИБКод() Тогда
Форма.ТолькоПросмотр(1);
Предупреждение("Документ создан в филиале! Редактирование в центральной базе запрещено.", 5);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Дополнительно защитим объект на уровне модуля документа в предопределенной процедуре ПриЗаписи, чтобы исключить программную перезапись:
Процедура ПриЗаписи()
Если ТекущаяИБЦентральная() = 1 Тогда
Если ИБСозданияОбъекта(ТекущийДокумент()) <> ТекущаяИБКод() Тогда
Сообщить("Запрещена запись документа, созданного в другой ИБ!", "!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Рассмотрим возможности конфигуратора для ограничения передачи лишних данных между базами:
РегистрацияИзменений(<Объект>, <Режим>) только при реальной модификации реквизитов пользователем, что убережет документы от ложной выгрузки при регламентном групповом перепроведении.Проанализируем правильную последовательность циклов обмена. Главная ошибка — запуск несинхронизированных параллельных выгрузок без ожидания файла ответа.
Регламент пакетного запуска скриптов обмена должен строго соблюдать цепочку:
Соблюдение данного регламента гарантирует, что регистрация изменений будет своевременно очищаться в таблице _1SUPDTS, и центральная база не станет циклически перетирать свежие локальные правки устаревшими пакетами.