Автоматизация складской логистики часто сталкивается с проблемой объединения разных поколений программных продуктов. Типичный сценарий: основной учет ведется в исторически сложившейся базе 1С 7.7, а мобильные рабочие места кладовщиков реализуются на современной платформе 1С 8.3. Основная сложность заключается в том, что "семерка" не обладает встроенными механизмами Web-сервисов и полноценным REST API, что затрудняет мгновенную передачу данных. Рассмотрим подробно, как преодолеть этот технологический разрыв и обеспечить оперативную синхронизацию документов.
Это классический метод, который основывается на использовании общей папки (сетевого диска или FTP-ресурса). Процесс выглядит следующим образом: мобильное приложение выгружает результат сборки товара в файл (XML или JSON), а 1С 7.7 должна "увидеть" этот файл и загрузить его. Разберем, как заставить 1С 7.7 автоматически отслеживать появление новых данных.
Поскольку в 1С 7.7 нет встроенного триггера на создание файла, мы можем использовать недокументированную возможность или стандартную обработку ожидания. Проанализируем пример использования метода ОбработкаОжидания. Для этого в глобальном модуле или в постоянно открытой обработке необходимо прописать периодическую проверку:
// В теле основной обработки или при старте системы
Процедура ПриОткрытии()
Форма.ОбработкаОжидания("ПроверитьПапкуВходящихДанных", 5); // Проверка каждые 5 секунд
КонецПроцедуры
Процедура ПроверитьПапкуВходящихДанных()
ПутьКФайлу = "C:\Exchange\FromMobile\result.xml";
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
// Запускаем алгоритм загрузки данных
ЗагрузитьДанныеИзМобильного(ПутьКФайлу);
// После успешной загрузки удаляем файл или переносим в архив
ФС.УдалитьФайл(ПутьКФайлу);
КонецЕсли;
КонецПроцедуры
Важный нюанс: Чтобы не нагружать интерфейс диспетчера, такую обработку лучше запускать в отдельном "техническом" сеансе 1С 7.7 на сервере. Это позволит основной базе работать в фоновом режиме, выполняя роль "робота-обработчика".
Более современный и быстрый подход — заставить 1С 7.7 самостоятельно обращаться к Web-сервисам промежуточной базы 1С 8.3. Хотя в платформе нет встроенного объекта HTTPСоединение, мы можем воспользоваться системным объектом WinHttp.WinHttpRequest.5.1.
Выясним, как отправить POST-запрос с данными прямо из кода "семерки". Это позволит передавать информацию в оперативной памяти, минуя запись на жесткий диск, что исключает задержки файловой системы. Рассмотрим пример реализации:
// Создаем объект для отправки HTTP-запроса
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("POST", "http://server/base8/hs/exchange/update_doc", 0);
WinHttp.SetRequestHeader("Content-Type", "application/json");
// Подготавливаем JSON с данными реализации
ТекстЗапроса = "{ ""ID"": ""123"", ""Status"": ""Collected"", ""Items"": [...] }";
Попытка
WinHttp.Send(ТекстЗапроса);
Если WinHttp.Status = 200 Тогда
Сообщить("Данные успешно отправлены в мобильное приложение");
Ответ = WinHttp.ResponseText;
КонецЕсли;
Исключение
Предупреждение("Ошибка связи с сервером 1С 8: " + ОписаниеОшибки());
КонецПопытки;
Этот метод позволяет реализовать двусторонний обмен. Когда диспетчер проводит документ в 7.7, код сразу "пуляет" уведомление в 1С 8.3, которая, в свою очередь, через Push-уведомление оповещает кладовщика.
Если базы находятся в одной локальной сети, можно использовать COM-технологию. Проанализируем ситуацию: кладовщик в мобильном приложении нажимает кнопку "Завершить сборку". В этот момент серверная часть 1С 8.3 инициирует COM-соединение с базой 1С 7.7, находит нужный документ и перезаписывает его.
Для реализации этого метода в 1С 8.3 используется следующий подход:
// Пример кода в 1С 8.3 для подключения к 7.7
V7 = Новый COMОбъект("V77.Application");
Открыта = V7.Initialize(V7.RMTrade, "/D""C:\Bases\1C77Base"" /N""Robot"" /P""Password""", "NO_SPLASH_SHOW");
Если Открыта Тогда
Док77 = V7.CreateObject("Документ.Реализация");
Если Док77.НайтиПоНомеру("0001", ТекущаяДата()) = 1 Тогда
// Изменяем количество товара, пришедшее из мобильного приложения
Док77.ВыбратьСтроки();
Пока Док77.ПолучитьСтроку() = 1 Цикл
// Поиск и обновление строк
КонецЦикла;
Док77.Записать();
Док77.Провести();
КонецЕсли;
КонецЕсли;
Преимущество: Это самый надежный способ с точки зрения контроля транзакций, так как данные меняются непосредственно в базе-приемнике без промежуточных файлов.
Если ваша 1С 7.7 работает на MS SQL Server, можно рассмотреть вариант прямой модификации таблиц. Это самый производительный метод, исключающий запуск тяжеловесного COM-объекта.
Разберем структуру: данные документов в 7.7 хранятся в таблицах DHxxxx (шапка) и DTxxxx (табличная часть), где xxxx — это внутренний идентификатор объекта. Посмотрим на алгоритм действий:
UPDATE для изменения количества в строках документа._1SJOURN для того, чтобы диспетчер увидел изменения.Внимание: Этот метод требует ювелирной точности. Неправильное изменение индексов или отсутствие блокировок может привести к повреждению базы данных. Используйте его только в крайних случаях, когда объем транзакций очень велик.
Для тех, кто хочет сделать работу в 1С 7.7 максимально плавной, рекомендуем обратить внимание на компоненты FormEx или 1C++. Они позволяют расширить возможности старой платформы:
FileSystemWatcher через .NET-обертку можно мгновенно реагировать на появление файла без цикличных проверок ОбработкаОжидания.Проанализировав все варианты, мы видим, что наиболее сбалансированным решением для оперативного обмена является комбинация HTTP-запросов из 7.7 и Web-сервисов в 8.3. Это обеспечивает высокую скорость, отсутствие файлового мусора и относительную простоту отладки кода.