Работа с двоичными данными в 1С 8.2 и 8.3

 

Начиная с версии технологической платформы 8.3.9 средства для работы с двоичными данными претерпели существенные изменения. В этой статье я постараюсь рассказать как о старых, так и о новых инструментах для работы с двоичными данными. При написании статьи использовалась версия технологической платформы 8.3.12

Общая информация

Если раньше, до версии технологической платформы 8.3.9, мы располагали только объектом ДвоичныеДанные, то к настоящему времени у нас имеется целый набор объектов, которые серьезно расширяют наши возможности по манипуляциям с двоичными данными. Рассмотрим все эти объекты чуточку подробнее.

Двоичные данные

Экземпляры объекта ДвоичныеДанные содержат двоичные данные, которые считываются из файла. При это объект ДвоичныеДанные является достаточно многофункциональным — мы можем:

  • читать двоичные данные из файла и записывать их в файл;
  • передавать их между клиентом и сервером при помощи временного хранилища;
  • передавать и получать их по сети;
  • хранить их базе данных в реквизитах вида ХранилищеЗначения;
  • превратить двоичные данные в объект вида Картинка (при определенных условиях конечно);
  • хранить двоичные данные в макетах;
  • шифровать и расшифровывать, подписывать и проверять подписи;

Наверняка я что-то пропустил, но главное должно быть понятно — несмотря на значительное развитие средств работы с двоичными данными, объект ДвоичныеДанные остается ключевым.

Потоки

Это группа объектов назначение которых заключается в работе с потоками данных.

Поток — этот объект представляет собой поток данных из которого можно читать и/или записывать в него данные. Данный объект не имеет конструктора, а получить экземпляр объекта можно при помощи различных методов других объектов.

ФайловыйПоток — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в файлах на диске.

ПотокВПамяти — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в оперативной памяти.

МенеджерФайловыхПотоков — этот объект предоставляет типовые методы для работы с файлами (открытие и создание). Создать экземпляр этого объекта нельзя — имеется объект глобального контекста ФайловыеПотоки который и предоставляет доступ к методам менеджера.

Чтение и запись

ЧтениеДанных — этот объект предназначен для чтения различных типов данных из различных источников (потоки, файлы, двоичные данные).

РезультатЧтенияДанных — этот объект содержит описание результата чтения данных из потока. Объект не имеет конструктора, получить экземпляр объекта можно при помощи методов других объектов.

БуферДвоичныхДанных — этот объект представляет собой коллекцию байтов фиксированного размера, имеется возможность произвольного доступа и изменения по месту.

ЗаписьДанных — этот объект предназначен для записи различных типов данных в приемник.

 

Практическая часть

Итак, у нас достаточно много различных объектов, которые, в свою очередь, имеют много разных свойств и методов. Разобраться во всем этом более подробно помогут практические примеры, к ним и перейдем.

Многие объекты — ДвоичныеДанные, Поток, ФайловыйПоток, ПотокВПамяти, ЧтениеДанных, ЗаписьДанных, РезультатЧтенияДанных имеют пары синхронных и асинхронных методов, например: Записать — НачатьЗапись, Закрыть — НачатьЗакрытие. Асинхронные методы нужны для обеспечения возможности одинаковой работы и в тонком клиенте, и в веб-клиенте.

Подробнее про синхронные и асинхронные методы можно прочесть в этой статье.

Двоичные данные

Ниже приведены примеры основных операций с объектом ДвоичныеДанные.

Потоки

В начале создадим файловый поток из PNG-файла и прочитаем первые 8 байт — они у изображений в формате PNG всегда такие: 137,80,78,71,13,10,26,10. При создании объекта ЧтениеДанных указан порядок байтов — BigEndian, подробнее об этом можно прочесть тут.

Заголовок PNG-файла
Заголовок PNG-файла

