Как настроить обмен данными между 1С:Розница и БГУ на обычных формах без использования FTP и почты?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации розничной сети часто возникает задача оперативной передачи небольших объемов данных из торговых точек в центральную базу. Рассмотрим классический сценарий: имеется множество точек с конфигурацией 1С:Розница и центральный офис с базой 1С:Бухгалтерия государственного учреждения (БГУ) редакции 1.0, работающей на обычных формах. Каждый день с каждой точки требуется передавать всего два числовых показателя: сумма выручки и сданная сумма.

Использовать для такой тривиальной задачи тяжеловесный типовой обмен (например, через планы обмена) нерационально — это создаст избыточную нагрузку на систему и усложнит поддержку. В этой статье мы подробно разберем, почему традиционные каналы обмена вроде FTP и электронной почты сегодня считаются устаревшими, и как реализовать современный, быстрый и безопасный обмен данными с использованием HTTP-сервисов и формата JSON.

Почему стоит отказаться от обмена через FTP и электронную почту?

Прежде чем перейти к программной реализации, проанализируем, почему старые методы передачи файлов уходят в прошлое:

  1. Проблемы безопасности FTP: Классический протокол FTP передает данные и учетные записи (логины и пароли) в открытом (незашифрованном) виде. Для обеспечения безопасности требуется настройка SFTP или FTPS, что в старых версиях платформы 1С часто вызывает технические сложности и требует привлечения внешних утилит.
  2. Коллизии при записи: При одновременной выгрузке файлов от десятков или сотен розничных точек на один FTP-сервер неизбежно возникают конфликты блокировки файлов. Это приводит к потере данных или сбоям в регламентных заданиях.
  3. Нестабильность электронной почты: Почтовый обмен сильно зависит от сторонних спам-фильтров, лимитов почтовых провайдеров на количество отправляемых писем и задержек в доставке. Парсинг структуры писем и вложений в 1С требует написания громоздкого кода, который сложно отлаживать.

Именно поэтому лучшим выбором является использование веб-технологий — HTTP-запросов, которые работают мгновенно, гарантируют доставку «здесь и сейчас» и легко масштабируются.

Развенчиваем миф: работают ли HTTP-сервисы на обычных формах?

Существует распространенное заблуждение среди разработчиков, что если конфигурация (например, БГУ 1.0) построена на обычных формах, то она не приспособлена для публикации в интернете и работы с веб-сервисами. Выясним причину этого заблуждения.

Обычные или управляемые формы определяют только интерфейс взаимодействия с пользователем. Механизмы интеграции, такие как Web-сервисы, HTTP-сервисы, а также объекты HTTPСоединение и HTTPЗапрос, работают исключительно на уровне платформы и сервера приложений. Визуальная оболочка конфигурации никак не влияет на способность 1С принимать и обрабатывать входящие веб-запросы. Единственное условие — использование современной версии платформы «1С:Предприятие 8.3».

Рассмотрим по шагам, как настроить и запрограммировать такой обмен.

Шаг 1. Создание и публикация HTTP-сервиса на стороне БГУ 1.0

Для того чтобы центральная база БГУ могла принимать данные от точек, мы настроим в ней собственный HTTP-сервис. Разберем этот процесс подробнее:

  1. Откройте конфигуратор БГУ 1.0 и перейдите в ветку общего дерева конфигурации Общие -> HTTP-сервисы.
  2. Добавьте новый HTTP-сервис (например, с именем ExchangeData) и укажите корневой URL (например, ExchangeData).
  3. Внутри сервиса создайте шаблон URL с именем v1 и шаблоном /v1/send.
  4. Для созданного шаблона добавьте метод 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.

Шаг 2. Настройка отправки данных из 1С:Розница

На стороне розничных точек нам нужно написать простую процедуру, которая будет собирать данные за текущий день, упаковывать их в формат 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-бота в качестве буфера

Серверы Telegram могут выступать в качестве бесплатного, отказоустойчивого и абсолютно безопасного посредника между базами 1С. Для этого центральный сервер БГУ не нужно открывать «наружу» — он сам будет делать исходящие запросы в Telegram для забора данных.

Проанализируем схему работы:

  1. Создается приватный Telegram-бот с помощью BotFather.
  2. В конце дня 1С:Розница отправляет POST-запрос к API Telegram, передавая текстовое сообщение формата: КодТочки;Выручка;Сдано в чат вашего бота.
  3. На стороне БГУ настраивается регламентное задание, которое раз в час обращается к Telegram API методом getUpdates, считывает накопившиеся сообщения, парсит их по разделителю ; и создает соответствующие документы в БГУ.

Этот подход гарантирует 100% безопасность центрального сервера, так как он осуществляет исключительно исходящие соединения.

Использование облачных таблиц как буфера (Яндекс Документы API)

Еще один элегантный и наглядный способ обмена микрообъемами данных — использование облачных таблиц (например, Яндекс Диск API или Google Sheets API).

Алгоритм действий следующий:

  1. Каждая точка «1С:Розница» отправляет простой HTTP-запрос к API облачного сервиса, добавляя новую строчку в общую таблицу со своими показателями (Идентификатор точки, Дата, Сумма выручки, Сданная сумма).
  2. Руководство компании или главный бухгалтер могут в любой момент открыть эту таблицу с телефона или компьютера в браузере и увидеть оперативную сводку, не заходя в 1С.
  3. БГУ по регламенту раз в день считывает строки из этой же облачной таблицы, загружает новые записи к себе и помечает их в таблице как «обработанные».

Таким образом, мы детально разобрали, как решить задачу обмена микрообъемами данных современными методами. Отказ от устаревших файловых схем на базе FTP в пользу легких HTTP-сервисов и JSON позволит вам создать надежную, быструю и безопасную систему передачи данных, которая практически не требует администрирования.

← На главную