Ошибка при вызове метода контекста wsпрокси

Доброго времени суток! Создаю WSПрокси для  работы с веб-сервисом, описанным в wsdl-файле. Объект создается, создаются объекты описанны[ типов объектом ФабрикаXDTO, все заполняется. Написано в руководстве, что запрос должен отправляться в форме SOAP-запроса. Я так поняла WSПрокси сам создает структуру этого запроса, остается только передать созданный объект как параметр метода. Но почему-то при попытке вызова метода ошибка вылазит. Вот код:

Определение = Новый WSОпределения(«file:///C:/Users/AUBashinskaya/Desktop/TLConnect.svc»);

    Сервис = Определение.Сервисы[0];

    Прокси = Новый WSПрокси(

    Определение,

    «https://www.travelline.ru/Api/TLConnect»;,

    «TLConnectService»,

    «BasicHttpBinding_ITLConnectService»

    );

    Прокси.Пароль = «PERc0IDUfbPTolsiDglM»;

    Прокси.Пользователь = «pms1cbit»;

    Фабрика = Прокси.ФабрикаXDTO;

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

        …

       ТипФ = Фабрика.Тип(«http://www.opentravel.org/OTA/2003/05»;,    «OTA_HotelAvailRQ»);

    Объект = Фабрика.Создать(ТипФ);

    Объект.AvailRequestSegements = AvailRequestSegements;

        Прокси.HotelAvailRQ(Объект); //тут возникает ошибка

Текст ошибки:

{Обработка.БИТ_Отель_TravelLine.МодульОбъекта(96)}: Ошибка при вызове метода контекста (HotelAvailRQ)

    Прокси.HotelAvailRQ(Объект);

по причине:

Ошибка вызова операции сервиса:  {https://www.travelline.ru/Api/TLConnect}:TLConnectService:HotelAvailRQ()

по причине:

Неизвестная ошибка. Ошибка работы с Интернет:  Couldn’t resolve host name

по причине:

Ошибка работы с Интернет:  Couldn’t resolve host name

Может быть надо указывать какие-то еще параметры? wsdl:

https://www.travelline.ru/Api/TLConnect.svc?singleWsdl

Содержание статей: 1С:Предприятие 8. Веб-сервисы
Предыдущая статья: 1С:Предприятие 8. Веб-сервисы. Введение

Для создания самого простого веб-сервиса необходимо:

  1. создать в дереве метаданных объект Web-Сервис;

  2. указать его URI пространства имен;
  3. создать необходимую операцию, если нужно указать ее параметры и тип возвращаемого значения;
  4. написать обработчик вызываемой операции;
  5. опубликовать веб-сервис.

После этих действий веб-сервисом можно будет пользоваться. Таким образом будет создан веб-сервис, который сможет оперировать только простыми типами данных. 

Итак начнем.

Откройте конфигурацию и в дереве метаданных найдите ветку «Общие — Web-сервисы». Нажмите правой кнопкой и добавьте новый элемент.

Реализация веб-сервиса в 1с

Введите имя создаваемого веб-сервиса.

Имя веб-сервиса можно задать русское. И платформа его сохранит и опубликует, но рекомендую использовать латиницу в названиях веб-сервисов,  ws-операций, параметров ws-операций. Например, chrome не смог отобразить wsdl файл веб-сервиса с русским именем.
Перейдите на вкладку  «Прочее» и укажите параметр «URI пространство имен».

Реализация веб-сервиса в 1с

Введите имя создаваемого веб-сервиса.

Имя веб-сервиса можно задать русское. И платформа его сохранит и опубликует, но рекомендую использовать латиницу в названиях веб-сервисов,  ws-операций, параметров ws-операций. Например, chrome не смог отобразить wsdl файл веб-сервиса с русским именем.
Перейдите на вкладку  «Прочее» и укажите параметр «URI пространство имен».

Реализация веб-сервиса в 1с

В документации об этом параметре написано чуть больше чем ничего, примерно то, что это поле служит для идентификации вашего веб-сервиса. Когда я делал свой первый веб-сервис, мне казалось что это ссылка на сайт, на котором я публикую свой веб-сервис и все наименования буду получаться через запрос к этому сайту. На самом деле «URI пространство имен» не что иное как строка определяющая название набора ваших имен (названий веб-сервиса, операций, параметров, типов данных и т.д.). То есть если вы объявите свой тип «integer» то xml-парсер не будет ругаться, так как этот тип принадлежит вашему пространству имен. Мало того если «URI пространство имен» будет содержать русские символы и не будет соответствовать стандарту как формат URI, платформа все равно опубликует такой веб-сервис, и он будет работать. Но по стандартам рекомендуется использовать URI ссылку. Я советую того же самого.
Простое и понятное объяснение пространства имен можно прочитать тут.

Поле «Пакеты XDTO» не обязательное. Оно определяет набор пакетов XDTO в которых вы можете оказать свои типы значений. Это не обязательное поле, по умолчанию вам всегда доступны типы пространства имен «http://www.w3.org/2001/XMLSchema». О пакетах XDTO я расскажу чуть позже.

«Имя файла публикации», это имя файла, в котором хранятся настройки веб-сервиса для Apache(путь к базе и другие) после публикации. Папка, в которой находится этот файл, определяется при публикации. О публикации на веб-сервере будет рассказано позже.

Веб-сервис создан, но еще нет ни одной функции которую он мог бы исполнить. Надо добавить операцию. Для этого добавьте в созданный веб-сервис операцию. Нажмите не веб-веб-сервис правой кнопкой и выберите «Добавить-Операция». Она будет к вашему операнду прибавлять 2 и возвращать значение. Давайте назовем ее «Plus2». Можно указать и русское название, многие клиенты его обработают, но все же могут возникнуть проблемы. 

Реализация веб-сервиса в 1с

«Тип возвращаемого значения» это тип описанный в указанном вами пакете XDTO или же тип из пространства имен «http://www.w3.org/2001/XMLSchema». Именно в этом типе веб сервис будет возвращать значение.
«Возможно пустое значение» признак что ws-операция может не вернуть значение(nillabletrue«).
«В транзакции» указывает что код веб-сервиса будет выполняться в транзакции. А «Режим управления блокировкой данных» определяет тип блокировки данных при транзакции по умолчанию.

Установим тип возвращаемого значения в int. В поле «Имя метода» укажем имя «Plus2» для нового метода, который будет выполнять обработку. При нажатии на лупу метод будет автоматом создан в модуле веб-сервиса.
Напишем простой код.


Функция Plus2(Параметр)
Возврат Параметр+2;
КонецФункции

Вы заметили что на входе функции у нас есть параметр «Параметр». Для того что бы в метод этот параметр был передан надо добавить его в дереве метаданных. Для этого щелкните правой кнопкой по веб-операции Plus2 и выберите «Добавить-Параметр».

Реализация веб-сервиса в 1с

«Тип возвращаемого значения» это тип описанный в указанном вами пакете XDTO или же тип из пространства имен «http://www.w3.org/2001/XMLSchema». Именно в этом типе веб сервис будет возвращать значение.
«Возможно пустое значение» признак что ws-операция может не вернуть значение(nillabletrue«).
«В транзакции» указывает что код веб-сервиса будет выполняться в транзакции. А «Режим управления блокировкой данных» определяет тип блокировки данных при транзакции по умолчанию.

Установим тип возвращаемого значения в int. В поле «Имя метода» укажем имя «Plus2» для нового метода, который будет выполнять обработку. При нажатии на лупу метод будет автоматом создан в модуле веб-сервиса.
Напишем простой код.


Функция Plus2(Параметр)
Возврат Параметр+2;
КонецФункции

Вы заметили что на входе функции у нас есть параметр «Параметр». Для того что бы в метод этот параметр был передан надо добавить его в дереве метаданных. Для этого щелкните правой кнопкой по веб-операции Plus2 и выберите «Добавить-Параметр».

Реализация веб-сервиса в 1с

Давайте назовем его «Param». Названия параметров тоже можно указывать русскими, мало того  класс SoapClient языка PHP работает с ними корректно, ведь параметры передаются через массив. Желательно использовать кодировку UTF-8.

Укажем «Тип значения» int из пространства имен «http://www.w3.org/2001/XMLSchema».

Свойство «Возможно пустое» указывает что можно передать значение null в веб-операцию.

«Направление передачи» указывает по значению или по «ссылке» передается операнд в ws-операцию. Возможные значение «Входной», «Выходной», «Входной-Выходной». Таким образом если вы для параметра укажете «Выходной» или «Входной-Выходной» то сможете менять значения операнда. В результате xml сообщение-ответ дополнится строкой с новым значением операнда. Я пока не сталкивался с задачами которые можно решить только используя Выходное направление операнда, потому не могу дать какие то комментарии по этому свойству.


Вот в принципе и всё! Веб сервис создан, но существует он пока что только как описание в вашей конфигурации. Для того что бы им воспользоваться надо его опубликовать на вашем веб-сервере. Как опубликовать вы можете прочитать в статье 1С:Предприятие 8. Веб-сервисы. Публикация и тестирование.

доброго времени суток всем! у меня возникла следующая проблема при создании WS-ссылки: в конфигураторе создается, но при проверке в режиме исполнения выдает ошибку: {Обработка.пример.Форма.Форма.Форма}: Ошибка при вызове метода контекста (СоздатьWSПрокси)     ПроксиСервер = WSСсылки.WSСсылка2.СоздатьWSПрокси( «;, «WebService», » WebServiceSoap» ); по причине: Порт не найден. {: WebServiceSoap прочитала кучу статей на форумах, в том числе и здесь, проверила регистр, с ним все нормально. подскажите, пожалуйста,а то руководитель меня морально съест(

точка с запятой там точно надо?

«;,  там нет точки с запятой ни в конфигураторе,ни в ошибке

видно, в сообщении при отправке автоматом прибавляется

в версии 8.3 синтаксис: СоздатьWSПрокси(<URIПространстваИменСервиса>, <ИмяСервиса>, <ИмяПорта>, <ИнтернетПрокси>, <Таймаут>, <ЗащищенноеСоединение>)

первые три параметра являются обязательными

здравствуйте еще раз. в процессе создания WSпрокси возник следующий вопрос: {Обработка.пример.Форма.Форма.Форма}: Ошибка при вызове конструктора (WSОпределения) Определения = Новый WSОпределения(«;, «Системный администратор», «»); по причине: При создании описания сервиса произошла ошибка.

Сделай пользователя без пробела.

попробовала,выдает ту же ошибку

ну, про точку с запятой, уже говорили?

и кавычки внутри кавычек.

«WebServiceSoap», там пробел был лишний…извиняюсь за свой чудовищный затуп(( кстати,кавычки добавляются сами при копировании сюда кода

теперь сообщает,что {Обработка.пример.Форма.Форма.Форма}: Ошибка при вызове метода контекста (Обмен) РезультатыИмпорта = Прокси.Обмен; по причине: Ошибка вызова операции сервиса:  {:Обмен по причине: Ошибка SOAP сервера:  Обязательное возвращаемое значение не задано:  :Обмен

Н так воспользовался бы ссылкой из 4. Так дай описании :  :Обмен Проверь что возвращает функция например в SoapUI

в соапе при вводе ссылки просит атентификацию, при вводе данных выдает ошибку и не создает проект, пишет Error loading []: org.apache.xmlbeans.XmlException: org.apache.xmlbeans.XmlException: error: Unexpected element: CDAT

WSDLException (at /html): faultCode=INVALID_WSDL: Expected element ‘{‘. — стабильно выдает соап после аутентификации

Ты бы хоть WSDL выложил. Тут ясновидцев мало

— проверяю эту вс-ссылку в соапе, выдает приведенную выше ошибку. в браузере сообщает: This XML file does not appear to have any style information associated with it. The document tree is shown below. <faultstring> Операция не найдена: {:Обмен </faultstring> по-видимому,косяк в функции Обмен , только непонятно,какой, код я сверяла со статьей,по которой делала

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

Посмотри в Оладчике, что тебе Прокси выдает. Какие методы.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Страница 1 из 2

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

    Процедура ПолучитьДанныеСервер()
      
        Попытка
            ОпределениеWS = Новый WSОпределения("test.wsdl");
        Исключение
            ОпределениеWS = Неопределено;
            Отказ = ИСТИНА;
            СообщениеОбОшибке = "Ошибка получения определения сервиса: " + ОписаниеОшибки();
        КонецПопытки;
      
        WSПрокси = Неопределено;
      
        Если ОпределениеWS <> Неопределено Тогда
            Сервис             = ОпределениеWS.Сервисы.Получить(0);
            ИмяСервиса         = Сервис.Имя;
            ТочкаПодключения = Сервис.ТочкиПодключения.Получить(0).Имя;
          
            WSПрокси = Новый WSПрокси(ОпределениеWS, Сервис.URIПространстваИмен, ИмяСервиса, ТочкаПодключения);
            WSПрокси.Пользователь = "user";
            WSПрокси.Пароль       = "password";
            ТипGetSignInfo  = WSПрокси.ФабрикаXDTO.Тип(Сервис.URIПространстваИмен, "GetSignInfo");
            ПараметрыМетода = WSПрокси.ФабрикаXDTO.Создать(ТипGetSignInfo);
            СтрокаBase64    = СоздатьСтрокуBase64(СокрЛП(Параметр));
            //ПараметрыМетода.signature = Base64Значение(СтрокаBase64); Тут я уже всё перетыкал
            ПараметрыМетода.signature = СокрЛП(Параметр);//Base64Значение(СокрЛП(Параметр));
            //ПараметрыМетода.content   = ""; - необязательный параметр, не заполняем
            ОбластьВывода = WSПрокси.GetSignInfo(ПараметрыМетода);
            // Вот тут и вываливается ОбластьВывода = WSПрокси.GetSignInfo(ПараметрыМетода);
        КонецЕсли;
    
    
    КонецПроцедуры
    
    
    Функция СоздатьСтрокуBase64(Строка) Экспорт
        ВременныйФайл = ПолучитьИмяВременногоФайла();
        ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, "CESU-8");
        ЗаписьТекста.Записать(Строка);
        ЗаписьТекста.Закрыть();
        ДД_Файла = Новый ДвоичныеДанные(ВременныйФайл);
        СтрокаBase64 = Base64Строка(ДД_Файла);
        УдалитьФайлы(ВременныйФайл);
        Возврат СтрокаBase64;
    КонецФункции

    Вылетает с ошибкой:
    {Форма.Форма.Форма(37)}: Ошибка при вызове метода контекста (GetSignInfo)
    ОбластьВывода = WSПрокси.GetSignInfo(ПараметрыМетода);
    по причине:
    Ошибка вызова операции сервиса: {urn:interface}:interfacePublicService:GetSignInfo()
    по причине:
    Неизвестная ошибка. Ошибка при вызове метода объекта модели XDTO.
    Неверный параметр.
    по причине:
    Ошибка при вызове метода объекта модели XDTO.
    Неверный параметр.

    Скриншот из дерева конфигурации:
    Ветка «Web-сервисы» — http://gyazo.com/36d8eed9ba85d2cf4f941ee32f1da03d
    Ветка «Типы объектов» модели данных — http://gyazo.com/df4b6fa8d1a63b1b2323a0457ada7199
    У обоих параметров тип одинаковый, но content не обязателен для заполнения.

    Саму ссылку просили не сбрасывать, надеюсь удастся решить проблему без неё…

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

    В чём может быть проблема? Как правильно передавать/преобразовывать строку в формат «base64Binary (http://www.w3.org/2001/XMLSchema)«, вроде уже все варианты перекастовал, все танцы с бубном отплясал, а всё равно вылетает одна и та же ошибка.

    Последнее редактирование: 24 мар 2016
  2. Решил поиграться с : «Новый ЗаписьТекста(ВременныйФайл, «CESU-8»)«, перепробовал все кодировки, единственное чего удалось добиться — изменение ошибки на:

    {Форма.Форма.Форма(37)}: Ошибка при вызове метода контекста (GetSignInfo)
    ОбластьВывода = WSПрокси.GetSignInfo(ПараметрыМетода);
    по причине:
    Ошибка вызова операции сервиса: {urn:interface}:interfacePublicService:GetSignInfo()
    по причине:
    Ошибка SOAP сервера: Подпись не верна

    P.S. В SoapUI всё отрабатывает правильно

  3. Может кто-нибудь подскажет сервисы, где в качестве параметра нужно передавать тип base64Binary (http://www.w3.org/2001/XMLSchema) ?
    Хочу понять это у меня руки из булок растут или просто сервис с 1С не дружит.

    Может быть есть какие-нибудь способы проверить правильность моей итоговой кодировки?

    Последнее редактирование: 24 мар 2016

  4. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

    А если самому в 1С-ке создать пустую конфигурацию, сделать в ней веб-сервис и попробовать погонять данные?

  5. Вообще не понял как таким образом можно проверить корректность преобразования строки в формат base64Binary.
    Поясните плз


  6. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

    На сколько понял суть проблемы:есть какие-то сложности с передачей значения типа Base64Binary во входной параметр функции удаленного веб-сервиса, так?

  7. Видимо да… Ошибки выше указаны.
    Или проблема с кодировкой, хоть как и указывал выше перепробовал, как мне кажется все.


  8. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

    1С-ка умеет только Base64Значение и Base64Строка.

    Так понимаю, в параметр функции веб-сервиса нужно пихать Base64Значение, т.е. передаваться должно значение типа ДвоичныеДанные, а не строка.


  9. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

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

    ЗначениеСтроквогоТипа = «hello, world!»;

    WebService.Func.Parameter = base64Значение(ЗначениеСтроковогоТипа)

    ?

    так мож проблемы не в этом, а в том, что нужно еще чего-то запихать в параметры функции удаленного Web-сервиса?

  10. Есть ещё второй параметр, но он не обязательный, я его вообще не заполняю, либо заполняю как «» — пустая строка, а ошибки все равно те же


  11. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

    Какой тип значения этого параметра?

  12. В самом верху всё уже расписал) — «У обоих параметров тип одинаковый, но content не обязателен для заполнения.»


  13. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

    Вот не нужно придумывать :)
    Если тип значения определен, то в него и нужно пихать пустое значение этого типа. Это ж — SOAP, структура передаваемых данных — фиксированная.

  14. При перпедаче пустой строки параметр автоматом заполняется пустыми двоичными данными
    Как иначе создать пустые двоичные данные?

  15. Создал пустые двоичные данные по тому же принципу — ПараметрыМетода.content = Base64Значение(СоздатьСтрокуBase64(«»));
    Результат тот же.


  16. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.876
    Симпатии:
    1.027
    Баллы:
    204

    Ну тада х.з.. Общайся с ТП удаленного Web-сервиса :)


  17. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Хочу заметить, что 1С не совсем корректно работает с некоторыми web-сервисами :)

  18. А как определить степень корректности если это вообще возможно?)))))

    — Объединение сообщений, 24 мар 2016

    Повторю вопрос: Может кто-нибудь подскажет сервисы, где в качестве параметра нужно передавать тип base64Binary (http://www.w3.org/2001/XMLSchema) ?
    Тогда уже точно бы понимал что косяк мой/1с/сервиса)))


  19. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    1С недоразвита в плане общения как с новыми технологиями, так и со старыми :)

Страница 1 из 2


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

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

Исправляем ситуацию

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

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

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

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста write
  • Ошибка при вызове метода контекста worksheets 1c
  • Ошибка при вызове метода контекста windows
  • Ошибка при вызове метода контекста sheets
  • Ошибка при вызове метода контекста send произошла исключительная ситуация