Синхронизация данных между базами 1С — задача стандартная, но она превращается в настоящий вызов, когда на систему наложены жесткие ограничения. Рассмотрим ситуацию: имеется старая конфигурация 1С:Управление производственным предприятием (УПП) на обычных формах, в которую категорически запрещено вносить изменения. При этом расширения платформой не поддерживаются, а обмен должен происходить оперативно (раз в 15 минут) через мобильный интернет с ограниченным трафиком.
В данной статье мы разберем, как организовать надежную выгрузку данных из регистра сведений, используя только внешние инструменты и механизмы платформы 1С, не затрагивая структуру метаданных.
Поскольку мы не можем добавить в конфигурацию свой ПланОбмена или новые реквизиты, нам необходимо реализовать механизм регистрации изменений на стороне внешней обработки. Основная идея заключается в том, чтобы хранить информацию о том, что уже было выгружено, во внешнем файле (например, в формате JSON или XML) на диске сервера.
Проанализируем алгоритм работы такой обработки:
Для вычисления хеша можно использовать объект КриптографияМенеджер или простую конкатенацию строк. Рассмотрим пример функции формирования уникального ключа записи:
Функция ПолучитьХешЗаписи(Выборка)
ТекстДляХеша = "";
Для Каждого Колонка Из Выборка.Колонки Цикл
ТекстДляХеша = ТекстДляХеша + Строка(Выборка[Колонка.Имя]);
КонецЦикла;
Хеш = ХешированиеДанных.СоздатьХеш(ТекстДляХеша, АлгоритмХеширования.MD5);
Возврат Хеш;
КонецФункции
В условиях, когда нельзя создать новое РегламентноеЗадание, автоматизацию можно настроить внешними средствами ОС. Выясним, как запустить процесс выгрузки по расписанию.
Самый эффективный способ — использование планировщика задач Windows (Task Scheduler) и параметров запуска 1С. Мы можем запускать тонкий или толстый клиент с ключом /Execute, который откроет внешнюю обработку сразу после авторизации.
Пример командной строки для планировщика:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S "Server\Base" /N "RobotUser" /P "Password" /Execute "C:\Scripts\ExchangeRecords.epf"
В самой обработке в процедуре ПриОткрытии или ПередОткрытием необходимо прописать логику автоматического выполнения и обязательного закрытия системы, чтобы сеансы не «зависали» в базе:
Процедура ПриОткрытии()
Если РольДоступна("ПолныеПрава") Тогда // Проверка, что запуск программный
ВыполнитьВыгрузку();
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Если у нас есть доступ к SQL-серверу, на котором развернута база УПП, мы можем обойти ограничения платформы 1С. Этот метод не меняет конфигурацию 1С, так как изменения происходят непосредственно в структуре таблиц базы данных или через создание вспомогательных таблиц.
Разберем вариант с созданием вспомогательной таблицы регистрации:
Custom_ChangeLog.INSERT, UPDATE, DELETE).ADOConnection подключается к этой таблице, считывает список изменений и выбирает данные только по конкретным идентификаторам.Это самый «чистый» с точки зрения трафика способ, так как выгружаться будет только реальная дельта изменений. Однако он требует высокой квалификации администратора БД.
Поскольку данные передаются через мобильное соединение, объем трафика критичен. Стандартный XML очень избыточен. Посмотрим, как уменьшить размер пакета передачи:
1. Использование сжатия (ZIP). Платформа 1С имеет встроенные средства для работы с архивами. Сжатие текстового файла выгрузки может уменьшить его размер в 5–10 раз.
Архив = Новый ЗаписьZipФайла(ИмяФайлаАрхива);
Архив.Добавить(ИмяФайлаДанных);
Архив.Записать();
2. Формат JSON. Если версия платформы позволяет (8.3.6 и выше), используйте ЗаписьJSON вместо ЗаписьXML. JSON весит значительно меньше за счет отсутствия закрывающих тегов и более лаконичной структуры.
3. Инкрементальная выгрузка по «Метке времени». Даже если в регистре нет поля «Дата изменения», в УПП часто есть реквизиты вроде Период (если регистр периодический). Можно хранить дату последней успешной выгрузки и в следующем запросе использовать ее как границу. Для надежности рекомендуется добавлять «нахлест» в 15-30 минут, чтобы исключить потерю данных, которые находились в транзакции в момент прошлой выгрузки.
Проанализируем ситуацию, упомянутую в обсуждении: иногда в старых конфигурациях уже существуют планы обмена (например, для обмена с бухгалтерией или розницей). Даже если наш регистр не включен в состав этого плана обмена, мы можем попробовать программно использовать этот механизм, если у нас есть права на добавление объектов в состав программно (через ПланыОбменаМенеджер).
Если же регистр включен хоть в какой-то план обмена, мы можем использовать метод ПланыОбмена.ВыбратьИзменения(), что будет гораздо эффективнее любых самописных запросов.
Заключение: Самым стабильным и безопасным решением в рамках заданных ограничений является создание внешней обработки, которая запускается через планировщик задач Windows, использует локальный кэш хеш-сумм для определения дельты изменений и передает данные в сжатом ZIP виде.