8.х Внешнее соединение, получить ОписаниеОшибки()

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем AlexeyKh, 5 сен 2012.

  1. TopicStarter Overlay
    AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    Всем добрый день! Платформа 1С8.2, толстый клиент.

    Пробовал искать информацию по данному вопросу, ничего не нашел, или может быть неправильно формулировал запрос.

    Имеем внешнее соединение с базой 1С, что-то там выполняем в попытке, по ошибке попадаем в исключение.

    Вопрос: Как получить/выполнить из Соединения результат функции ОписаниеОшибки() или
    ИнформацияОбОшибке().

    При попытке выполнить Соединение.ОписаниеОшибки() или Соединение.ИнформацияОбОшибке()
    получем сообщение метод не обнаружен. В СП написано что функции доступны во внешнем соединении.
    В самом сеансе внешнего соединения они работаю, настраивается тестовая печать, результат этих функций выводится в текстовый файл. Может кто знает как (и можно ли вообще) непосредственно из Соединения получить инфорацию об ошибке возникшей в базе внешнего соединения?
  2. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Они и впрямь доступны во внешнем соединении. Но они не доступны со стороны ПО, открывшее внешнее соединение.

    Пример:
    в открываемой БД в модуле ХрюМу есть расшареная функция "ЧихПых"
    Код:
    Функция ЧихПых(ЧеДелить, НаЧеДелить, ОтработалНиштяк, ОписаловоСпотычки) Экспорт
    Попытка
    Результат = ЧеДелить / НаЧеДелить;
    Исключение
    ОтработалНиштяк = Ложь;
    Результат  = Неопределено);
    ОписаловоСпотычки = ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
    КонецФункции // ЧихПых()
    И дергаете вы ее как
    Код:
    ОтказЧихПыха = Истина;
    ЧихПыхИнформ = ""
    РезультЧихПых = БДВнешняя.ЧихПых(100, 0, ОтказЧихПыха, ЧихПыхИнформ);
    Вы получите на выходе в ОтказЧихПыха = Ложь; и в ЧихПыхИнформ - описание отказа.

    А вот если
    Код:
    Функция ЧихПых(ЧеДелить, НаЧеДелить, ОтработалНиштяк, ОписаловоСпотычки) Экспорт
    Результат = ЧеДелить / НаЧеДелить;
    Возврат Результат;
    КонецФункции // ЧихПых()
    То
    Код:
    ОтказЧихПыха = Истина;
    ЧихПыхИнформ = ""
    Попытка
    РезультЧихПых = БДВнешняя.ЧихПых(100, 0, ОтказЧихПыха, ЧихПыхИнформ);
    Исключение
    ЧихПыхИнформ = РезультатЧихПых.ОписаниеОшибки();
    КонецПопытки;
    сфейлит

    Сфелит, как минимум потому, что сбой произошел не в текущей БД, а в другой.

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

    P.S.
    Откровенно мог затупить. Но вроде как так.
  3. TopicStarter Overlay
    AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    Так идея как раз и была использовать внешнее соединение с другой базой для получения информации об ошибки

    Попытка
    РезультЧихПых = БДВнешняя.ЧихПых(100, 0, ОтказЧихПыха, ЧихПыхИнформ);
    Исключение
    ЧихПыхИнформ = БДВнешняя.ОписаниеОшибки(); // а не РезультатЧихПых.ОписаниеОшибки();
    КонецПопытки;[/code]

    почему так нельзя сделать?
  4. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Берем телефон и звоним Пете:
    -Петя, а сходи, заведи мотоцикл!
    Петя кладет трубку на стол, и бежит в гараж заводить мотоцикл. Через какое то время возвращается и говрит
    -Не, глохнет, зараза.
    -А какой звук был?
    -Петя теряется, потому как он не запомнил какой же был звук.

    В кратце:
    1) Потому что не предусмотрено.
    2) Потому что эта встроенная функция не "выведена" наружу (не имеет интерфейса за пределы текущего сеанса).
    3) Потому что из справки

    А => когда управление вернется в программу, вызвавшую исключительную ситуацию, данный метод уже в любом случае вернул бы пустую строку.
    4) А потому что исключительная ситуация возникла не в вашей программе (интерактивном сеансе) а в сторонней (в подключенной 1Ске, но это могла быть и не 1Ска, а все что угодно)
  5. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Без "ВнешняяБД". Просто вызвать ОписаниеОшибки().

    Код:
    Попытка
    РезультЧихПых = БДВнешняя.ЧихПых(100, 0, ОтказЧихПыха, ЧихПыхИнформ);
    Исключение
    ЧихПыхИнформ = ОписаниеОшибки();
    КонецПопытки;
    
  6. TopicStarter Overlay
    AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    сделал как посоветовал УЗА.

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

    //Пример использования функции обработать во внешнем соединении
    ...
    лкРезультат = 0;
    лкСообщение = лкСоединение.Обработать("Параметр = 100 + 200/0",лкРезультат);
    ...
    //ОбъектПользователь объект элемента справочника созданного во внешнем соединении
    лкСообщение = лкСоединение.Обработать("Параметр.Записать()",ОбъектПользователь);

    раньше пытался записать так:

    лкСоединение.ОбъектПользователь.Записать();

    если возникала ошибка, информации об ошибке не было

    теперь если использовать выше описанную конструкцию

    лкСообщение = лкСоединение.Обработать("Параметр.Записать()",ОбъектПользователь);

    если возникает ошибка, есть сообщение об ошибке.

    Всем большое спасибо! Все заработало. Но как-то не верится что разработчики платформы не могли что-то подобное сделать.

Поделиться этой страницей