Имя: Пароль:
1C
1С v8
Как сделать... систему плагинов в 8.2?
0 WDUM
 
25.11.11
13:37
Возникла необходимость сделать желательно довольно гибкую надстройку над 1С УТ 11 (платформа 8.2) которая бы имела нечто общее с системой плагинов в прочих программах.
Суть такова: одна централизованная обработка обрабатывает неким алгоритмом справочник номенклатуры. Алгоритм совершает почти одни и те же действия в целом, но требует для разных классов (назовём пока так - классов, чтобы не путать с терминами из самой конфиги) номенклатуры свой уникальный субалгоритм для данного класса номенклатуры. Причём желательно иметь возможность довольно легко дополнять эту систему новыми классами номенклатуры со своими субалгоритмами. Класс номенклатуры в рамках нашей конкретной задачи имеет вполне вещественный смысл и выделен в отдельный справочник. Хотелось бы максимально эффективно организовать встраивание в систему и собственно вызов вот этого субалгоритма, типа как плагина - иметь в справочнике классов номенклатуры возможность указать что за алгоритм мы будет использовать.
В голову сразу приходят несколько вариантов, но я считаю у них есть глобальные недостатки:
1. в классах номенклатуры завести текстовое поле неограниченной длины, куда прямо писать код субалгоритма, и вызывать его через eval.
жирным минусом я вижу трудность отладки. очень жирный минус.
2. в классах номенклатуры завести поле хранилище и грузить в него в нешнюю обработку, экспортные методы которой в дальнейшем дергать.
минусом я вижу долгое время приведения этого механизма в боеспособное состояние, а методы плагина должны дергаться довольно часто. т.е. буквально идем стандартным перебором по товарам и в зависимости от того какому классу он принадлежит дергаем метод плагина. надо как можно быстрее. кроме того, пока писал уже, дошло, что отладка опять в пролете.
Хотелось бы что-то совсем быстрое и достаточно удобное.
Зрел вариант заводить на каждый класс обработку в модуле менеджера которой экспортировать нужные функции. В справочнике же классов просто указывать имя обработки, а потом динамически в коде её получать и вызывать метод. Не получается так...
В общем есть ли еще какие варианты или какие мысли как улучшить то что я обдумывал?
1 VVi3ard
 
25.11.11
13:41
(0) Если за ранее создать и закешировать обработки плагины то создание всех обработок перед стартом обработки займет секунд 5.

В некоторых случаях даже DLL у взрослых дольше подключаются.

Тебе надо определить сколько классов будет 10,100,1000?
2 IamAlexy
 
25.11.11
13:41
нафига ?
3 Stepa86
 
25.11.11
13:44
если алгоритмы простые, то можно и полем обойтись, посмотри в сторону инструментов разработки, может сможешь прикрутить...

обработки подрубать и обрабатывать не так уж сложно, а по времени все очень спорно, а отлаживать обработки попроще будет


пока что любой плагин проще всего реализуется на обработках
4 VVi3ard
 
25.11.11
13:47
Опять таки даже если у тебя будет 100 классов это подразумевает что записей у тебя более 10 000 даже в этом случае создание 100 обработок в кэш не займет много времени, да и создание во время выполнения (без кеша) не должно быть проблемой, темболее обработки у тебя будут простыми  и пустыми (без кучи форм). Мне кажется ты преувеличиваешь проблему.

А вот хранить в конфигурации "плагины" плохая идея т.к. придется еще добавлять механизм обмена плагинами (выгрузка загрузка) следить а коллизиями обмена, при этом получение алгоритма через "." тоже не бесплатно.
5 VVi3ard
 
25.11.11
13:48
*Без кеша я имею в ввиду кшеа при старте, само собой что для каждого класса обработка будет создана только один раз.
6 Stepa86
 
25.11.11
13:53
и поковыряй механизм доп. обработок в БСП, может там есть что надо...
7 ptiz
 
25.11.11
13:59
Конечно, быстрее всего хранить готовый код и выполнять через Выполнить. Если такое возможно - надо за это бороться.
8 acsent
 
25.11.11
14:02
Еще один вариант суперуниверсальной обработки которая в конечном итоге никому будет не нужна
9 WDUM
 
25.11.11
14:03
О, получилось по имени обработки дернуть её метод из модуля менеджера.
Т.е. Обработки[ Имя ].Метод(...) вполне работает, я запорол на том что пытался из клиента вызывать, а это в 8.2 прерогатива сервера.
Думаю это всяко быстрее чем динамически грузить обработку из хранилища. Кеш конечно можно сделать, но это сложностями обрастает. Отладка опять же в пролете.
А так получается всё что нужно на месте и самое главное - восьмерка позволяет обновлять конфигурацию базы динамически. Это для меня вообще лафа, т.к. как раз по ходу работы юзверей я смогу и обновлять базу без угрозы поломать что-то (меняется только алгоритм) и отладку делать и довольно быстро вызывать плагинообразный код.
Всё, вопрос закрыт. Всем спасибо!
10 WDUM
 
25.11.11
14:06
> Еще один вариант суперуниверсальной обработки которая в конечном итоге никому будет не нужна

Нет, у неё конкретный практический смысл, который уже много лет работает под семеркой. Но там реализация абы какая, что-то во внешних обработках распихано, что-то через ЕСЛИ Товар.Поставщик.Код = ... Тогда ... короче труба.
Сейчас планируем переходить на восьмёрку заодно рефактрингом займусь.
11 Stepa86
 
25.11.11
14:09
1) нефик программировать в боевой базе
2) демоническое обновление зло
12 Анатоль
 
25.11.11
14:15
(9) я тоже радовался динамическому обновлению пока на одном из предыдущих релизов 8.2 не загнулась база. Сейчас уже эту проблему подправили, но осадок остался, так что теперь не пользуюсь.
(11) +100500
13 Mashinist
 
25.11.11
14:52
(9) и еще учти, что при динамическом обновлении что бы у пользователя алгоритмы поменялись он должен будет выйти и зайти
т.е. еще может оказаться, что у разных пользователей буде разный алгоритм, а это ИМХО хуже чем если он просто не правильный...
слушай что говорит (12)
у меня тоже осадок остался. не пользуюсь на боевых больших базах.
14 WDUM
 
25.11.11
15:45
Смысл субалгоритма в том чтобы из внешних источников данных всякими разными способами извлекать информацию о товаре (цены, характеристики и так далее, сильно зависит и состав данных и его источник от того что я назвал классов товара) и скармливать общему алгоритму применению изменений. Поэтому нестрашно почти всё из вышеописанного, кроме естественно обрушивания базы. =) Хорошо, учту, творить "беспредел" с обновлениями буду только в тестовой.
15 WDUM
 
25.11.11
15:52
Хотя я думал динамическое обновление всяко безопасно, если нет изменения структуры базы, а только код меняется, причём не касающийся того как устроена база, т.е. тем более. Вполне понятно что если серьезная реструктуризация данных, а какие то клиенты живут "по старым правилам" это ооочень плохо не выгонять их.
Так что интересен вопрос - есть примеры когда база рушилась именно без реструктуризации данных?
16 Kuzen
 
25.11.11
15:54
Динамическое юзаю но все равно приходится перезагружать сервер 1с иначе потом конфигурацию не сохранить во внешний файл.
17 vmv
 
25.11.11
16:02
мы создали эталонную административную базу которая поставляет данные во все остальные рабочие боевые базы.

В эталонной базе содержатся классификаторы(профессий, номенклатура, услуги и пр.). В ней же обработки по заливке в нее данных откуда угодно.

Все остальные рабочие базы коннектяться по сом-коннектору в этой эталонной и потребляют единообразные данные и методы для всех, а все эти субалгоритмы и подклассы - от лукавого, сломаете зубы - инфа 100%
18 WDUM
 
25.11.11
16:17
> В ней же обработки по заливке в нее данных откуда угодно.
> а все эти субалгоритмы и подклассы - от лукавого

Вы знаете такие слова, как "обобщение алгоритмов"?
У вас же тоже есть обработки по заливке данных - есть.
Чего плохого в том чтобы унифицировать их? Чего плохого в том чтобы облегчить правку старых или добавление новых алгоритмов без изменения центрального кода, раз уж есть к тому предпосылки?
В какой нибудь Java вокруг ничего классов и наследования разводят как вот по этой ссылке до маразма: http://www.gamedev.ru/flame/forum/?id=155128 (реально маразматично)
Но раз уж в 1С нет нормальных классов и наследования, то почему я не могу "отплагинить" код в модуль менеджера? Нормально всё. Попрет.
19 rutony
 
25.11.11
16:34
(0) У нас реализация обмена с ккм как раз 2й вариант.
Мы сделали причем еще несколько режимов...
Отладочный, при котором обработка берется не из хранилища, а из указанного пути, соответственно ее легко трассировать, а главного ничего не нужно переоткрывать, изменил, сохранил, нажал кнопку, сказка а не отладка, ненужно всякие обработки переоткрывать, предприятия перезагружать...
В планах сделать еще обновления по инету ну и прочие вкусняшки...
20 VVi3ard
 
