При работе с распределенными информационными базами в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с неожиданной и неприятной проблемой: специализированные методы УРБД (Управление распределенными базами данных) отсутствуют в стандартном синтакс-помощнике. Такие функции, как ТекущаяИБЦентральная(), РегистрацияИзменений() или ИБСозданияОбъекта(), не выводятся по нажатию клавиш быстрого поиска справочной информации. Давайте разберем по шагам, почему возникает эта проблема, как расширить возможности синтакс-помощника и детально изучим внутреннее устройство механизмов автообмена в версии 7.7.
Платформа 1С:Предприятие 7.7 построена по модульному принципу. Компонента УРБД (в сообществе разработчиков также известная как УРИБ — Управление распределенными информационными базами) поставлялась отдельно от базовой или стандартной сетевой версии платформы. По этой причине файлы описания встроенного языка, поставляемые по умолчанию с конфигуратором, не содержат справочной информации по специфическим методам распределенных баз. Справочная информация в Конфигураторе 1С 7.7 формируется динамически на основе специальных индексных файлов с расширением .als, расположенных в каталоге исполняемых файлов платформы.
Для того чтобы в вашем конфигураторе появилось полноценное описание всех методов автообмена, необходимо добавить в систему нужный файл разметки синтаксиса. Разберем по шагам, как это сделать:
distrib.als. В кругах разработчиков также часто встречаются его копии или модификации под именами urbd.als или rbd.als.distrib.als) в каталог BIN установленной платформы (обычно он располагается по пути вида C:\Program Files (x86)\1Cv77\BIN\).Теперь, когда мы обеспечили отображение справочной информации в конфигураторе, проанализируем синтаксис и особенности практического применения встроенных методов распределенных баз.
1. Функции определения статуса текущей информационной базы:
ТекущаяИБКод() — возвращает уникальный трехсимвольный строковый код текущей информационной базы, который задается в конфигураторе при настройке обмена.ТекущаяИБНаименование() — возвращает текстовое описание (наименование) текущей базы данных.ТекущаяИБТолькоПолучатель() — возвращает число: 1, если текущая база настроена в режиме "только прием данных" (в ней запрещено интерактивное изменение объектов конфигурации и данных), и 0, если база является полнофункциональным узлом.ТекущаяИБЦентральная() — возвращает 1, если база является главной (центральной), и 0, если текущая база — периферийная.ЦентральнаяИБКод() — возвращает трехсимвольный строковый код центральной информационной базы для данного распределенного пространства.2. Определение происхождения объектов:
ИБСозданияОбъекта(<Объект>) — возвращает трехсимвольный код базы данных, в которой изначально был физически создан переданный объект (например, конкретный документ, элемент справочника или счет). Это крайне полезно для разрешения конфликтов при коллизиях автообмена.3. Метод управления авторегистрацией изменений:
РегистрацияИзменений(<Режим>) — важнейший метод, доступный только у объектов типа "Справочник" и "Документ". Он позволяет временно отключить авторегистрацию конкретной записи в очереди изменений для обмена. Принимает параметр: 1 — регистрировать изменения (режим по умолчанию), 0 — отключить регистрацию.Проанализируем ситуацию применения метода РегистрацияИзменений() на практическом примере. Представьте, что нам нужно программно скорректировать реквизит документа или справочника (например, заполнить служебный комментарий), но мы не хотим, чтобы это изменение выгружалось во все периферийные базы и вызывало избыточный трафик обмена. Посмотрим на пример кода:
Процедура ИзменитьБезВыгрузки(ВыбДокумент)
Док = СоздатьОбъект("Документ");
Док.НайтиДокумент(ВыбДокумент);
// Блокируем объект перед изменением
Док.Блокировка(1);
// Отключаем регистрацию изменений для этого сеанса записи
Док.РегистрацияИзменений(0);
// Вносим изменения в реквизиты
Док.Комментарий = "Служебная корректировка без обмена";
// Записываем документ
Док.Записать();
// Снимаем блокировку
Док.Блокировка(0);
КонецПроцедуры
Важное правило использования метода: действие вызова РегистрацияИзменений(0) распространяется исключительно на один последующий вызов метода Записать() текущего позиционированного объекта. Если вы перепозиционируете объект или выберете другой элемент, режим сбросится в исходное состояние (авторегистрация включена).
За непосредственное выполнение операций обмена и чтение структуры распределенных баз отвечает динамическая библиотека DistrDB.dll, находящаяся в каталоге BIN платформы. Бывают ситуации, когда при установке платформы из неполных или модифицированных дистрибутивов эта библиотека отсутствует. Существует классический административный лайфхак для принудительного развертывания этой библиотеки:
Если в вашем каталоге BIN отсутствует файл DistrDB.dll, создайте в этой папке пустой текстовый файл, переименуйте его в DistrDB.dll, а затем запустите процесс восстановления (Repair) или переустановки платформы 1С 7.7 из оригинального дистрибутива. Установщик обнаружит "поврежденный" (нулевого размера) файл библиотеки и автоматически перезапишет его полноценной рабочей версией из состава дистрибутива.
Для глубокого понимания механизмов УРБД необходимо заглянуть на уровень СУБД (независимо от того, используется ли файловая версия DBF или клиент-серверная на MS SQL). При инициализации распределенной структуры в базе данных разворачиваются три служебные таблицы:
1sdbset.dbf (на SQL-сервере — таблица _1SDBSET) — содержит перечень всех информационных баз, входящих в данное распределенное пространство, включая их коды, наименования и глобальные уникальные GUID-идентификаторы.1sdwnlds.dbf (на SQL-сервере — таблица _1SDWNLDS) — содержит историю загрузок пакетов и номера ожидаемых и полученных сообщений обмена для контроля транзакционной целостности.1supdts.dbf (на SQL-сервере — таблица _1SUPDTS) — центральная таблица регистрации изменений. Сюда записываются ссылки на все измененные объекты конфигурации и данных, которые должны быть отправлены в периферийные базы. В полях таблицы фиксируются тип объекта, его внутренний идентификатор (ID) и код базы-получателя.Штатные механизмы 1С 7.7 не предоставляют разработчику гибких инструментов для массового управления регистрацией изменений. Например, в платформе отсутствует аналог метода "ЗарегистрироватьИзменения" для целого класса объектов, который появился только в 1С 8. Если требуется выгрузить, к примеру, весь справочник "Номенклатура" на новую периферийную точку, стандартными средствами пришлось бы перезаписывать каждый элемент в цикле, что вызовет колоссальные транзакционные блокировки таблиц базы данных и займет часы работы.
Для обхода этого ограничения разработчики используют прямые SQL-запросы (в случае работы на MS SQL) или прямое низкоуровневое редактирование DBF-файла таблицы 1supdts.dbf. Запись напрямую в таблицу регистрации изменений позволяет мгновенно поставить любой объем данных в очередь на выгрузку без физического изменения и перезаписи самих объектов. Это предотвращает блокировки таблиц документов и справочников и экономит колоссальное количество времени администратора.
Рано или поздно филиальная структура может измениться. Если перед вами стоит задача превратить базу данных, которая ранее функционировала как периферийная или центральная в распределенной структуре, в обычную локальную или сетевую информационную базу (например, для объединения баз или перехода на базовую версию платформы), Конфигуратор не позволит сделать это штатно. Нам потребуется провести ручную процедуру очистки ("отвязки") базы от признаков распределенности.
Рассмотрим по шагам безопасный алгоритм деинсталляции УРБД:
1sdbset.dbf и 1sdbset.cdx1sdwnlds.dbf и 1sdwnlds.cdx1supdts.dbf и 1supdts.cdx1ssystem.dbf (в SQL-версии — таблица _1SSYSTEM) с помощью специализированного редактора DBF-таблиц.DBSIGN (код текущей базы в распределенной структуре) и DBSETUUID (уникальный идентификатор распределенного пространства). Очистите значения в этих полях (сделайте их пустыми).1ssystem.dbf.После выполнения этих шагов база полностью потеряет все признаки распределенности. Вы сможете без проблем запускать ее на любых компьютерах без установленной компоненты УРБД и использовать как обычную автономную информационную базу.