При организации обмена данными между устаревшей конфигурацией 1С:Бухгалтерия 7.7 и современной 1С:Управление торговлей 11 одной из главных проблем становится отсутствие в платформе 7.7 встроенных планов обмена. Выгрузка за фиксированный период не решает задачу полностью, поскольку пользователи могут задним числом редактировать документы прошлых периодов. Разберем архитектурные ограничения платформы 7.7 и рассмотрим практические способы отслеживания и передачи только измененных данных.
В платформе 1С 7.7 отсутствуют глобальные события записи объектов уровня конфигурации (такие как ПередЗаписью или ПриЗаписи в модуле объекта платформы 8). Предопределенная процедура ПриЗаписи() существует только в модулях экранных форм документов и справочников. Это означает, что если объект перезаписывается программно через вызов метода Записать() в регламентной обработке, код формы не выполняется вовсе. Процедура ОбработкаПроведения() в модуле самого документа фиксирует только факт проведения, оставляя без внимания снятие с проведения, пометку на удаление или изменение реквизитов непроведенного документа.
Штатный журнал регистрации 7.7 также имеет существенные недостатки: он по умолчанию фиксирует преимущественно интерактивные действия пользователей и создает высокую нагрузку при постоянном парсинге текстового лога. Поэтому для надежной синхронизации применяются другие архитектурные подходы.
Рассмотрим штатный механизм распределенных баз данных 1С 7.7. При включении компоненты УРБД платформа на уровне ядра начинает автоматически регистрировать любые изменения данных в системной таблице.
1SDNXL.1SDNXL (с помощью команды DELETE), что не требует монопольного захвата и переиндексации базы данных, в отличие от файлов DBF/CDX.Если база данных 7.7 работает на сервере MS SQL, наиболее производительным и надежным решением является перехват изменений на уровне СУБД. В этом случае мы не зависим от того, как именно был изменен документ — интерактивно пользователем или программной процедурой.
Проанализируем структуру хранения документов в 1С 7.7:
_1SJOURN содержит общие реквизиты всех документов: дату, номер, идентификатор вида документа, флаги проведения и пометки удаления.DH<ID_Документа> содержат значения реквизитов шапки конкретного вида документа.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;
Если нет прямого доступа к администрированию СУБД для создания триггеров, рассмотрим альтернативные варианты фиксации изменений внутри конфигурации 1С 7.7:
Перехватчик, можно перехватить методы ядра платформы Записать, Провести и СделатьНеПроведенным для всех документов метаданных. При срабатывании перехватчика уникальный идентификатор документа (IDDOC) записывается в буфер.ОчередьОбмена со строковым реквизитом для ссылки или идентификатора объекта. Запись в этот справочник выполняется в процедурах ПриЗаписи() модулей форм документов и в модулях проведения. Этот способ прост в реализации, однако требует ручного изменения модулей всех объектов, участвующих в обмене.Выясним, как правильно выстроить процесс регулярной передачи данных. В платформе 1С 7.7 метод ОбработкаОжидания() работает только в активном графическом сеансе конкретного пользователя. Если сессия зависнет или пользователь закроет программу, обмен остановится.
Поэтому инициативу обмена рекомендуется перенести на сторону 1С:Управление торговлей 11:
РегламентноеЗадание, выполняющееся на сервере по расписанию.ADODB.Connection или подключается к 1С 7.7 через COM-соединение с помощью объекта V77S.Application.IDDOC, которые были модифицированы с момента последнего обмена.СписокОбъектовДляВыгрузки. Это позволяет правилам выгружать строго определенный перечень документов без необходимости перебирать всю информационную базу.