25.11.11
16:37
Я не понял какой менеджер модуля, при чем здесь обновление?

Ты хочешь это обработки хранить в конфигурации? И причем здесь тогда плагины?
21 WDUM
 
25.11.11
16:48
> Я не понял какой менеджер модуля, при чем здесь обновление?

Менеджер модуля - это в 8.2 (да и в 8.1 наверное, не помню, я сразу на 8.2 прыгаю с семерки) это экспортные процедуры менджера объектов, т.е. не создавая документ или обработку как объект можно вызвать метод, например так:
Обработки.МояОбоработка.МояПроцедура/Функция(...), причём именно я, как программист, программирую этот метод.
В сущности сильно похоже на просто неглобальный общий модуль, но меня привлекла возможность делать так:
Обработки[ СтрокаСИменемОбработки ].МояПроцедура/Функция(...), где видно что можно завести кучу таких обработок и вызывать метод из любой из них параметрически по текстовому имени обработки.
Если такое есть у общих модулей - то еще лучше, но лично у меня так не получилось, ибо они не являются объектным типом конфигурации и обращаться к ним через ОбщиеМодули[ Строка ].Метод не получается.
А у всех обработок/справочников/документов такое есть и реализуется через так называемый "модуль менеджера". Есть в этом аналогия к статическому методу класса в большинстве ЯВУ, но тут еще можно какбе через рефлексию с этим работать, как в Яве какой нибудь.

Суть того что эти обработки я буду вызывать по строковому имени динамически, поэтому и аналогия с плагинами, хотя хранится они будут, да, в конфигурации.
22 Alexandr Puzakov
 
25.11.11
16:53
Кривым решением попахивает... Давай-ка все по порядку и с самого начала. Что? Зачем? Откуда? По чьей инициативе?...
23 VVi3ard
 
25.11.11
17:15
Что такое модуль менеджера я в курсе, но его нет во внешних обработках, т.к. он может быть  только у объекта конфигурации. Таким образом ты резко генеришь себе геморрой экономя на спичках.

Я не понимаю какой смысл хранить ПЛАГИНЫ в конфигурации?

Нет конечно если у тебя одна база и база подключена к хранилищу и тебе нужно вести версии плагинов то да смысл есть но это будут уже не плагины.

Во всех остальных случаях гораздо проще делать внешние обработки и подключать их по мере необходимости.

(9) "Кеш конечно можно сделать, но это сложностями обрастает. Отладка опять же в пролете."

Какими сложностями?

Функция ПолучитьПлагинПоКлассу(пКласс)
  Плагин = глСоответствиеПлагинов[пКласс];
  Если Плагин= Неопределено тогда
    Плагин = ВнешниеОбработки.Создать(пКласс.ПутьКОбработке);
    глСоответствиеПлагинов.Вставить(пКласс,Плагин)
  КонецЕсли
  Возврат (Плагин)
КонецФункции;

глСоответствиеПлагинов =  Глобальная переменная соответствие или структура.

Отладка стандартная, открыл обработку плагина в конфигураторе и отлаживай сколько угодно.
24 vmv
 
25.11.11
17:18
не взлетит
25 VVi3ard
 
25.11.11
17:18
Вообще нужно смотреть сколько у тебя конфигураций, сколько людей плагины будут разрабатывать может (22) прав и не стоит огород городить а тупо общий модуль в конфигурации выделить и все.

Минус плагинов в том что если у тебя в одном плагине есть удачная функция и тебе такую во втором хочется юзать это все выглядит не красиво.
А в общем модуле у тебя много функций общих будет. В итоге нужно взвесить все за и против. Но если ЗА то делай через внешнюю обработку
26 WDUM
 
25.11.11
17:19
> Кривым решением попахивает... Давай-ка все по порядку и с самого начала. Что? Зачем? Откуда? По чьей инициативе?...

Что: закачка разнообразных свойств и атрибутов номенклатуры отличающаяся алгоритмом (сильно) в зависимости принадлежности её некоему поставщику - закачка информации из предоставляемого им прайса или похожего источника информации, коими могут быть, к примеру, диски с презентациями в HTML или даже Flash.
Зачем: да чтобы импортировать всё это многообразие не ручками, а программой и программист не парился добавляя нового поставщика ковыряя в глобальных модулях, а менеджеры не парились если заводят новый подраздел номенклатуры информационно изолированный от других, но для которого формат входных данных совпадает с уже существующим.
27 WDUM
 
25.11.11
18:02
> Вообще нужно смотреть сколько у тебя конфигураций, сколько людей плагины будут разрабатывать может (22) прав и не стоит огород городить а тупо общий модуль в конфигурации выделить и все.

"Тупо общий модуль" уже в 7-ке был, даже лучше - с имитацией кое каких действий через вызов внешних обработок, для юниформности, но это же, блдаж, уровень бейсика:
ЕСЛИ Поставщик1 ТОГДА
ИМопртПоставщика1(...)
ИНАЧЕ ЕСЛИ Поставщик2 ТОГДА
ИМпортПостащика2( ...)
...

Маразм...
28 oleg_km
 
25.11.11
18:28
(27) А как ты еще хотел. Если это просто вызов одной функции, то лучше чем ты написал не будет. Мне недостаточно было для обработки разных банк-клиентов вызова одной функции. Я на каждый вариант банк-клиента написал обработку. У обработок есть стандартизированный набор экспортируемых реквизитов и методов, а в исходном документе создаю для каждого банк-клиента нужную обработку и дергаю ее методы, зная, что у всех обработок они есть. Больше по-моему ничего не придумать. Или суперобработка с супер Если Иначе.
29 Alexandr Puzakov
 
25.11.11
18:48
Может чуше посмотреть в сторону организации на обработках? Типа внешних печатных форм. Также выделяем отдельный справочник, в нем сохраняем обработки определенной структуры, в справочнике номенклатуры просто добавляем реквизит, ссылающийся на этот справочник и готово. Тут тебе и удобство отладки, и простота в создании.
30 IamAlexy
 
25.11.11
19:02
внешние обработки табличных частей  и внешние печатные формы а так же внешние отчеты и обрабокти - вот те плагины с помощью которых можно придумать все что угодно в базе.. практчиески все что угодно что не требует каких то фундаментальных изменений влекущих за собой мзменения дерева метаданных
31 Злопчинский
 
25.11.11
19:03
знакомо.. знакомо.. прайсы всяких по дискам/видео.. 95% кода загрузки одинаково, остальные 5% - почти под каждый прайс программить...
32 cosmo_pro
 
25.11.11
19:04
(29) Согласен. Сделал бы именно так. Забивать конфигурацию обработками, а потом их удалять, если поставщик отвалился.
33 IamAlexy
 
25.11.11
19:09
(29) и тормозня в работе..
34 IamAlexy
 
25.11.11
19:10
(32) а почему просто не закрыть код поставив соответствующие ограничения? зачем морочится с обработками, темболее что у заказчика будет 100500 архивных копий базы из которых он любые обработки достанет ?
35 Мимохожий Однако
 
25.11.11
19:17
Возьми Универсальную обработку подбора объектов и в ней используй Произвольный алгоритм, настройки которого хранятся в настройках пользователя и можно сохранить во внешних файлах. Каждый алгоритм может работать как отдельно, так и группой.
36 Alexandr Puzakov
 
25.11.11
20:28
(33) какие тормоза?
37 WDUM
 
28.11.11
14:32
Оппаньки... Не взлетает. =)
Концепт не вписывается краями в подлые рамки клиент-серверной архитектуры 1С 8.2.
В 8.2 сильные ограничения на клиент-серверное взаимодействие с целью забарывания клиент-серверного трафика...
Так, например, на клиенте недоступные очень многие ключевые объекты конфигурации типа СправочникОбъект и желанная мной конструкция Обработки[ ПоИмени ]... Оные вещи должны кодироваться на стороне сервера. Причем с сервера вызов методов на клиенте вообще не доступен.

Чёрт побери, но я то хотел так:
1. открываем обработку с унифицированным алгоритмом загрузки инфы о товарах от поставщиков
2. в ней указываем класс товаров (в сущности аналогия поставщика) в котором в строке указано имя обработки со стандартизированными методами, например "ЗагрузитьДанные( класс, путь_к_файлу_данных_или_урл )"
3. в этом "загрузить данные", вызванном из обработки динамически по имени происходят вещи типа открытия XLS, или DBF или Web и парсятся данные в один унифицированный формат набора структур данных о товаре.
4. эти извлеченные данные уже передаются в единый алгоритм "ПрименитьДанныеОТоварах( класс, данные )"

