При реализации онлайн-взаимодействия между 1С:Управление торговлей 11 и самописным сайтом разработчики часто сталкиваются с проблемой «хрупкости» системы. Идеальная картина, когда изменения в 1С мгновенно отражаются на сайте и наоборот, разбивается о технические реалии: временную недоступность сервера, сетевые сбои или блокировки в базе данных. Рассмотрим подробно, как организовать архитектуру обмена, которая сохранит данные в любой ситуации.
Главный риск прямого онлайн-обмена заключается в невозможности отменить транзакцию на стороне клиента. Если покупатель нажал кнопку «Оформить заказ», мы не можем выдать ему ошибку только потому, что в 1С в этот момент обновляется конфигурация или база заблокирована другим процессом. Следовательно, и на стороне сайта, и на стороне 1С должна существовать очередь сообщений.
Проанализируем ситуацию с очередностью объектов. Часто важно, чтобы данные передавались строго последовательно: сначала информация о новом товаре, а только потом — заказ, содержащий этот товар. План обмена в 1С сам по себе не хранит время регистрации изменения, он лишь фиксирует факт наличия изменений. Разберем способы решения этой задачи.
Для соблюдения строгой последовательности выгрузки данных рекомендуется создать вспомогательный регистр сведений «Очередь событий». Рассмотрим структуру этого регистра:
При записи важного объекта в 1С (в модуле объекта ПередЗаписью или ПриЗаписи) мы добавляем запись в этот регистр. Специальное регламентное задание будет перебирать записи, сортируя их по дате, и вызывать API сайта. В случае ошибки статус записи меняется на «Ошибка», и администратор может оперативно вмешаться, не нарушая общую логику обмена.
Если объемы данных велики, использование планов обмена более эффективно, так как это штатный механизм платформы. Чтобы победить проблему очередности товаров и заказов, проанализируем следующий алгоритм:
Номенклатура.ЗаказКлиента.ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения) для получения порции данных.Такой подход гарантирует, что к моменту обработки заказа на стороне сайта вся необходимая номенклатура уже будет создана или обновлена.
Для передачи данных на сайт обычно используется формат JSON. Сборка JSON вручную через перебор строк — процесс медленный и ресурсоемкий. Разберем, как ускорить этот процесс с помощью объектной модели XDTO. Рассмотрим пример кода для формирования тела запроса:
// Создадим структуру для передачи данных
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("Артикул", ТоварСсылка.Артикул);
ДанныеОбъекта.Вставить("Наименование", ТоварСсылка.Наименование);
ДанныеОбъекта.Вставить("Цена", ТекущаяЦена);
// Быстрая сериализация структуры в JSON
ЗаписатьJSON(ЗаписьJSON, ДанныеОбъекта);
РезультатСтрокой = ЗаписьJSON.Закрыть();
Для сложных вложенных структур лучше использовать Фабрику XDTO. Это позволяет типизировать данные и избежать ошибок при формировании JSON, а также значительно ускоряет работу за счет использования внутренних механизмов платформы.
Если ваша 1С:УТ 11 работает в файловом режиме, онлайн-интеграция становится еще сложнее из-за блокировок. Рассмотрим рекомендации по работе в таких условиях:
HTTP-сервисы.$top и $skip (в OData) или реализуйте параметр ПоследнийID в своих сервисах, чтобы отдавать данные порциями.Для обеспечения максимальной отказоустойчивости рассмотрим внедрение промежуточного звена. Сайт общается не напрямую с 1С, а с быстрой промежуточной базой (например, Redis или простая SQL-таблица). 1С выгружает туда остатки и цены по мере их изменения. Если 1С недоступна (обновление, бэкап), сайт продолжает показывать актуальные данные из буфера и принимать заказы. Как только связь восстанавливается, 1С «забирает» накопленные заказы из буфера.
Важный момент — идемпотентность API. Выясним причину возможных дублей: если 1С создала заказ, но не успела ответить сайту из-за обрыва связи, сайт пришлет заказ повторно. Чтобы этого избежать, всегда передавайте с сайта уникальный ИдентификаторТранзакции. 1С перед созданием заказа должна проверить: не создавался ли уже документ с таким идентификатором.
Таким образом, комбинируя использование планов обмена для фиксации изменений, регистров очереди для соблюдения последовательности и HTTP-сервисов для быстрой передачи JSON, мы получаем надежную систему, готовую к любым техническим сбоям.