1с http соединение закрыть
Основные особенности программного кода этой функции:
5. Я сообщаю пользователю об ошибке в программном коде этой функции, когда получаю код ответа НЕ пределах 200-299. Дело в том, есть случай когда код ответа не равно 200, а 204 например и это не ошибка. Такой код можно получить, например если искомый ответ не найден по полям поиска или идентификационный номер.
В качестве сервера будет выступать опубликованная на веб-сервере БД с именем WebBuh (Демо-база “Бухгалтерия Предприятия 3.0”).
Пример №1 Создать новый элемент справочника если он не найден по идентификационному номеру или по полям поиска
При обмене данными , часто возникает вопрос о создании нового объекта справочника, только в том случае если его. Сначала я буду искать его в базе приемника по идентификационному номеру, а затем по полям поиска. Если его нет , то я его добавлю его в базе приемника с таким же идентификационный номер как в базе источника . Для иллюстрации этого примера я использую простой справочник, который имеет только код и наименования, например Классификатор Стран Мира
Пример №2 Запись в периодическом регистре сведения
В этом примере будет показано как выполнить запись в периодическом и независимом регистре сведения. Работа с зависимыми от документа регистрами не имеет практического смысла, так как запись в этих регистрах происходит в процедуре обработки проведения в модуле объекта документа, которая вызывается при проведении документа.
В качестве примера я буду использовать регистр сведения Документы физических лиц.
Рис 1 Структура регистра сведения Документы физ лиц
Данный регистр является независимым и периодическим в пределах дня.
Особенность записи регистра через протокол odata с помощью технологии интеграции Rest – интерфейс платформы 1С заключается в том, что отсутствие режим замещения существующей записи с тем же набором значений измерений регистра и с тем же периодом (для периодических регистров). Иными словами, если запись регистра сведений с таким набором существует, то невозможно выполнять замещение и приходится сначала удалить запись, а затем добавить. Возможно в будущих платформах 1С такая возможность появится .Однако, на сколько мне известно последнее расширение поддержки протокола OData Реализовано в версии 8.3.8.1652.
В следующем программном коде, мы будем выполнять сначала метод DELETE, а затем метод POST.
Для сокращения программного кода будем считать, что все объекты ссылочного типа ( ВидДокумента_Key и ФизическоеЛицо_Key ) , на которые ссылается регистр сведения добавлены в базе приемника с помощью программного кода примера №1
В этой статье я попробую рассказать о том, какими средствами располагает технологическая платформа 1С для работы с протоколом FTP. Первая часть статьи — теоретическая, вторая — практические примеры. Отмечу, что при написании статьи использовалась технологическая платформа версии 8.3.12.1595.
Общая информация
Для работы с протоколом FTP у технологической платформы 1С имеется два главных объекта — FTPСоединение и FTPФайл, кроме них существует объект ЗащищенноеСоединениеOpenSSL — который используется для подключения к FTPS-серверам (не следует путать с SFTP), а также объект ИнтернетПрокси — который используется для соединения с FTP-сервером через прокси-сервер.
FTPСоединение ключевой объект для работы с FTP в 1С — именно через этот объект происходит и соединение с FTP/FTPS сервером и все дальнейшие действия. Все параметры для соединения с сервером указываются в конструкторе объекта.
FTPФайл служит для получения информации о каталогах и файлах на FTP-сервере — этот объект позволяет получить информацию по объекту на FTP-сервере: имя, путь расширение, размер и тд.
ИнтернетПрокси позволяет указать прокси-сервер используемый для соединения с FTP/FTPS сервером — параметры для подключения к прокси-серверу указываются методом Установить(). Использование свойств «Пароль» и «Пользователь» нежелательно, так как эти свойства являются устаревшими.
ЗащищенноеСоединениеOpenSSL создает защищенное соединение OpenSSL — предоставляет возможность организовать защищенное соединение с FTP-сервером, также имеется возможность конкретный сертификат клиента и/или сертификат удостоверяющего центра.
Практические задачи при работе с FTP
В качестве практических примеров рассмотрим все операции которые позволяет выполнить объект FTPСоединение.
Как подключиться к серверу FTP?
Параметры для подключения указываются в конструкторе, сами параметры достаточно стандартны. Отдельно скажу про два параметра:
(обязательный). Тип - Строка. Адрес ресурса на сервере.
(обязательный). Тип - Строка. Имя файла на диске, в который
помещаются данные, полученные от сервера (ответ сервера).
(необязательный). Тип - Строка. Заголовки, добавляемые к запросу на сервер.
Текстовые пары вида :, разделенные комбинацией ВК + ПС.
(подробнее о заголовках будет сказано ниже).
Рассмотрим параметры процедуры Получить() более подробно:
В поле ИмяВыходногоФайла указывает имя файла на диске, в который будут сохранены данные, полученные от сервере в результате запроса. Так, например, если сервер возвращает список пользователей в формате XML, то на диск в указанный файл будет сохранен XML файл со списком пользователей.
О заголовках более подробно будет сказано ниже.
Так же, при запросе к веб-серверу зачастую передаются дополнительные данные (параметры) для этого запроса. Параметры от адреса источника отделяются символом "?". Каждый параметр задается в формате =. Параметры от адреса источника отделяются символом "?". Сами же параметры отделяются друг от друга символом "&". В результате строка адреса источника может выглядеть следующим образом: getUsers.php?owner_id=263544&count=100.
Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х
Все заголовки разделяются на четыре основных группы:
От себя лишь добавлю, что, если это явно не указано в требованиях к отправке данных веб-серверу заголовки HTTP для метода GET можно не указывать. Для метода POST обычно нужно указать заголовки Content-Type (тип передаваемых данных, например: "Content-Type: text/html;charset=utf-8") и Content-Length (размер передаваемых данных в байтах, например: "Content-Length: 1348").
Напомню, что HTTP заголовки в 1С указываются строкой в виде текстовых пар ":", разделенных комбинацией символов ВК+ПС.
Также заголовки можно задать типом Соответствие, где в качестве ключа указывается заголовок, а в качестве значения - значение заголовка.
Ниже приведены поясняющие примеры:
Код 1C v 8.х
Поле АдресРесурса аналогично полю Источник процедуры Получить(), т.е. указывается строка с адресом запроса, идущая после имени домена и символа "/".
Поле ИмяВыходногоФайла также аналогично одноименному полю процедуры Получить(), т.е. содержит имя файла, в котором будут сохранены данные, полученные от сервера в результате обработки исходных данных.
О заголовках было упомянуто выше. Напомню лишь, что для метода POST обычно указываются заголовки Content-Type и Content-Length. В качестве параметра заголовка Content-Length указывается размер файла-источника, преобразованный с помощью функции XMLСтрока().
Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х
где:
- id пользователя на сайте, от имени которого добавляется комментарий;
- id материала на сайте, к которому добавляется комментарий;
- текст комментария.
Предположим, что нам уже известны id пользователя и материала и они хранятся в переменных user_id и post_id. Ниже приведен пример, решающий нашу задачу.
Код 1C v 8.х
Загрузка файлов (изображений, документов и т.п.) на веб-сервер методом POST.
Зачастую возникает необходимость загрузки файлов на веб-сервер. Это может быть, например, изображение к статье на сайте, или фотография для альбома, или архив для файлообменника. Ранее мы рассматривали передачу методом POST параметров или просто файлов. Таким же образом можно и передавать двоичные файлы. Но как быть, если файлы необходимо отправлять вместе с параметрами? Для возможности отправки файлов в этом случае используется HTTP заголовок ContentType:multipart/form-data. Следует заметить, что обычно таким способом передаются файлы через веб-браузеры. Т.е. когда на сайте вы выбираете файл и нажимаете кнопку "Загрузить", то файл передается способом описанным ниже. При таком способе сам файл также задается как переменная, т.е., например, файл передается через параметр file или image. Однако, мы не можем просто передать file=. А вот как все таки передать файл мы и рассмотрим ниже.
Bounday можно сформировать, например, таким образом
Код 1C v 8.х
Все данные отделяются друг от друга разделителем boundary. Начинать разделитель нужно с "--":
Код
В конце данных нужно закрыть разделитель, добавили в конце разделителя "--", т.е. вид будет "----".
Итак, например, нам нужно передать на веб-сервер текстовый файл через параметр "text", его описание через параметр "desc" и id пользователя через параметр "uid", для которого будет загружен наш файл.
Предположим, что файл содержит следующий текст:
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
Описание должно содержать "Стих А.С. Пушкина", а id пользователя равно "0123456". Тогда файл должен быть сформирован следующим образом (для упрощения предположим, что bounday мы уже сформировали и он равен "ccf8111910")
Код
--ccf8111910
Content-Disposition: form-data; name="uid"
0123456
--ccf8111910
Content-Disposition: form-data; name="desc"
Стих А.С. Пушкина
--ccf8111910
Content-Disposition: form-data; name="text"; filename="stih.txt"
Content-Type: text/plain
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
--ccf8111910--
А теперь перейдем непосредственно к 1С. Пусть у нас будет форма с реквизитами "Пользователь", "Описание" и "ИмяФайла". Реализуем отправку данных, описанным выше способом
Код 1C v 8.х
Передача текстовых файлов таким способом проблем не вызывает. Сложнее дело обстоит с файлами, содержащими двоичные данные (изображения, архивы и т.п.). Все дело в том, что в 1С просто нет методов для чтение двоичных файлов в строку. Если мы делаем обмен со своим сайтом, которые сами и разрабатывали, то можно просто преобразовать файл в строку Base64 при помощи процедуры Base64Строка(), а на стороне сервера преобразовать строку Base64 обратно.
Код 1C v 8.х
А как же быть если мы загружаем файл на сторонний сервер, который принимает файл как есть без преобразование его в строку Base64(). В это случае можно пойти на хитрость. В 1С есть процедура ОбъединитьФайлы(), которая объединяет несколько файлов на диске в один результирующий файл
Код 1C v 8.х
(обязательный). Тип - Массив. Массив имен частей файлов, которые
требуется объединить. Объединение будет происходить в порядке, в котором заданы
имена файлов в массиве.
(обязательный). Тип - Строка. Имя файла, который будет
создан в результате объединения файлов.
Т.е. мы можем сформировать текстовый файл с запросом, объединить его с файлом(-ами), которые необходимо передать на веб-сервер и передать уже файл, получившийся в результате объединения исходных файлов. Ниже демонстрируется процесс передачи двух zip архивов на сервер с дополнительными параметрами user_id и post_id.
Код 1C v 8.х
Ну вот, вроде бы, и все, что я хотел рассказать о способах передачи файлов и данных на веб-сервер из 1С. Если что-то не понятно, что-то хотите уточнить или нашли ошибки - пишите в комментариях.
Автор: Павел
// Подключение к сайту 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С: Предприятие 8″ могут блокироваться и не переходят в спящий режим. Следует уточнить, что активным пользователем может быть:
В параметрах время засыпания сеанса и время удаления неиспользуемого спящего сеанса в разделе Администрирование/ Параметры информационной базы можно установить интервал времени, по истечении которого неактивный сеанс переводится в спящий режим и интервал времени, по истечении которого спящий сеанс завершается. Я предлагаю такие параметры параметры – 300 и 10 соответственно.
Если пользователь покидает базу (завершил сеанс) – его сеансовые данные удаляются. В режиме клиент сервер, сеансы хранятся на кластере серверов, за это отвечает менеджер кластера, именно для этого существует сервис сеансовых данных. Чтобы ускорить работу, данные сеансов кешируются в рабочих процессах и в толстых клиентах. При перезапуске кластера серверов данные сеансов будут сохранены. В том случае если активный пользователь не выполнил ни одного обращения к кластеру в течение 20-ти минут и сеанс не назначен соединению, то сеанс удаляется вместе с его данными. Для поддержания сеанса тонкий клиент и веб-клиент обеспечивают обращение к кластеру не реже 1 раза в 10 минут.
Однако. из-за нештатного завершения, сеанс может блокироваться и не переходить в спящий режим, и следовательно, завершиться автоматически не может и нужно их удалить через консоль сервера предприятия
Однако в файловом режиме, для снятия заблокированного сеанса веб-клиента не достаточно перезагружать web-сервер apache. Это обычно не помогает. Можно попытаться перезагружать ПК, где запущен браузер, но это тоже иногда не помогает. Лучше всего помогает запустить конфигуратор от имен администратора и снова опубликовать ИБ в разделе Администрирование/Публикация на веб- сервере.
Читайте также: