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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *