Двоичные данные в 1С 8.3

Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер)

Как было раньше

Ранее 1С предоставляла для работы с двоичными данными одноименный тип и некоторые методы работы с файлами. Думаю, многим известна ситуация, когда для отправки файла в формате multipart/form-data использовался метод «ОбъединитьФайлы». Это было связано  с отсутствием методов по работе  с внутренним содержимым двоичных данных.

Что такое двоичные данные и как с ними можно работать в 1С 8

Двоичные данные (или бинарные) — это файл данных произвольного формата.

Платформа 1С (8.3 и 8.2) в общем случае понятия не имеет, что это. Предполагается, что программист или пользователь знает, какие именно это данные и как их применять. Тем не менее, если в двоичные данные загружен графический файл, формат которого понимает объект типа «Картинка», то при инициализации картинки такими двоичными данными картинка будет нормально показана, а её свойство «Формат» примет правильное значение.

Платформа 1С при работе с двоичными данными может:

  • Хранить в базе данных в реквизитах типа «ХранилищеЗначения», в справочниках, документах, регистрах сведений.
  • Читать их из файла и записывать в файл.
  • Передавать их между сервером и клиентом через временное хранилище.
  • Инициализировать ими объект типа «Картинка».
  • Закодировать и раскодировать в/из строковое представление Base64.
  • Хранить в объектах конфигурации в качестве Макета.
  • Читать двоичные данные из сети при помощи объектов типа «HTTPСоединение» (объект «HTTPОтвет» можно получить в том числе в виде двоичных данных), «ПочтовоеВложение», «ИнтернетПочтовоеВложение».
  • Зашифровать, расшифровать, подписать и проверить подпись средствами криптографии.
  • Вычислить хеш-функцию с помощью объекта типа «ХешированиеДанных»

Возможно, я еще что-то упустил, однако интуитивно ясно, что практически все, что надо для работы с двоичными данными в 1С, у нас есть. Рассмотрим теперь по порядку несколько конкретных примеров работы с двоичными данными на платформе 1С 8.3.

Чтение и запись двоичных данных в файл

Основной тип объектов двоичных данных платформы 1С так и называется: «ДвоичныеДанные». Вот что говорит о нем «Синтаксис-помощник»:

Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.

Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы.

Чтение двоичных данных из файла

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Тип «Двоичные данные» имеет единственный конструктор:

дд = Новый ДвоичныеДанные(имяФайла);

имяФайла — обязательный аргумент.

В итоге получаем программный объект двоичных данных, прочитанный из файла.

Запись двоичных данных в файл

дд.Записать(имяФайла);

Определение размера двоичных данных в байтах

квоБайт = дд.Размер();

Сохранение двоичных данных в реквизит объекта

Рассмотрим сразу запись двоичных данных из файла на клиенте в реквизит объекта базы данных типа ХранилищеЗначения. Причем напишем такой код, который сработает и на веб-клиенте, а также будет лишен модальных вызовов, то есть таких вызовов, которые ожидают действия пользователя и останавливают при этом исполнение программы. Теперь платформа 1С 8.3 требует разрабатывать асинхронные программы.

Выглядит это примерно так: создается обработчик оповещения о выполнении некоторой длительной процедуры, затем запускается процедура «НачатьХХХ()», в которую, кроме понятных аргументов, передается еще и описание обработчика ее завершения. Наша программа спокойно работает далее, а по завершении запущенной процедуры вызывается наш обработчик завершения.

Предположим, у нас на форме есть реквизит типа «СправочникСсылка.Картинки». Справочник «Картинки» имеет реквизит «ДанныеКартинки» типа ХранилищеЗначения.

Создадим команду формы «ЗагрузитьКартинкуИзФайла».

Создадим обработчик команды, выделив команду в списке команд формы и нажав на кнопку с увеличительным стеклом в поле «Действие» панели свойств:

создание обработчика команды

Поскольку все необходимые параметры для записи картинки мы можем передать изнутри клиентской части обработчика, нам нет нужды создавать контекстную серверную процедуру на сервере. Выберем «Создать на клиенте и процедуру на сервере без контекста»:

