Как организовать выгрузку только измененных документов из 1С 7.7 в 1С:Управление торговлей 11

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

При организации обмена данными между устаревшей конфигурацией 1С:Бухгалтерия 7.7 и современной 1С:Управление торговлей 11 одной из главных проблем становится отсутствие в платформе 7.7 встроенных планов обмена. Выгрузка за фиксированный период не решает задачу полностью, поскольку пользователи могут задним числом редактировать документы прошлых периодов. Разберем архитектурные ограничения платформы 7.7 и рассмотрим практические способы отслеживания и передачи только измененных данных.

Ограничения платформы 1С 7.7 при отслеживании изменений

В платформе 1С 7.7 отсутствуют глобальные события записи объектов уровня конфигурации (такие как ПередЗаписью или ПриЗаписи в модуле объекта платформы 8). Предопределенная процедура ПриЗаписи() существует только в модулях экранных форм документов и справочников. Это означает, что если объект перезаписывается программно через вызов метода Записать() в регламентной обработке, код формы не выполняется вовсе. Процедура ОбработкаПроведения() в модуле самого документа фиксирует только факт проведения, оставляя без внимания снятие с проведения, пометку на удаление или изменение реквизитов непроведенного документа.

Штатный журнал регистрации 7.7 также имеет существенные недостатки: он по умолчанию фиксирует преимущественно интерактивные действия пользователей и создает высокую нагрузку при постоянном парсинге текстового лога. Поэтому для надежной синхронизации применяются другие архитектурные подходы.

Вариант 1. Использование механизма УРБД (распределенной информационной базы)

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

  1. Настроим в конфигураторе 1С 7.7 распределенную базу: создадим фиктивный периферийный узел. Если основная информационная база сама регистрируется как периферийная по отношению к некоторому центру, это снимает необходимость отдельного лицензирования центрального узла.
  2. Все модификации справочников и документов платформа сохраняет в таблице 1SDNXL.
  3. Поскольку база работает под управлением Microsoft SQL Server, после успешной выгрузки зарегистрированных объектов снятие признака изменений выполняется напрямую SQL-запросом к таблице 1SDNXL (с помощью команды DELETE), что не требует монопольного захвата и переиндексации базы данных, в отличие от файлов DBF/CDX.

Вариант 2. Триггеры на уровне Microsoft SQL Server

Если база данных 7.7 работает на сервере MS SQL, наиболее производительным и надежным решением является перехват изменений на уровне СУБД. В этом случае мы не зависим от того, как именно был изменен документ — интерактивно пользователем или программной процедурой.

Проанализируем структуру хранения документов в 1С 7.7:

  1. Таблица _1SJOURN содержит общие реквизиты всех документов: дату, номер, идентификатор вида документа, флаги проведения и пометки удаления.
  2. Таблицы вида DH<ID_Документа> содержат значения реквизитов шапки конкретного вида документа.
  3. Таблицы вида DT<ID_Документа> содержат строки табличных частей.

Создадим отдельную служебную таблицу в SQL для очереди изменений и настроим триггеры на нужные таблицы. Критически важное требование к триггерам 1С 7.7: первой командой внутри каждого триггера обязательно должна быть директива SET NOCOUNT ON;. Если ее опустить, возвращаемое сервером число затронутых строк нарушит работу встроенного драйвера ODBC платформы 1С 7.7, и при проведении документов пользователи начнут получать системные ошибки транзакций.

Посмотрим на пример структуры триггера для отслеживания изменений табличной части документа:


CREATE TRIGGER tr_DT1234_Sync ON dbo.DT1234
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    SET NOCOUNT ON;

    -- Регистрируем IDDOC измененных строк в буферной таблице
    INSERT INTO dbo.ExchangeQueue (IDDOC, ChangeDate)
    SELECT DISTINCT IDDOC, GETDATE()
    FROM (
        SELECT IDDOC FROM inserted
        UNION
        SELECT IDDOC FROM deleted
    ) AS Changes
    WHERE IDDOC NOT IN (SELECT IDDOC FROM dbo.ExchangeQueue);
END;

Вариант 3. Использование перехвата методов через внешние компоненты или буферный справочник

Если нет прямого доступа к администрированию СУБД для создания триггеров, рассмотрим альтернативные варианты фиксации изменений внутри конфигурации 1С 7.7:

  1. Перехват событий через внешнюю компоненту 1С++: Используя класс Перехватчик, можно перехватить методы ядра платформы Записать, Провести и СделатьНеПроведенным для всех документов метаданных. При срабатывании перехватчика уникальный идентификатор документа (IDDOC) записывается в буфер.
  2. Служебный справочник очереди изменений: Создадим в метаданных справочник ОчередьОбмена со строковым реквизитом для ссылки или идентификатора объекта. Запись в этот справочник выполняется в процедурах ПриЗаписи() модулей форм документов и в модулях проведения. Этот способ прост в реализации, однако требует ручного изменения модулей всех объектов, участвующих в обмене.

Организация регулярного обмена с 1С:Управление торговлей 11

Выясним, как правильно выстроить процесс регулярной передачи данных. В платформе 1С 7.7 метод ОбработкаОжидания() работает только в активном графическом сеансе конкретного пользователя. Если сессия зависнет или пользователь закроет программу, обмен остановится.

Поэтому инициативу обмена рекомендуется перенести на сторону 1С:Управление торговлей 11:

  1. В УТ 11 создается РегламентноеЗадание, выполняющееся на сервере по расписанию.
  2. Регламентное задание выполняет прямое подключение к базе данных MS SQL через ADODB.Connection или подключается к 1С 7.7 через COM-соединение с помощью объекта V77S.Application.
  3. Из буферной таблицы или таблицы УРБД считывается список идентификаторов IDDOC, которые были модифицированы с момента последнего обмена.
  4. Сформированный массив ссылок передается в правила обмена (обработка «Универсальный обмен данными в формате XML») через входящий параметр СписокОбъектовДляВыгрузки. Это позволяет правилам выгружать строго определенный перечень документов без необходимости перебирать всю информационную базу.
  5. После успешного завершения транзакции загрузки в УТ 11 обработанные записи удаляются из очереди изменений в базе 1С 7.7.
← На главную