Теперь попробуем отправить составное (multipart) HTTP-сообщение. У меня на сервере есть PHP-скрипт вот такого содержания:

Отошлем ему две картинки из библиотеки картинок и посмотрим, что получится:

Полезные ссылки: о работе с HTTP в 1Со составных HTTP-сообщениях.

Результат:

Передача составного HTTP-сообщения
Передача составного HTTP-сообщения

На этом все, надеюсь, что эта статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Оценка статьи:
УжасноПлохоНеплохоХорошоОтлично (оценок: 14, средняя оценка: 3,71 из 5)
Загрузка...

Понравилась статья? Поделиться с друзьями:
Комментарии: 9
  1. Евгений

    нихрена не понял. :(
    как из входящих писем вытащить вложения и прикрепить их как файлы к внутр.доку-ту в 1С документообороте???
    уже неделю зависаю. :sad:

    Email = Новый ИнтернетПочта;
    Email.Подключиться(Профиль,ПротоколИнтернетПочты.IMAP);

    МассивВходящихПисем = Новый Массив;
    МассивВходящихПисем = Email.Выбрать(Ложь,,Ложь);

    Для каждого Письмо Из МассивВходящихПисем Цикл
    Если СтрНайти(Письмо.Тема,»Заявка на доработку ИС»)>0 Тогда
    Сообщить(«Нашлось письмо по Заявке на доработку ИС»);

    Заявка = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
    Заявка.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию(«Заявка на доработку ИС»);
    Заявка.ДатаСоздания = ТекущаяДата();
    ШаблоныДокументов.ЗаполнитьРеквизитыДокументаПоШаблону(
    Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию(«Заявка на доработку ИС»),Заявка);
    Заявка.Содержание = Письмо.Тексты[0].Текст;
    Заявка.Подготовил = Заявка.Ответственный;
    Заявка.Записать();

    что дальге надо писать??? прикрепленные файлы находятся в Письмо.Вложения[].Данные (это и есть двлич.данные)….как из них получить файл и потом прикрутить к Заявке?

    вот это вот не работает:
    ВложенияВоВременномХранилище = РаботаСПочтовымиСообщениямиСлужебный.ОписанияВложений(Письмо);
    РаботаСФайламиСлужебныйВызовСервера.УстановитьВладельцаФайла(ВложенияВоВременномХранилище,Заявка);

    1. esqado

      Была похожая задачка.
      Проверял входящие по отправителю, выдёргивал вложения и складывал в директорию.
      Потом пробегал по файлам (excel), через табдок считывал внутренности и записывал в бд.
      В твоём случае, в объекте письмо должно находиться вложение.
      Это вложение нужно записать как файл (временный файл) и прочитать через двоичные данные.

      1. esqado

        И ещё: для вложений лучше использовать отдельный справочник, а в документе оставлять ссылку (адрес) на элемент справочника.
        Таким образом ты немного облегчишь документ. Удачи!

  2. Игорь

    Ну наверно так считать
    ИмяВременногоФайла = КаталогВременныхФайлов()+»Вложение.bin»;
    Письмо.Вложения[0].Данные.Записать(ИмяВременногоФайла);
    а уж как прикрутить, то во «внутреннем документе» наверно есть какое-то поле, куда его можно загрузить

    1. Илья

      Это плохой метод через каталог. Ошибки совместного доступа к файлам не миновать частым

  3. Игорь

    Как взять поток с COM порта?

    1. esqado

      Получить объект порта и слушать, что там происходит.

  4. esqado

    Не могу понять, как превратить картинку в двоичные данные без файла?
    У меня картинка генерится в самой эске и не вижу смысла использовать промежуточный файл, чтобы получить двоичные данные.
    Картинка — qrcode. После генерации вставляю в область для qrкода.

    1. esqado

      Глупость делал. Не надо ничего превращать.
      Нужно просто использовать картинку как есть.
      В моём случае — вставить в реквизит табличного документа.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: