Совсем простой обмен HTTP, 2 функции

Функция для вызова рест-сервиса и функция для разбора результата. Быстро, просто, универсально.

Сам пользуюсь этими функциями, в ряде случаев чуть дорабатывая "по месту", но в основном их возможностей хватает. Позволяют быстро начать работу с большинством http-сервисов.


// Вспомогательная
Процедура СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять=Ложь) Экспорт
Если Прав(инфо,3)="!!!" Тогда
рСтатус=СтатусСообщения.ОченьВажное;
ИначеЕсли Прав(инфо,2)="!!" Тогда
рСтатус=СтатусСообщения.Важное;
ИначеЕсли Прав(инфо,1)="!" Тогда
рСтатус=СтатусСообщения.Внимание;
Иначе
рСтатус=СтатусСообщения.Информация;
КонецЕсли;
Если рПояснять Тогда
Сообщить(инфо,рСтатус);
КонецЕсли;
//
Если ТипЗнч(рПротокол)=Тип("ТекстовыйДокумент") Тогда
рПротокол.ДобавитьСтроку(инфо);
КонецЕсли;
КонецПроцедуры

// Выполняет любой запрос к соединению,при необходимости создаёт соединение,заносит в параметры ответ сервиса.
// Возвращает успешность (булево), при ошибке возвращает Ложь.
//
// Параметры:
//    рПараметры - структура:
//
//        Соединение - HTTP-соединение; заносится в этот ключ,если не было передано (создаётся в функции),и используется из этого ключа без изменений,если было передано;
//        если значение ключа Соединение не указано или имеет иной тип,то соединение создаётся согласно значениям указанных ключей:
//            Сервер -строка, обязательный (если пусто или не указано,то возвращает ошибку),если начинается с http://,то приводится к правильному виду автоматически;
//            Порт - число, обязательный (по умолчанию для незащищённых 80,для защищённых 443);
//            Пользователь - строка, необязательный;
//            Пароль - строка, необязательный;
//            Таймаут - число, необязательный (по умолчанию 0);
//            ПроксиПользователь - строка, необязательный (по умолчанию пуста); если не пуста,то это признак использования прокси,в этом случае требуется передача свойств:
//                ПроксиПароль - строка, необязательный;
//                ПроксиСервер - строка,
//                ПроксиПорт - число, необязательный (по умолчанию 0);
//            ЗащищенноеСоединение - булево, необязательный; если используется,то применяется SSL;
//            КраткийФорматВызова - булево, необязательный; если указан,то соединение НЕ защищённое и БЕЗ прокси.
//        Если Соединение не было указано,то по завершении функции в ключ Соединение вносится созданное в ней;
//
//        HTTPЗапрос - запрос с уже установленными свойствами; необязательный,если не указан,то инициализируется в функции согласно значениям указанных ключей:
//            АдресРесурса или АдресСкрипта (равнозначны оба ключа) - строка,необязательный; по умолчанию "/";
//            ЗаголовкиЗапроса - соответствие или фикс.соответствие, необязательный;
//            ПараметрыЗапроса - структура,соответствие,фикс.соответствие или список значений (где имя ключа - Представление,а значение ключа - Значение),
//                список значений используется в случае,когда важен порядок следования параметров, вносит в ком.строку строго по порядку вхождения данных в список;
//            ТелоЗапроса - строка или двоичные данные,необязательный;
//                уточнения для тела запроса,являющегося строкой: КодировкаТелаЗапроса (по умолчанию UTF-8),ИспользованиеByteOrderMark (по умолчанию НеИспользовать);
//            ИмяФайлаТелаЗапроса - строка; необязательный;
//                указание тела запроса более приоритетно, чем указание имени файла тела запроса;
//        Если HTTPЗапрос был указан, то по завершении функции из рПараметры значение с ключом HTTPЗапрос удаляется,во избежание кэширования;
//
//        МетодHTTP - строка,необязательный (по умолчанию GET), допустимы только значения "GET" и "POST";
//
//        Протокол - текстовый документ, необязательный (по умолчанию пуст и не используется);
//        Пояснять - булево; если Истина, то действия поясняются и в протокол (если ведётся), и сообщениями.
//
//    По итогам работы функции при её успешном завершении в рПараметры вставляется значение с ключом HTTPОтвет. При ошибке вставляет Неопределено.
//
// Возвращает успешность (булево).
//
Функция HTTPВыполнитьЗапрос(рПараметры) Экспорт
Попытка
рПротокол=?(рПараметры.Свойство("Протокол"),рПараметры.Протокол,Неопределено);
рПояснять=?(рПараметры.Свойство("Пояснять"),рПараметры.Пояснять,Ложь);

// сразу по умолчанию
//рОтвет=Новый HTTPСервисОтвет(0,"Запрос не выполнялся"); // в релизах ниже 8.3.7 не отрабатывает
рОтвет=Неопределено;
рПараметры.Вставить("HTTPОтвет",рОтвет);

рКраткийФормат=?(рПараметры.Свойство("КраткийФорматВызова"),рПараметры.КраткийФорматВызова,Ложь);
рЗащищённое=?(рПараметры.Свойство("ЗащищенноеСоединение"),рПараметры.ЗащищенноеСоединение,Ложь);

рПользователь=?(рПараметры.Свойство("Пользователь"),рПараметры.Пользователь,"");
рПароль=?(рПараметры.Свойство("Пароль"),рПараметры.Пароль,"");

рСоединение=?(рПараметры.Свойство("Соединение"),рПараметры.Соединение,Неопределено);
Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда // надо его установить
#Область УстановкаСоединения
Если не рПараметры.Свойство("Сервер") Тогда Возврат Ложь КонецЕсли;
рСервер=СокрЛП(рПараметры.Сервер);
Если ПустаяСтрока(рСервер) Тогда Возврат Ложь КонецЕсли;
рПорт=?(рПараметры.Свойство("Порт"),рПараметры.Порт,0);
рТаймаут=?(рПараметры.Свойство("Таймаут"),рПараметры.Таймаут,0);
рПроксиПользователь=?(рПараметры.Свойство("ПроксиПользователь"),рПараметры.ПроксиПользователь,""); // признак применения прокси именно в этом
Если рКраткийФормат Тогда рЗащищённое=Ложь; рПроксиПользователь="" КонецЕсли;
//
рПрокси=Неопределено;
Если не ПустаяСтрока(рПроксиПользователь) Тогда
рПрокси=Новый ИнтернетПрокси;
рПрокси.Пользователь=рПроксиПользователь;
рПрокси.Пароль=рПараметры.ПроксиПароль;
Если рПараметры.ПроксиПорт=0 Тогда
рПрокси.Установить("HTTP",рПараметры.ПроксиСервер);
Иначе
рПрокси.Установить("HTTP",рПараметры.ПроксиСервер,рПараметры.ПроксиПорт);
КонецЕсли;
КонецЕсли;
//
Если СтрНачинаетсяС(НРег(рСервер),"http://") Тогда
рСервер=Сред(рСервер,8);
КонецЕсли;
Если рПорт=0 Тогда
рПорт=?(рЗащищённое,443,80);
КонецЕсли;
//
Если рЗащищённое Тогда
си=Новый СистемнаяИнформация;
Если Число(СтрРазделить(си.ВерсияПриложения,".",Ложь).Получить(2))>9 Тогда
рSSL=Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows());
Иначе
рSSL=Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровWindows);
КонецЕсли;
Иначе
рSSL=Неопределено;
КонецЕсли;
//
Если рКраткийФормат Тогда
Если рЗащищённое Тогда
рСоединение=Новый HTTPСоединение(рСервер,,,,,,рSSL);
Иначе
рСоединение=Новый HTTPСоединение(рСервер);
КонецЕсли;
Иначе
Если рПрокси=Неопределено Тогда
рСоединение=Новый HTTPСоединение(рСервер,рПорт,рПользователь,рПароль,,рТаймаут,рSSL);
Иначе
рСоединение=Новый HTTPСоединение(рСервер,рПорт,рПользователь,рПароль,рПрокси,рТаймаут,рSSL);
КонецЕсли;
КонецЕсли;
//
Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда
СообщитьИВнестиВПротокол("Не удалось создать объект HTTP-соединения!",рПротокол,рПояснять);
КонецЕсли;
//
// вставим на будущее (это иногда имеет смысл кэшировать)
рПараметры.Вставить("Соединение",рСоединение);
#КонецОбласти
Иначе
рСервер=рСоединение.Сервер;
рПорт=рСоединение.Порт;
рТаймаут=рСоединение.Таймаут;
рПроксиПользователь=рСоединение.Прокси.Пользователь;
КонецЕсли;
// а эти всегда берём по итогам установленного соединения
рПроксиСервер=рСоединение.Прокси.Сервер();
рПроксиПорт=рСоединение.Прокси.Порт();
//
// выводим настройки соединения
инфо="Соединение:
|Сервер: "+СокрЛП(рСервер)+",порт: "+Строка(рПорт)+",пользователь: "+СокрЛП(рПользователь)+",таймаут: "+рТаймаут+"
|краткий формат: "+Строка(рКраткийФормат)+",защищённое: "+Строка(рЗащищённое)+Символы.ПС;
Если не ПустаяСтрока(рПроксиПользователь) Тогда
инфо=инфо+"прокси: сервер "+СокрЛП(рПроксиСервер)+",порт "+Строка(рПроксиПорт)+",пользователь "+СокрЛП(рПроксиПользователь);
Иначе
инфо=инфо+"прокси не используется";
КонецЕсли;
СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять);
//
Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда // уже без сообщения,именно выход по ошибке
Возврат Ложь;
КонецЕсли;

рЗапрос=?(рПараметры.Свойство("HTTPЗапрос"),рПараметры.HTTPЗапрос,Неопределено);
Если ТипЗнч(рЗапрос)<>Тип("HTTPЗапрос") Тогда
#Область УстановкаЗапроса
Если рПараметры.Свойство("АдресРесурса") и не ПустаяСтрока(рПараметры.АдресРесурса) Тогда
рАдресРесурса=рПараметры.АдресРесурса;
ИначеЕсли рПараметры.Свойство("АдресСкрипта") и не ПустаяСтрока(рПараметры.АдресСкрипта) Тогда
рАдресРесурса=рПараметры.АдресСкрипта;
Иначе
рАдресРесурса="/";
СообщитьИВнестиВПротокол("Используется пустой адрес ресурса для запроса.",рПротокол,рПояснять);
КонецЕсли;
//
рЗаголовки=Новый Соответствие;
Если рПараметры.Свойство("ЗаголовкиЗапроса") Тогда
Если ТипЗнч(рПараметры.ЗаголовкиЗапроса)=Тип("Соответствие") или ТипЗнч(рПараметры.ЗаголовкиЗапроса)=Тип("ФиксированноеСоответствие") Тогда
рЗаголовки=рПараметры.ЗаголовкиЗапроса;
КонецЕсли;
КонецЕсли;
//
Если рПараметры.Свойство("ПараметрыЗапроса") Тогда
Если ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("Структура")
или ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("Соответствие")
или ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("ФиксированноеСоответствие")
Тогда
Если рАдресРесурса<>"/" Тогда
разд="?";
Для каждого киз Из рПараметры.ПараметрыЗапроса Цикл
рАдресРесурса=рАдресРесурса+разд+СокрЛП(киз.Ключ)+"="+СокрЛП(Строка(киз.Значение)); разд="&";
КонецЦикла;
КонецЕсли;
ИначеЕсли ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("СписокЗначений") Тогда
// случай,когда был очень важен порядок параметров,и их разместили осознанно именно так; не сортировать!
Если рАдресРесурса<>"/" Тогда
разд="?";
Для каждого знч Из рПараметры.ПараметрыЗапроса Цикл
рАдресРесурса=рАдресРесурса+разд+СокрЛП(знч.Представление)+"="+СокрЛП(Строка(знч.Значение)); разд="&";
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
//
рЗапрос=Новый HTTPЗапрос(рАдресРесурса,рЗаголовки);
//
Если рПараметры.Свойство("ТелоЗапроса") Тогда
Если ТипЗнч(рПараметры.ТелоЗапроса)=Тип("Строка") Тогда
рКодировка=?(рПараметры.Свойство("КодировкаТелаЗапроса"),рПараметры.КодировкаТелаЗапроса,Неопределено);
Если не ЗначениеЗаполнено(рКодировка) Тогда рКодировка=КодировкаТекста.UTF8 КонецЕсли;
рИспользоватьБОМ=?(рПараметры.Свойство("ИспользованиеByteOrderMark"),рПараметры.ИспользованиеByteOrderMark,Неопределено);
Если не ЗначениеЗаполнено(рИспользоватьБОМ) Тогда рИспользоватьБОМ=ИспользованиеByteOrderMark.НеИспользовать КонецЕсли;
рЗапрос.УстановитьТелоИзСтроки(рПараметры.ТелоЗапроса,рКодировка,рИспользоватьБОМ);
ИначеЕсли ТипЗнч(рПараметры.ТелоЗапроса)=Тип("ДвоичныеДанные") Тогда
рЗапрос.УстановитьТелоИзДвоичныхДанных(рПараметры.ТелоЗапроса);
КонецЕсли;
ИначеЕсли рПараметры.Свойство("ИмяФайлаТелаЗапроса") Тогда
// наличие файла не проверяем,считаем,что он есть априорно
рЗапрос.УстановитьИмяФайлаТела(рПараметры.ИмяФайлаТелаЗапроса);
КонецЕсли;
#КонецОбласти
КонецЕсли;
Если рПараметры.Свойство("HTTPЗапрос") Тогда
// удаляем из параметров,чтобы не повторялось в будущем (кэшировать его нам не надо)
рПараметры.Удалить("HTTPЗапрос");
КонецЕсли;

