Получить html код страницы 1с
Всё нижеописанное уже так или иначе общеизвестно и опубликовано. Поскольку я ни разу не знаток javascript, данная заметка не претендует на "статью" и носит скорее антисклерозный характер. Основная задача - парсинг сайтов (кто о чём, а я всё о том же), а значит, получение исходного текста страницы.
Во втором случае на форме размещается реквизит типа "Строка" неограниченной длины, с видом "Поле HTML документа", и ему присваивается локальный или сетевой URL. В момент присвоения начинается загрузка документа. Здесь и далее документ определяется как
Окончание загрузки правильнее всего определять по совокупности двух факторов: возникновения события ЭУ 1С "ДокументСформирован" и по выставлении свойства "readyState", равному "complete". Замечено, что, несмотря на теорию, в текущих релизах эти события не синонимичны; полагаю, потому, что событие 1С срабатывает при "interactive", когда уже загружена страница и построено DOM-дерево, но картинки и айфреймы ещё догружаются (т.е. вызвано не Load, а DOMContentLoaded). Либо, возможны новые изменения-догрузки сразу после первой загрузки. Разумно делать обработчик ожидания с выключением в момент полной загрузки.
Мы можем оперировать DOM-моделью документа, методами документа и его элементов. Проверено, что все методы HTML5 работают корректно, с двумя скверными особенностями - они далеко не всегда вызывают ошибки (так, "removeAttribute" при указании несуществующего атрибута никак не ругается) и "пустое" значение js не синонимично пустому в 1С (так, правильнее проверять не "ЗначениеЗаполнено(хтмл)", а "ТипЗнч(хтмл)=Тип("Неопределено") и т.д.)
Мы не можем работать с глобальными переменными - они не сохраняются между сеансами обращения к документу. Т.е. в некоем контексте, в т.ч. контексте документа в целом, можно объявить переменную, и в рамках фрагмента кода js она будет, но следующее обращение столкнётся даже не с пустой переменной, а с её отсутствием.
Не рекомендую ни в каком месте js-кода использовать this - оно или пусто, или некорректно. Возможно, это исправят в других релизах, но надёжнее указывать полный путь к объекту. Если объект создан динамически, тоже пишите его явно.
Вместо "parentWindow" используем "DefaultView", хорошо известное как Document.Window, и можем вызывать скрипты страницы. Также, можем добавлять собственные скрипты (что мне представляется более верным и менее травматичным для документа, нежели подвешивание кусков кода на события и вызов этих событий, как предложено в статье 2016 года). Делается это так:
Можно вносить не в скрипты head'a, а в конец body. Документ уже загрузился, всякие асинхроны своё отрабатывают без учёта наших скриптов, Defer всё равно ни на что не влияет. Перезагрузка страницы при этом не происходит, designMode="on" включать не обязательно. Но важно учитывать, что, если текст скрипта не обёрнут в функцию, то он выполнился сразу в момент срабатывания appendChild, поэтому советую в скрипты класть именованные функции js или осознанно применять эту фичу. А вообще рез=Элементы.ПолеХТМЛ.Документ.DefaultView.Math1(100,50); // и получим 150
Это удобнее, чем присваивать результаты неким свойствам неких объектов и вычитывать их оттуда, или ловить в параметрах событий через createEventObject() и брать из Event.data. Кроме того, не все типы данных могут пережить это преобразование (так, для ArrayBuffer или Blob у меня не сработало, да и про объекты js есть сомнения). А так мы имеем прямое обращение к функции js из языка 1С. Для входных параметров ограничений или искажений экспериментально не обнаружено.
Замечу, что можно многократно добавлять функцию с тем же именем, js просто перезаписывает её код поверх старого (и, кстати, известная разница между "a=func1 и a=func1()" наблюдается и в 1С). Также замечу, что можно добавить одним куском кода в один скрипт сразу несколько функций. Если скрипт добавлен, а обращение по имени вызывает ошибку (1С пишет, что метод не найден), значит, где-то в коде js ошибка, он не скомпилировался и не добавился - так можно себя проверять "на лету".
Задействовать Eval мне не удалось - ошибки не происходит, но и ничего не делает.
Теперь переходим к решению заявленной задачи.
1. Можно обратиться к свойству outerHTML:
Но нам-то надо получить вообще всё, все объявления.
2. Можно использовать Node.js - сильно могучую штуковину, имеющую возможности различной сериализации и выгрузки, которую, однако, надо инсталлировать; потому отпадает. Тем, кто соберётся: обязательно всюду, где только можно, явно указывайте всякие encoding и charset по Документ.inputEncoding, взятому из документа, иначе жесть.
3. webBrowser.DocumentText неприменимо, т.к. нет такого ЭУ - webBrowser (если, конечно, не мучиться долго и старательно с обёртками и актив-иксинами), и опять же, он не кроссплатформенный. Можно, конечно, сделать com-объект MSIE.Application и дёргать его, но зачем.
Но капризничает, если неправильно написан адрес в части префиксов, доменов, протоколов; и любит, чтоб сайт был по возможности статичным, чей хтмл известен уже прямо целиком, что в наше время редкость.
5. Можно использовать (и мне понравился этот способ) объект XMLSerializer. Это часть современной js, и у неё есть метод сериализации всея документа в строку:
В этом случае будет возвращено всё, включая декларацию , хтмл с его объявлениями пространств имён, скриптами и т.д., словом, то, что надо. Кодировка UTF-8, и, судя по утверждениям гуру с хабра, с кодировкой он не лажает. Правда, немного жаль, что для этого же сериализатора метод serializeToStream, описанный здесь, более не работает. Кстати, теперь у нас есть возможность обработать двоичный поток, и можно было бы сделать нечто такое:
но увы, это уже не поддерживается.
Правда, можно поиграть с XMLHttpRequest, вместо .responseType="text" и responseText читая результат из собственно response в виде arraybuffer или blob (в 1С уже есть инструменты работы с ними), или даже в виде "ms-stream", если только для IE. Но: этот объект требует асинхронного вызова, а с этим у js-в-1С некоторые трудности. Проще говоря, ни fetch, ни промисы адекватно не отрабатывают либо даже не компилируются. Мне не удалось даже подвесить функцию на событие OnLoad для ХHR, и ничего лучше тупого цикла по статусу реквеста не взлетело.
Таким образом, синхронное получение исходного текста документа загруженной страницы html это:
Добавляем скрипт с этой функцией. Вызываем:
Наблюдаем свежедобавленный скрипт среди прочих в head.
Вот, собственно, и всё. В прежние времена писали ОболочкаХТМЛ.ПолучитьТекст() и были счастливы, но прогресс не стоит)
. и я грустно пошёл переделывать свои старые публикации под новую механику. Потому что беда общая. Буде кто готов сию пещерную дикость развить и дополнить, всецело приветствую.
P.S. Если вдруг захочется использовать возможности js, можно сделать совсем пустой документ (благо, теперь это всего лишь 6 тегов без хитрых объявлений), и добавлять вышеописанным способом свои скрипты в него. По сути, динамически набросать модуль из js-функций, сохранить в файл и юзать по необходимости.
Для того, чтобы брать информацию со страницы, нам надо изучить ее. Посмотрев исходный код страницы, можно выделить следующие фрагменты:
Теперь необходимо разобраться, как получать информацию о самих участниках. Опять же глянем исходный код страницы:
В таблице каждая строка представлена 4 ячейками:
- Ячейка с классом regional_tour_fio. В данной ячейке размещается фамилия, имя и отчество участника
- Ячейка с классом regional_tour__nomination_td. В данной ячейке размещается элемент span, класс которого зависит от номинации, в которой участ вовал пользователь. Таких номинаций три:
- Бухгалтерский учет и налогообложение (класс nomination b)
- Кадровый учет и трудовое право (класс nomination k)
- Платформа 1С:Предприятие 8 – разработка и администрирование (класс nomination it)
- Ячейка с классом text-center. В данной ячейке размещается количество баллов, набранных за отборочный тур. Также здесь можно увидеть атрибут title, в котором хранится калькуляция баллов. Например "Тест: 84, акция Вконтакте: 15, акция от партнера: 15". Здесь хотелось бы отметить, что обязательно указывается только "Тест", остальные значения могут не указываться, если участник не принимал участия в акциях партнера или проводимых Вконтакте.
- Ячейка без опозновательных знаков :) В ней находится номер сертификата Профессионал 1С:ИТС. Ее будем определять как ячейку без атрибута class.
Создание справочников
Создадим пустую конфигурацию и добавим справочники Участники и Партнеры. На рисунке ниже показаны реквизиты справочников
В справочнике Участники реквизиты Фамилия, Имя, Отчество, Сертификат имеют тип Строка, БаллыЗаТест, БаллыВК, БаллыПартнер, ОбщиеБаллы имеют тип число и реквизит Партнер имеет тип СправочникСсылка.Партнеры. В справочнике Партнеры все реквизиты имеют тип строка.
Теперь создадим общую форму, с помощью которой будем обновлять информацию в справочниках. В данной форме создадим две команды: ОбновитьИнформацию и ЗакрытьФорму.
Разбор адреса
Начнем писать код в модуле этой формы. Для удобства работы напишем сперва функцию СтруктураАдреса, которая будет разбирать наш адрес по частям и возвращать структуру. Согласно RFC1738, адрес страницы строится следующим образом:
Получение DOM-объектов с веб-страницы
Получение и обработка данных из DOM-объектов
Чтобы получить необходимую информацию, нам необходимо загрузить страницу, где она расположена. Но у нас таких страниц несколько, и для этого нам необходимо обработать элементы списка партнеров. Чтобы получить список партнеров и адреса страниц, нам надо просмотреть все элементы option и получить значение атрибута value, из которого получим адреса страниц и сам текст этого элемента. Поиск элемента в объектах DOM будем осуществлять с помощью метода построителя DOM - ПолучитьЭлементыПоИмени(). В результате работы этого метода мы получим переменную с типом СписокЭлементовDOM(), в котором будут содержаться все элементы option и его содержимое. Для получения атрибута используем метод ПолучитьАтрибут(), а для получения содержимого элемента используем метод ТекстовоеСодержимое() Получить. Эти данные мы сохраним в структуре Партнер("Город", "НомерНаСайте", "Партнер"), которую в свою очередь добавим в массив. Вот тут у меня вопрос к читателям: как лучше сделать - передавать по одной структуре на сервер и там сохранять в справочнике или собрать все структуры в массив и передать массив на сервер? Я попробовал оба варианта, и по мне лучше второй. Далее мы подгружаем все страницы с информацией о участниках поочередно. Для получения информации об участниках необходимо найти таблицу без шапки (элемент tbody) и в нем получить все строки (элемент tr). После этого просматриваем все ячейки строки (элемент td) на соответствие атрибута class одному из условий. Все условия мы с вами рассмотрели ранее. Когда получаем элементы ячеек, нам необходимо выполнить некоторую обработку:
- В ячейке "Номинация" необходимо найти элемент span и на основании атрибута class данного элемента получить номинацию;
- Разобрать атрибут title в ячейке с количеством баллов, чтобы получить отдельно баллы за тест, за акцию ВК и баллы от партнеров.
Все полученные данные сохраняем в структуру Участник("ФИО", "Номинация", "БаллыТест", "БаллыВК", "БаллыПарт", "ОбщиеБаллы", "Сертификат", "Партнер"). Как и в случае с партнерами, данную структуру добавляем в массив. Полученные массивы отправляем на сервер для сохранения. В итоге функция получилась следующая:
Сохранение данных в справочниках
Для сохранения данных в справочниках мы создадим функции ОбновитьУчастников(МассивУчастников) и ОбновитьПартнеров(МассивПартнеров):
Осталось только сделать приятные мелочи по оформлению, но каждый делает на свой вкус и цвет. Я вывел форму списка справочника Участники единственной на рабочую облать начальной страницы, и вместо вывода номера сертификата я применил условное форматирование (строка выделяется цветом, если человек получил сертификат). В итоге получилось следующее:
В данной статье рассматривается способ программного формирования HTML документа, содержащего ссылки на объекты базы данных 1С, такие как справочники, документы и т.д. Показан пример построения обработчика события OnClick ПоляHTMLДокумента, для обработки клика на html-ссылке.
Текст модуля формы:
Код 1C v 8.х
Ну вот html мы сформировали, теперь чтобы ссылки “ожили” надо написать обработчик события OnClick элемента управления ПолеHTMLДокумента.
Код 1C v 8.х
Всё можно пробовать!
Похожие FAQ
10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей. COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Посмотреть все результаты поиска похожих
Еще в этой же категории
// Подключение к сайту 1cnik.by.
// Параметры: адрес, порт (http:80, https:443), пользователь, пароль, прокси, таймаут в секундах, защищ.соединение (для https)
СоединениеHTTP = Новый HTTPСоединение ( "1cnik.by" , 80 , , , , , );
Сообщить ( "Текст страницы: " + РезультатЗапроса . ПолучитьТелоКакСтроку ());
СоединениеHTTP = Новый HTTPСоединение ( "www.yandex.by" , 80 ); // Поиск по Yandex.by
Если РезультатЗапроса . КодСостояния = 302 Тогда // Произошло перенаправление на другую страницу
// Функция СтруктураURI возвращает имя, порт и путь к ресурсу.
СтрURI = СтруктураURI ( РезультатЗапроса . Заголовки . Получить ( "Location" ));
// Сохранение страницы с результатами поиска в виде html файла и тут же покажем его пользователю.
СоздатьКаталог ( КаталогДокументов () + "\1cnik.by" );
ФайлHTML = КаталогДокументов () + "\1cnik.by\index.html" ;
HTMLТекст = Новый ЗаписьТекста ( ФайлHTML , КодировкаТекста . UTF8 );
HTMLТекст . Записать ( Результат . ПолучитьТелоКакСтроку ());
HTMLТекст . Закрыть ();
// Вывод пользователю на экран
ЗапуститьПриложение ( ФайлHTML );
КонецЕсли;
&НаКлиенте
Процедура СохранениеКартинкиССайта ()
// Запись файла easter_960_720.jpg на диск
СоздатьКаталог ( КаталогДокументов () + "\1cnik.by" );
ФайлКартинки = КаталогДокументов () + "\1cnik.by\easter_960_720.jpg" ;
РезультатЗапроса . ПолучитьТелоКакДвоичныеДанные (). Записать ( ФайлКартинки );
// Показываем картинку пользователю
ЗапуститьПриложение ( ФайлКартинки );
ЗаголовкиЗапроса = Новый Соответствие ;
ЗаголовкиЗапроса . Вставить ( "Data" , "format=woff2" );
ЗаголовкиЗапроса . Вставить ( "Base" , "1C" );
ЗаголовкиЗапроса . Вставить ( "Cookie" , "session=701" );
// Подключаемся к сайту.
СоединениеHTTP = Новый HTTPСоединение ( "1cnik.by" );
Proxy = Новый ИнтернетПрокси ;
// Авторизация на сервере
Proxy . Пользователь = "Admin1C" ;
Proxy . Пароль = "8317" ;
// Прокси сервер прописывается для каждого протокола отдельно
Proxy . Установить ( "http" , "192.168.100.2" , "8080" );
Proxy . Установить ( "https" , "192.168.100.2" , "3370" );
СоединениеHTTP = Новый HTTPСоединение ( "1cnik.by" . Proxy );
// Подключение к сайту https://google.by
// Параметры: адрес, порт (http:80, https:443), пользователь, пароль, прокси, таймаут в секундах, защищ.соединение (для https)
СоединениеHTTP = Новый HTTPСоединение ( "google.by" , 443 , , , , , Новый ЗащищенноеСоединениеOpenSSL ());
// Получение текста страницы
ЗапросHTTP = Новый HTTPЗапрос ( "/" ); // Можно указать любую страницу например, "/services" или "/contacts"
// В Cookies нам должны вернуть идентификатор сессии.
Cookie = РезультатЗапроса1 . Заголовки . Получить ( "Set-Cookie" );
Cookie = СтрЗаменить ( Cookie , ";" , Символы . ПС );
ИдентификаторСессии1 = СтрПолучитьСтроку ( Cookie , 1 );
// В cookie нам вернули второй идентификатор.
Cookie = РезультатЗапроса2 . Заголовки . Получить ( "Set-Cookie" );
Cookie = СтрЗаменить ( Cookie , ";" , Символы . ПС );
ИдентификаторСессии2 = СтрПолучитьСтроку ( Cookie , 1 );
// В результате второго Get-запроса возращена страница авторизации
// Получаем из формы авторизации значения параметров name="lt", name="execution" и name="_eventId",
// Чтобы сформировать код приглашения на сайт.
ltValue = "" ; executionValue = "" ; _eventIdValue = "" ;
Строки = Новый ТекстовыйДокумент ;
Строки . УстановитьТекст ( РезультатЗапроса2 . ПолучитьТелоКакСтроку ());
Для Индекс = 0 По Строки . КоличествоСтрок () Цикл
Строка = Строки . ПолучитьСТроку ( Индекс );
Если Найти ( Строка , "name=""lt""" ) > 0 Тогда
ltValue = ВытащитьЗначениеИзСтроки ( Строка );
ИначеЕсли Найти ( Строка , "name=""execution""" ) > 0 Тогда
executionValue = ВытащитьЗначениеИзСтроки ( Строка );
ИначеЕсли Найти ( Строка , "name=""_eventId""" ) > 0 Тогда
_eventIdValue = ВытащитьЗначениеИзСтроки ( Строка );
КонецЕсли;
КонецЦикла;
// Для формирования кода приглашения нужен логин и пароль от сайта 1С:ИТС.
Логин1СИТС = "" ;
Пароль1СИТС = "" ;
Если Логин1СИТС = "" Или Пароль1СИТС = "" Тогда
Сообщить ( "Для продолжения укажите в коде логин и пароль от ИТС." );
Возврат;
КонецЕсли;
КодПриглашения = "inviteCode < &execution &_eventId &username &password /login;" + ИдентификаторСессии2 +
"?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_check%3B" + ИдентификаторСессии1 ;
СоединениеHTTP3 = Новый HTTPСоединение ( "login.1c.ru" , , , , , , Новый ЗащищенноеСоединениеOpenSSL ());
ЗаголовкиЗапроса1 = Новый Соответствие ;
ЗаголовкиЗапроса1 . Вставить ( "Cookie" , ИдентификаторСессии2 );
ЗаголовкиЗапроса1 . Вставить ( "Content-Type" , "application/x-www-form-urlencoded;" );
ЗаголовкиЗапроса2 = Новый Соответствие ;
ЗаголовкиЗапроса2 . Вставить ( "Cookie" , ИдентификаторСессии1 );
&НаКлиенте
Функция СтруктураURI (Знач СтрокаURI ) Экспорт
СтрокаURI = СокрЛП ( СтрокаURI );
// Схема
Схема = "" ;
ТекущаяПозиция = Найти ( СтрокаURI , "://" );
Если ТекущаяПозиция > 0 Тогда
Схема = НРег ( Лев ( СтрокаURI , ТекущаяПозиция - 1 ));
СтрокаURI = Сред ( СтрокаURI , ТекущаяПозиция + 3 );
КонецЕсли;
// Строка соединения и путь на сервере
СтрокаСоединения = СтрокаURI ;
ПутьНаСервере = "" ;
ТекущаяПозиция = Найти ( СтрокаСоединения , "/" );
Если ТекущаяПозиция > 0 Тогда
ПутьНаСервере = Сред ( СтрокаСоединения , ТекущаяПозиция + 1 );
СтрокаСоединения = Лев ( СтрокаСоединения , ТекущаяПозиция - 1 );
КонецЕсли;
// Авторизация и имя сервера
СтрокаАвторизации = "" ;
ИмяСервера = СтрокаСоединения ;
ТекущаяПозиция = Найти ( СтрокаСоединения , "@" );
Если ТекущаяПозиция > 0 Тогда
СтрокаАвторизации = Лев ( СтрокаСоединения , ТекущаяПозиция - 1 );
ИмяСервера = Сред ( СтрокаСоединения , ТекущаяПозиция + 1 );
КонецЕсли;
// Логин и пароль
Логин = СтрокаАвторизации ;
Пароль = "" ;
ТекущаяПозиция = Найти ( СтрокаАвторизации , ":" );
Если ТекущаяПозиция > 0 Тогда
Логин = Лев ( СтрокаАвторизации , ТекущаяПозиция - 1 );
Пароль = Сред ( СтрокаАвторизации , ТекущаяПозиция + 1 );
КонецЕсли;
// Host, port
Host = ИмяСервера ;
Port = "" ;
ТекущаяПозиция = Найти ( ИмяСервера , ":" );
Если ТекущаяПозиция > 0 Тогда
Host = Лев ( ИмяСервера , ТекущаяПозиция - 1 );
Port = Сред ( ИмяСервера , ТекущаяПозиция + 1 );
КонецЕсли;
РезультатЗапроса = Новый Структура ;
РезультатЗапроса . Вставить ( "Схема" , Схема );
РезультатЗапроса . Вставить ( "Логин" , Логин );
РезультатЗапроса . Вставить ( "Пароль" , Пароль );
РезультатЗапроса . Вставить ( "ИмяСервера" , ИмяСервера );
РезультатЗапроса . Вставить ( "Хост" , Host );
РезультатЗапроса . Вставить ( "Порт" , ?( Port <> "" , Число ( Port ), Неопределено));
РезультатЗапроса . Вставить ( "ПутьНаСервере" , ПутьНаСервере );
&НаКлиенте
Функция ВытащитьЗначениеИзСтроки ( ТекСтрока )
Положение2 = СтрДлина ( ТекСтрока );
Пока Положение2 > 1 Цикл
Если Сред ( ТекСтрока , Положение2 , 1 ) = """" Тогда
Прервать;
КонецЕсли;
Положение2 = Положение2 - 1 ;
КонецЦикла;
Положение1 = Положение2 - 1 ;
Пока Положение1 > 1 Цикл
Если Сред ( ТекСтрока , Положение1 , 1 ) = """" Тогда
Прервать;
КонецЕсли;
Положение1 = Положение1 - 1 ;
КонецЦикла;
Возврат Сред ( ТекСтрока , Положение1 + 1 , Положение2 - Положение1 - 1 );
Местный босс - администратор
В статье собран мой опыт по передаче данных на веб-сервер.
В ходе реализации одного проекта потребовалось организовать автоматическую передачу данных на веб-сервер посредством регламентного задания.
Покопавшись прежде всего в мануалах, синтаксис-помощнике 1С Предприятия, порыскав в Сети, с удивлением обнаружил наличие отсутствия каких-либо вменяемых материалов по теме. Вернее, материалы в Сети есть, но там больше вопросы с абстрактными ответами.
Все нижеприведённые примеры кода всего лишь примеры, хоть и взяты из рабочей конфигурации.
Прежде всего необходимо создать файл отправки данных (собственно содержимое POST-запроса) и, при необходимости, подготовить двоичные данные.
Определяем разделитель разделов — границу boundary в POST-запросе в формате RFC (подробнее MIME: Организация данных ). В качестве границы может быть использована строка, состоящая из латинских букв и цифр.
Чтобы ничего не выдумывать, воспользуемся штатным классом 1С Предприятия УникальныйИдентификатор .
Содержимое файла ответа будет представлять собой какой-либо контент, отданный скриптом на стороне веб-сервера агенту пользователя. Подробнее смотрите пример скрипта php и скриншот ниже.
Подготавливаем двоичные данные. В моём случае это файл архива zip, но может быть что угодно, хоть изображение.
Передача содержимого файла
В 1С Предприятии отсутствуют средства чтения двоичных файлов в обычную строку, как в PHP или PERL.
Одним из способов получения строкового содержимого двоичного файла является кодирование с помощью штатных функций Base64Строка() или XMLСтрока(), при этом размер передаваемых данных увеличивается примерно на 30%. Декодировать содержимое файла на сервере можно при помощи функции php base64_decode() или аналогичных для используемого вами серверного ПО.
Другой способ состоит в использовании штатной функции ОбъединитьФайлы(, ) (подробнее см. в СП). В этом случае формирование файла POST-запроса будет происходить немного сложнее.
Оба способа описаны ниже.
Впрочем, двоичные данные лучше закодировать, иначе при приёме на веб-сервере файл может быть повреждён или не принят вовсе, если он будет содержать URL-значащие символы. Особенно это касается XML-подобных или иных текстовых файлов.
Следует также помнить об ограничениях хостинга и контролировать размер передаваемых данных. Как правило, для php это 2Мб. (см. файл /usr/local/php5/php.ini)
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M
В противном случе, на веб-сервере вы получите пустой POST-запрос.
Читайте также: