Синхронизация данных между 1С:Предприятие 7.7 и 1С:Предприятие 8 — классическая задача при поэтапном переходе на новую платформу или при использовании 7.7 в качестве складского бэк-офиса. Основная сложность заключается в обеспечении высокой скорости обмена и надежной регистрации изменений, особенно когда базы работают в файловом режиме. Разберем наиболее эффективные методики решения этой задачи.
В отличие от восьмой версии, где существуют штатные ПланыОбмена, в 1С 7.7 механизм отслеживания измененных объектов нужно реализовывать самостоятельно. Рассмотрим подробнее несколько проверенных подходов.
Вариант 1: Использование компоненты УРБД
Если в конфигурации 7.7 подключена компонента «Управление распределенными информационными базами» (УРБД), мы можем использовать её внутренние механизмы для автоматической регистрации изменений. Проанализируем этот метод: при включении объекта в состав правил обмена УРБД, система сама фиксирует факт изменения в специальных таблицах. Нам остается лишь программно прочитать эти изменения и выгрузить их. Однако, стоит учитывать, что в файловой базе активная работа с таблицами регистрации может приводить к блокировкам.
Вариант 2: Запись во вспомогательную таблицу (DBF)
Этот метод считается одним из самых надежных для файловых баз. Суть заключается в модификации глобального модуля и модулей объектов. Выясним, как это реализовать: в процедурах ПриЗаписи для справочников и ОбработкаПроведения для документов мы добавляем код, который записывает идентификатор объекта (например, Код или ВнутреннийИдентификатор) в отдельный DBF-файл или специальный справочник-регистратор.
Пример кода для 1С 7.7 в процедуре ПриЗаписи:
// В модуле справочника Номенклатура
Процедура ПриЗаписи()
// Регистрация изменения во внешнем файле
ТекстЛога = СоздатьОбъект("Текст");
ИмяФайла = "C:\Exchange\Changes.txt";
Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
ТекстЛога.Открыть(ИмяФайла);
КонецЕсли;
ТекстЛога.ДобавитьСтроку("Номенклатура;" + глПолучитьИд(ТекущийОбъект()));
ТекстЛога.Записать(ИмяФайла);
КонецПроцедуры
Часто программисты пытаются использовать COM-соединение (OLE) для чтения данных напрямую из 7.7 в 8-ку. Разберем по шагам, почему это может стать «бутылочным горлышком»:
Вместо COM-соединения рассмотрим использование прямых запросов к файлам данных .dbf. Мы можем использовать провайдеры ADO или специализированные компоненты, такие как 1С++. Это позволяет 1С 8 считывать остатки и данные товаров за миллисекунды, не запуская экземпляр 7.7.
Проанализируем современный подход с использованием промежуточной базы SQLite. Это легкая база данных, состоящая из одного файла, которая отлично справляется с очередями обмена.
Такой подход гарантирует, что данные не потеряются, даже если в момент обмена одна из баз была недоступна.
Посмотрим на ситуацию со стороны 1С 8. В файловом режиме регламентные задания не выполняются автоматически без запущенного сеанса пользователя. Чтобы обеспечить «скорость обновления», о которой просит автор темы, необходимо реализовать механизм мониторинга.
Рассмотрим вариант создания «служебного сеанса». Мы запускаем один экземпляр 1С 8 под специальным пользователем и подключаем ОбработчикОжидания. Этот обработчик будет проверять наличие новых данных в папке обмена или в промежуточной таблице каждые 10–30 секунд.
Пример кода для 1С 8 по обработке очереди:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ВыполнитьОбменДанными", 30); // каждые 30 секунд
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОбменДанными()
// Логика чтения DBF файла регистрации
// Загрузка измененных объектов из 7.7
// Выгрузка документов из 8 в 7.7
КонецПроцедуры
Для передачи остатков из 7.7 в 8 рекомендуется использовать механизм «среза». Вместо того чтобы передавать каждое движение, мы можем раз в 5–10 минут выгружать текущий актуальный остаток только по тем позициям, которые изменились. Это значительно снижает объем передаваемого трафика.
Для передачи документов из 8 в 7.7 лучше всего использовать формат XML или JSON. Несмотря на то, что 7.7 старая платформа, она прекрасно работает с текстом. Мы формируем файл в 1С 8, а 7.7 при запуске обработки загрузки (например, по таймеру через v7Plus.dll) считывает файл и создает соответствующий документ.
При интенсивном двустороннем обмене в файловых базах важно помнить о целостности индексов. Если обе системы будут одновременно пытаться писать в один и тот же файл обмена, возникнет коллизия. Рекомендуем использовать схему «флагов»:
1С 8 пишет файл data_tmp.xml, а после завершения записи переименовывает его в data_ready.xml. 1С 7.7 начинает обработку только тогда, когда видит файл с суффиксом _ready. Это простая, но эффективная защита от чтения «битых» файлов.
Подводя итог, можно сказать, что для достижения максимальной скорости в связке 7.7 и 8 лучше всего отказаться от COM-технологии в пользу обмена через промежуточные DBF/SQLite файлы с использованием прямых запросов или специализированных механизмов регистрации изменений в глобальном модуле 7.7.