// выводим настройки запроса
инфо="Запрос:
|Адрес ресурса: "+рЗапрос.АдресРесурса+",заголовк"+?(рЗапрос.Заголовки.Количество()=0,"ов нет","и:");
Для каждого киз Из рЗапрос.Заголовки Цикл
инфо=инфо+"
|     "+СокрЛП(киз.Ключ)+"="+СокрЛП(киз.Значение);
КонецЦикла;
Если рПараметры.Свойство("ТелоЗапроса") и ТипЗнч(рПараметры.ТелоЗапроса)=Тип("Строка") Тогда
инфо=инфо+"
|Тело запроса:"+Символы.ПС+рПараметры.ТелоЗапроса;
КонецЕсли;
СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять);

рМетодHTTP=?(рПараметры.Свойство("МетодHTTP"),ВРег(рПараметры.МетодHTTP),"");
Если ПустаяСтрока(рМетодHTTP) Тогда рМетодHTTP="GET" КонецЕсли;
//
Если рМетодHTTP="GET" Тогда
рОтвет=рСоединение.Получить(рЗапрос);
ИначеЕсли рМетодHTTP="POST" Тогда
рОтвет=рСоединение.ОтправитьДляОбработки(рЗапрос);
Иначе
СообщитьИВнестиВПротокол("Указан не поддерживаемый метод: "+рМетодHTTP+",никакое действие не выполняется!!",рПротокол,рПояснять);
Возврат Ложь;
КонецЕсли;
рПараметры.Вставить("HTTPОтвет",рОтвет);

Возврат Истина;

