При интеграции 1С с различным оборудованием — например, GPS-трекерами, терминалами или промышленными датчиками по протоколу TCP/IP — часто возникает задача передачи бинарных пакетов. Разберем по шагам, как правильно сформировать байтовый пакет в 1С и передать его через внешние компоненты (такие как WinSocket) или обработать средствами платформы.
Если требуется быстро передать одиночный байт или символьную строку без нулевых байтов, можно воспользоваться встроенной функцией 1С Символ().
Проанализируем пример передачи байта со значением 0x01 через ActiveX-компонент WinSocket:
// Передача байта с кодом 1 (0x01)
WinSocket.SendData(Символ(1));
Важное ограничение метода: передать этим способом нулевой байт (0x00) не получится. В языке 1С и COM-интерфейсах Windows символ с кодом 0 воспринимается как признак конца строки (null-terminator). Если в формируемом пакете содержится байт 0x00, строка будет автоматически обрезана, и отправятся только данные до первого нулевого байта.
Чтобы избежать искажения данных и уверенно передавать пакеты любой структуры (включая нулевые байты), компонент 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(Пакет);
В современных версиях платформы 1С:Предприятие для работы с бинарными потоками предусмотрены специальные объекты: ПотокВПамяти, ЗаписьДанных и БуферДвоичныхДанных. Разберем, как сгенерировать объект ДвоичныеДанные в памяти:
ПотокВПамяти.ЗаписьДанных для работы с этим потоком.ЗаписатьБайт().ДвоичныеДанные.Посмотрим на пример реализации:
Поток = Новый ПотокВПамяти;
Запись = Новый ЗаписьДанных(Поток);
// Последовательная запись байтов
Запись.ЗаписатьБайт(1);
Запись.ЗаписатьБайт(0);
Запись.ЗаписатьБайт(3);
// Получаем объект ДвоичныеДанные
ДвоичныйПакет = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Выясним преимущества такого подхода: объекты типа ДвоичныеДанные и БуферДвоичныхДанных удобно использовать для сохранения в файлы, передачи в HTTP-запросах или интеграции с современными внешними компонентами Native API.