Нетипичное использование компоненты УРБД в системе 1С:Предприятие 7.7 (статья)При организации обмена между двумя информационными базами (не обязательно 1С:Предприятие) возникают две сложности: как узнать, а какие же объекты были изменены с момента последней отгрузки информации (чтобы выгружать не все данные, а только необходимое), и как отследить доставку пакетов обмена (если пропал один или два пакета, то это не должно приводить к глобальному сбою: пакеты, по которым не пришло подтверждение доставки, должны быть просто и прозрачно отправлены при следующем сеансе обмена). | | Автор статьи: romix | Редакторы: Волшебник, Последняя редакция №2 от 14.10.05 | История URL: http://kb.mista.ru/article.php?id=45 | |
Давайте рассмотрим, как технология надежной доставки реализована в компоненте УРБД 1С:Предприятие 7.7 «изнутри» (на уровне исходных таблиц информационной базы). Это особенно интересно, если мы хотим реализовать взаимодействие с другими системами (не обязательно 1С), не отказываясь, в то же время, от удобных средств, предоставляемых программисту компонентой УРБД.
Установка и настройка распределенной базы УРБД «с нуля» описана в статье http://forum.mista.ru/topic.php?id=7852.
Для просмотра и правки файлов DBF рекомендую программу DBFNavigator от Алексея Долгачева.
Ниже приведены результаты моих собственных изысканий (поправки и дополнения приветствуются).
1SUPDTS.DBF
Таблица хранит записи об измененных объектах 1С:Предприятие, которые подлежат отправке получателям.
DBSIGN (тип: Строка 3) – Код базы УРБД, как он задан в окне настроек в меню Администрирование - Распределенная ИБ – Управление. Это код базы-адресата, куда должен быть отправлен объект (например, пользовательский документ или элемент справочника). Если есть несколько баз-получателей, то в таблице будет несколько записей (строчек) для одного и того же объекта (например, измененного элемента справочника товаров).
TYPEID (тип: Строка 4) – Идентификатор типа объекта 1С, например, документа или справочника. Значение хранится в 36-й системе счисления.
OBJID (тип: Строка 9) – Внутренний числовой идентификатор объекта (например, пользовательского документа или элемента справочника), как он представлен в методе ЗначениеВСтрокуВнутр(). Необходимы ведущие пробелы.
DELETED (тип: Строка 1) – Признак непосредственного (не пометка на удаление!) удаления объекта, 1=да или 0=нет.
DWNLDID (тип: Строка 9) – Идентификатор пакета выгрузки, как в 1SDWNLDS.DBF (см. ниже).
Основная проблема при расшифровке информации из этой таблицы – как средствами 1С получить ссылку на объект (например, элемент справочника), если известен его TYPEID и OBJID.
- Во-первых, преобразование значения TYPEID в/из 36-й системы счисления в десятичную можно произвести при помощи (недокументированных) функций _StrToId() и (обратное преобразование) - _IdToStr().
- Во-вторых, пара TYPEID (в десятичной системе) и OBJID фигурирует в методах ЗначениеИзСтрокиВнутр() и ЗначениеВСтрокуВнутр(). Вы можете попытаться выгружать существующие объекты во внутреннее текстовое представление, и смотреть, какое у них будет значение этих параметров.
- В-третьих, для разбора и формирования этих строк удобно применять методы работы со списками значений – ВстрокуСРазделителями() и ИзСтрокиСРазделителями().
Пример получения измененных объектов
Ниже приведен пример чтения 1SUPDTS.DBF из 1С, если установлена компонента УРБД и настроена распределенная база данных. Пример позволяет вывести объекты (например, элементы справочника товаров), по которым были зафиксированы изменения. Чтобы добиться того же результата без компоненты УРБД, потребовалось бы заводить специальный справочник, и вводить в него значения при каждом сохранении, удалении, проведении, отмене проведения, пометке на удаление или снятии такой пометки у объекта, а также изменение времени, подчиненности и т.п. А поскольку в Глобальном модуле 1С:Предприятие отслеживаются далеко не все подобные ситуации, то это гарантирует существенное дополнение конфигурации «следящим» за действиями пользователя кодом. В случае же использования компоненты УРБД в режиме мониторинга изменений, правка конфигурации не требуется совершенно – все изменения автоматически попадают в файл 1SUPDTS.DBF, и могут быть оттуда извлечены как ссылки на объекты.
//*******************************************
Процедура Сформировать()
dbf=СоздатьОбъект("XBASE");
ИмяФайла=КаталогИБ()+"1SUPDTS.DBF";
Если фс.СуществуетФайл(ИмяФайла)=0 Тогда
Сообщить("Таблица 1SUPDTS.DBF не найдена.", "!");
Возврат;
КонецЕсли;
dbf.ОткрытьФайл(ИмяФайла,,1);
Если dbf.Открыта()=0 Тогда
Сообщить("Таблица 1SUPDTS.DBF заблокирована.", "!");
Возврат;
КонецЕсли;
Если dbf.Первая()=1 Тогда
Пока 1=1 Цикл
TYPEID=dbf.TYPEID;
OBJID=dbf.OBJID;
тип=_StrToId(TYPEID);
объ=Прав(" "+OBJID,13);
стр="{""B"",""0"",""0"","""+тип+""",""0"",""0"","""+объ+"""}";
о=ЗначениеИзСтрокиВнутр(стр); //справочник
Если ПустоеЗначение(о)=1 Тогда
стр="{""O"",""0"",""0"","""+тип+""",""0"",""0"","""+объ+"""}";
о=ЗначениеИзСтрокиВнутр(стр); //документ
КонецЕсли;
//выводит ссылки на объекты (например, названия товаров)
Сообщить("Объект: "+о);
Если dbf.Следующая()=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
dbf.ЗакрытьФайл();
КонецПроцедуры
Пример умеет работать только с документами и справочниками. Буквы (первый параметр ЗначениеИзСтрокиВнутр()) для других ссылочных типов:
B – Справочник
O - Документ
T – Счет
P – План счетов
K – Вид субконто
C – Календарь
A – Вид расчета
Этот пример, как и сам автообмен в УРБД, работает только в разделенном (не монопольном!) режиме 1С:Предприятие 7.7.
1SDWNLDS.DBF
Эта таблица хранит идентификаторы пакетов обмена.
DWNLDID (тип: Строка 9) – Идентификатор пакета выгрузки
DBSIGN (тип: Строка 3) – Код базы - получателя
DIRECT (тип: Строка 1) – Направление (I-входящий пакет или O-исходящий)
ACKNOWL (тип: Строка 1) – Наличие подтверждения доставки (символ А, если есть подтверждение, или пустая строка- если нет подтверждения)
Каждая выгрузка (например, инициированная через меню Администрирование – Распределенная ИБ – Автообмен) пишет в эту таблицу новую строчку с уникальным номером пакета DWNLDID. Этот же ключ будет проставлен всем объектам таблицы 1supdts.dbf, где оно еще пустое. Затем 1С «пройдется» по всем записям 1supdts.dbf, и выгрузит все указанные в нем объекты.
Что происходит, если объекты дошли до получателя
Объекты (элементы справочников и документы) идут в пакете с определенным номером пакета DWNLDID, и этот же номер будет фигурировать в подтверждении доставки. Программа увидит: ага, такой-то DWNLDID успешно дошел, и можно чистить таблицу 1supdts.dbf, в части тех записей об объектах, которые содержат этот же DWNLDID.
Что происходит, если объекты не дошли до получателя
Предположим, что наступил следующий день, и надо отправлять базе-получателю новую порцию свежевбитой пользователями информации. Часть объектов в таблице 1supdts.dbf будут с заполненными полями DWNLDID (это вчерашние объекты), а часть – с пустыми (сегодняшние объекты). УРБД пошлет все старые пакеты, по которым еще не было подтверждения, и один новый пакет (присвоив ему новый номер), в одном большом пакете. Таким образом, размер пакета выгрузки с каждым днем будет постоянно расти, до тех пор, пока не треснет что-либо, либо пока от базы – приемника не начнут приходить подтверждения. Предположим, что были доставлены пакеты с номерами 1 и 2, а всего было послано 3 пакета. Размер выгрузки немедленно уменьшится, поскольку УРБД удалит из 1supdts.dbf все записи об объектах, которые принадлежали пакетам 1 и 2 – ведь посылать их базе-приемнику больше не нужно.
Алгоритм повторной доставки
Вы можете реализовать подобные манипуляции с 1supdts.dbf вручную, если обмен производится, например, средствами XML. Алгоритм работы примерно следующий:
- Заполнить все пустые поля DWNLDID значением нового (увеличенного на 1) идентификатора пакета.
- Выгрузить все объекты, которые перечислены в 1supdts.dbf, указав в пакете выгрузки, какие номера DWNLDID были выгружены.
- Если от базы-получателя приходит подтверждение по определенным DWNLDID, то удалить из 1supdts.dbf все записи, где DWNLDID совпадает с номерами пакетов с подтвержденной доставкой.
Ссылки
http://argat.h11.ru/URBDStructure.html
http://1c.proclub.ru/modules/newbb/viewtopic.php?topic_id=258258&forum=2&viewmode=flat&order=ASC&start=all
http://1c.realnet.ru/kuban/138067.html |