Исключение
инфо="HTTPВыполнитьЗапрос,общая ошибка: "+ОписаниеОшибки();
Сообщить(инфо,СтатусСообщения.Важное);
ЗаписьЖурналаРегистрации("Обмен",УровеньЖурналаРегистрации.Ошибка,,,инфо);
Возврат Ложь;
КонецПопытки;
КонецФункции

// Выполняет анализ ответа rest-сервиса как объекта HTTPОтвет,заносит в параметры результаты разбора.
// Возвращает успешность (булево),при ошибке возвращает Ложь.
//
// Параметры:
//    HTTPОтвет - объект типа "HTTPСервисОтвет", обязательный; собственно разбираемый ответ;
//    КодСостояния - число, вносимый;
//    Причина - строка, вносимый; если КодСостояния 200, то пуста;
//    ЗаголовкиОтвета - соответствие, вносимый;
//    ТелоКакСтрока - булево; если указан и Истина, то читается тело ответа как строка, для уточнения кодировки используется ключ:
//        КодировкаТелаОтвета - строка или КодировкаТекста, по умолчанию UTF8;
//    ТелоКакДвоичныеДанные - булево; если указан и Истина, то читается тело ответа как двоичные данные;
//    ТелоКакИмяФайла - булево; если указан и Истина, то возвращается имя файла, куда прочитано тело ответа;
//    ТелоОтвета - результат чтения тела ответа, вносимый, если способ чтения тела не указан, то Неопределено;
//    Протокол - текстовый документ, необязательный (по умолчанию пуст и не используется);
//    Пояснять - булево; если Истина, то действия поясняются и в протокол (если ведётся), и сообщениями.
//
Функция HTTPРазобратьОтвет(рПараметры) Экспорт
Попытка
рПротокол=?(рПараметры.Свойство("Протокол"),рПараметры.Протокол,Неопределено);
рПояснять=?(рПараметры.Свойство("Пояснять"),рПараметры.Пояснять,Ложь);

Если Не (рПараметры.Свойство("HTTPОтвет") и ТипЗнч(рПараметры.HTTPОтвет)=Тип("HTTPОтвет")) Тогда
СообщитьИВнестиВПротокол("В структуре параметров не найден ответ сервиса!!",рПротокол,рПояснять);
Возврат Ложь;
КонецЕсли;
рОтвет=рПараметры.HTTPОтвет;
//
рПараметры.Вставить("КодСостояния",рОтвет.КодСостояния);
Если рОтвет.КодСостояния=200 Тогда
рПараметры.Вставить("Причина","");
Иначе
Попытка рПараметры.Вставить("Причина",рОтвет.Причина) Исключение рПараметры.Вставить("Причина","") КонецПопытки;
КонецЕсли;
рПараметры.Вставить("ЗаголовкиОтвета",рОтвет.Заголовки);
Если рПараметры.Свойство("ТелоКакСтрока") и ТипЗнч(рПараметры.ТелоКакСтрока)=Тип("Булево") и рПараметры.ТелоКакСтрока=Истина Тогда
рКодировка=КодировкаТекста.UTF8;
Если рПараметры.Свойство("КодировкаТелаОтвета") и ЗначениеЗаполнено(рПараметры.КодировкаТелаОтвета) Тогда
Если ТипЗнч(рПараметры.КодировкаТелаОтвета)=Тип("Строка") или ТипЗнч(рПараметры.КодировкаТелаОтвета)=Тип("КодировкаТекста") Тогда
рКодировка=рПараметры.КодировкаТелаОтвета;
КонецЕсли;
КонецЕсли;
рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьТелоКакСтроку(рКодировка));
ИначеЕсли рПараметры.Свойство("ТелоКакДвоичныеДанные") и ТипЗнч(рПараметры.ТелоКакДвоичныеДанные)=Тип("Булево") и рПараметры.ТелоКакДвоичныеДанные=Истина Тогда
рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьТелоКакДвоичныеДанные());
ИначеЕсли рПараметры.Свойство("ТелоКакИмяФайла") и ТипЗнч(рПараметры.ТелоКакИмяФайла)=Тип("Булево") и рПараметры.ТелоКакИмяФайла=Истина Тогда
рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьИмяФайлаТела());
Иначе
СообщитьИВнестиВПротокол("Тело ответа игнорируется,т.к. его тип и способ обработки не указаны!",рПротокол,рПояснять);
рПараметры.Вставить("ТелоОтвета",Неопределено);
КонецЕсли;
//
Возврат Истина;
Исключение
инфо="HTTPРазобратьОтвет,общая ошибка: "+ОписаниеОшибки();
Сообщить(инфо,СтатусСообщения.Важное);
ЗаписьЖурналаРегистрации("Обмен",УровеньЖурналаРегистрации.Ошибка,,,инфо);
Возврат Ложь;
КонецПопытки;
КонецФункции

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

Применимо, начиная с 8.3.6.

15 Comments

  1. VmvLer

    не читал подробно, но приветствую.

    никакой воды: лаконичное описание и код для тестирования/использования.

    не то что опусы тутошних маркетологов — напишут с три короба, замылят глаза картинками, а проку пшик.

    Reply
  2. Yashazz

    Странное что-то с пробелами после запятых, взяли и исчезли… Извиняюсь, возможно, накосячил при публикации.

    Reply
  3. fr13

    В попытке выполнять такой большой участок кода… сомнительное решение. Все возможные ошибки проглатываются и сводятся к одной. Такой код тяжело поддерживать.

    Reply
  4. Yashazz

    (3) Соглашусь. Действительно, логичнее разбить на пошаговые попытки. Переделать?

    Reply
  5. AllexSoft

    Автор любитель условий через ?(,,), сразу видать )

    Даю подсказку:

    рКодировка=?(рПараметры.Свойство(«КодировкаТелаЗапроса»),рПараметры.КодировкаТелаЗапроса,Неопределено);

    заменяется на

    рПараметры.Свойство(«КодировкаТелаЗапроса», рПараметры.КодировкаТелаЗапроса);

    и без всяких условий, ну и вся инициализация переменных из свойств аналогично.

    А раз так много переменных параметров для запроса требуется, то лучше вынести это в структуру вообще типа

    СтруктураПараметровЗапроса = новый Структура(«параметр1, параметр2, параметр3», «», «», неопределено);

    ну а потом ЗаполнитьЗначенияСвйоств(СтруктураПараметровЗапроса , рПараметры);

    все! две строи и параметры инициализированы, и вы точно уверены в полях СтруктураПараметровЗапроса

    А здесь зачем то сделано через попытку..

    Попытка рПараметры.Вставить(«Причина»,рОтвет.Причина) Исключение рПараметры.Вставить(«Причина»,»») КонецПопытки;

    хотя то же самое что

     Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(рОтвет, «Причина») Тогда рПараметры.Вставить(«Причина»,рОтвет.Причина) Иначе рПараметры.Вставить(«Причина»,»») КонецЕсли  

    А вобще для ODATA неплохо бы процедурку которая умеет собирать параметр filter из структуры отбора или настройки отбора компоновщика скд.

    Reply
  6. Yashazz

    (5) Алекс, а это я часть кода резал, неуниверсальную, перед публикацией. Вышло так. Вообще, конечно, ты прав.

    Reply
  7. Yashazz

    (5) Насчёт filter’а для опен даты поищу, вроде где-то делал…

    Reply
  8. AllexSoft

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

     ПутьНаСервере = СтруктураПодключения.ИмяПубликации + «/odata/standard.odata/Catalog_ДоговорыКонтрагентов?$format=json&$filter=Owner_Key eq guid'»+СтруктураКонтрагент.Ref_Key+»‘»;
    
    СвойстваСДатой = Новый Структура(«Дата, СрокДействия», ‘00010101’, ‘00010101’);
    
    Результат = ПолучитьДанныеИзODATAвСтруктуру(СтруктураПодключения, ПутьНаСервере,,, СвойстваСДатой);
    
    Для каждого СтруктураДоговор Из Результат.value Цикл
    
    СтруктураПолейПоиска = Новый Структура(«Дата, Номер, Контрагент», Новый Структура(«ИмяПоля», «Дата»), Новый Структура(«ИмяПоля», «Номер»), НайденныйКонтрагент.Ссылка);
    
    НайденныйДоговор = ПолучитьОбъектПоСтруктуреODATA(СтруктураДоговор, «Справочник.ДоговорыКонтрагентов», СтруктураПолейПоиска);
    ЗаполнитьЗначенияСвойств(НайденныйДоговор, СтруктураДоговор,,»Code»);
    
    …..
    НайденныйДоговор.Записать();
    
    КонецЦикла;
    
    
    

    Показать

    где ПолучитьДанныеИзODATAвСтруктуру — получает массив структур из ODATA, ПолучитьОбъектПоСтруктуреODATA — по структуре находит объекты в базе или создает их (подобно как ПКО в КД2). Вот сюда бы как раз универсальную замену вот этой строке

    ПутьНаСервере = СтруктураПодключения.ИмяПубликации + «/odata/standard.odata/Catalog_ДоговорыКонтрагентов?$format=json&$filter=Owner_Key eq guid'»+СтруктураКонтрагент.Ref_Key+»‘»;
    Reply
  9. Yashazz

    (8) Вечером доберусь до терминала, где делал это — скопирую и выложу. Хотя у меня это примерно на том же уровне, что и ты привёл пример… Надо вообще?

    Reply
  10. AllexSoft

    (9)

    Надо вообще?

    думаю в качестве дополнения к статье было бы интересно не только мне.. тем более у меня filter никак не формируется вообще (

    Reply
  11. user1166203

    Спонсор функции — производитель колесиков для мыши 🙁

    Reply
  12. kosmo0

    Немного не по статье (раз уж специалисты по работе 1С в интернете собрались).

    Можно ли как-то прологировать действия 1с с инетом? В частности работу FTPСоединение. А то один компьютер подключается и нормально забирает и выкладывает файлы. Другой этого не может, хотя конфа одна и та же. Можно конечно потыкать пальцем в небо — давайте попробуем то или это, но хотелось бы видеть действия программы. Или это только сниффером пакеты смотреть?

    Reply
  13. AllexSoft

    (12) по идее включить тех журнал, там наверняка есть события подобного рода. Первое куда я бы смотрел это туда.

    Reply
  14. Yashazz

    (12) Просто ЖР для начала, и каждый шаг писать. Прям вот каждый, и код разобрать на совсем простые шаги. Ну и внимательно смотреть всё — клиент или сервер, какие права у юзера и аккаунта подключения, итд.

    Алекс, мне обрубили доступ к тому терминалу. Попробую по черновикам восстановить.

    Reply
  15. kosmo0

    (13)(14) Спасибо за возможные решения проблемы. Но решил отказаться от FTP в данном случае. Так как не специалист по сетевым технологиям и времени на устранение понадобится довольно много. Плюс надо проверять и изменять из места в котором я не обладаю всеми полномочиями.

    зы. Для информации. FTP-сервер расположен на роутере (флешка в usb-порту). Раньше был один роутер, после поломки приобретен от того же производителя, но модель попроще. На старом роутере работало оба обмена использующие FTPСоединение. Но новом только один.

    Код который работал и работает:

    Соединение.НайтиФайлы(«[полный путь к папке]», <ИмяФайла>);

    Код который не стал работать:

    Соединение.УстановитьТекущийКаталог(«[полный путь к папке]»);

    Соединение.НайтиФайлы(,<ИмяФайла>);

    Плюс оказалось что есть чувствительность к регистру букв в полном пути (особенно в наименовании корневого каталога).

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *