Имя: Пароль:
1C
1C 7.7
v7: Как сделать переопределение функции?
, ,
0 Злопчинский
 
14.07.20
13:00
Например, в типовых конфигах есть экспортная глобальная процедура
.
глИдентификаторКонфигурации();
.
допустим, есть универсальная обработка где необходимо получить идентификатор конфигурации.
для типовой конфиги будет ОК.
.
а для нетиповой? чтобы например типа
если есть глобальная экспортная процедура - то выполняется она, а если нет - то выполнить процедуру с таким же именем из кода обработки?
1 Serginio1
 
14.07.20
13:09
попытка
исключение
2 Ёпрст
 
14.07.20
13:20
(0) через выполняемый модуль в попытке компилируешь, если не удача, процы нет
3 Ёпрст
 
14.07.20
13:20
(1) так не катит, будет ошибка синтаксиса сразу
4 Злопчинский
 
14.07.20
13:22
(3) ошибки не будеь, если есть локальная процедура с таким же именем.. но это не поможет
5 Злопчинский
 
14.07.20
13:22
(2) это уже на крайняк...
6 Сияющий Асинхраль
 
14.07.20
13:24
Аааа... Забыл семерку, но можно ведь было прочитать идентификатор конфигурации: "Бухгалтерский учет, редакция 4.5" и даже релиз из комментария. Учитывая количество типовых это вполне можно обработать без Попытки...
7 Ёпрст
 
14.07.20
13:27
(5) почему крайняк ? кроме шаблона, у тебя штатно ничего нет
Вот наличие глоб переменной лекгко проверить, через ф=ф;
8 Злопчинский
 
14.07.20
13:28
(7) а шаблон тут как?
9 Злопчинский
 
14.07.20
13:28
(7) это понятно, с этим еще фича есть, если использовать неинициализированную переменную
то
а=а/0; нифига исключения не даст
10 Злопчинский
 
14.07.20
13:30
(6) до этого я сам минут 10 назад дошел ;-)
но это не факт, заголовок могут поменять адски, хотя внутрях танцевать от типовой...
11 Сияющий Асинхраль
 
14.07.20
13:35
(10) Ну, если уж заголовок конфы поменяли, значит уже нетиповая :-(
Просто это, по сути, единственный вариант без использования Попытки (ну не люблю я ее использовать, что в семерке, что в восьмерке). А тут, Метаданные.Идентификатор дает Название конфы, а Метаданные.Комментарий ее релиз. Ну да, ясно, что работает только для полностью типовых, ну тут уж чем-то жертвовать надо, либо попыткой, либо красотой :-(
12 Сияющий Асинхраль
 
14.07.20
13:39
А еще там есть:

Метаданные.АвторРазвернутаяИнформация
Метаданные.АвторКороткаяИнформация

где тоже фигурирует название конфы...
13 Serginio1
 
14.07.20
14:11
(3) А через вычислить?
14 Serginio1
 
14.07.20
14:16
Да давно не брал я в руки семерку. Шаблон же
15 Злопчинский
 
14.07.20
14:20
(13) Не прокатит.
если функции такой нет - даст синтаксическую ошибку, попыткой не экранируется, вернет саму строку шаблона
.
    Попытка Результат = Шаблон("[глИдентификаторКонфигурацииА()]");
    Исключение
        Сообщить("Ошибка "+ОписаниеОшибки());
    КонецПопытки;
    Сообщить(Результат+", "+Метаданные.Идентификатор);
.
глИдентификаторКонфигурацииА<<?>>()
Функция не обнаружена (глИдентификаторКонфигурацииА)
[глИдентификаторКонфигурацииА()], Торговля+Склад, редакция 9.2 (в.2020-06-20-0305)
16 Сияющий Асинхраль
 
14.07.20
14:31
(15) А кстати, а что ты собираешься писать, если конфа нетиповая?
17 vova1122
 
14.07.20
14:32
(0) если есть глобальная экспортная процедура - то выполняется она, а если нет - то выполнить процедуру с таким же именем из кода обработки?

А разве так можно. Стандартное поведение платформы совсем обратное. Сначала ищет процедуру в своем модуле, а если не находит, то экспортную в глобальном.
18 Сияющий Асинхраль
 
14.07.20
14:34
(17) Ну никто же тебе не запрещает в обработке назначить нужной процедуре нужное тебе имя, пусть даже немножко другое, например, локИдентификаторКонфигурации()
19 Serginio1
 
14.07.20
14:37
(15) Ну тогда проще проанализировать Результат.
20 Креатив
 
14.07.20
14:37
(0)Запускай сразу свою процедуру. Она же всё равно есть.
21 Сияющий Асинхраль
 
14.07.20
14:38
+(18) И делать что-то типа:

Функция локИдентификаторКонфигурации()
Попытка
  глИдентификаторКонфигурации()
Исключение
  // ....
КонецПопытки;
КонецФункции
22 Garykom
 
гуру
14.07.20
14:42
Предлагаю свою функцию написать например по набору констант через метаданные ))
23 Aleksey
 
14.07.20
14:44
(21) Процедура не обнаружена (глИдентификаторКонфигурации)
24 Злопчинский
 
14.07.20
14:45
(19) в табло вываливается ошибка, некузяво.
и, блин, где-тоя подымал ветку как подавить в табло сообщение об ошибке, там даже решение было
25 Злопчинский
 
14.07.20
14:45
(21) не прокатит, обработк ане запустится, не пройдет синтаксическйи контроль
26 Сияющий Асинхраль
 
14.07.20
14:45
А, кстати, в Бухе семерочной есть константа "НомерРелиза" ручками не меняется только программно, можно поглядеть есть ли нечто подобное во всех остальных конфах...
27 Сияющий Асинхраль
 
14.07.20
14:46
+(26) Сколько я помню по номерам конфигураций можно было практически однозначно сказать что за конфа...
28 Сияющий Асинхраль
 
14.07.20
14:49
(25) Тут согласен... Лажанулся
29 Ёпрст
 
14.07.20
14:57
Чебур, не ипи мозг, сделай как в (2)  и не парься
30 Злопчинский
 
14.07.20
15:07
(29) это конечно да, но всякре бывает. запрещено использование ВК и все...
31 Ёпрст
 
14.07.20
15:08
(30) делай как я, встраивай все вк в саму поделку, и пофик там на религию индусов
32 Сияющий Асинхраль
 
14.07.20
15:11
(31) А кстати, ВК прокатит под любым пользователем? Не возникнет проблем с правами?
33 trad
 
14.07.20
15:12
(0) перенести глИдентификаторКонфигурации() из типовой в свою универсальную обработку уже предлагали?
34 Сияющий Асинхраль
 
14.07.20
15:14
(33) А ты глядел содержание этой процедурки :-)))
35 Злопчинский
 
14.07.20
15:16
(32) ну, 1С++ и formex - должны прокатить
36 Ёпрст
 
14.07.20
15:18
(32) да, под любым, 1сpp и формекс сто лет в обед не требуют регистрации в реестре
37 Сияющий Асинхраль
 
14.07.20
15:20
(35)(36) Понял. Спасибо.
(35) Но все-таки, что будешь делать, если нетиповая, иными словами что хочешь отследить? Может там достаточно увериться что план счетов есть, или еще что...
38 victuan1
 
14.07.20
15:28
//проверим объявлена ли ф-я глИдентификаторКонфигурации() в гл. модуле
    Попытка
        Модуль = СоздатьОбъект("ВыполняемыйМодуль"); //1С++ был загружен ранее
        Модуль.УстановитьМодуль("т = глИдентификаторКонфигурации()");
    Исключение
        мсообщить("Неудачная попытка использования объекта ""ВыполняемыйМодуль"". Возможно, нужно установить более новую версию 1cpp.dll");
        Возврат 0
    КонецПопытки;
    Попытка
        //Модуль.РазрешитьИсключения();
        Модуль.КомпилироватьМодуль();
        ФункцияглИдентификаторКонфигурацииОбъявлена = 1;
    Исключение
        ФункцияглИдентификаторКонфигурацииОбъявлена = 0;
    КонецПопытки;
39 trad
 
14.07.20
15:29
(34) нет. с типовыми лет 15+ не имел дела ))
40 Сияющий Асинхраль
 
14.07.20
15:33
(39) Просто эта функция состоит из одной строчки, она на уровне кода :-( возвращает с какой типовой конфигурацией мы работаем, бухгалтерия, ТиС, УсН и т.д. По сути вся и задача состоит в том, а как еще можно это определить...
41 trad
 
14.07.20
15:35
(40) а, т.е. ИдентификаторКонфигурации захардкоден (захардкожен?). ясно
42 Злопчинский
 
14.07.20
15:36
(38) спсб
43 Злопчинский
 
14.07.20
15:37
(41) о, сколько нам открытий чудных...
44 trad
 
14.07.20
15:51
(43) нуу, так себе открытие...
45 Garykom
 
гуру
14.07.20
15:59
EvalExpr в попытке не?
46 victuan1
 
14.07.20
17:22
(42) Это код для совета из (2).
47 victuan1
 
14.07.20
17:40
Так что спсб Ёпрсту. Как обычно ;)
48 Djelf
 
14.07.20
18:06
(0) Ну не красиво, но и не критично, если надо без ВК сделать, просто выведи предупреждение, до использования Шаблона что надо поставить галочку "Нестандартная конфигурация" при сбое.
Потом будет как обычно, без этого сбоя.
49 Злопчинский
 
14.07.20
19:40
Всем спасибо.
50 Ёпрст
 
14.07.20
22:31
Вообще в (2), нужно , чтоб проверять, загружен ли доп глобальник формековский, чтоб его повторно не грузить.
Предложил Артур на 1cpp давным давно
51 Ёпрст
 
14.07.20
22:31
Ну и Чебуру, тоже подойдёт
52 Сияющий в темноте
 
14.07.20
23:48
если все равно использовать замену,если нет,то зачем искать-проще соазу считать,что ее нет.

при подключении по Com,точнее по Ole,так как семерка только так умеет,можно получить DispId ыункции,если она есть,если нет то будет ошибка получения Id.
разница с попыткой в том,что попытка ввйдет в исключение,если функция есть,но внутри ее ошибка,а также будет исполнение,чего в случае запроса DispId не будет.
53 Злопчинский
 
14.07.20
23:51
(52) хм.. зачем искать работу (богатым айтишнегом), проще сразу считать что ее нет (или идти грузчиком) ?