Проблема в том, что в 8.2 эксель или dbf по логике должны создаваться на клиенте, но мне чтобы вызвать обработку по имени нужно переключится в режим сервера и обратный вызов клиента с сервера, как я понял невозможен!
В принципе как вариант - передать каким то образом файл с данными от клиента серверу. Закачать его в бинарныеданные что ли и скормить вызовом? Чтобы сервер у себя сохранил во временный файл и открыл?
О боже, что-то кривовато выходит... Есть мысли как это должно работать "наиболее гармонично"?
Хочется вписаться в архитектурные особенности 8.2...
38 Alexandr Puzakov
 
28.11.11
16:23
>>Проблема в том, что в 8.2 эксель или dbf по логике должны создаваться на клиенте

а?
39 WDUM
 
28.11.11
17:43
> а?

Что "а?"? =) Человек НА КЛИЕНТЕ выбирает файл для загрузки. Он у него лежит, допустим в "мои документы". Как серверу до него добраться, а?
40 Rie
 
28.11.11
17:48
(39) ХранилищеЗначения - не поможет?
41 Fragster
 
гуру
28.11.11
17:50
(0) механизм внешних печатных форм - не то?
42 Fragster
 
гуру
28.11.11
17:50
ну и обработки заполнения табличных частей
43 WDUM
 
28.11.11
18:02
(40) ХранилищеЗначения - это то же что я сам предложил грузить в ДвоичныеДанные и передавать их как параметр в серверную часть, чтобы там из них выгрузить во временный файл и уже работать с ним. Наверное на том и остановлюсь, хотя как то некомильфо...
44 WDUM
 
28.11.11
18:03
(41) 0-ой пост уже не актуален, актуален (37)
45 Fragster
 
гуру
28.11.11
18:35
(44) то же самое, см. УТ 11
46 Юрий Лазаренко
 
28.11.11
21:48
(37) Чего ты паришься, у тебя все равно будет как минимум один вызов сервера, так как во время загрузки ты что-то куда-то будешь писать в ИБ.
По урлу загружай файл-источник во временное хранилище, на сервере уже перехватывай его и парси. Для описания разных процедур загрузки сделай общий модуль, где опиши алгоритм обработки данных для разных классов, у самих классов достаточно указать имя функции в этом общем модуле.
Как-то так я бы сделал, если правильно понял задачу.
47 WDUM
 
06.12.11
11:18
(46)
Да, всё, примерно так и сделал. Только не в общем модуле процедуры специфичные для каждого поставщика - а в модуле менеджера обработок, для каждого постащика завожу одну обработку. Файл на сервер действительно пришлось передавать, но делаю не через ХранилищеЗначнения, а через "ДвоичныеДанные", по моему проще и как раз то что нужно.

Однако сейчас возник вопрос немного не по теме, наверное лучше новую тему завести, но попробую сперва задать вопрос в этой.

========================
=== НОВЫЙ ВОПРОС ТУТ ===
========================

Дело вот в чём - выгружаю сейчас конфигурацию (это стандартная УТ 11 + мои доработки) и размер получается 150 мегабайт cf-файла! O_o Дело в том, что мне его надо передавать по инету и заливать в рабочую базу. Накладненько это часто делать! Не ну я могу мирится раз в два-три дня эту операцию можно проделывать, но если мелкие доработки - проще вручную зайти на удаленный сервер и править там что ли. O_o

Нашел режим выгрузки только определенных модулей - может сильно помочь, если менялся только код, но тем не менее размер конфигурационных данных всё равно удивляет.
Добавил 3 справочника, пяток обработок и два общих модуля - размер подрос до 160Мб. На десять мегабайт эти изменения что ли потянули?! O_o Архивирование уменьшает на процентов 5 всего, несущественно совсем.
Это нормально в 8.2?
В инете какие то утилиты находятся типа ужимающие чего то - кто пользуется?
Чего можете посоветовать?
Подумалось - может создать типа "обновление конфигурации" - т.е. типа отпочковать свою конфигу через встроенный механизм поддержки конфигураций - но как мне показалось это поломает пусть уже подрезанный краями включением режима обновления объектов конфигурации, но тем не менее еще возможно хоть что-то могущим обновить механизмом поддержки УТ 11. Или это нормальный выход? Опять таки - может направите по верному руслу...
48 Fragster
 
гуру
06.12.11
11:31
сделай поставку и .cfu rktgfq
49 Fragster
 
гуру
06.12.11
11:32
клепай
Ошибка? Это не ошибка, это системная функция.