При автоматизации розничной сети часто возникает задача оперативной передачи небольших объемов данных из торговых точек в центральную базу. Рассмотрим классический сценарий: имеется множество точек с конфигурацией 1С:Розница и центральный офис с базой 1С:Бухгалтерия государственного учреждения (БГУ) редакции 1.0, работающей на обычных формах. Каждый день с каждой точки требуется передавать всего два числовых показателя: сумма выручки и сданная сумма.
Использовать для такой тривиальной задачи тяжеловесный типовой обмен (например, через планы обмена) нерационально — это создаст избыточную нагрузку на систему и усложнит поддержку. В этой статье мы подробно разберем, почему традиционные каналы обмена вроде FTP и электронной почты сегодня считаются устаревшими, и как реализовать современный, быстрый и безопасный обмен данными с использованием HTTP-сервисов и формата JSON.
Прежде чем перейти к программной реализации, проанализируем, почему старые методы передачи файлов уходят в прошлое:
Именно поэтому лучшим выбором является использование веб-технологий — HTTP-запросов, которые работают мгновенно, гарантируют доставку «здесь и сейчас» и легко масштабируются.
Существует распространенное заблуждение среди разработчиков, что если конфигурация (например, БГУ 1.0) построена на обычных формах, то она не приспособлена для публикации в интернете и работы с веб-сервисами. Выясним причину этого заблуждения.
Обычные или управляемые формы определяют только интерфейс взаимодействия с пользователем. Механизмы интеграции, такие как Web-сервисы, HTTP-сервисы, а также объекты HTTPСоединение и HTTPЗапрос, работают исключительно на уровне платформы и сервера приложений. Визуальная оболочка конфигурации никак не влияет на способность 1С принимать и обрабатывать входящие веб-запросы. Единственное условие — использование современной версии платформы «1С:Предприятие 8.3».
Рассмотрим по шагам, как настроить и запрограммировать такой обмен.
Для того чтобы центральная база БГУ могла принимать данные от точек, мы настроим в ней собственный HTTP-сервис. Разберем этот процесс подробнее:
ExchangeData) и укажите корневой URL (например, ExchangeData).v1 и шаблоном /v1/send.POST (так как мы будем отправлять данные в базу) и укажите имя обработчика в модуле HTTP-сервиса (например, ДанныеПринять).Теперь напишем код обработчика в модуле созданного HTTP-сервиса. Этот код будет принимать JSON-пакет, парсить его и записывать данные в базу (например, в специально созданный непериодический регистр сведений ОтраженнаяВыручкаТочек с измерениями Точка, Дата и ресурсами Выручка, Сдано):
Функция ДанныеПринять(Запрос) Экспорт
// Создаем объект ответа по умолчанию (код 200 - Успешно)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Читаем тело POST-запроса, переданное в формате JSON
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если ПустаяСтрока(СтрокаJSON) Тогда
Ответ.КодСостояния = 400; // Bad Request
Ответ.УстановитьТелоИзСтроки("{""status"":""error"",""message"":""Пустое тело запроса""}");
Возврат Ответ;
КонецЕсли;
// Инициализируем чтение JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Попытка
// Десериализуем данные в соответствие или структуру 1С
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Записываем полученную информацию в регистр сведений БГУ
МенеджерЗаписи = РегистрыСведений.ОтраженнаяВыручкаТочек.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Точка = Данные.Точка;
МенеджерЗаписи.Выручка = Данные.Выручка;
МенеджерЗаписи.Сдано = Данные.Сдано;
// Записываем данные с замещением существующих записей за эту дату
МенеджерЗаписи.Записать(Истина);
// Формируем успешный ответ для розничной точки
Ответ.УстановитьТелоИзСтроки("{""status"":""success"",""message"":""Данные успешно сохранены""}");
Исключение
ЧтениеJSON.Закрыть();
// В случае ошибки возвращаем внутреннюю ошибку сервера (код 500)
Ответ.КодСостояния = 500;
Ответ.УстановитьТелоИзСтроки("{""status"":""error"",""message"":""" + ОписаниеОшибки() + """}");
КонецПопытки;
Возврат Ответ;
КонецФункции
После написания кода базу БГУ необходимо опубликовать на веб-сервере (IIS или Apache). При публикации обязательно убедитесь, что установлена галочка напротив вашего HTTP-сервиса ExchangeData.
На стороне розничных точек нам нужно написать простую процедуру, которая будет собирать данные за текущий день, упаковывать их в формат JSON и отправлять на опубликованный адрес нашей БГУ.
Рассмотрим пример кода, выполняющего эту задачу:
Процедура ОтправитьДанныеВЦентр(ИдентификаторТочки, СуммаВыручки, СданнаяСумма) Экспорт
// 1. Формируем структуру с передаваемыми параметрами
ДанныеОбмена = Новый Структура;
ДанныеОбмена.Вставить("Точка", ИдентификаторТочки);
ДанныеОбмена.Вставить("Выручка", СуммаВыручки);
ДанныеОбмена.Вставить("Сдано", СданнаяСумма);
// 2. Сериализуем структуру в формат JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеОбмена);
СтрокаJSON = ЗаписьJSON.Закрыть();
// 3. Настраиваем параметры HTTP-соединения
Сервер = "bgu.company.ru"; // Внешний адрес вашего веб-сервера
Порт = 443; // Рекомендуется использовать защищенное соединение HTTPS (порт 443)
Пользователь1С = "ExchangeUser"; // Специальный пользователь в БГУ с минимальными правами
Пароль1С = "StrongPassword123";
// Создаем защищенное SSL-соединение, если используется HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь1С, Пароль1С,, 30, ЗащищенноеСоединение);
Исключение
Сообщить("Ошибка инициализации HTTP-соединения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 4. Формируем HTTP-запрос POST
АдресРесурса = "/BGU_Base/hs/ExchangeData/v1/send";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// 5. Отправляем запрос на сервер БГУ
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Обмен прошел успешно! Данные приняты сервером.");
Иначе
Сообщить("Ошибка при передаче данных. Код ответа сервера: " + Ответ.КодСостояния);
Сообщить("Ответ сервера: " + Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
КонецЕсли;
Исключение
Сообщить("Не удалось связаться с сервером БГУ: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Данную процедуру можно вызывать автоматически при закрытии кассовой смены на торговой точке или настроить ее запуск по расписанию через РегламентныеЗадания.
Если служба безопасности вашего государственного учреждения категорически запрещает публиковать базу БГУ напрямую во внешнюю сеть интернет, или у вас нет возможности настроить белый IP-адрес для сервера БГУ, рассмотрим альтернативные варианты безопасного обмена данными.
Серверы Telegram могут выступать в качестве бесплатного, отказоустойчивого и абсолютно безопасного посредника между базами 1С. Для этого центральный сервер БГУ не нужно открывать «наружу» — он сам будет делать исходящие запросы в Telegram для забора данных.
Проанализируем схему работы:
КодТочки;Выручка;Сдано в чат вашего бота.getUpdates, считывает накопившиеся сообщения, парсит их по разделителю ; и создает соответствующие документы в БГУ.Этот подход гарантирует 100% безопасность центрального сервера, так как он осуществляет исключительно исходящие соединения.
Еще один элегантный и наглядный способ обмена микрообъемами данных — использование облачных таблиц (например, Яндекс Диск API или Google Sheets API).
Алгоритм действий следующий:
Таким образом, мы детально разобрали, как решить задачу обмена микрообъемами данных современными методами. Отказ от устаревших файловых схем на базе FTP в пользу легких HTTP-сервисов и JSON позволит вам создать надежную, быструю и безопасную систему передачи данных, которая практически не требует администрирования.