на сервере без контекста

Вначале напишем наши обработчики команды в старом, «модальном» или «синхронном» стиле:

&НаСервереБезКонтекстаПроцедура ЗагрузитьКартинкуИзФайлаНаСервере(стрАдрес, спрКартинка)объКартинка = спрКартинка.ПолучитьОбъект();объКартинка.Картинка = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(стрАдрес));объКартинка.Записать();КонецПроцедуры&НаКлиентеПроцедура ЗагрузитьКартинкуИзФайла(Команда)адресДанных = “”;Если ЗначениеЗаполнено(Картинка) ТогдаЕсли ПоместитьФайл(адресДанных, ИмяФайлаКартинки, ИмяФайлаКартинки, Истина, УникальныйИдентификатор) ТогдаЗагрузитьКартинкуИзФайлаНаСервере(адресДанных, Картинка);КонецЕсли; // ПоместитьФайл((Новый ДвоичныеДанные(ИмяФайлаКартинки))КонецЕсли; // ЗначениеЗаполнено(Картинка)КонецПроцедуры

В моей небольшой тестовой конфигурации этот код отлично сработал в режиме тонкого клиента. Теперь преобразуем модальный вызов «ПоместитьФайл» в асинхронный, он же немодальный. В меню конфигуратора запустим команду меню «Текст >Рефакторинг >Нерекомендуемые синхронные вызовы >Преобразовать вызовы модуля». Нам в ответ сообщат, что «Не рекомендуемых синхронных вызовов преобразовано: 1».

Для компактности я удалил все пустые строки, и вот что получилось вместо клиентской части нашего обработчика:

&НаКлиентеПроцедура ЗагрузитьКартинкуИзФайла(Команда)адресДанных = “”;Если ЗначениеЗаполнено(Картинка) ТогдаНачатьПомещениеФайла(Новый ОписаниеОповещения(“ЗагрузитьКартинкуИзФайлаЗавершение”, ЭтаФорма, Новый Структура(“адресДанных”, адресДанных)), адресДанных, ИмяФайлаКартинки,, Истина, УникальныйИдентификатор);КонецЕсли; // ЗначениеЗаполнено(Картинка)КонецПроцедуры&НаКлиентеПроцедура ЗагрузитьКартинкуИзФайлаЗавершение(Результат, Адрес, ИмяФайлаКартинки, ДополнительныеПараметры) ЭкспортадресДанных = ДополнительныеПараметры.адресДанных;Если Результат ТогдаЗагрузитьКартинкуИзФайлаНаСервере(адресДанных, Картинка);КонецЕсли; // ПоместитьФайл((Новый ДвоичныеДанные(ИмяФайлаКартинки))КонецПроцедуры

Готово! Мы кошерно асинхронно записали картинку из файла на клиенте в реквизит объекта базы данных, в нашем случае — элемента справочника.

Работа с файлами и картинками во встроенном языке 1С:Предприятия 8

Назначение

В управляемом приложении реализован новый механизм работы с файлами. Он обеспечивает обмен файлами между информационной базой и клиентским приложением. Особенностью данного механизма является то, что он ориентирован на использование в тонком клиенте и Веб-клиенте и разработан с учетом ограничений на работу с файлами, накладываемыми веб-браузерами.

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

Область действия методов

Временное хранилище

Временное хранилище — это специализированная область информационной базы, в которую могут быть помещены двоичные данные. Основное назначение – это временное хранение информации при клиент-серверном взаимодействии до ее переноса в базу данных.

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

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

Файл или двоичные данные, помещенные в хранилище, идентифицируются уникальным адресом, который в дальнейшем можно использовать в операциях записи, чтения или удаления. Этот адрес выдают методы записи файла во временное хранилище. Отдельный метод во встроенном языке позволяет определить, является ли переданный адрес адресом, указывающим на данные во временном хранилище.

Информационная база

Механизм позволяет получить доступ к двоичным данным, хранящимся в реквизитах типа ХранилищеЗначений.

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

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

Описание методов работы с файлами

Сохранение данных во временное хранилище

Наиболее типичный сценарий использования данного механизма предусматривает первоначальное размещение данных пользователя во временное хранилище. Для этого предназначены два метода: ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище().

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

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

Как результат метод возвращает Ложь, если пользователь в интерактивном режиме отказался от совершения операции в диалоге выбора файла. Метод доступен только на клиенте.

Второй метод, ПоместитьФайлВоВременноеХранилище(), схож с предыдущим, за исключением того, что он доступен на сервере, а данные для записи во временное хранилище представляются не в виде пути в файловой системе, а в виде переменной типа ДвоичныеДанные. Точно так же, если не указан целевой адрес, создается новый файл в хранилище. Его адрес возвращается как результат функции.

Получение файла из временного хранилища

При записи объекта в информационную базу может понадобиться извлечь данные из временного хранилища и поместить их, например, в реквизит. Для этого есть соответствующий серверный метод — ПолучитьФайлИзВременногоХранилища(). Этот метод извлекает данные из временного хранилища и возвращает их как результат. Для этого необходимо указать адрес во временном хранилище. Этот адрес возвращают вышеописанные методы ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище() в случае их успешного выполнения.

Удаление файла из временного хранилища

После того, как данные сохранены в реквизите, файл во временном хранилище можно удалить. Для этого есть метод УдалитьФайлИзВременногоХранилища(), который удаляет файл из временного хранилища. Метод принимает в параметре адрес файла во временном хранилище. Доступен на сервере.

Проверка адреса на принадлежность временному хранилищу

Адрес файла может указывать как на временное хранилище, так и на реквизит в информационной базе. Для проверки его типа существует метод ЭтоАдресВременногоХранилища().

Он проверяет, что переданный адрес является адресом, указывающим на хранилище. Возвращает Истина, если адрес указывает на временное хранилище. Метод доступен на сервере.

Получение адреса реквизита

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

Но прежде чем получить данные, например из реквизита, необходимо получить адрес этого реквизита. Для этого существует метод ПолучитьАдресФайлаВИнформационнойБазе().

Его назначение – вернуть адрес файла в информационной базе по исходным параметрам. Для этого необходимо передать ключ объекта (это может быть как ссылка на объект, так и ключ записи регистра сведений) и имя реквизита. Если нужно получить адрес файла, хранимого в реквизите табличной части, до имени реквизита в параметре, задающем имя реквизита, необходимо добавить имя табличной части и точку «.». Метод доступен как на клиенте, так и на сервере.

Получение файла из информационной базы

Метод ПолучитьФайл() получает файл из информационной базы и сохраняет его в локальную файловую систему пользователя. Первый параметр определяет адрес файла в реквизите или во временном хранилище файлов. Второй параметр определяет целевое расположение полученного файла. В не интерактивном режиме необходимо указать путь. В интерактивном режиме параметр является опциональным.

По умолчанию метод исполняется в интерактивном режиме, то есть последний параметр равен Истина. Это значит, что выдается диалоговое окно, в котором можно указать действие с полученным файлом: запустить его или сохранить по указанному пользователем расположению. Если активен интерактивный режим, а параметр Целевой путь к файлу на диске не указан, то операция открытия файла не доступна. Возвращает булевское значение. Ложь означает, что пользователь выбрал отмену операции в диалоговом окне сохранения файлов в интерактивном режиме.

Пример использования файловых методов

<source lang=1c>// Получение в интерактивном режиме файла с диска// и помещение его во временное хранилище&НаКлиентеПроцедура ВыбратьФайлСДискаИЗаписать()

Перем ВыбранноеИмя; Перем АдресВременногоХранилища; Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, Истина) Тогда Объект.ИмяФайла = ВыбранноеИмя; ПоместитьФайлОбъекта(АдресВременногоХранилища); КонецЕсли;

КонецПроцедуры

// Копирование файла из временного хранилища в реквизит// справочника, запись объекта,удаление файла из временного// хранилища&НаСервереПроцедура ПоместитьФайлОбъекта(АдресВременногоХранилища)

ЭлементСправочника = РеквизитФормыВЗначение(“Объект”); ДвоичныеДанные = ПолучитьФайлИзВременногоХранилища(АдресВременногоХранилища); ЭлементСправочника.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные); ФайлПутьНаДиске = Новый Файл(ЭлементСправочника.ИмяФайла); ЭлементСправочника.ИмяФайла = ФайлПутьНаДиске.Имя; ЭлементСправочника.Записать(); Модифицированность = Ложь; УдалитьФайлИзВременногоХранилища(АдресВременногоХранилища); ЗначениеВРеквизитФормы(ЭлементСправочника, “Объект”);

КонецПроцедуры

// Считывание файла из реквизита и сохранение его// на локальном диске в интерактивном режиме&НаКлиентеПроцедура ПрочитатьФайлИСохранитьНаДиск()

Адрес = ПолучитьАдресФайлаВИнформационнойБазе(Объект.Ссылка, “ДанныеФайла”); ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);

КонецПроцедуры</source>

Поддержка адресов в поле картинки

Элемент управления Поле картинки поддерживает отображение картинки, заданной адресом файла во временном хранилище или в базе данных.

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

[Image]

Пример<source lang=1c>// Привязка поля картинки к адресу картинки во временном// хранилище. АдресКартинки реквизит формы строкового типа

ПоместитьФайл(АдресКартинки, ,Истина)

Картинка.Данные = АдресКартинки</source>

Ограничения при работе с Веб-клиентом

Работа описываемого механизма при использовании Веб-клиента имеет некоторые ограничения. Эти ограничения связаны с особенностями модели безопасности браузера. Так, например, клиент самостоятельно не может сохранить файл в локальную файловую систему, то есть доступен только интерактивный вариант клиентских методов ПоместитьФайл() и ПолучитьФайл(). При попытке использовать не интерактивный режим генерируется исключение. Диалоговые окна, отображаемые в интерактивном режиме, специфичны для конкретного типа браузера.

Побайтовые операции

Для анализа работы новых методов возьмем  за пример анализ параметров изображений для загрузки через API ВКонтакте.
Требования для загрузки фото в товар группы:

Допустимые форматы: JPG, PNG, GIF. 
Ограничения: минимальный размер фото — 200x200px, сумма высоты и ширины не более 14000px, файл объемом не более 50 МБ.
 

Нас будет интересовать формат файла, его разрешение и вес.

Внимание! Формат файла JPG не обрабатывается в обработке.

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

&НаКлиенте

Процедура РаботаСДвоичнымиДаннымиВ1С(Команда)

//создаем двоичные данные из файла

ДвоичныеДанные = Новый ДвоичныеДанные(“D:test.png”);

//получаем размер двоичных данных

Сообщить(“Размер файла: “+ДвоичныеДанные.Размер()+” байт”);

//кодируем двоичные данные в строку по алгоритму base64

СтрокаBase64 = Base64Строка(ДвоичныеДанные);

//и раскодируем обратно

ДвоичныеДанные = Base64Значение(СтрокаBase64);

Сообщить(СтрокаBase64);

//создаем картинку из двоичных данных

Картинка = Новый Картинка(ДвоичныеДанные);

//помещаем во временное хранилище и передаем адрес на сервер

ПолучитьДвоичныеДанныеНаСервере(ПоместитьВоВременноеХранилище(ДвоичныеДанные));

КонецПроцедуры

&НаСервере

Процедура ПолучитьДвоичныеДанныеНаСервере(Адрес)

//получаем двоичные данные из временного хранилища

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

//записываем двоичные данные в файл на сервере

ДвоичныеДанные.Записать(“D:serv-test.png”);

//помещаем двоичные данные в объект ХранилищеЗначения

Хранилище = Новый ХранилищеЗначения(ДвоичныеДанные);

КонецПроцедуры

Потоки

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

&НаКлиенте

Процедура РаботаСПотокамиВ1С(Команда)

//создадим фаловый поток

ФайловыйПоток = ФайловыеПотоки.ОткрытьДляЧтения(“D:test.png”);

//размер файла

Сообщить(“Размер файла: “+ФайловыйПоток.Размер()+” байт”);

//создадим необходимый объект для чтения данных из потока

ЧтениеДанных = Новый ЧтениеДанных(ФайловыйПоток, КодировкаТекста.ANSI, ПорядокБайтов.BigEndian);

//считаем первые восемь байт в буфер

Буфер = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(8);

//пройдемся по каждому байту буфера

Для Каждого Байт Из Буфер Цикл

Сообщить(Строка(Байт));

КонецЦикла;

//этот цикл делает тоже самое что и предыдущий

Для Номер = 0 По 7 Цикл

Сообщить(Строка(Буфер[Номер]));

КонецЦикла;

КонецПроцедуры

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

<?php

?>

echo $_FILES[‘image1’][‘name’].”n”;

echo $_FILES[‘image1’][‘size’].”n”;

echo $_FILES[‘image2’][‘name’].”n”;

echo $_FILES[‘image2’][‘size’];

?>

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

&НаКлиенте

Процедура Проверить3(Команда)

//подготавливаем вложенные сообщения

ДвоичныеДанные1 = ПодготовитьКартинку(“image1”, “image1.png”, БиблиотекаКартинок.АктивироватьЗадачу);

ДвоичныеДанные2 = ПодготовитьКартинку(“image2”, “image2.png”, БиблиотекаКартинок.АктивныеПользователи);

Разделитель = “boundary”;

//устанавливаем заголовки основного сообщения

Заголовки = Новый Соответствие();

Заголовки.Вставить(“Content-Type”, “multipart/form-data; boundary=” + Разделитель);

//формируем основное сообщение

ПотокВПамяти = Новый ПотокВПамяти();

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

ЗаписьДанных.ЗаписатьСтроку(“–“+Разделитель);

ЗаписьДанных.Записать(ДвоичныеДанные1);

ЗаписьДанных.ЗаписатьСтроку(“”);

ЗаписьДанных.ЗаписатьСтроку(“–“+Разделитель);

ЗаписьДанных.Записать(ДвоичныеДанные2);

ЗаписьДанных.ЗаписатьСтроку(“”);

ЗаписьДанных.ЗаписатьСтроку(“–” + Разделитель + “–“);

ЗаписьДанных.Закрыть();

ТелоЗапроса = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();

//отправляем данные скрипту

