[RClassMngr] ООП для V8. Добавляем наследование v.1.1

Опубликовал Илья Кузнецов (Robert) в раздел Программирование - Внешние компоненты

Посвящается 1С++. Добавляем в V8 наследование свойств и методов объектов.

Общеизвестно, что ООП строится на трех основных принципах: полиморфизме, наследовании и инкапсуляции.
Программирование в среде V8 вполне можно считать объектно ориентированным и все эти принципы в какой-то степени присутствуют. Но хотелось бы большего.
Чего не хватает? Нам не позволили создавать произвольные классы.
Частично эта проблема решается созданием обработок, где в модуле объекта можно создавать публичные и приватные свойства и методы. Получается вполне класс. Такой подход используется в стандартных конфигурациях. Чудесно. Но нет наследования! Нельзя построить иерархию классов. Нельзя расширить или переопределить функционал базовых объектов.
Данная разработка в некоторой степени снимает это ограничение.
Как это работает.
Компонента представляет собой COM-сервер. Компонента хранит ссылки на переданные ей базовые объекты и при обращении к ее свойствам и методам просто переадресовывает вызовы к базовым объектам.
Как этим пользоваться.
Например так. Добавим в конфигурацию обработку Класс1. Добавим такой текст в модуль объекта.

Процедура Метод1() Экспорт

    Сообщить("Класс1::Метод1");

КонецПроцедуры


 

Результатом выполнения следующего кода

Класс1=Обработки.Создать("Класс1");
Класс1.Метод1();


будет

Класс1::Метод1



Теперь добавим еще одну обработку Класс2. Текст модуля объекта:

Процедура Метод2() Экспорт
    Сообщить("Класс2::Метод2");
КонецПроцедуры



Теперь сделаем так, чтобы Класс2 сохранил свои методы и унаследовал методы Класса1.

Класс2=Новый COMОбъект("RClassMngr.Class");
Класс2._Инит(Обработки.Создать("Класс2"), Обработки.Создать("Класс1"));
Класс2.Метод2();
Класс2.Метод1();


Результатом выполнения будет:

Класс2::Метод2
Класс1::Метод1


Методы Класса1 можно переопределить в Классе2. Базовым для Класса2 может стать и любой другой объект в системе.

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

Функция _КакКласс() Экспорт
    Cls = Новый COMОбъект("RClassMngr.Class");
    Cls._Инит(ЭтотОбъект
    , Обработки.Создать("БазовыйКласс")
    );
    Возврат Cls;
КонецФункции


Тогда создание экземпляра класса будет сводиться только к одной строке:

с

Кл2=Обработки.Создать("Класс2")._КакКласс();



Хочется, конечно, что то вроде этого: Кл2 = Новый Класс2, но....

Кроме того, в модуль объекта можно добавить процедуру Деструктор. Она будет вызываться автоматически при уничтожении экземпляра класса.

P.S. Компонента требует регистрации в реестре как обычный COM-сервер или ActiveX-объект.

regsvr32.exe RClassMngr.dll

Описание наследования форм //infostart.ru/blogs/985/

Скачать файлы

Наименование Файл Версия Размер
RClassMngr v.1.1.0
.1237131025 94,00Kb
31.12.14
170
.1237131025 94,00Kb 170 Скачать бесплатно
Пример наследования форм v.1.1
.1237974601 21,64Kb
31.12.14
86
.1237974601 21,64Kb 86 Скачать бесплатно

См. также

Комментарии
1. Герман (German) 924 15.03.09 20:14 Сейчас в теме
2. Василий Демидов (Душелов) 3786 15.03.09 20:26 Сейчас в теме
3. Игорь Белышев (biv75) 15.03.09 21:56 Сейчас в теме
Интересно.. надо попробовать
4. Василий Демидов (Душелов) 3786 15.03.09 22:04 Сейчас в теме
С объектами понятно, а вот с формами... Сделать наследование форм...
Документы, обработки - можно сделать наследованными, с реквизитами и методами... А вот как бы форму унаследовать...
5. Илья Кузнецов (Robert) 703 15.03.09 22:38 Сейчас в теме
(4) Форму можно также наследовать. Только для того, чтобы самому обращаться как производному от формы классу.
Или ты хотел бы производный класс подсунуть системе вместо базовой формы?
6. Василий Демидов (Душелов) 3786 15.03.09 22:41 Сейчас в теме
Тут как раз вопрос именно в визуальном редактировании наследованной формы и подмене обработчиков формы.
7. Илья Кузнецов (Robert) 703 15.03.09 22:50 Сейчас в теме
(6) Я не совсем тебя понимаю. Объясни на пальцах.
Вот есть форма, на ней реквизит, у реквизита обработчик. Теперь создаем новую форму и, типа, наследуем ее от первой. Как это выглядит? Что в редакторе формы? Что наследуется? Реквизиты или поведение реквизитов?
8. Василий Демидов (Душелов) 3786 15.03.09 22:52 Сейчас в теме
(7) Классическое наследование формы:
Есть форма, на ней реквизиТ, у реквизита обработчик - получаем новую форму, аналогичную, только обработчик реквизита новой формы работает в старой форме. Но имеем возможность добавлять свои реквизиты у новой формы.
9. Илья Кузнецов (Robert) 703 15.03.09 22:56 Сейчас в теме
(8) Ладно, идею понял. Пораскину мозгами.
10. Илья Кузнецов (Robert) 703 16.03.09 00:41 Сейчас в теме
(8) Не, это совсем из другой оперы.
11. Василий Демидов (Душелов) 3786 16.03.09 00:43 Сейчас в теме
(10) Ну почему же? Наследовать же мы можем любые объекты, добавлять новые свойства, переопределять методы своими...
12. Александр Орефков (orefkov) 1449 16.03.09 11:54 Сейчас в теме
Для начала отлично.
В свое время мы с Dmitro думали над возможными реализациями ООП в 8ке, и пришли почти к такому же решению, однако делать не стали.

Так сразу же вопросы и пожелания и своя толика видения развития.

Сделано ли множественное наследование?
Будет ли какая-то декларативность в описании классов?

То есть сейчас наследование (и обращение из класса к базовым методам) делается "ручками":
в инициализируещем методе обработки сами создаем объект ВК, и объекты базовых классов.
Если хотим обращаться к методам базовых классов, то должны сами сохранить где-то (например в переменных модуля) ссылки на нами же созданные объекты.

А вот тут Dmitro (как больший чем я спец по 8ке) подсказывает - у обработки могут быть реквизиты обработки с типом "Обработка.Объект", которые как-раз и было бы удобно использовать как базовые классы.
Те у ВК допустим метод - CreateClass(ИмяОбработки)
ВК создает эту обработку, базовые классы создаются САМИ как реквизиты этой обработки.
Дальше ВК должна просто обойти реквизиты обработки, выделить среди них те, которые есть базовые классы (может там инфа в синонимах метаданных и тп), и вернуть уже свой объект. Также для каждого подобъекта, являющегося классом, можно будет вызывать какой-то инит-метод, в который передавать ссылку на конечный объект, для реализации виртуальных вызовов (аналог Сам(Контекст) в 1С++).

Вобщем, надо думать над этим, и для начала определиться со стандартами - как прописывать/создавать иерархию наследования, как инициализировать, как описать public/protected/private методы и наследование, и тп.
13. Артур Аюханов (artbear) 854 16.03.09 13:01 Сейчас в теме
+ Хорошо!
Напрашивающийся вопрос: что будешь делать с исходниками? Будешь ли выкладывать в открытый доступ?
14. Артур Аюханов (artbear) 854 16.03.09 13:03 Сейчас в теме
Ага, вопросов куча :)
Например, виртуальные методы реализованы?
15. Илья Кузнецов (Robert) 703 16.03.09 13:04 Сейчас в теме
(12) http://www.1cpp.ru/forum/YaBB.pl?num=1237134465

(11) Наследовать можем. А заставить V8 искать обработчик событий формы в модуле другой формы я не могу.
16. Василий Демидов (Душелов) 3786 16.03.09 13:09 Сейчас в теме
(15) Ну тогда только копировать обработчики в новую форму.
17. Илья Кузнецов (Robert) 703 16.03.09 13:18 Сейчас в теме
(13) Дался тебе этот открытый доступ. Там кода кот наплакал. Выложу.
(14) Как таковы виртульных методов нет. Можешь определить метод в базовом классе, но оставить метод пустым или добавить генерацию ошибки при вызове этого метода. А в производном классе переопределить этот метод и написать реализацию. В любом случае метод будет публичным и клиент может обратиться к методу.
18. Илья Кузнецов (Robert) 703 16.03.09 13:22 Сейчас в теме
(16) Ты можешь не копировать текст обработчиков в новую форму, а в обработчиках новой формы вызывать обработчики из старой формы (базового класса). Соотв. при изменении базового класса изменится поведение всех обработчиков всех форм, которые на него завязаны. Но это можно и без всяких классов сделать
19. Артур Аюханов (artbear) 854 16.03.09 13:28 Сейчас в теме
Роберт, а скорость тестировал? Насколько сильно тормозить по сравнению с типовым/штатным вызовом метода обработки?
20. Артур Аюханов (artbear) 854 16.03.09 13:33 Сейчас в теме
А как быть с конструкторами классов, как базовых, так и наследников?
Есть какой-нибудь вариант?

ЗЫ кстати, народ, есть ли у кого-нибудь какая-нибудь система тестирования (функционального или юнит-тестирования) для 8 ?
С ее помощью было бы удобно протестировать и данную ВК :)
21. Илья Кузнецов (Robert) 703 16.03.09 13:57 Сейчас в теме
(19) Скорость не тестировал. Время вызова метода увеличивается максимум на время поиска метода в каждом базовом классе последовательно.
(20) В моем примере _КакКласс по сути и есть конструктор. Если ты создаешь класс, у которого базовым является другой класс, то он создается также через _КакКласс, т.е. через вызов конструктора.
Вообще, orefkov может быть предложит вариант изящнее.
22. Артур Аюханов (artbear) 854 16.03.09 14:05 Сейчас в теме
(21) По конструктору: Хотелось бы отделить/выделить стадии создания (статический метод) и стадию конструирования (на уже готовом объекте).
Т.е. метод _КакКласс и метод Конструктор() ИМХО удобнее иметь отдельно.

При этом было бы совсем красиво, если бы метод Конструктор вызывался из твоей ВК автоматом внутри твоего метода Инит :)
23. Артур Аюханов (artbear) 854 16.03.09 14:05 Сейчас в теме
(21) А как построена схема поиска метода? линейный поиск, бинарный, хеш, деревья и т.д.?
24. Илья Кузнецов (Robert) 703 16.03.09 14:11 Сейчас в теме
(22) Без понятия :) Я в код 1С не залезал. Это не RainbowV8. Я получаю IDispatch интерфейсы базовых объектов и использую их методы GetIDsOfNames и Invoke. Можно, конечно, кэшировать вызовы и по мере работы класса создавать собственный хеш, дерево или что угодно. Но заранее методы базовых объектов мне не известны.
25. Артур Аюханов (artbear) 854 16.03.09 14:31 Сейчас в теме
(24) Да, через ИДиспатч скорость будет слабенькая :(
26. Андрей Скляров (coder1cv8) 3283 16.03.09 16:21 Сейчас в теме
Вот честно, не понимаю, какая в этом практическая польза? ) Столько разговоров про ООП, наследование... Зачем это в языке КОНФИГУРИРОВАНИЯ? Может конечно, дело в том, что я пришел в 1С не с "нормального" языка программирования, а изначально писал только на восьмерке (ну если не считать скрипты всякие)... Но вот за всю свою практику решения самых разнообразных задач, ни разу не чувствовал необходимости в чем-то подобном...
27. Денис Беляев (Dziden) 10 16.03.09 16:31 Сейчас в теме
я вижу применение только для обфускации кода и подобных задач.
28. Илья Кузнецов (Robert) 703 16.03.09 16:57 Сейчас в теме
(26) ООП это способ выражения программистской мысли. Весьма популярный способ на настоящий момент. Он имеет ряд преимуществ и ряд недостатков. Поклонников и противников.
ИМХО, V8 имеет все признаки объектно ориентированного языка или системы, как угодно.
simply1; Арчибальд; +2 Ответить 1
29. Артур Аюханов (artbear) 854 16.03.09 17:33 Сейчас в теме
(26) ООП нужен тем, кто не занимается копи-пастом, а любит/умеет строить нормальные программы, удобные при сопровождении, разработке и т.д.

А 77 и 8, к сожалению, проповедуют минимальные знания разработчика/программиста - спец.термин даже придумали "внедренец" :(
simply1; mdzen; +2 Ответить 2
30. Артур Аюханов (artbear) 854 16.03.09 17:34 Сейчас в теме
(28) 8 имеет только признаки ООП и сама сделана внутри на ООП-языке, но вот для разработчиков в среде 1С ничего в плане ООП не сделано.
ИМХО ООП - в первую очередь возможность создавать собственные классы, схемы наследования и т.д.
31. Мубаракшин Рамиль (magican) 40 16.03.09 20:07 Сейчас в теме
32. H A D G E H O G s (Hadgehogs) 326 16.03.09 23:20 Сейчас в теме
(26) Поддержу товарисча.
Страсти вокруг ООП напоминают беготню пигвинячьей стаи. Один побежал - и все ломанулись.
Прямо культ ООП.
Накуй-накуй оно не нужно в 1С.
Сделали вон СУПЕР УНИВЕРСАЛЬНОЕ движение по партиям в УПП - оно надо. Чем меньше универсальности - тем лучше.

ООПисты, баянисты млин.

Каждый раз, какой - нибудь спец напрягается, вываливает мегакод на Обработках, толпа начинает эрреагировать на это, потом успокаевается.
Забавные вы.
33. H A D G E H O G s (Hadgehogs) 326 16.03.09 23:22 Сейчас в теме
А, пардон, тут ВКшэчка, ну да не в этом суть.
34. Артур Аюханов (artbear) 854 17.03.09 07:01 Сейчас в теме
(32) Не хочешь - не ешь :)
Если не понимаешь смысла, также не говори.

ООП нужно тем, кто не хочет выполнять постоянный копи-паст, а ведет постоянное накопление рабочего кода в виде необходимых классов + (29)
35. Александр Рытов (Арчибальд) 2652 17.03.09 08:07 Сейчас в теме
(26)Цитируем Кодера: ну зачем мне знать, как устроен автомобиль, если мне на нем ЕЗДИТЬ.
А никто и не заставляет. Выложен инструментик для инженера (=творца), а не для юзера.
(32)Сам-то ведь тоже в стае глупых пингвинов. ООП пользуешься - 1С на нем и стоит.
Автору. Привязка к 8 и 1С++ в заголовке не требуется. Семерочникам методичность мышления тоже требуется. А для "особо юзвернутых" читателей неплохо бы добавить что-то типа "потребителей просят не беспокоиться"
36. Александр Рытов (Арчибальд) 2652 17.03.09 08:11 Сейчас в теме
(0)>Общеизвестно(Sic!), что ООП строится на трех основных принципах: полиморфизме, наследовании и инкапсуляции

