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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

92 Comments

  1. German

    Возьмем на заметку…

    Reply
  2. Душелов

    А что? Это идея…

    Reply
  3. biv75

    Интересно.. надо попробовать

    Reply
  4. Душелов

    С объектами понятно, а вот с формами… Сделать наследование форм…

    Документы, обработки — можно сделать наследованными, с реквизитами и методами… А вот как бы форму унаследовать…

    Reply
  5. Robert

    (4) Форму можно также наследовать. Только для того, чтобы самому обращаться как производному от формы классу.

    Или ты хотел бы производный класс подсунуть системе вместо базовой формы?

    Reply
  6. Душелов

    Тут как раз вопрос именно в визуальном редактировании наследованной формы и подмене обработчиков формы.

    Reply
  7. Robert

    (6) Я не совсем тебя понимаю. Объясни на пальцах.

    Вот есть форма, на ней реквизит, у реквизита обработчик. Теперь создаем новую форму и, типа, наследуем ее от первой. Как это выглядит? Что в редакторе формы? Что наследуется? Реквизиты или поведение реквизитов?

    Reply
  8. Душелов

    (7) Классическое наследование формы:

    Есть форма, на ней реквизиТ, у реквизита обработчик — получаем новую форму, аналогичную, только обработчик реквизита новой формы работает в старой форме. Но имеем возможность добавлять свои реквизиты у новой формы.

    Reply
  9. Robert

    (8) Ладно, идею понял. Пораскину мозгами.

    Reply
  10. Robert

    (8) Не, это совсем из другой оперы.

    Reply
  11. Душелов

    (10) Ну почему же? Наследовать же мы можем любые объекты, добавлять новые свойства, переопределять методы своими…

    Reply
  12. orefkov

    Для начала отлично.

    В свое время мы с Dmitro думали над возможными реализациями ООП в 8ке, и пришли почти к такому же решению, однако делать не стали.

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

    Сделано ли множественное наследование?

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

    То есть сейчас наследование (и обращение из класса к базовым методам) делается «ручками»:

    в инициализируещем методе обработки сами создаем объект ВК, и объекты базовых классов.

    Если хотим обращаться к методам базовых классов, то должны сами сохранить где-то (например в переменных модуля) ссылки на нами же созданные объекты.

    А вот тут Dmitro (как больший чем я спец по 8ке) подсказывает — у обработки могут быть реквизиты обработки с типом «Обработка.Объект», которые как-раз и было бы удобно использовать как базовые классы.

    Те у ВК допустим метод — CreateClass(ИмяОбработки)

    ВК создает эту обработку, базовые классы создаются САМИ как реквизиты этой обработки.

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

    Вобщем, надо думать над этим, и для начала определиться со стандартами — как прописывать/создавать иерархию наследования, как инициализировать, как описать public/protected/private методы и наследование, и тп.

    Reply
  13. artbear

    + Хорошо!

    Напрашивающийся вопрос: что будешь делать с исходниками? Будешь ли выкладывать в открытый доступ?

    Reply
  14. artbear

    Ага, вопросов куча 🙂

    Например, виртуальные методы реализованы?

    Reply
  15. Robert

    (12) http://www.1cpp.ru/forum/YaBB.pl?num=1237134465

    (11) Наследовать можем. А заставить V8 искать обработчик событий формы в модуле другой формы я не могу.

    Reply
  16. Душелов

    (15) Ну тогда только копировать обработчики в новую форму.

    Reply
  17. Robert

    (13) Дался тебе этот открытый доступ. Там кода кот наплакал. Выложу.

    (14) Как таковы виртульных методов нет. Можешь определить метод в базовом классе, но оставить метод пустым или добавить генерацию ошибки при вызове этого метода. А в производном классе переопределить этот метод и написать реализацию. В любом случае метод будет публичным и клиент может обратиться к методу.

    Reply
  18. Robert

    (16) Ты можешь не копировать текст обработчиков в новую форму, а в обработчиках новой формы вызывать обработчики из старой формы (базового класса). Соотв. при изменении базового класса изменится поведение всех обработчиков всех форм, которые на него завязаны. Но это можно и без всяких классов сделать

    Reply
  19. artbear

    Роберт, а скорость тестировал? Насколько сильно тормозить по сравнению с типовым/штатным вызовом метода обработки?

    Reply
  20. artbear

    А как быть с конструкторами классов, как базовых, так и наследников?

    Есть какой-нибудь вариант?

    ЗЫ кстати, народ, есть ли у кого-нибудь какая-нибудь система тестирования (функционального или юнит-тестирования) для 8 ?

    С ее помощью было бы удобно протестировать и данную ВК 🙂

    Reply
  21. Robert

    (19) Скорость не тестировал. Время вызова метода увеличивается максимум на время поиска метода в каждом базовом классе последовательно.

    (20) В моем примере _КакКласс по сути и есть конструктор. Если ты создаешь класс, у которого базовым является другой класс, то он создается также через _КакКласс, т.е. через вызов конструктора.

    Вообще, orefkov может быть предложит вариант изящнее.

    Reply
  22. artbear

    (21) По конструктору: Хотелось бы отделить/выделить стадии создания (статический метод) и стадию конструирования (на уже готовом объекте).

    Т.е. метод _КакКласс и метод Конструктор() ИМХО удобнее иметь отдельно.

    При этом было бы совсем красиво, если бы метод Конструктор вызывался из твоей ВК автоматом внутри твоего метода Инит 🙂

    Reply
  23. artbear

    (21) А как построена схема поиска метода? линейный поиск, бинарный, хеш, деревья и т.д.?

    Reply
  24. Robert

    (22) Без понятия 🙂 Я в код 1С не залезал. Это не RainbowV8. Я получаю IDispatch интерфейсы базовых объектов и использую их методы GetIDsOfNames и Invoke. Можно, конечно, кэшировать вызовы и по мере работы класса создавать собственный хеш, дерево или что угодно. Но заранее методы базовых объектов мне не известны.

    Reply
  25. artbear

    (24) Да, через ИДиспатч скорость будет слабенькая 🙁

    Reply
  26. coder1cv8

    Вот честно, не понимаю, какая в этом практическая польза? ) Столько разговоров про ООП, наследование… Зачем это в языке КОНФИГУРИРОВАНИЯ? Может конечно, дело в том, что я пришел в 1С не с «нормального» языка программирования, а изначально писал только на восьмерке (ну если не считать скрипты всякие)… Но вот за всю свою практику решения самых разнообразных задач, ни разу не чувствовал необходимости в чем-то подобном…

    Reply
  27. Dziden

    я вижу применение только для обфускации кода и подобных задач.

    Reply
  28. Robert

    (26) ООП это способ выражения программистской мысли. Весьма популярный способ на настоящий момент. Он имеет ряд преимуществ и ряд недостатков. Поклонников и противников.

    ИМХО, V8 имеет все признаки объектно ориентированного языка или системы, как угодно.

    Reply
  29. artbear

    (26) ООП нужен тем, кто не занимается копи-пастом, а любит/умеет строить нормальные программы, удобные при сопровождении, разработке и т.д.

    А 77 и 8, к сожалению, проповедуют минимальные знания разработчика/программиста — спец.термин даже придумали «внедренец» 🙁

    Reply
  30. artbear

    (28) 8 имеет только признаки ООП и сама сделана внутри на ООП-языке, но вот для разработчиков в среде 1С ничего в плане ООП не сделано.

    ИМХО ООП — в первую очередь возможность создавать собственные классы, схемы наследования и т.д.

    Reply
  31. ogidni

    Интересно

    Reply
  32. Hadgehogs

    А, пардон, тут ВКшэчка, ну да не в этом суть.

    Reply
  33. artbear

    (32) Не хочешь — не ешь 🙂

    Если не понимаешь смысла, также не говори.

    ООП нужно тем, кто не хочет выполнять постоянный копи-паст, а ведет постоянное накопление рабочего кода в виде необходимых классов + (29)

    Reply
  34. Арчибальд

    (26)Цитируем Кодера: ну зачем мне знать, как устроен автомобиль, если мне на нем ЕЗДИТЬ.

    А никто и не заставляет. Выложен инструментик для инженера (=творца), а не для юзера.

    (32)Сам-то ведь тоже в стае глупых пингвинов. ООП пользуешься — 1С на нем и стоит.

    Автору. Привязка к 8 и 1С++ в заголовке не требуется. Семерочникам методичность мышления тоже требуется. А для «особо юзвернутых» читателей неплохо бы добавить что-то типа «потребителей просят не беспокоиться»

    Reply
  35. Арчибальд

    (0)>Общеизвестно(Sic!), что ООП строится на трех основных принципах: полиморфизме, наследовании и инкапсуляции

    Безудержный оптимизм автора сильно воодушевляет.

    Reply
  36. artbear

    (35) Цитата «Автору. Привязка к 8 и 1С++ в заголовке не требуется. Семерочникам методичность мышления тоже требуется» к чему относится?

    Расшифруй, нифига не понятно 🙂

    Reply
  37. coder1cv8

    Ну вот, один (29) сказал что я «не умею стоить нормальные программы» и вообще занимаюсь «копи-пастом», второй (35) юзером обозвал! ))

    Reply
  38. Арчибальд

    (37)А это я поддерживаю посты 29 и 34. В том, что ООП — это, в первую очередь, стиль/метод мышления. И сам пользуюсь оным методом на семерке, хотя синтаксиса семерочного и не хватает.

    Автору плюсанул за методическую идею, а не за ВК-шку

    Reply
  39. Арчибальд

    (38)Если у тебя есть свои индивидуальные инструменты, ты, вероятно, мастер, а если нет, так, в лучшем случае, ремесленник. Т.е. пользователь (user).

    Reply
  40. coder1cv8

    А между тем все забывают что есть стандарты написания кода 1С, разработанные непосредственно создателями платформы, где использование всяких ВК и ООП отнюдь не поощряется. Специфика конфигураций 1С такова, что есть большая вероятность того что в дальнейшем ваш код будет сопровождать и разбирать кто-то другой. А для среднестатистического одинэсника, ООП — темный лес! Да, тут можно говорить о низком «пороге вхождения» в эту специальность, что поделать, так уж сложилось… Вот поэтому написание кода согласно стандартам 1С — это хороший стиль, признак мастера, не для себя, не для другого профи, а в первую очередь для ЗАКАЗЧИКА.

    Reply
  41. coder1cv8

    (40) Какие-такие инструменты? ) Поясни, пожалуйста…

    Reply
  42. Душелов

    (41) > есть стандарты написания кода 1С, разработанные непосредственно создателями платформы, где использование всяких ВК и ООП отнюдь не поощряется

    Холивар! :)) А в 7-ке ВК очень даже используются в типовых… v7plus.dll к примеру…

    Reply
  43. coder1cv8

    (43) Ну с семеркой-то как раз все понятно… Здесь холивар на другую тему! ))

    Reply
  44. Арчибальд

    (41)Ровно все наоборот. 1С сама выпустила книжечку про технологию ВК. На использовании ООП вся платформа построена. «Агрегатные объекты» языка — это классы с присущими им атрибутами и методами, наследуемыми при создании экземпляра класса и/или подкласса. «Среднестатистический одинэсник» может их, конечно, называть колобашками или хреновинками — это вопрос культуры речи. Да, мастер должен обеспечить сопровождаемость продаваемого продукта — но именно продукта, а не инсрументария, им использованного. И уж совсем глупо запрещать одному мастеру поделиться с другим своими приемами.

    Reply
  45. Арчибальд

    (42)Ноу-хау.

    Reply
  46. coder1cv8

    (46) хауноу? )

    Reply
  47. artbear

    (41) Как раз с этим нельзя согласиться!

    Данный стандарт, как и любой стандарт разработки, не является обязательным и автоматическим применяемым.

    1С его ввела для упрощения/стандартизации ведения разработки и помощи разработчикам в плане указания полезных фич решения учетных задач и т.д.

    ООП-схемы прекрасно можно уложить даже и в этот стандарт 🙂

    Reply
  48. WKBAPKA

    Плюсану за оригинальность идеи…

    Reply
  49. Valerich

    Больше всего от ООП действительно не хватает полиморфизма и наследования. Особенно это касается форм. TormozIT как-то поднимал вопрос инкапсуляции форм, т.е. чтобы готовую форму можно было вставить в другую форму в качестве закладки на панели или что-то в этом роде.

    Reply
  50. Froloid

    Автору плюс. Тем кто пытается доказать что это не нужно — минус. Любая вещь не является нужной или не нужной по определению, она может быть нужной или нет для кого-то конкретно. И у этой обязательно найдутся свои поклонники!

    Reply
  51. rasswet

    я когда чего-то не понимаю часто думаю что наверное это что-то очень умное. Плюсану

    Reply
  52. K_A_O

    Чего-то не получается зарегистрировать: «regsvr32 RClassMngr.dll»

    Права администратора есть. Говорит «Приложение некорректно настроено».

    Пробовал в Windows XP SP3 и в Windows Server 2003 SP1

    Reply
  53. Robert

    (53) Никогда не встречал такой ошибки при регистрации.

    Попробуй загрузить библиотеку через ЗагрузитьВнешнююКомпоненту. При такой загрузке она должна самостоятельно зарегистрироваться.

    Reply
  54. K_A_O

    (54) Так, естественно, тоже не регистрируется.

    Я нашел ссылку на подобную проблему

    http://www.rsdn.ru/Forum/message/3022647.all.aspx

    В принципе все начинает регистроваться и работать, если установить «Microsoft Visual C++ 2008 Redistributable Package».

    Reply
  55. Robert

    (55) Понял. Спасибо. Буду иметь в виду

    Reply
  56. steban

    Чтобы не зависеть от VC90 runtime, можно собрать ВК прилинковав runtime статически:

    в свойствах проекта -> c/c++ ->Code Generation -> Runtime Library поставить «Multi-threaded» вместо «Multi-threaded DLL»

    dll-как чуток распухнет в размере и избавится от зависимости от msvcr90

    Reply
  57. steban

    Ой.

    А она еще от ATL90.dll зависит.

    Можно избавить так:

    Свойства проекта -> Configuration properties -> General -> Use of ATL поставить «Static link to ATL»

    Reply
  58. Robert

    (55,57,58) Сделано. Спасибо.

    Reply
  59. artbear

    Роберт, а ты отладчиком пробовал заходить в подобные классы/субклассы.

    Работает ли отладка для подобной схемы?

    Reply
  60. Robert

    (60) Пробовал. Работает.

    Reply
  61. artbear

    (61) Это очень хорошо, заморочек будет меньше.

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

    Reply
  62. kote

    (32) и др. не попробовавших ООП или не программировавших ничего, кроме учетных задач..

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

    Смотрите что происходит — с появлением 8.1 — появились новые объекты (на самом деле классы) — БизнесПроцессы.. А будь там ООП — юзеры сами бы создали этот и много других классов.. но для 1С это плохо, — посмотрите на пользователей 1С++ — теперь их за уши не оттащишь от 7.7 с 1С++.. в общем, потерянные клиенты для 1С на неопределенное время.

    Reply
  63. Rusmus

    (50) а можно ссылку на эту тему? я и сам собирался реализовать подобное

    Reply
  64. B0P0H

    хм. а множественное наследование?

    Reply
  65. cool.vlad4

    (62) artbear, столько времени прошло, честно скажи пользовался этой ВК? …просто интересно…

    Reply
  66. artbear

    (66) Нет, не пользовался, т.к. создание собственных классов все-таки не очень удобно.

    Планирую сделать собственную ВК для реализации ООП и Перехватчика для 8-ки аналогично реализованным в 1С++ для 77 На базе прямого доступа к внутренним функциям 1С 8.2

    ЗЫ в принципе уже есть примеры реализации ООП для 8.2, товарищ chessman с 1cpp.ru сделал 🙂

    Reply
  67. cool.vlad4

    (67) Сама идея неплоха, вот только проблема как мне кажется в 1С, они же не используют ничего подобного;-((( а с типовыми работать надо…

    Reply
  68. artbear

    (68) В 1С++ для 77 мы вполне успешно юзали отдельные классы и целые наборы классов. было очень удобно.

    Reply
  69. artbear

    (68) Например, уже сейчас у chessman-a работает такой код

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    объектИнформатор = Новый Информатор;
    объектИнформатор.Изучить(Справочники);
    КонецПроцедуры
    

    ЗЫ кстати, рекомендую Объект Информатор 🙂

    Скриншот

    ЗЗЫ tormozit в своей подсистеме «Инструменты ИР» уже начал пользоваться.

    Reply
  70. fixin

    забейте граждане.

    будущее не за ООП, а за АОП (аспектно-ориентированным)

    Reply
  71. AlexO

    (67) artbear,

    Нет, не пользовался, т.к. создание собственных классов все-таки не очень удобно.

    а в чем неудобство конкретно? в том, что 1с не дружит с ООП принципиально? или в конкретной реализации?

    (70) artbear,

    это, я так понимаю, ВК из (67)?

    (71) fixin,

    АОП полностью работает на ООП. Сам АОП никогда не откажется от ООП, т.к. аспекты — это прикладная реализация, а ООП — это база для реализации.

    Reply
  72. artbear

    (72) Да, именно эта доработка.

    Работает на базе КОМ-объекта DynaWrapperX

    Reply
  73. fixin

    (72) не согласен. В 1С есть элемент АОП — подписка на события. она не объектно-ориентированная.

    Reply
  74. bainov

    Не получается переопределить метод.

    Как вызывать абстрактные методы, предназначенные для переопределения в потомках?

    Reply
  75. AlexO

    (74) fixin,

    В 1С есть элемент АОП — подписка на события

    Это подделка под АОП. Как если сделать машину из фанеры, покрасить качественно, колеса приделать настоящие. И рядом поставить действительно настоящую. Обе стоят, от друг друга не отличить. Но одна сама ездит, другая — нет.

    она не объектно-ориентированная.

    В 1С нет вообще ничего объектно-ориентированно в настоящем значении этого определения. А есть подделки «ну вы же видите, что в результате некоторые моменты в платформе вроде как будто ООП!»

    Reply
  76. AlexO

    (75) bainov,

    Не получается переопределить метод.

    Как вызывать абстрактные методы,

    И не получится. Здесь имеем отдельную реализацию, «подтаскивание» 1С к ООП по каким-то пунктам или моментам. Если события или методы, или обработка «объекта» не реализованы у данной ВК — их не будет в 1С. Т.к. в 1С ООП нет и не было никогда. По-моему, фраза в описании

    «Данная разработка в некоторой степени снимает это ограничение.»

    должна все объяснять сразу.

    Reply
  77. bainov

    (77) AlexO, Мне удалось таки реализовать при помощи данной разработки полиморфизм.

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

    Перем Этот Экспорт; //через эту переменную будем вызывать переопределяемые методы
    
    //Описываем виртуальный метод:
    
    
    Процедура Рисовать(НомерРисунка) экспорт
    сообщить(«Базовый класс рисует. № «+НомерРисунка);
    КонецПроцедуры
    
    
    //Используем метод в базовом классе:
    
    Процедура ВывестиСписок() экспорт
    
    Для Инд=1 По 10 Цикл
    Этот.Рисовать(Инд);//вызываем свой виртуальный метод через переменную Этот
    КонецЦикла;
    
    КонецПроцедуры
    
    Этот = ЭтотОбъект; //пишем сюда ссылку на ЭтотОбъект. Но в потомке мы переопределим переменную на класс
    
    

    Показать

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

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

    Показать

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

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

    (78) bainov,

    Мне удалось таки реализовать при помощи данной разработки полиморфизм

    У вас в примере минимум не хватает функции «Класс», которая вызывается в

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

    , и что выводится в

    Базовый.ВывестиСписок();
    ….
    Потомок.ВывестиСписок();
    Reply
  79. bainov

    (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).

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

    В результате количество программного кода уменьшилось раза в три, а функциональности стало намного больше.

    На скриншоте отображен результат приведенного мной выше теста с использованием виртуальных методов.

    А также результат применения ООП при разработке интерфейса для моей программы.

    Прикрепил обработки для демонстрации возможностей.

    Reply
  80. AlexO

    (80) bainov, а почему не сделали на общих функциях и программном формировании элементов?

    Reply
  81. bainov

    (81) AlexO,

    так и сделано: классы программно отрисовывают свои области.

    Общие функции — теперь в базовом классе.

    Различающиеся методы рисования объектов — в потомках.

    Каждый потомок теперь оснащен автоматически своими кнопками-скроллерами, отображаемыми при необходимости (если количество объектов не влезает в панель).

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

    количество элементов по горизонтали и вертикали, цвет, шрифт и т.п.

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

    Раньше все было реализовано методами 1С. Код был очень громоздким, запутанным, зачастую повторяющимся.

    Сейчас наконец-то можно писать на 1C, получая удовольствие от процесса работы с ООП.

    А главное, производительность разработки существенно выше, чем при процедурном программировании — меньше ошибок, легче разработка.

    Reply
  82. artbear

    (82) Красиво, большой плюс за ООП 🙂

    Reply
  83. CheBurator

    Главное наверное — скорость работы решения, а не объем кода и его следование каким-то мегапринципам.

    а то вот смотрю я на нашего восьмерочника и бп3 в таксях — две строки в документе и проводится документ секунд пять…

    тоже на наверное на ооп все отрисовано..

    Reply
  84. AlexO

    (84) CheBurator,

    Главное наверное — скорость работы решения, а не объем кода и его следование каким-то мегапринципам.

    Здесь еще на первое место выходит — наличие и работоспособность длл-ки. Как основа.

    тоже на наверное на ооп все отрисовано..

    Нет, это 8.3 так работает…. Говорят, быстрее в десять раз, чем когда она только вышла. И радуются, радуются…

    Reply
  85. artbear

    (84) ОФФ. главное, чтобы всех все устраивало — и бизнес, и разработчики, и конечных пользователей, и администраторов.

    для этого и придумываются всякие методики, оптимизации и т.п.

    Reply
  86. AlexO

    (82) bainov,

    Базовый класс рулит общими процессами

    Я, может, не понимаю чего, но почему это нельзя было реализовать «общими» процедурами?

    «Базовая» процедура — управляет общими процессами, «потомки» — «выводят свои данные каждого объекта».

    Т.е. вызываются последовательно универсальные процедуры. Их можно сделать со своими «методами» и «свойствами».

    Именно так предлагал в свое время реализовать «подобие ООП» Гений1С.

    Вот если бы можно было готовый объект использовать или класс, например — базовый интерфейс, а на его основе — потомки. Меняем базовый — меняются и потомки. меняем потомка — меняется только он.

    А тут все те же функции надо писать, т.е. отличия от концепции, предложенной Гением1С, минимальны.

    Reply
  87. bainov

    (87) AlexO, Конечно можно. Я ж говорил что так оно и было раньше. А сейчас код выглядит понятнее. И легче вносить изменения в потомков.

    Вы наверное приниципиальный противник ООП.

    Не нравится классы проектировать? Или вмешательство в работу платформы 1С для вас кошунство? 🙂

    С классами же проще как-то работать.

    По скорости же работы 1С — ничуть не уступает обычному методу работы.

    Представленный COM-объект просто переадресовывает обращения от одной обработки к другой.

    А нам не приходится напрягать себе мозг лишними усилиями.

    В результате глюков меньше, толку больше. Что нам и нужно в итоге.

    Reply
  88. bainov

    (87) AlexO, Предполагаю что в какой нибудь 1С9 добавят ООП — и все, в том числе и Вы, только и будут классы новые вовсю создавать.

    И говорить потом — почему это вы отошли от принципов ООП? Сделали все обработками!

    🙂

    Reply
  89. AlexO

    (88) bainov,

    Вы наверное приниципиальный противник ООП.

    Наоборот ))

    Не нравится классы проектировать?

    Ну так я здесь настоящих «классов»-то и не вижу — подмена функций — COM-объектами с функциями «внутри». Отличия от ранее предложенного подхода — минимальны.

    Представленный COM-объект просто переадресовывает обращения от одной обработки к другой.

    Вот именно, т.е. говорить о существовании отдельного объекта — нельзя. Чуть изменен способ перенаправления, и только.

    Что у вас раньше было — в отдельных функциях, а теперь — в «отделной» обработке… ну, вам-то, может, и проще стало )). А я разницы не особо вижу )

    В результате глюков меньше, толку больше.

    Вот это точно не следствие «отдельных обработок».

    (89) bainov,

    Предполагаю что в какой нибудь 1С9 добавят ООП

    Нет, не добавят. Потому что ООП — это крест на поддерживаемой ныне и бесконечно парадигме 1С «пропритетарности платформы», как они это понимают.

    Reply
  90. bainov

    (90) AlexO, Соглашусь с вами, что основным недостатком данной реализации является то, что нельзя сделать наследование более одного уровня.

    Но, несмотря на это, все таки мне лично применение этого решения очень облегчает жизнь. Например, интерфейс с отрисовкой кнопок раньше я бы делал несколько дней.

    А тут я успел переделать его несколько раз за день всего.

    Reply
  91. bainov

    (90) AlexO,

    Нет, не добавят. Потому что ООП — это крест на поддерживаемой ныне и бесконечно парадигме 1С «пропритетарности платформы», как они это понимают.

    А чем интересно ООП мешает «проприетарности платформы»?

    Reply
  92. AlexO

    (91) bainov,

    А тут я успел переделать его несколько раз за день всего.

    Видимо, потому что вы уже заранее разобрались с механизмом формирования интерфейса по задаче «ООП в 1с»? 🙂

    Не вижу возможности увеличения производительности при замене редактирования функций — редактированием функций в отдельных обработках.

    (92) bainov,

    А чем интересно ООП мешает «проприетарности платформы»?

    Само ООП — не мешает проприетарности. Как мы это понимаем.

    ООП мешает «проприетарности» в понимании 1С.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *