Имя: Пароль:
1C
1С v8
Работа с данными при помощи web-сервиса
0 Самарасофт
 
18.08.17
18:22
Добрый день.
Имеется web-сервис на стороне 1С, к которому идёт обращение через публикацию на IIS
Один из методов - создание записи в документах и справочниках. Вот начало функции:

Функция CreateNewObject(type, name, entityCollection)
    
        
Перем Спр;
        
    таблица = ПолучитьТаблицуПоИмени(name);    
    Если таблица = "Справочник" Тогда
       Спр = Вычислить("Справочники." + name);
       новыйОбъект = Спр.СоздатьЭлемент();
       таблица = "Справочники";
    ИначеЕсли таблица = "Документ" Тогда
       Спр = Вычислить("Документы." + name);
       новыйОбъект = Спр.СоздатьДокумент();
       таблица = "Документы";
    КонецЕсли;
            
Возврат 322;

Весь текст не привожу - много его. В двух словах - дальше идёт заполнение и запись создаваемого экземпляра.

Беда в том, что при обработке экземпляров типа "Документы" наблюдается чрезвычайно опасное поведение:

для документа ЗаказПокупателя и ЗаказПоставщику данный блок кода не отрабатывает, а для большинства других экземпляров(например, ЗаказНаПроизводство) вполне успешно проходит создание.
Возврат ОписаниеОшибки() не помогает - ответ:
500 internal server error



Прошу наставить на путь истинный, где искать причины ошибки.
1 Базис
 
naïve
18.08.17
18:28
Пятница, пол седьмого. Сервер устал и хочет на набережную!
2 lodger
 
18.08.17
18:28
ну я так понимаю,
"Спр = Вычислить("Документы." + name);" - не срабатывает, т.к. name не равен имени метаданных.
или еще хз, что.
но! надо все это дело завернуть в попытку и в возврат пихать осмысленный код+текст ошибки.
кстати, в IIS можно настроить выдачу подробностей, а не 500 internal server error :
When 1C:Enterprise errors (when you are working with IIS web server 7.0 or 7.5) are displayed as 500 – internal server error. There is a problem with the resource you are looking for, and it cannot be displayed., change the parameter controlling the error display. To do this, open the error page parameters customization dialog:
Control Panel – Administrative tools – IIS Services Manager – <Name of server> – Sites – <Default Web Site> – <Name of virtual application> – Error pages – Edit parameters. In the dialog that opens, set the If the server finds an error, return the following parameter to Detailed error messages. Then click OK.
3 lodger
 
18.08.17
18:29
+(2) простите за английский, нашел это на международной морде 1с.
4 Базис
 
naïve
18.08.17
18:30
Времени ему не хватает, небось.
5 Базис
 
naïve
18.08.17
18:31
Логи писать и читать ещё можно, в ЖР и ТЖ.
6 Самарасофт
 
18.08.17
18:36
(2), Спасибо! Пытаюсь.

(4), таймауты все более, чем достаточны. Ошибка возвращается практически мгновенно

+(1) версия платформы 8.1 //если это значимо...
7 Самарасофт
 
18.08.17
18:38
(2), увы, не помогло, всё равно шарашит 500.
"Спр = Вычислить..." - работает на других документах:
ЗаказНаПроизводство - работает

ЗаказПокупателя - нет
ЗаказПоставщику - нет
8 lodger
 
18.08.17
18:41
(6) ну тогда

Попытка

лялялял

исключение

ЗаписьЖурналаРегистрации("ВебСервис.ТвойВебсервис.ТвойМетод()",
УровеньЖурналаРегистрации.Информация, , ,
"ахтунг, ругаца"+ТвоиПараметры+ОписаниеОшибки());

КонецПопытки;
9 Самарасофт
 
18.08.17
18:42
(5), в журнал регистрации, судя по всему, 1С не пишет, т.к. дело до записи каких-либо данных не доходит
10 Самарасофт
 
18.08.17
18:43
(8), Спасибо, сейчас попробую.
11 Базис
 
naïve
18.08.17
18:45
Кто мешает писать свои отладочные сообщения на каждом этапе? Ещё есть замер производительности, в нём видны отработавшие куски кода. И 82 уже есть, и 83 - там с интеграционными технологиями получше.
12 Самарасофт
 
18.08.17
18:47
(11), 82 83 не даёт использовать бизнес-задача, увы.
Отладочные сообщения дали выявить, на какой строке падает:
Спр = Вычислить("Документы." + name)
13 lodger
 
18.08.17
18:51
(12) читать первые строки из (2) до просветления.
14 Самарасофт
 