Безудержный оптимизм автора сильно воодушевляет.
37. Артур Аюханов (artbear) 854 17.03.09 09:01 Сейчас в теме
(35) Цитата "Автору. Привязка к 8 и 1С++ в заголовке не требуется. Семерочникам методичность мышления тоже требуется" к чему относится?
Расшифруй, нифига не понятно :)
38. Андрей Скляров (coder1cv8) 3283 17.03.09 09:14 Сейчас в теме
Ну вот, один (29) сказал что я "не умею стоить нормальные программы" и вообще занимаюсь "копи-пастом", второй (35) юзером обозвал! ))
39. Александр Рытов (Арчибальд) 2652 17.03.09 09:21 Сейчас в теме
(37)А это я поддерживаю посты 29 и 34. В том, что ООП - это, в первую очередь, стиль/метод мышления. И сам пользуюсь оным методом на семерке, хотя синтаксиса семерочного и не хватает.
Автору плюсанул за методическую идею, а не за ВК-шку
40. Александр Рытов (Арчибальд) 2652 17.03.09 09:27 Сейчас в теме
(38)Если у тебя есть свои индивидуальные инструменты, ты, вероятно, мастер, а если нет, так, в лучшем случае, ремесленник. Т.е. пользователь (user).
41. Андрей Скляров (coder1cv8) 3283 17.03.09 09:28 Сейчас в теме
А между тем все забывают что есть стандарты написания кода 1С, разработанные непосредственно создателями платформы, где использование всяких ВК и ООП отнюдь не поощряется. Специфика конфигураций 1С такова, что есть большая вероятность того что в дальнейшем ваш код будет сопровождать и разбирать кто-то другой. А для среднестатистического одинэсника, ООП - темный лес! Да, тут можно говорить о низком "пороге вхождения" в эту специальность, что поделать, так уж сложилось... Вот поэтому написание кода согласно стандартам 1С - это хороший стиль, признак мастера, не для себя, не для другого профи, а в первую очередь для ЗАКАЗЧИКА.
42. Андрей Скляров (coder1cv8) 3283 17.03.09 09:32 Сейчас в теме
(40) Какие-такие инструменты? ) Поясни, пожалуйста...
43. Василий Демидов (Душелов) 3786 17.03.09 09:34 Сейчас в теме
(41) > есть стандарты написания кода 1С, разработанные непосредственно создателями платформы, где использование всяких ВК и ООП отнюдь не поощряется

Холивар! :)) А в 7-ке ВК очень даже используются в типовых... v7plus.dll к примеру...
44. Андрей Скляров (coder1cv8) 3283 17.03.09 09:41 Сейчас в теме
(43) Ну с семеркой-то как раз все понятно... Здесь холивар на другую тему! ))
45. Александр Рытов (Арчибальд) 2652 17.03.09 09:53 Сейчас в теме
(41)Ровно все наоборот. 1С сама выпустила книжечку про технологию ВК. На использовании ООП вся платформа построена. "Агрегатные объекты" языка - это классы с присущими им атрибутами и методами, наследуемыми при создании экземпляра класса и/или подкласса. "Среднестатистический одинэсник" может их, конечно, называть колобашками или хреновинками - это вопрос культуры речи. Да, мастер должен обеспечить сопровождаемость продаваемого продукта - но именно продукта, а не инсрументария, им использованного. И уж совсем глупо запрещать одному мастеру поделиться с другим своими приемами.
AlexO; mdzen; be_nt_all; lustin; Donat; artbear; Robert; +7 Ответить
46. Александр Рытов (Арчибальд) 2652 17.03.09 10:03 Сейчас в теме
47. Андрей Скляров (coder1cv8) 3283 17.03.09 11:36 Сейчас в теме
48. Артур Аюханов (artbear) 854 17.03.09 12:03 Сейчас в теме
(41) Как раз с этим нельзя согласиться!
Данный стандарт, как и любой стандарт разработки, не является обязательным и автоматическим применяемым.
1С его ввела для упрощения/стандартизации ведения разработки и помощи разработчикам в плане указания полезных фич решения учетных задач и т.д.
ООП-схемы прекрасно можно уложить даже и в этот стандарт :)
49. Sheridan (WKBAPKA) 17.03.09 14:27 Сейчас в теме
Плюсану за оригинальность идеи...
50. Валерыч (Valerich) 18.03.09 03:12 Сейчас в теме
Больше всего от ООП действительно не хватает полиморфизма и наследования. Особенно это касается форм. TormozIT как-то поднимал вопрос инкапсуляции форм, т.е. чтобы готовую форму можно было вставить в другую форму в качестве закладки на панели или что-то в этом роде.
51. Дмитрий (Froloid) 66 18.03.09 10:21 Сейчас в теме
Автору плюс. Тем кто пытается доказать что это не нужно - минус. Любая вещь не является нужной или не нужной по определению, она может быть нужной или нет для кого-то конкретно. И у этой обязательно найдутся свои поклонники!
52. rasswet (rasswet) 80 19.03.09 09:00 Сейчас в теме
я когда чего-то не понимаю часто думаю что наверное это что-то очень умное. Плюсану
53. Андрей Крутских (K_A_O) 481 28.03.09 19:02 Сейчас в теме
Чего-то не получается зарегистрировать: "regsvr32 RClassMngr.dll"

Права администратора есть. Говорит "Приложение некорректно настроено".
Пробовал в Windows XP SP3 и в Windows Server 2003 SP1
54. Илья Кузнецов (Robert) 703 30.03.09 12:36 Сейчас в теме
(53) Никогда не встречал такой ошибки при регистрации.
Попробуй загрузить библиотеку через ЗагрузитьВнешнююКомпоненту. При такой загрузке она должна самостоятельно зарегистрироваться.
55. Андрей Крутских (K_A_O) 481 30.03.09 14:37 Сейчас в теме
(54) Так, естественно, тоже не регистрируется.

Я нашел ссылку на подобную проблему
http://www.rsdn.ru/Forum/message/3022647.all.aspx

В принципе все начинает регистроваться и работать, если установить "Microsoft Visual C++ 2008 Redistributable Package".
56. Илья Кузнецов (Robert) 703 30.03.09 15:26 Сейчас в теме
(55) Понял. Спасибо. Буду иметь в виду
57. steban (steban) 71 30.03.09 17:42 Сейчас в теме
Чтобы не зависеть от VC90 runtime, можно собрать ВК прилинковав runtime статически:
в свойствах проекта -> c/c++ ->Code Generation -> Runtime Library поставить "Multi-threaded" вместо "Multi-threaded DLL"

dll-как чуток распухнет в размере и избавится от зависимости от msvcr90
58. steban (steban) 71 30.03.09 17:44 Сейчас в теме
Ой.
А она еще от ATL90.dll зависит.

Можно избавить так:
Свойства проекта -> Configuration properties -> General -> Use of ATL поставить "Static link to ATL"
59. Илья Кузнецов (Robert) 703 30.03.09 20:04 Сейчас в теме
60. Артур Аюханов (artbear) 854 17.04.09 12:32 Сейчас в теме
Роберт, а ты отладчиком пробовал заходить в подобные классы/субклассы.
Работает ли отладка для подобной схемы?
61. Илья Кузнецов (Robert) 703 19.05.09 12:42 Сейчас в теме
62. Артур Аюханов (artbear) 854 19.05.09 12:51 Сейчас в теме
(61) Это очень хорошо, заморочек будет меньше.
В последнее время, работая на 8, все больше начинаю задумываться о классах и наследовании в 8 и применении твоей ВК.
63. Котэ Пруидзе (kote) 449 19.11.09 21:41 Сейчас в теме
(32) и др. не попробовавших ООП или не программировавших ничего, кроме учетных задач..

.. 1С не годится для моделирования чего либо, кроме задач учёта. Даже в VBA + Access больше возможностей, если честно, чем в 1C - в плане ВОЗМОЖНОСТЕЙ.. но 1С подарила на преднастроенные классы для решения учетных задач - Документ, Справочник, ПланСчетов.. и т.п. А в VBA пришлось бы самим создавать всю реализация и методы для решения учетных задач.

Смотрите что происходит - с появлением 8.1 - появились новые объекты (на самом деле классы) - БизнесПроцессы.. А будь там ООП - юзеры сами бы создали этот и много других классов.. но для 1С это плохо, - посмотрите на пользователей 1С++ - теперь их за уши не оттащишь от 7.7 с 1С++.. в общем, потерянные клиенты для 1С на неопределенное время.
64. Николай Клементьев (Rusmus) 36 07.10.10 11:06 Сейчас в теме
(50) а можно ссылку на эту тему? я и сам собирался реализовать подобное
65. B0P0H (B0P0H) 09.10.10 12:15 Сейчас в теме
хм. а множественное наследование?
66. Ийон Тихий (cool.vlad4) 41 10.10.11 23:53 Сейчас в теме
(62) artbear, столько времени прошло, честно скажи пользовался этой ВК? ...просто интересно...
67. Артур Аюханов (artbear) 854 11.10.11 15:05 Сейчас в теме
(66) Нет, не пользовался, т.к. создание собственных классов все-таки не очень удобно.
Планирую сделать собственную ВК для реализации ООП и Перехватчика для 8-ки аналогично реализованным в 1С++ для 77 На базе прямого доступа к внутренним функциям 1С 8.2
ЗЫ в принципе уже есть примеры реализации ООП для 8.2, товарищ chessman с 1cpp.ru сделал :)
68. Ийон Тихий (cool.vlad4) 41 11.10.11 15:08 Сейчас в теме
(67) Сама идея неплоха, вот только проблема как мне кажется в 1С, они же не используют ничего подобного;-((( а с типовыми работать надо...
69. Артур Аюханов (artbear) 854 12.10.11 07:27 Сейчас в теме
(68) В 1С++ для 77 мы вполне успешно юзали отдельные классы и целые наборы классов. было очень удобно.
70. Артур Аюханов (artbear) 854 12.10.11 16:28 Сейчас в теме
(68) Например, уже сейчас у chessman-a работает такой код
Процедура КнопкаВыполнитьНажатие(Кнопка)
	объектИнформатор = Новый Информатор;
	объектИнформатор.Изучить(Справочники);
КонецПроцедуры
...Показать Скрыть

ЗЫ кстати, рекомендую Объект Информатор :)
Скриншот
ЗЗЫ tormozit в своей подсистеме "Инструменты ИР" уже начал пользоваться.
71. Осипов Сергей (fixin) 3478 14.02.12 18:54 Сейчас в теме
забейте граждане.
будущее не за ООП, а за АОП (аспектно-ориентированным)
72. Алекс Ю (AlexO) 114 20.04.12 13:43 Сейчас в теме
(67) artbear,
Нет, не пользовался, т.к. создание собственных классов все-таки не очень удобно.

а в чем неудобство конкретно? в том, что 1с не дружит с ООП принципиально? или в конкретной реализации?
(70) artbear,
это, я так понимаю, ВК из (67)?
(71) fixin,
АОП полностью работает на ООП. Сам АОП никогда не откажется от ООП, т.к. аспекты - это прикладная реализация, а ООП - это база для реализации.
73. Артур Аюханов (artbear) 854 20.04.12 19:11 Сейчас в теме
(72) Да, именно эта доработка.
Работает на базе КОМ-объекта DynaWrapperX
74. Осипов Сергей (fixin) 3478 03.05.12 11:02 Сейчас в теме
(72) не согласен. В 1С есть элемент АОП - подписка на события. она не объектно-ориентированная.
75. Евгений Баинов (bainov) 103 28.02.15 11:54 Сейчас в теме
Не получается переопределить метод.
Как вызывать абстрактные методы, предназначенные для переопределения в потомках?
76. Алекс Ю (AlexO) 114 28.02.15 15:14 Сейчас в теме
(74) fixin,
В 1С есть элемент АОП - подписка на события
Это подделка под АОП. Как если сделать машину из фанеры, покрасить качественно, колеса приделать настоящие. И рядом поставить действительно настоящую. Обе стоят, от друг друга не отличить. Но одна сама ездит, другая - нет.
она не объектно-ориентированная.
В 1С нет вообще ничего объектно-ориентированно в настоящем значении этого определения. А есть подделки "ну вы же видите, что в результате некоторые моменты в платформе вроде как будто ООП!"
77. Алекс Ю (AlexO) 114 28.02.15 15:18 Сейчас в теме
(75) bainov,
Не получается переопределить метод.
Как вызывать абстрактные методы,
И не получится. Здесь имеем отдельную реализацию, "подтаскивание" 1С к ООП по каким-то пунктам или моментам. Если события или методы, или обработка "объекта" не реализованы у данной ВК - их не будет в 1С. Т.к. в 1С ООП нет и не было никогда. По-моему, фраза в описании
"Данная разработка в некоторой степени снимает это ограничение."
должна все объяснять сразу.
78. Евгений Баинов (bainov) 103 28.02.15 22:20 Сейчас в теме
(77) AlexO, Мне удалось таки реализовать при помощи данной разработки полиморфизм.

В обработке БазовыйКласс определяем переменную:

Перем Этот Экспорт; //через эту переменную будем вызывать переопределяемые методы

//Описываем виртуальный метод:


Процедура Рисовать(НомерРисунка) экспорт
   сообщить("Базовый класс рисует. № "+НомерРисунка);
КонецПроцедуры


//Используем метод в базовом классе:

Процедура ВывестиСписок() экспорт

  Для Инд=1 По 10 Цикл
       Этот.Рисовать(Инд);//вызываем свой виртуальный метод через переменную Этот
  КонецЦикла;

КонецПроцедуры

Этот = ЭтотОбъект; //пишем сюда ссылку на ЭтотОбъект. Но в потомке мы переопределим переменную на класс

...Показать Скрыть



В потомке НовыйКласс реализовываем инициализирующий метод-конструктор:

Функция Класс() Экспорт
    БазовыйКласс = Обработки.БазовыйКласс.Создать();
	Класс = Новый COMОбъект("RClassMngr.Class");
    Класс._Инит(ЭтотОбъект, БазовыйКласс);
	
    Класс.Этот=Класс; //прописываем себя в переменную Класс базового класса
	
    Возврат Класс;
КонецФункции

//Переопределяем метод 
Процедура Рисовать(НомерРисунка) экспорт
   сообщить("Класс-потомок класс рисует. № "+НомерРисунка+" уже по другому.");
КонецПроцедуры

...Показать Скрыть


Используем классы:

Базовый = Обработки.БазовыйКласс.Создать().Класс();
Базовый.ВывестиСписок();

Потомок = Обработки.НовыйКласс.Создать().Класс();
Потомок.ВывестиСписок();
...Показать Скрыть
79. Алекс Ю (AlexO) 114 01.03.15 04:06 Сейчас в теме
(78) bainov,
Мне удалось таки реализовать при помощи данной разработки полиморфизм
У вас в примере минимум не хватает функции "Класс", которая вызывается в
Базовый = Обработки.БазовыйКласс.Создать().Класс();
, и что выводится в
Базовый.ВывестиСписок();
....
Потомок.ВывестиСписок();
80. Евгений Баинов (bainov) 103 01.03.15 10:54 Сейчас в теме
(79) AlexO, Писал по памяти. Очепятался немного :)

Правильная процедура теста:

Процедура КнопкаВыполнитьНажатие(Кнопка)
	Базовый = Обработки.БазовыйКласс.Создать(); //"Базовый класс" - на самом деле является обычной обработкой
        
	Базовый.ВывестиСписок();                    //Вызываем метод обычной обработки


	Потомок = Обработки.НовыйКласс.Создать().Класс();//Класс-потомок создается уже при помощи метода Класс(), который прописывает ссылку на себя в обработке-предке в переменную Этот. Поскольку вызовы виртуального метода в предке будут идти как Этот.<Имя метода> , то фактически будет отрабатывать переопределенный в потомке метод.
	Потомок.ВывестиСписок();
КонецПроцедуры
...Показать Скрыть


Результат работы:

Выводим список методом предка:
Базовый класс рисует. № 1
Базовый класс рисует. № 2
Базовый класс рисует. № 3
Базовый класс рисует. № 4
Базовый класс рисует. № 5
Базовый класс рисует. № 6
Базовый класс рисует. № 7
Базовый класс рисует. № 8
Базовый класс рисует. № 9
Базовый класс рисует. № 10
Выводим список методом потомка:
Класс-потомок класс рисует. № 1 уже по другому.
Класс-потомок класс рисует. № 2 уже по другому.
Класс-потомок класс рисует. № 3 уже по другому.
Класс-потомок класс рисует. № 4 уже по другому.
Класс-потомок класс рисует. № 5 уже по другому.
Класс-потомок класс рисует. № 6 уже по другому.
Класс-потомок класс рисует. № 7 уже по другому.
Класс-потомок класс рисует. № 8 уже по другому.
Класс-потомок класс рисует. № 9 уже по другому.
Класс-потомок класс рисует. № 10 уже по другому.

ВЫВОД:
Респект автору! Решение работает отлично!
Хотя и было разработано во времена 8.0. Пример для 1С идет для 1С 8.0. Кое-как нашел дистрибутив 8.0 чтобы проверить.
Протестировано на 1С:Предприятие 8.3 (8.3.5.1383).
Вдохновившись, за эти выходные переписал частично работу с интерфейсом в нашей программке.
В результате количество программного кода уменьшилось раза в три, а функциональности стало намного больше.
На скриншоте отображен результат приведенного мной выше теста с использованием виртуальных методов.
А также результат применения ООП при разработке интерфейса для моей программы.
Прикрепил обработки для демонстрации возможностей.
Прикрепленные файлы:
БазовыйКласс.epf
НовыйКласс.epf
Тест.epf
81. Алекс Ю (AlexO) 114 01.03.15 12:26 Сейчас в теме
(80) bainov, а почему не сделали на общих функциях и программном формировании элементов?
82. Евгений Баинов (bainov) 103 01.03.15 14:41 Сейчас в теме
(81) AlexO,
так и сделано: классы программно отрисовывают свои области.
Общие функции - теперь в базовом классе.
Различающиеся методы рисования объектов - в потомках.
Каждый потомок теперь оснащен автоматически своими кнопками-скроллерами, отображаемыми при необходимости (если количество объектов не влезает в панель).

Базовый класс рулит общими процессами: порядком вывода "квадратиков" на экран, настройка вывода кнопок навигации, которые показываются и скрываются при автоматически.
количество элементов по горизонтали и вертикали, цвет, шрифт и т.п.

Потомки же сами выводят свои данные каждого объекта из своего списка в предназначенный ему "квадратик".

Раньше все было реализовано методами 1С. Код был очень громоздким, запутанным, зачастую повторяющимся.
Сейчас наконец-то можно писать на 1C, получая удовольствие от процесса работы с ООП.
А главное, производительность разработки существенно выше, чем при процедурном программировании - меньше ошибок, легче разработка.
83. Артур Аюханов (artbear) 854 01.03.15 22:42 Сейчас в теме
(82) Красиво, большой плюс за ООП :)
84. Сергей (Che) Коцюра (CheBurator) 3371 02.03.15 02:30 Сейчас в теме
Главное наверное - скорость работы решения, а не объем кода и его следование каким-то мегапринципам.
а то вот смотрю я на нашего восьмерочника и бп3 в таксях - две строки в документе и проводится документ секунд пять...
тоже на наверное на ооп все отрисовано..
85. Алекс Ю (AlexO) 114 02.03.15 09:53 Сейчас в теме
(84) CheBurator,
Главное наверное - скорость работы решения, а не объем кода и его следование каким-то мегапринципам.
Здесь еще на первое место выходит - наличие и работоспособность длл-ки. Как основа.
тоже на наверное на ооп все отрисовано..
Нет, это 8.3 так работает.... Говорят, быстрее в десять раз, чем когда она только вышла. И радуются, радуются...
86. Артур Аюханов (artbear) 854 02.03.15 16:19 Сейчас в теме
(84) ОФФ. главное, чтобы всех все устраивало - и бизнес, и разработчики, и конечных пользователей, и администраторов.
для этого и придумываются всякие методики, оптимизации и т.п.
87. Алекс Ю (AlexO) 114 03.03.15 22:04 Сейчас в теме
(82) bainov,
Базовый класс рулит общими процессами
Я, может, не понимаю чего, но почему это нельзя было реализовать "общими" процедурами?
"Базовая" процедура - управляет общими процессами, "потомки" - "выводят свои данные каждого объекта".
Т.е. вызываются последовательно универсальные процедуры. Их можно сделать со своими "методами" и "свойствами".
Именно так предлагал в свое время реализовать "подобие ООП" Гений1С.
Вот если бы можно было готовый объект использовать или класс, например - базовый интерфейс, а на его основе - потомки. Меняем базовый - меняются и потомки. меняем потомка - меняется только он.
А тут все те же функции надо писать, т.е. отличия от концепции, предложенной Гением1С, минимальны.
88. Евгений Баинов (bainov) 103 04.03.15 13:59 Сейчас в теме
(87) AlexO, Конечно можно. Я ж говорил что так оно и было раньше. А сейчас код выглядит понятнее. И легче вносить изменения в потомков.
Вы наверное приниципиальный противник ООП.
Не нравится классы проектировать? Или вмешательство в работу платформы 1С для вас кошунство? :)
С классами же проще как-то работать.
По скорости же работы 1С - ничуть не уступает обычному методу работы.
Представленный COM-объект просто переадресовывает обращения от одной обработки к другой.
А нам не приходится напрягать себе мозг лишними усилиями.
В результате глюков меньше, толку больше. Что нам и нужно в итоге.
89. Евгений Баинов (bainov) 103 04.03.15 14:04 Сейчас в теме
(87) AlexO, Предполагаю что в какой нибудь 1С9 добавят ООП - и все, в том числе и Вы, только и будут классы новые вовсю создавать.
И говорить потом - почему это вы отошли от принципов ООП? Сделали все обработками!
:)
90. Алекс Ю (AlexO) 114 04.03.15 14:32 Сейчас в теме
(88) bainov,
Вы наверное приниципиальный противник ООП.
Наоборот ))
Не нравится классы проектировать?
Ну так я здесь настоящих "классов"-то и не вижу - подмена функций - COM-объектами с функциями "внутри". Отличия от ранее предложенного подхода - минимальны.
Представленный COM-объект просто переадресовывает обращения от одной обработки к другой.
Вот именно, т.е. говорить о существовании отдельного объекта - нельзя. Чуть изменен способ перенаправления, и только.
Что у вас раньше было - в отдельных функциях, а теперь - в "отделной" обработке... ну, вам-то, может, и проще стало )). А я разницы не особо вижу )
В результате глюков меньше, толку больше.
Вот это точно не следствие "отдельных обработок".
(89) bainov,
Предполагаю что в какой нибудь 1С9 добавят ООП
Нет, не добавят. Потому что ООП - это крест на поддерживаемой ныне и бесконечно парадигме 1С "пропритетарности платформы", как они это понимают.
91. Евгений Баинов (bainov) 103 04.03.15 21:16 Сейчас в теме
(90) AlexO, Соглашусь с вами, что основным недостатком данной реализации является то, что нельзя сделать наследование более одного уровня.
Но, несмотря на это, все таки мне лично применение этого решения очень облегчает жизнь. Например, интерфейс с отрисовкой кнопок раньше я бы делал несколько дней.
А тут я успел переделать его несколько раз за день всего.
Прикрепленные файлы:
92. Евгений Баинов (bainov) 103 04.03.15 21:23 Сейчас в теме
(90) AlexO,
Нет, не добавят. Потому что ООП - это крест на поддерживаемой ныне и бесконечно парадигме 1С "пропритетарности платформы", как они это понимают.

А чем интересно ООП мешает "проприетарности платформы"?
93. Алекс Ю (AlexO) 114 05.03.15 14:26 Сейчас в теме
(91) bainov,
А тут я успел переделать его несколько раз за день всего.
Видимо, потому что вы уже заранее разобрались с механизмом формирования интерфейса по задаче "ООП в 1с"? :)
Не вижу возможности увеличения производительности при замене редактирования функций - редактированием функций в отдельных обработках.
(92) bainov,
А чем интересно ООП мешает "проприетарности платформы"?
Само ООП - не мешает проприетарности. Как мы это понимаем.
ООП мешает "проприетарности" в понимании 1С.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа