Адрес временного хранилища 1с

Адрес временного хранилища 1с

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

Чем полезно временное хранилище:

  • Не надо создавать объекты в конфигурации
  • Доступно и с сервера и с клиента
  • Можно записать любой объект

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

Синтаксис работы с хранилищем простой:

Передав параметром, данные которые хотим поместить(Посылка) и УникальныйИдентификатор получаем Адрес, по которому потом можно будет обратиться. Причем передаваемый идентификатор не является получаемым в последствии адресом. Вместо идентификатора можно передать строку Адреса, по которому и будет помещено наше значение, но это не любая строка! Строка Адреса выглядит примерно вот так «e1cib/tempstorage/ae5c5472-0266-4892-9073-20392dd5a6a6» .

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

Чтобы получить из хранилища нужно только указать адрес:

Также можно удалить помещенный объект, используя адрес

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

Помещение в хранилище

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

Чтение из хранилища

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

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

В параметре Адрес, можно указать Адрес в который нужно записать файл, если нужен новый адрес, то нужно передать пустую строку.

Истина – открывает окно для выбора папки и имени файла, при значении Истина есть возможность открыть файл."КопияФайла.xml" – Имя файла под которым будет сохранен файл.Адрес – это адрес в хранилище,ПолучитьФайл(Адрес,"Копияфайла.xml" , Истина);Чтобы сохранить файл из временного хранилища на Клиенте можно использовать метод

Содержание

В хранилище значения можно сохранить почти любую информацию, например,

. картинки (фотки):

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

// в этом месте он все выводит . ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить(); ТекИзображение.Записать();

. табличный документ:

. произвольные файлы (двоичные данные):

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

Восьмерка поддерживает сжатие данных, помещаемых в хранилище:

ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));

. внешние обработки и отчеты:

Работа с хранилищем

Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().

Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда

Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:

Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:

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

Назначение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Tv box android aliexpress

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример // Привязка поля картинки к адресу картинки во временном // хранилище. АдресКартинки реквизит формы строкового типа

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

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

Особенности при работе с ХранилищемЗначений на Клиенте

Когда у Документа в табличной части есть реквизит типа ХранилищеЗначений, то тормозит открытие формы документа, если в этом реквизите записаны данные большого размера.

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

  • В свойствах табличного реквизита формы есть флаг "Использовать всегда". Если он установлен, то содержимое поля всегда передается между сервером и клиентом — например, при открытии формы. Этот флаг надо отключить, но при этом нужно учесть это в коде, так как по умолчанию значения этого поля на клиенте не будет. Пример можно посмотреть в 1С:Архив.

Ещё лучше использовать временное хранилище для передачи файлов между клиентом и сервером.




В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "///// echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1.
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Читайте также:  Безлимитный ютуб на билайн

Собственно сам скрипт:

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

Адрес2 = ПоместитьВоВременноеХранилище(«Б», ЭтаФорма.УникальныйИдентификатор);

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

Но я уже привык не доверять этому механизму, ибо в свое время на этом очень сильно обжегся (изменение по одному адресу во временном хранилище)

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

и как выкрутились с адресом во временном хранилище?

Давайте я немного наброшу на вентилятор. А как будет работать Ваша схема с файлами больше 4 Гб?

Я бы слегка перефразировал вопрос и разбил его на несколько:

1) Как работают с большими файлами платформенные механизмы передачи файлов между клиентом и сервером? Какие есть ограничения для тонкого и веб-клиента? Есть ли зависимость от браузера?

2) Как работают с большими объемами данных механизмы потоков?

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

1) Какая разница как они работают «под капотом»? Во временное хранилище нельзя положить больше 2#k8SjZc9Dxk32 байт. Просто нельзя.

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

2) А вот механизм потоков работает просто отлично, он может и небольшими порциями работать через ПотокВПамяти.

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

Я конечно не хочу казаться умником, но чем вас не устраивает метод НачатьПомещениеФайла / НачатьПомещениеФайлов ? У вас куча процедур расписана (на мой взгляд совершенно лишних)

я выбираю файлы таким образом:

(10) Основное отличие моего варианта от Вашего — возможность обработать выбранный пользователем файл до передачи на сервер или получения с сервера. Например: сообщить пользователю «Вы не можете загрузить на сервер файл ‘Игра престолов (все сезоны).mkv’» или «Вы не можете перезаписать файл ‘устав проекта.docx’, выберите другой». Кроме того, в Вашем варианте все заканчивается после получения адреса загруженного файла, в моем — дополнительно описана процедура обработки содержимого с помощью механизма потоков, поэтому и методов в примере больше. Но конечно же, Ваш вариант проще, и может быть вполне применим в большинстве случаев.