18.08.17
18:58
(13), но как же name может быть не равен имени метаданных, если я туда через SOAP UI передаю "ЗаказПокупателя" - не работает.
Передаю "ЗаказНаПроизводство" - работает.

Оба значения беру из конфигуратора <Объект>-Основные-Имя

Но ведь что-то я явно делаю не так..

Подскажите, могут какие-либо процедуры на уровне модуля объекта влиять на корректность исполнения метода Вычислить()?
15 Самарасофт
 
18.08.17
19:05
(8), увы, не получается отследить ошибку журналом регистрации - запись туда не производится.

обернул всё в попытку, прописал в исключении как Вы и сказали.

Может быть, что некорректная работа метода Вычислить() вызывает прерывание выполнения всего кода? Как такое отловить в 1С?
16 Asmody
 
18.08.17
19:09
Вынеси методы веб-сервиса в отдельный модуль, отлаживай как обычный код, хоть тестами покрой. В модуле самого сервиса оставь только функции-обертки.
17 h-sp
 
18.08.17
19:16
(15) ну сделай нормальный код

Спр = Документы[name];

что ты какое-то Вычислить? Какой-то херней страдаешь.
18 Самарасофт
 
18.08.17
19:29
(16), (17), Спасибо, будем пробовать.
19 Самарасофт
 
18.08.17
19:49
(17), жаль, но описанное поведение сохранилось
20 breezee
 
18.08.17
19:56
(0) Ну если веб-сервис на стороне 1с - в 1с в конфигурации включите отладку для веб-есрвисов и по f10 проходитесь
21 Asmody
 
18.08.17
20:00
(19) Нет такого документа
22 Самарасофт
 
21.08.17
12:48
(2) Еще раз спасибо за совет. Настроили возврат значимого сообщения.

Для "ЗаказПоставщику":
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
   <soap:Header/>
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Неизвестная ошибка. {Документ.ЗаказПоставщику(297,53)}: Переменная не определена (ФормированиеПечатныхФорм)
по причине:
{Документ.ЗаказПоставщику(297,53)}: Переменная не определена (ФормированиеПечатныхФорм)
по причине:
{Документ.ЗаказПоставщику(297,53)}: Переменная не определена (ФормированиеПечатныхФорм)</faultstring>
         <detail>Неизвестная ошибка. {Документ.ЗаказПоставщику(297,53)}: Переменная не определена (ФормированиеПечатныхФорм)
по причине:
{Документ.ЗаказПоставщику(297,53)}: Переменная не определена (ФормированиеПечатныхФорм)
по причине:
{Документ.ЗаказПоставщику(297,53)}: Переменная не определена (ФормированиеПечатныхФорм)</detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>


Строка 297:
    ОбластьМакета.Параметры.ПредставлениеПоставщика  = ФормированиеПечатныхФорм.ОписаниеОрганизации(УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Поставщик, Шапка.Дата), "ПолноеНаименование,ИНН,КПП,ЮридическийАдрес,Телефоны,");
    


Для "ЗаказПокупателя":
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
   <soap:Header/>
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Неизвестная ошибка. {ОбщийМодуль.ОбщийДляНШ(9,118)}: Переменная не определена (РабочаяДата)
по причине:
{ОбщийМодуль.ОбщийДляНШ(9,118)}: Переменная не определена (РабочаяДата)
по причине:
{ОбщийМодуль.ОбщийДляНШ(9,118)}: Переменная не определена (РабочаяДата)</faultstring>
         <detail>Неизвестная ошибка. {ОбщийМодуль.ОбщийДляНШ(9,118)}: Переменная не определена (РабочаяДата)
по причине:
{ОбщийМодуль.ОбщийДляНШ(9,118)}: Переменная не определена (РабочаяДата)
по причине:
{ОбщийМодуль.ОбщийДляНШ(9,118)}: Переменная не определена (РабочаяДата)</detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>
23 France
 
21.08.17
12:54
(22) расставить галочки "Сервер, Клиент" и тд и тп..
в модуле веб-сервиса указанные переменные не доступны..
24 Вафель
 
21.08.17
12:56
У тебя вообще нельзя объект на сервере создать. Слишком много клиентского кода в модуле
25 Самарасофт
 
21.08.17
13:24
(23) (24) Спасибо. Я правильно понимаю, что данную проблему можно будет решить путем проставления нужных галочек у модулей "Сервер, Клиент, ..." или путем реорганизации кода и добавления конструкций вида "#Если Клиент Тогда"?
26 France
 
21.08.17
13:27
(25) в том числе и проставление галочек... и, не нужно весь код в модуль сервиса.. лучше создать не один общий модуль, и работать через них..
27 France
 
21.08.17
13:27
хотя, может быть есть смысл смотреть в сторону  OData, если нужно работать со всеми объектами 1С..