При подготовке доклада на конференцию infostart teach event 2025 возникла идея сделать аналог оператора Выполнить под WEB клиент и мобильный клиент через создание внешней подключаемой обработки. На этом сайте представлен яркий пример упаковки обработок, расширения, конфигурация на функционале платформы 8.3.9 и новее: Yellow Packer и Распаковщик. Однако, работа с двоичными данными возможна и на более ранних версиях 1С, но для этого нужна функция Преобразовать64 , которая преобразует строку base64 в массив байтов и обратно из массива байт в base64. Пользуясь случаем, выражаю благодарность автору за её реализацию.
Данная библиотека представляет собой универсальный слой совместимости (Compatibility Layer), который реализует на уровне встроенного языка функции для работы с двоичными данными. Её ключевая цель — предоставить единый API (программный интерфейс) для абсолютно всех платформ 1С 8.x, включая версии 8.0.5 – 8.3.8, мобильные клиенты (КПК), а также конфигурации, работающие в режиме совместимости, где нативные объекты недоступны.
Ядро библиотеки основано на работе через массив байт. Вся логика построена на базовом типе Массив, где каждый элемент — число от 0 до 255 (байт). Это позволяет:
-
Обойти отсутствие в старых версиях объектов
Поток,БуферДвоичныхДанных,ХешированиеДанных. -
Не зависеть от режима совместимости и типа клиента (толстый/тонкий/веб/мобильный).
-
Иметь одну кодовую базу для гетерогенных сред (например, сервер 8.3.12 и клиенты на КПК с 8.2).
Отличие библиотеки от платформы приведено в виде следующей таблицы:
| Особенности | Библиотека | Платформа 8.3.9+ |
|---|---|---|
| Работа с файлами | Читает файл всегда целиком в память. | Позволяет читать файл порциями (блоками), снижая потребление памяти. За счёт потоковой работы с диском технически ничем не ограничена (файлы в сотни ГБ). |
| Ограничения на размер | Ограничена оперативной памятью и предельным размером массива (2^31). | Технически не ограничена (работа с диском). |
| Использование компонент | Не используются внешние компоненты. | Встроенные оптимизированные механизмы. |
| Требования / Совместимость | Достаточно платформы 1С 8.0.5 (использует XMLСтрока/XMLЗначение). Не зависит от режима совместимости. | Требует платформы 8.3.9+ и соответствующего режима совместимости. |
| Типы клиентов | Работает на всех клиентах, кроме клиентской части WEB. | Аналогичные ограничения со стороны WEB-клиента. |
| Основное преимущество | Универсальность: один код для всех версий 1С 8.x и мобильных платформ. Оптимальный выбор для внешних обработок, старых конфигураций, и файлов не более 10-100 МБ. | Производительность и работа с большими данными. Оптимальный выбор для современных конфигураций без ограничений. |
Прямое применение библиотеки:
-
Старые версии (1С 8.0–8.3.8) и мобильные клиенты/приложения и КПК, где нет современных методов работы с данными.
-
Конфигурации со старым режимом совместимости (например, УПП).
-
Разработчики внешних обработок, которым нужен один код для всех клиентов для версии 1С 8.х
-
Унифицированный подход работы с небольшими файлами на 1С 8.х
Справочник функций библиотеки применительно к функциям платформы:
1. Базовые преобразования (используют XMLСтрока/XMLЗначение)
| Функция | Назначение и применение | Ключевая особенность / Аналог в 1С 8.3.9+ |
|---|---|---|
| ДвоичныеДанныеИзМассива (МассивБайт) |
Создаёт объект ДвоичныеДанные из массива байт. Мост для записи результата в файл или сохранения в базе. |
Особенность: Использует XMLЗначение, совместима с 1С 8.0.5.Аналог: Новый ДвоичныеДанные(БуферДвоичныхДанных) |
| МассивИзДвоичныхДанных (Данные) |
Извлекает массив байт из объекта ДвоичныеДанные. Первый шаг для разбора любого файла, загруженного в систему. |
Особенность: Использует XMLСтрока.Аналог: Буфер = ДвДанные.ПолучитьБуферДвоичныхДанных() |
| МассивИзФайла (ИмяФайла) |
Вспомогательная функция. Читает файл целиком в массив байт. | Особенность: Упрощает начало работы. Аналог: ДвДанные = Новый ДвоичныеДанные(ИмяФайла) |
2. Низкоуровневый парсинг и сборка (аналог Потока)
| Функция | Назначение и применение | Пример / Аналог в 1С 8.3.9+ |
|---|---|---|
| ПрочитатьЦелое8/16/32/64ИзМассива и ПрочитатьЦелоеИзМассива (Массив, Позиция, ...) |
Чтение чисел из бинарной структуры. Основа для разбора заголовков файлов (BMP, PNG), сетевых пакетов, пользовательских форматов. | Пример: Ширина = ПрочитатьЦелое32ИзМассива(ДанныеФайла, 18);Аналог: Число = Поток.Прочитать(Целое32); |
| ЗаписатьЦелое8/16/32/64ВМассив и ЗаписатьЦелоеВМассив (Массив, Позиция, ...) |
Запись чисел в бинарную структуру. Основа для сборки данных для отправки внешнему оборудованию или генерации файлов. | Пример: ЗаписатьЦелое16ВМассив(Буфер, 0, 1024, "BigEndian");Аналог: Поток.Записать(Значение, Целое16); |
| ЗаписатьМассивВМассив (Целевой, Исходный, Позиция) |
Копирование блоков данных. Аналог записи в буфер. Используется для сборки итогового файла из фрагментов. | Аналог: Работа с областями БуфераДвоичныхДанных. |
3. Преобразования данных и кодировок
Функция |
Назначение и применение | Пример / Особенности |
|---|---|---|
| ПолучитьМассивБайтовИзСтроки (Строка, Кодировка="UTF8") |
Преобразует строку в байты. Критична для формирования текстовых полей в бинарных протоколах. | Пример: ИмяВUTF16 = ПолучитьМассивБайтовИзСтроки("Привет", "UTF16");Аналог: Использование ЗаписьТекста в поток с указанием кодировки. |
| ПолучитьСтрокуИзМассиваБайтов (Массив, Кодировка="UTF8") |
Декодирует байты в строку. Необходима для чтения текста из бинарных файлов. | Пример: Текст = ПолучитьСтрокуИзМассивБайтов(ПрочитанныеБайты, "UTF8"); |
| ПолучитьМассивИзHexСтроки (HexСтрока) |
Конвертирует строку шестнадцатеричных символов (HEX) в массив байт. | Особенность: Не имеет прямого аналога в платформе. Пример: Массив = ПолучитьМассивИзHexСтроки("A1FF2B"); |
| ПолучитьHexСтрокуИзМассивБайтов (МассивБайтов) |
Конвертирует массив байт в строку HEX-символов. Незаменима для отладки (дамп данных). | Пример: Дамп = ПолучитьHexСтрокуИзМассивБайтов(Данные); // "A1FF2B..." |
Практический пример: чтение ширины и высоты из BMP на всех версиях 1С 8.х с помощью библиотеки:
// Универсальная функция, работающая на всех версиях 1С 8.x
Процедура ПрочитатьРазмерыBMP(ПутьКФайлу)
// 1. Универсальное чтение файла в массив байт
ДанныеФайла = МассивИзФайла(ПутьКФайлу);
// 2. Проверка сигнатуры "BM"
Если Не (ДанныеФайла[0] = 66 И ДанныеФайла[1] = 77) Тогда // "B" и "M"
ВызватьИсключение "Это не BMP-файл";
КонецЕсли;
// 3. Чтение ширины и высоты из заголовка (смещения 18 и 22)
Ширина = ПрочитатьЦелое32ИзМассива(ДанныеФайла, 18);
Высота = ПрочитатьЦелое32ИзМассива(ДанныеФайла, 22);
Сообщить("Размер изображения: " + Ширина + " x " + Высота + " пикселей");
КонецПроцедуры
Аналог на 1С 8.3.9+ - используя возможности платформы:
// Работает ТОЛЬКО на платформе 8.3.9+ в подходящем режиме совместимости
Процедура ПрочитатьРазмерыBMP_Платформа(ПутьКФайлу)
Поток = Новый ПотокВФайле(ПутьКФайлу, РежимОткрытияФайла.Чтение);
// Чтение заголовка
Поток.Пропустить(2); // Пропускаем сигнатуру "BM"
Поток.Пропустить(12); // Пропускаем размер файла и зарезервированные поля
СмещениеДанных = Поток.Прочитать(Целое32);
РазмерЗаголовка = Поток.Прочитать(Целое32);
Ширина = Поток.Прочитать(Целое32);
Высота = Поток.Прочитать(Целое32);
Сообщить("Размер изображения: " + Ширина + " x " + Высота + " пикселей");
Поток.Закрыть();
КонецПроцедуры
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.309
- Управление торговлей, редакция 10.3, релизы 10.3.88.3
Вступайте в нашу телеграмм-группу Инфостарт
