Имя: Пароль:
1C
1C 7.7
v7: Различные версии одной поделки для разных конфигураций.. Как организовать?
,
0 Dolly_EV
 
31.03.15
09:24
Имеется поделка на 77 к самописной конфе. Вдруг резко потребовалось эту поделку прикрутить к еще двум другим конфам (одна ПУБ, друга совсем не типовая. У исходной конфы - далекие предки Бухгалтерия и ТиС)
Начал прикручивать и задумался - а как сделать универсально? чтобы в итоге потом сопровождать ОДНУ поделку для трех конф, а не ТРИ разные версии?
Проблема понятно в том, что в исходной конфе есть функция "торгПроверкаДоступа(...)", а во вновь прикручиваемой - нету такой функции.
В самой поделке делаю вилку по вариантам конфигураций, но как избежать ругани при синтаксическом контроле (Функция не обнаружена (торгПроверкаДоступа)?
Пытаюсь использовать

лСервис=СоздатьОбъект("Сервис");
лСервис.ДобавитьГлобальныйМодуль(фКаталогЭкспорта+"допГМ.txt");

где, в доп.глобальнике пытаюсь прописать недостающие функции и процедуры - пустышками, но не выходит каменный цветок...Или фишка в том, чтобы доп.глобальник грузить ДО открытия формы поделки?
Кто как вообще подобную задачу решал?
1 fisher
 
31.03.15
09:28
Я х.з, что у тебя за поделка, но вариант как бы очевиден. Разделить универсальный и специфичный функционал. Универсальный поддерживать универсально, специфичный - специфично :) А с поставкой выёживаться не надо. Поставки проще сделать различные.
2 Dolly_EV
 
31.03.15
09:30
+(0) Решение - тащить все недостающие процедуры и функции из ВСЕХ трех конфиг в САМУ поделку - не вариант. Оно очевидно и некрасиво. Так же переписка всех разных мест на ОДИНАКОВУЮ логику опять же в пределах поделки - тоже не вариант: логика местами сильно расходится...
(1) ну так это ТРИ поставки))) чего и хочется избежать
3 fisher
 
31.03.15
09:33
Хотя, если у тебя получится грузить специфичные блоки универсально через неведомую мне хрень "ДобавитьГлобальныйМодуль" - то тоже вполне ничего.
(2) Стопудово можно переписать так, что ядро будет универсальное.
4 Dolly_EV
 
31.03.15
09:33
неведомая хрень "ДобавитьГлобальныйМодуль" - это formex.
5 Dolly_EV
 
31.03.15
09:34
вот про него тащемта и вопрос... ибо именно "ДобавитьГлобальныйМодуль" раньше не пользовал, тем более в таком контексте
6 fisher
 
31.03.15
09:36
(4) Ну, я уже давно уже забыл 7.7 как страшный сон. formex юзал только для раскраски и управления формами.
А если у тебя не будет основного универсального ядра, то толку не будет. Может оказаться проще сопровождать три поделки.
7 Dolly_EV
 
31.03.15
09:37
(6) да ядро-то как раз есть, основное и универсальное. разница - в мелочах.. и из-за мелочей все распадается на три поставки. А их светит поддерживать и дорабатывать (((
8 fisher
 
31.03.15
09:39
(7) Ой, я тебя умоляю. Два раза скопипастить обновленное универсальное ядро. А остальное хоть так, хоть эдак делать придется.
9 fisher
 
31.03.15
09:41
Если получится обойтись без копипасты - то хорошо, конечно.
10 Dolly_EV
 
31.03.15
09:42
(8) не, не совсем так.. ядро есть, но оно не совсем универсальное)). Т.е. его просто так не скопипастишь без допила на две другие конфы
11 Гёдза
 
31.03.15
10:10
Шаблон("торгПроверитьЛяЛяЛя")
12 Dolly_EV
 
31.03.15
10:12
(11) угу.. думал в этом направлении.. но тоже как-то не комильфо
13 fisher
 
31.03.15
10:17
(10) Воот. А надо сделать совсем универсальное. Это вполне реально. Ессно, придется реструктурировать.
14 ADirks
 
31.03.15
11:02
Если можно подключить 1С++, то код от синтакс-анализатора можно запрятать в ВыполняемыйМодуль.
15 Dolly_EV
 
31.03.15
15:52
(14) Алексей, имеешь ввиду запихать все "ветвящиеся моменты" в несколько выполняемых модулей?
16 Dolly_EV
 
31.03.15
15:53
(14) не понял я, можно по-подробнее?
17 Dolly_EV
 
31.03.15
16:51
Тема, она вот она: http://www.1cpp.ru/forum/YaBB.pl?num=1202810577/0
но без окончания ((
18 Ёпрст
 
31.03.15
16:59
Все списифические функции в ВМ залепить и привет, далее проверка их наличия через исключения ВМ.. всё, если есть исключение - загрузить, нет исключения - ничего не делать
19 Гёдза
 
31.03.15
17:18
Твоя поделка использует 1сpp для своих целей?
20 Dolly_EV
 
31.03.15
17:19
(19) клюшки без 1cpp по-моему нельзя использовать))

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

(18) "далее проверка их наличия через исключения ВМ" вот это как? не работал я с "ВыполняемыйМодуль"
21 Dolly_EV
 
31.03.15
17:32
(18) Ёпрст! Сказавши А, скажи Б))) Последний пинок в нужном направлении!
про "исключения"!

Хелп читаю про "ВыполняемыйМодуль" - как-то там не понятно...
и у "РазрешитьИсключения" и у "ВыполнитьПроцедуруКонтекста" - в als - одно и тоже описалово от последней...
22 Ёпрст
 
31.03.15
17:32
(20) далее в попытке компилируешь модуль, если не успешно - грузишь его.
23 Dolly_EV
 
31.03.15
17:32
а в самом модуле что пишу?
24 Dolly_EV
 
31.03.15
17:33
+(23) на примере "торгПроверкаДоступа()"
25 Ёпрст
 
31.03.15
17:36
пример проверки, есть ли переменная модуля:

    Модуль = СоздатьОбъект("ВыполняемыйМодуль");
    Модуль.УстановитьМодуль("т = глПеременнаяМодуля");
    Попытка
        Модуль.КомпилироватьМодуль();
    Исключение
        Серв = СоздатьОбъект("Сервис");
        Серв.ДобавитьГлобальныйМодуль(ТекстГлобальничка);
    КонецПопытки;
26 Ёпрст
 
31.03.15
17:37
(24) для проц и функций - аналогично
27 Dolly_EV
 
31.03.15
17:41
(25) чего-то как-то громоздко...
Хочется ОДИН раз заменить "глПеременнаяМодуля" на ВМ.глПеременнаяМодуля
потом в ВМ чего-нить прописать и вообще забыть про "глПеременнаяМодуля"
28 Dolly_EV
 
31.03.15
17:44
....но при этом в ВМ для той конфы, где есть глПеременнаяМодуля - оно и возвращалось/выполнялось. А где нет - ничего не делалось и не падало.
29 Dolly_EV
 
31.03.15
17:45
//======================================================================
Функция торгПроверкаДоступа(ОбъектМФ,СписПроверок,Конт) Экспорт
    Если лИДКонф="БИТ" Тогда
        //вот здесь как вызвать "родную" торгПроверкаДоступа() ??
    ИначеЕсли     лИДКонф="ОПТОВИК" Тогда
        //нету
        Возврат 1;
    ИначеЕсли     лИДКонф="ПУБ" Тогда
        //нету
        Возврат 1;
    КонецЕсли;    
КонецФункции // торгПроверкаДоступа(ОбъектМФ,СписПроверок,Конт)
30 Dolly_EV
 
31.03.15
17:48
+(29) а где-то надо будет не просто ничего не делать ,а перенаправить вызов в другое место...
31 Ёпрст
 
31.03.15
17:55
Ничего не понял, что надо и что мешает через вм скомпилировать модуль с вызовом процы, и если компиляция не успешная - загрузить доп глобальник с ней. Всё
32 Dolly_EV
 
31.03.15
18:03
(31) Да схема "внедрения" не до конца ясна.
Вот у меня сейчас есть готовая поделка на конфе "БИТ"
Беру конфу "ПУБ", открываю в ней поделку, жму Синтаксический контроль - мне вываливается, что
Если торгПроверкаДоступа<<?>>(ОбъектМФ,СписПроверок,Контекст)=0 тогда
{D:\BASES\_....ERT(1232)}: Функция не обнаружена (торгПроверкаДоступа). Для этогно конкретного случая мне надо, чтобы для "БИТ" эта функция работала, для остальных - не надо ничего делать

Дальше мои действия? Я хочу дописать ВМ.торгПроверкаДоступа
и перейти к следующей ошибке... вот в ВМ как обработать теперь торгПроверкаДоступа для трех вариантов?
33 Dolly_EV
 
31.03.15
18:10
Следующая ошибка:
Процедура не обнаружена (глДокументУстановкаНомера)

Для этого случая мне надо, чтобы для "БИТ" эта процедура работала, для "ПУБ" - перенаправилась в другую процедуру, для "ОПТОВИК" - ничего не происходило.
Я хочу написать в основной поделке "ВМ.глДокументУстановкаНомера(...)" и забыть это место, а в ВМ обработать по вилке...
34 Ёпрст
 
31.03.15
18:16
Всё просто, все критичные места проверить через вм. чего не хватает - добавить через доп глобальник.
Далее, все вызовы лепить через шаблон
35 Ёпрст
 
31.03.15
18:16
или еще как
36 Ёпрст
 
31.03.15
18:16
всё
37 Ёпрст
 
31.03.15
18:16
и будет полный синтаксис контроль и всё на свете
38 ADirks
 
01.04.15
08:00
ну как-то так


ункция Модуль(Конт, ТекстМодуля) Экспорт
    Модуль = СоздатьОбъект("ВыполняемыйМодуль");
    Модуль.УстановитьМодуль(ТекстМодуля);
    Модуль.НазначитьКонтекст(Конт);
    Модуль.КомпилироватьМодуль();
    Модуль.ВыполнитьМодуль();
    Возврат Модуль;
КонецФункции


Процедура _()
    Если Конфа = "БИТ" Тогда
        вм = Модуль(Контекст, "
        |Процедура УстановкаНомера(Конт)
        |    глДокументУстановкаНомера(Конт);
        |КонецПроцедуры
        |");
    ИначеЕсли Конфа = "ПУБ" Тогда
        вм = Модуль(Контекст, "
        |Процедура УстановкаНомера(Конт)
        |    глДокументУстановкаНомера_ПУБ(Конт);
        |КонецПроцедуры
        |");
    Иначе
        вм = Модуль(Контекст, "
        |Процедура УстановкаНомера(Конт)
        |КонецПроцедуры
        |");
    КонецЕсли;
    
    вм.УстановкаНомера(Контекст);
КонецПроцедуры
2 + 2 = 3.9999999999999999999999999999999...