Соединение = Новый HTTPСоединение(“server.ru”,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос(“/script.php”, Заголовки);

Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Сообщить(Ответ.ПолучитьТелоКакСтроку());

КонецПроцедуры

&НаКлиенте

Функция ПодготовитьКартинку(Название, ИмяФайла, Картинка)

Поток = Новый ПотокВПамяти();

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

//устанавливаем заголовки

ЗаписьДанных.ЗаписатьСтроку(“Content-Disposition: form-data; name=” + Название + “; filename=” + ИмяФайла);

ЗаписьДанных.ЗаписатьСтроку(“Content-Type: image/png”);

ЗаписьДанных.ЗаписатьСтроку(“”);

ЗаписьДанных.Записать(Картинка.ПолучитьДвоичныеДанные());

ЗаписьДанных.Закрыть();

Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();

КонецФункции

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

Результат:

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

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

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

loading.gif

Загрузка…

Кодирование двоичных данных в формат Base64 и обратно

Тут все очень просто. Платформа имеет две глобальные функции, доступные везде:

  • Base64Строка(<Значение>)
  • Base64Значение(<Строка>)

Первая получает в качестве аргумента объект типа «ДвоичныеДанные», а возвращает его текстовое представление в кодировке base64, а вторая, наоборот, из текста в формате base64 возвращает объект типа «ДвоичныеДанные».

Не очень, правда, представляю, зачем нам это может понадобиться. Во всех встроенных типах объектов вроде ПочтовоеВложение или объектов для работы с XML необходимые преобразования платформа делает сама. Разве что нам потребуется работать с какими-то нестандартными форматами файлов для обмена с внешними системами…

Оптимизация вышеприведенного кода

Код, представленный на Рис.4, безусловно, работает, но с одной существенной оговоркой: если в свойствах конфигурации установлен флажок «Режим использования модальности» (Рис.10). В противном случае его использование вызовет ошибку. Рис.10

Для того, чтобы этого не происходило надо находясь в модуле формы элемента справочника, зайти в меню Текст->Рефакторинг->Нерекомендуемые синхронные вызовы->Преобразовать вызовы модуля.

По прошествии некоторого времени синхронные вызовы автоматически будут преобразованы в асинхронные, а код примет вид (Рис.11)

Рис.11

it-soprovogdenie-700x120.jpg
Джон фон Нейман

Оснащение для магазина с доставкой от компании Ru-Holod

Выбор оборудования зависит от цели его эксплуатации. В магазине оборудование для реализации продуктов питания, условия хранения которых требуют поддержания особой …

Проверка отчетности 6-НДФЛ и 2-НДФЛ в 1С ЗУП 3.1

Какие проверки необходимо произвести для успешной сдачи отчетов 6-НДФЛ и 2-НДФЛ и какие средства в 1С ЗУП 3.1 в этом …

Как сократить издержки в производственной компании малого бизнеса. Вебинар

18 февраля 2020 г. состоялся вебинар «Как сократить издержки в производственной компании малого бизнеса. Планирование, фактическая себестоимость, анализ в 1С:Управление …

Интервью с Сергеем Кукановым

На предприятии есть производство, но вы ещё не доросли до крупных систем управления? Тогда вполне можете попробовать обойтись решением 1С:Управление …

Годовая отчетность за 2019 г.: бухгалтерская и налоговая

Оформить заявку на участие в онлайн-семинаре “Годовая отчетность за 2019 г.: бухгалтерская и налоговая” https://buhexpert8.ru/dostup#buh ПРОГРАММА СЕМИНАРА НАЛОГОВАЯ ОТЧЕТНОСТЬ: • …

Новое в ЗУП за 5 мин [выпуск от 17.02.2020]

Выпуск на нашем сайте – https://buhexpert8.ru/1s-zup#tt-5min В этом выпуске: • Разместили ответы на вопросы с семинара по СЗВ-ТД • Обновили …

1С:ERP Урок 55. Исполнение заказа на производство

Пятьдесят пятый видеоурок вводного курса по «1С:ERP Управление предприятием». Тема на сегодня – исполнение заказа на производство (без использования пооперационного …

1C:Розница. «Поступление маркируемой табачной продукции при отсутствии электронного УПД»

Так как до 1.07.2020 г. сопровождение поставки электронным УПД не является обязательным для всех участников оборота табачной продукции, то могут …

Новое в учете и отчетности по НДФЛ в 2020 году

Изменения по НДФЛ в 2020 году. Изменения сроков и порядка представления отчетности по НДФЛ. Как представить отчетность по доходам по …

Ошибки при учете договоров ГПХ в 1С ЗУП 3.1

Кого считать работниками по договорам ГПХ. Ошибки квалификации договоров ГПХ. Выплаты по договорам ГПХ в 1С ЗУП 3.1. Смотрите тест-драйва …

Ответы на популярные вопросы по ЭТК - часть 2

Фрагмент вебинара по электронным трудовым от 11.02.2020 – Если все оставляют бумажные трудовые, можно ли не сдавать СЗВ-ТД? – Нужно …

Ответы на популярные вопросы по ЭТК - часть 1

Фрагмент вебинара по электронным трудовым от 11.02.2020 …

Юридическая и организационная (управленческая) структура Компании в 1С:ЗУП КОРП

✔️ Как настроить в 1С:ЗУП КОРП юридическую и организационную (управленческую) структуру Компании? ✔️ Какой отчет показывает сотрудников в разрезе оргструктуры? …

1С:Электронные трудовые книжки - бесплатный сервис от фирмы 1С

Если вы не используете программу 1С, предлагаем вам воспользоваться сервисом для формирования отчета СЗВ-ТД совершенно бесплатно. Переходите по ссылке etk.1c.ru …

Сведения о среднесписочной численности работников в 1С 8.3 ЗУП

Кем и в какие сроки сдаются сведения по среднесписочной численности. Что входит в понятие среднесписочная численность и как она рассчитывается …

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...