Как сформировать и передать двоичные данные через сокет в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с различным оборудованием — например, GPS-трекерами, терминалами или промышленными датчиками по протоколу TCP/IP — часто возникает задача передачи бинарных пакетов. Разберем по шагам, как правильно сформировать байтовый пакет в 1С и передать его через внешние компоненты (такие как WinSocket) или обработать средствами платформы.

Способ 1. Использование функции Символ() для передачи байтов и его ограничения

Если требуется быстро передать одиночный байт или символьную строку без нулевых байтов, можно воспользоваться встроенной функцией 1С Символ().

Проанализируем пример передачи байта со значением 0x01 через ActiveX-компонент WinSocket:


// Передача байта с кодом 1 (0x01)
WinSocket.SendData(Символ(1));

Важное ограничение метода: передать этим способом нулевой байт (0x00) не получится. В языке 1С и COM-интерфейсах Windows символ с кодом 0 воспринимается как признак конца строки (null-terminator). Если в формируемом пакете содержится байт 0x00, строка будет автоматически обрезана, и отправятся только данные до первого нулевого байта.

Способ 2. Корректная передача произвольных байтовых пакетов через COMSafeArray

Чтобы избежать искажения данных и уверенно передавать пакеты любой структуры (включая нулевые байты), компонент WinSocket в методе SendData принимает массивы типа VT_UI1 (Unsigned 1-byte Integer).

Рассмотрим, как сформировать такой массив с помощью объекта COMSafeArray:


// Создаем SafeArray из 1 элемента с типом байт (VT_UI1)
МассивБайт = Новый COMSafeArray("VT_UI1", 1);

// Записываем нужный байт по индексу 0 (например, значение 1)
МассивБайт.Установить(0, 1);

// Отправляем сформированный двоичный пакет
WinSocket.SendData(МассивБайт);

Если требуется передать пакет из нескольких байтов, достаточно указать соответствующий размер массива и заполнить его по индексам:


// Создание пакета из 3 байт
Пакет = Новый COMSafeArray("VT_UI1", 3);
Пакет.Установить(0, 1);   // 0x01
Пакет.Установить(1, 0);   // 0x00 (корректно передастся)
Пакет.Установить(2, 255); // 0xFF

WinSocket.SendData(Пакет);

Способ 3. Формирование двоичных данных средствами 1С (платформа 8.3.10 и выше)

В современных версиях платформы 1С:Предприятие для работы с бинарными потоками предусмотрены специальные объекты: ПотокВПамяти, ЗаписьДанных и БуферДвоичныхДанных. Разберем, как сгенерировать объект ДвоичныеДанные в памяти:

  1. Создаем объект ПотокВПамяти.
  2. Инициализируем ЗаписьДанных для работы с этим потоком.
  3. Последовательно записываем байты с помощью метода ЗаписатьБайт().
  4. Закрываем поток и получаем итоговый объект ДвоичныеДанные.

Посмотрим на пример реализации:


Поток = Новый ПотокВПамяти;
Запись = Новый ЗаписьДанных(Поток);

// Последовательная запись байтов
Запись.ЗаписатьБайт(1);
Запись.ЗаписатьБайт(0);
Запись.ЗаписатьБайт(3);

// Получаем объект ДвоичныеДанные
ДвоичныйПакет = Поток.ЗакрытьИПолучитьДвоичныеДанные();

Выясним преимущества такого подхода: объекты типа ДвоичныеДанные и БуферДвоичныхДанных удобно использовать для сохранения в файлы, передачи в HTTP-запросах или интеграции с современными внешними компонентами Native API.

← На главную