Младшее поле 52 и старшее 18 объединяем в 16-битное число 4660. Сдвиги и маски разделяют поля без строковых преобразований.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Весь пример выполняется на числах, строках и двоичных данных, созданных в памяти. Реальные файлы, API и объекты базы не нужны.
МладшееПоле = 52;
СтаршееПоле = 18;
Если МладшееПоле < 0 Или МладшееПоле > 255 Или МладшееПоле <> Цел(МладшееПоле)
Или СтаршееПоле < 0 Или СтаршееПоле > 255 Или СтаршееПоле <> Цел(СтаршееПоле) Тогда
ВызватьИсключение "Учебные поля должны быть целыми числами 0..255";
КонецЕсли;
Упаковано = ПобитовоеИли(МладшееПоле, ПобитовыйСдвигВлево(СтаршееПоле, 8));
Первое = ПобитовоеИ(Упаковано, 255);
Второе = ПобитовоеИ(ПобитовыйСдвигВправо(Упаковано, 8), 255);
Если Упаковано <> 4660 Или Первое <> 52 Или Второе <> 18 Тогда
ВызватьИсключение "Нарушена упаковка двух учебных полей";
КонецЕсли;
Сообщить(СтрШаблон("Число %1; младшее %2; старшее %3", Упаковано, Первое, Второе));Разбор по шагам
Каждое поле проверяем как целое 0…255, иначе оно не помещается в 8 бит.
Сдвиг старшего поля на 8 бит освобождает младший байт; Или объединяет непересекающиеся области.
Маска 255 оставляет только восемь младших битов. Для старшего поля сначала сдвигаем число вправо.
Это порядок разрядов в числе. При записи в двоичный поток порядок байтов нужно задать отдельно.
Как проверить результат
Результат: число 4660, младшее поле 52, старшее 18.
Замените любое поле на 256 или 1.5: исключение возникает до упаковки.
Для другого допустимого набора сначала обновите ожидаемые значения в проверке, затем сравните распакованные поля с исходными.
Ожидаемый результат
Два фиксированных 8-битных поля объединены и восстановлены без потери значений.
На что обратить внимание
ПобитовыйСдвигВправо заполняет освободившиеся старшие разряды нулями; это не деление дробного значения.
Числовая упаковка не определяет сетевой протокол и endian-порядок сериализованных байтов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.