Имя: Пароль:
1C
1C 7.7
v7: Как обойти без ошибки отсутствие в конфигурации требуемой процедуры
,
0 Злопчинский
 
11.04.17
22:34
например, в открываемой обработке есть код типа:
Чтото= глПредставлениеДокумента1(Докум.ДокОснование); //отсылка к глобальному модулю, в конфигурации процедуры может не быть


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

что-то типа

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

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



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

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

Функция   ЕстьПроцедураГМ(ИмяПроцедуры,КоличествоПараметров)
    Перем Путь,Имя;
    
    РасположениеФайла(Путь,Имя);
    ФС.УстТекКаталог(Путь);

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

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

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

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