(11) при превышении объема файла над размером памяти — система сама выдаст ошибку. Вам останется лишь вывести ее в удобочитаемом виде.

(11) еще можно создать диалог — выбрать и инициализировать файл и получить его размер. Если размер устраивает — передать Диалог дальше в метод получения файла.

12. Виктор Назаров (androgin) 12.04.18 13:48

(11) при превышении объема файла над размером памяти — система сама выдаст ошибку. Вам останется лишь вывести ее в удобочитаемом виде

А если нам надо ограничить размер файла своим значением, например 10Мб, исходя из своих целей? А если надо наложить условие: можно загружать все файлы, кроме определенных типов? В этих случаях как раз и надо проверить, что выбрал пользователь. Причем сделать это лучше ДО остальных действий по формированию и передаче файла.

(13) Именно такая схема, с отдельным диалогом, и приведена в статье. Я не стал вставлять дополнительные проверки, чтобы не загромождать пример. И, раз уж мы получили имя файла, его и надо передавать в метод передачи файла, а не Диалог.

(15) ну вам виднее. Но я бы так не делал)

(15) вы в своем коде все равно тащите все на сервер — в чем смысл?

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

Использование диалога позволяет применять фильтр!

Мне кажется в нашем споре каждый имеет в виду что-то свое. Я описываю решение следующей задачи: 1) дать возможность пользователю выбрать файл, 2) проверить, что он выбрал (проверки могут быть самые разные: размер, расширение, каталог), 3) и только если файл удовлетворяет заданным критериям, отправить его на сервер для дальнейшей обработки. В моем примере выбор файла — асинхронный вызов диалога, по его завершению мы получим имя файла, который после всех проверок будем использовать при передачи на сервер. Зачем при передаче на сервер еще раз указывать диалог? Чтобы пользователь два раза выбирал файл? Да, конечно же, можно использовать интерактивный режим вызова метода НачатьПомещениеФайлов без предварительного вызова диалога. Но при этом Вам просто негде будет вставить свои проверки. Единственное что Вы можете — это указать маску допустимых имен файла. Но и в этом случае Вы не сможете задать условие вида: ‘выбрать все файлы, кроме *.exe, *.vbs’. Что касается задачи получения файла с сервера, там ситуация немного иная. Если, как в моем примере, файл не хранится в базе, а формируется каким либо образом — это формирование может занять какое-то время. Тогда, с точки зрения юзабилити, лучше дать возможность выбрать файл для записи, удостовериться что он его выбрал, и выбрал то, что надо, а только потом заниматься длительным формированием файла. При использовании Вашего подхода (т.е. использования диалога выбора при вызове метода передачи) мы сначала затратим время на формирование и сохранение файла во временном хранилище, а только потом будем спрашивать у пользователя куда он хочет его сохранить, и не передумал ли он, «потому что забыл дома флешку».

Читайте также:  Custer size wrong please format что делать

(18) так вы сами же описываете то, что я и говорю: выбор файла и проверку его ( ваш второй пункт очень странный — расширение и каталог в диалоге выбирается! а размер можно получить после выбора файла или настроить вид диалога — показать там размер).

Это топтание на месте.

Мне вообще непонятно: зачем использовать сервер, если все на клиенте делается: и выбор файла и получение его размера. Только для того, чтобы поиграться с потоком?)))

Можно использовать и не_интерактивный метод выбора (признак такой имеется в методе) и это никак не мешает вставить свои проверки. Фильтр «выбрать все, кроме ххх, ххх» — ну это ж дурость! Создайте необходимые фильтры заранее и пусть пользователь сам выбирает, что ему нужно.

Когда вы тащите хранилище на сервер — вы уже получаете файл!

Вам вообще знакомы клиент-серверные работы с файлами?

Ваш метод, мало того, что получает файл и помещает в хранилище, так вы потом его еще на сервер тащите и там получаете из хранилища!!

Все ваши манипуляции вполне себе на клиенте работают!

Несмотря на вашу горячность, я надеюсь, что Вы не троллите, а просто невнимательно читаете мои сообщения. Хорошо, давайте возьмем Ваш пример из (10). Добавьте в него возможность загружать любые файлы, кроме потенциально опасных, например *.exe. Нет, это не дурость, подобный функционал есть в системах, построенных на базе БСП, там есть что-то вроде «Запретить загрузку файлов с расширениями». В случае попытки выбрать такой файл добавьте сообщение об этом пользователю. Если у Вас найдется способ сделать это с помощью интерактивного режима метода НачатьПомещениеФайлов без дополнительного вызова диалога, поделитесь. Далее: в моем примере при выборе файла не используется сервер, и конечно же для получения размера файла сервер тоже не нужен. Безусловно, есть задачи, которые можно решить только на клиенте. Но я специально выбрал такую задачу, для которой нужен сервер. Я это подчеркнул в начале статьи. Вы и сами сможете привести примеры таких задач. Вы же согласитесь, что с объектами базы данных можно работать только на сервере? Вот и в моем примере используется запись и чтение объектов ИБ. Может Вы имеете в виду иное — хранение файла целиком в базе данных, в каком-либо реквизите? Это немного другая задача.

(20) «кроме потенциально опасных» — вы вообще читали, что я писал?

вы программист — вам легко это проверить после выбора! Даже если вы не укажете опасное расширение — вы его можете проверить ПОСЛЕ выбора и вывести пользователю сообщение, что «ай-я-яй, такие файлы нельзя выбирать!» и удалить их из выбора. Сложно? НЕТ!

Далее: НачатьПомещениеФайлов с диалогом как раз и контролирует расширения, о чем я вам выше и писал!

«специально выбрал такую задачу, для которой нужен сервер» — именно это и является узким местом! вы тащите все на сервер! а это и есть «очень плохо».

Я же настаиваю, что все операции с проверками делать нужно на клиенте!

Вы все-таки невнимательно прочитали статью и мои комментарии. Поясню еще раз: на первом шаге мы вызываем диалог выбора файла. При вызове можно указать (как Вы верно говорите) свойства диалога: фильтр, начальный каталог, etc. Результат работы диалога обрабатывается в ОповещениеПослеВыбораФайлаДляЧтения . Здесь мы можем выполнить любые проверки — проверить расширение файла, путь к файлу и так далее. Я не стал загромождать пример, поэтому проверяю только то, что пользователь не отказался от выбора. Если вы посмотрите внимательно, то увидите директиву &НаКлиенте. Это означает, что эти операции будут выполнены на клиенте. С чего Вы взяли, что я делаю это на сервере? Если посмотрите внимательно, то увидите, что у меня ни в одной серверной процедуре нет проверок.

Вы разобрались что происходит в моих серверных методах? А там я делаю то, что можно сделать только на сервере: работаю с данными информационной базы. Для решения поставленной в начале статьи задачи, мне нужно содержимое файла. Вполне логично, что я его получаю из хранилища. Что значат Ваши слова:

«Ваш метод, мало того, что получает файл и помещает в хранилище, так вы потом его еще на сервер тащите и там получаете из хранилища!!

Все ваши манипуляции вполне себе на клиенте работают! «? Как можно после помещения файла во временное хранилище, отдельно его «тащить» на сервер? Какая строчка моего кода заставила Вас так подумать? Как «манипуляции» по созданию объекта и записи его в ИБ «вполне себе на клиенте работают»? Или Вы считаете что таких задач не бывает? Что любые действия с содержимым файлов можно делать на клиенте, потому что на сервере это делать «есть «очень плохо»?

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

Уже не нужно использовать «СериализаторXDTO»

Наконец написал свою публикацию с блекджеком и ш…… Работа с файлами (обычная и управляемая форма) все структурировано и используется метод «ЧтениеДанных»!

Ссылка на основную публикацию
Windows app cert kit что это
Используйте комплект сертификации приложений для Windows, чтобы протестировать приложение перед его отправкой в Microsoft Store или проверить существующие классические приложения....
Telegram desktop mac os
Телеграм для Mac Os специально оптимизирован для данной операционной системы. При этом все функции, которые вы встретите в Windows версии,...
Temporary root как получить
Хотите скачать рут права? 19+ лучших способов и инструкций это сделать! Для того, чтобы расширить свои возможности в качестве пользователя...
Windows defender exe что это
Windows Defender Основное окно программы Защитник Windows Тип Антивирусная программа Операционная система Windows 2000, XP, Server 2003, Windows Vista, Windows...
Adblock detector