Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Как обойти без ошибки отсутствие в конфигурации требуемой процедуры

Я
   Злопчинский
 
Ведущий
11.04.17 - 22:34
например, в открываемой обработке есть код типа:
Чтото= глПредставлениеДокумента1(Докум.ДокОснование);//отсылка к глобальному модулю, в конфигурации процедуры может не быть



чтобы:
1. при открытии обработки не вывалилось в синт.ошибку
2. понять, что процедуры нет и выполнить альтернативный код
?

что-то типа
СтрокаКода = "[глПредставлениеДокумента(Докум.ДокОснование)]";
ДокументРасчета = Шаблон(СтрокаКода);//тут вываливает в табло сообщение... надо этого избежать

Если ДокументРасчета = СтрокаКода Тогда 
  //здесь алтернативный код, все норм

  ДокументРасчета = Докум.ДокОснование; 
КонецЕсли;
 
 
   ТакВотЖе
 
1 - 11.04.17 - 22:44
по моему никак
   Злопчинский
 
Ведущий
2 - 12.04.17 - 00:00
(1) неудовлетворительный ответ
должен, должен быть вариант! (без ВК)
   AlexYurg
 
3 - 12.04.17 - 00:16
Попытка-Исключение разве не поможет?
   novichok79
 
4 - 12.04.17 - 00:18
в БСП есть по-моему, ОбщийМодуль.Найти, или как-то так.
   novichok79
 
5 - 12.04.17 - 00:18
(4) но это уже 8.3, для 7.7 такого нет
   Salimbek
 
6 - 12.04.17 - 00:19
(2)(3) Там же платформа еще на запуске обработки проведет синтаксический контроль и ругнется на ошибку. Обернуть запуск в Попытку можно, конечно, только что потом с ней делать...
   Злопчинский
 
Ведущий
7 - 12.04.17 - 00:31
вот запуск в попытку обернуть не надо. все д.б внутри обработки
   Torquader
 
8 - 12.04.17 - 01:22
Тут две проблемы:
1) В 7.7 нет команды выполнить, то есть весь код нужно или вызывать через шаблон (что не всегда приятно) или писать явно в коде.
2) Если в коде есть ссылка на процедуру или функцию, которой нет, то выдаётся ошибка компиляции - и никак повлиять на поведение транслятора нельзя.
Если мы хотим проверить наличие глобальной процедуры в конфигурации (проверку локальной процедуры производить бессмысленно так как если процедуры нет в коде, то его автор - дятел), то можно сделать следующее - с помощью записи двоичных данных через сценарий на VbScript, вызываемый через MsScriptControl, записать файл внешней обработки с процедурой, в которой вызывается данная функция. После этого остаётся только открыть эту обработку, в процедуре которой ПриОткрытии устанавливается СтатусВозврата(0) и меняется объект, переданный, как параметр открытия - тогда пользователь обработку не увидит, а по изменению объекта в параметры мы сможем понять - выполнялась обработка или нет (то есть компилировался ли модуль нашей обработки или вызвал ошибку компиляции).
Вот и всё.
   Злопчинский
 
Ведущий
9 - 12.04.17 - 01:33
(8) то есть никак.. придется смириться с тем, что работает как надо, но не удастся избавиться от выдачи в табло сообщения.?
   Torquader
 
10 - 12.04.17 - 01:54
(9) Табло сообщений можно закрыть после выдачи.
 
 
   Злопчинский
 
Ведущий
11 - 12.04.17 - 03:02
(10) Можно, но это неспортивно
   Злопчинский
 
Ведущий
12 - 12.04.17 - 03:03
(10) хм, а без ВК как закрыть табло?
   NSSerg
 
13 - 12.04.17 - 03:06
(12) Скриптами
   Злопчинский
 
Ведущий
14 - 12.04.17 - 03:08
(13) это я знаю, но это неспортивно - ведь может же быть вариант что скрипты выключены?
   vcv
 
15 - 12.04.17 - 05:35
Шаблон нужен, что бы обойти синтаксический контроль. А выводит в окно сообщений, как я понимаю, ошибку, когда функции нет? Тут только проверять, в какой конфигурации запущено и по конфигурации предполагать, есть ли функция.
Типа
Если Метаданные.Регистр("ОстаткиТМЦ").Выбран() = 1 Тогда
  // Это ТиС

   СтрокаКода = "[глПредставлениеДокумента(Докум.ДокОснование)]";
Иначе
   СтрокаКода = Докум.ДокОснование.Вид()+" "+Докум.ДокОснование.НомерДок;
КонецКода
   Рэйв
 
16 - 12.04.17 - 06:49
Попытка
    Выполнить("ТвояПроц()");
Исключение
    Выполнить("Другое()");
КонецПопытки;
   Рэйв
 
17 - 12.04.17 - 06:49
аа..77.
Тогда сторно
   Злопчинский
 
Ведущий
18 - 12.04.17 - 12:32
(15) в типовых есть глИдентификаторКонфигурации() - но тут масло масленое получается... ;-)

В принципе, ладно, через шаблон слома проги не идет - максимум в табло сообщение об ошибке - это известно где выдается и когда выдается - можно в табло плюнуть следом сообщение типа
"Ошибка некритичная, можно работать дальше..."
   Vladal
 
19 - 12.04.17 - 12:41
(18) глИдентификаторКонфигурации не из типовой константы берет результат?
Если да, то почитай в Метаданных конфигурации её идентификатор.
Если нет, то как раз на результат типовой и ориентируйся.
   Ёпрст
 
20 - 12.04.17 - 12:42
(0) есть обход , штатно
   Ёпрст
 
21 - 12.04.17 - 12:42
инициализация переменной или неявная инициализация в условии
   NSSerg
 
22 - 12.04.17 - 21:23
(21) Речь ведь не о переменной, а о функции
   Djelf
 
23 - 12.04.17 - 21:41
Можно сделать процедуру Инициализация() в ней проверка через Шаблон и записать результат проверки куда то. Один раз обработка поругается в табло и успокоится.
   Это_mike
 
24 - 13.04.17 - 07:12
хм.
при начале работы вызвать функцию через "шаблон"
если вывалится в ошибку - создать и загрузить глобальный модуль с требуемой функцией/процедурой.
Правда, нужен формекс..
   trad
 
25 - 13.04.17 - 09:08
усилием воли скопипастить глПредставлениеДокумента в модуль обработки
   Это_mike
 
26 - 13.04.17 - 09:27
(25) а если в основной конфигурации оно специфическое?
   trad
 
27 - 13.04.17 - 09:36
(26) если в разных конфигах обработке допускается работать по-разному, то ой
   Это_mike
 
28 - 13.04.17 - 09:41
(27) кстати, я б скопипастил функцию внутрь, и в ней  пытался получить даные от встроенной. если облом - возвращал вычисленныею
   trad
 
29 - 13.04.17 - 09:54
"в ней  пытался получить даные от встроенной"
такой модуль не скомпилится
   Это_mike
 
30 - 13.04.17 - 10:07
(29) через шаблон. или формексом...
   Ёпрст
 
31 - 13.04.17 - 10:18
(0)Ч через ВыполняемыйМодуль скомпилить в попытке, если удача - функция есть, неудача - нема.
   Ёпрст
 
32 - 13.04.17 - 10:18
но, это если религия позволяет 1cpp пользовать
   Ёпрст
 
33 - 13.04.17 - 10:22
Тип того



Модуль = СоздатьОбъект("ВыполняемыйМодуль");
Модуль.УстановитьМодуль("т = глПредставлениеДокумента(""Вася"")");
Попытка
    Модуль.КомпилироватьМодуль();
Исключение
    Серв = СоздатьОбъект("Сервис");
    Серв.ДобавитьГлобальныйМодуль(ТекстГМ); 
КонецПопытки;

в ТекстГМ добавишь свою глПредставлениеДокумента
 
  Рекламное место пустует
   trad
 
34 - 13.04.17 - 11:24
(30) через шаблон - будет сообщение об ошибке
ВК ТС не хотит
все это выше сказано
   Злопчинский
 
Ведущий
35 - 13.04.17 - 11:48
ок. всем спасибо.
вопрос считаем закрытым.
   Djelf
 
36 - 13.04.17 - 18:43
(35) Чего это закрываем?
Раз надо штатно значит штатно
Используем пустую форму с тз (чтобы не текло) и #ЗагрузитьИзФайла ПроверкаПроцедуры.txt
Функция   ЕстьПроцедураГМ(ИмяПроцедуры,КоличествоПараметров)
    Перем Путь,Имя;
    
    РасположениеФайла(Путь,Имя);
    ФС.УстТекКаталог(Путь);

    ТекстПараметров="";
    Для ии=1 По КоличествоПараметров Цикл
        ТекстПараметров=ТекстПараметров+?(ТекстПараметров="","",",")+ии;
    КонецЦикла;

    ТекстОбработки=СоздатьОбъект("Текст");
    ТекстОбработки.ДобавитьСтроку("
    |Процедура ПриОткрытии() СтатусВозврата(0); КонецПроцедуры
    |"+ИмяПроцедуры+"("+ТекстПараметров+")");

    ТекстОбработки.Записать(Путь+"ПроверкаПроцедуры.txt");

    Попытка
        ОткрытьФорму("Отчет",,Путь+"ПроверкаПроцедуры.ert");
    Исключение
        Сообщить("ОписаниеОшибки "+ОписаниеОшибки());
        Возврат 0;
    КонецПопытки;
    Возврат 1;
КонецФункции




Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует