Для иллюстрации возможностей "движка" также приложил реальную компоненту, реализующую несколько нетривиальных объектов, таких как РасшСтруктура, РасшСписокЗначений, ОбъектныйМодуль.
РасшСтруктура и
РасшСписокЗначений в целом повторяют функциональность объектов Структура из 1С++ и СписокЗначений из самой 1С (не все методы реализованы, только основные). Отличие в том, что в них добавлены новые методы для вставки "ссылок без блокировки", позволяющие организовывать циклические ссылки (которые, как известно, нельзя делать с обычными объектами, потому что память из под таких объектов не будет освобождена). Не буду объяснять, для чего это было необходимо на практике – это отдельная тема, на которой можно развести
большой срач обширную дискуссию и долго спорить о стилях программирования (чего делать совершенно не хочется).
Использовать можно так:
Родитель=СоздатьОбъект("РасшСтруктура");
Родитель.Вставить("Объекты", СоздатьОбъект("СписокЗначений"));
Объект=СоздатьОбъект("РасшСтруктура");
Объект.ВставитьБезБлокировки("Родитель", Родитель);
Родитель.Объекты.ДобавитьЗначение(Объект);
Или в любых подобных и более сложных комбинациях. В метод ВставитьБезБлокировки() можно передавать и ссылки на обычные объекты 1С типа СписокЗначений или ТаблицаЗначений. При этом корректно будет работать и "неправильное" использование "ссылок без блокировки" типа такого:
Объект.ВставитьБезБлокировки("Ссылка", СоздатьОбъект("СписокЗначений"));
Созданный список значений должен будет тут же уничтожиться, поскольку Объект ссылается на него без блокировки, а больше на него не ссылается никто. Так и произойдет и свойство Ссылка просто примет значение типа ПустоеЗначение. Также корректно отработает такой код:
Родитель=СоздатьОбъект("РасшСтруктура");
Объект.ВставитьБезБлокировки("Родитель", Родитель);
Родитель=0;
После Родитель=0 свойство Объект.Родитель также примет ПустоеЗначение. Если же передать в методы ...БезБлокировки() не объект, а обычное значение (число, строку и т.д.), они просто сработают как обычные.
РасшСписокЗначений также крайне выгодно отличается от своего собрата в 1С тем, что все методы, работающие с ключами (Установить, Получить, ДобавитьЗначение со вторым параметром), реализованы, как и РасшСтруктура, с использованием хэширования. Знающие люди поймут разницу между O(n2) при бездумном использовании этих методов в объекте СписокЗначений и O(n) в РасшСписокЗначений (при ограниченном количестве коллизий). Кстати, функция для расчета хэша строк безбожно тестировалась и подгонялась для достижения наибольшей равномерности и показывает довольно сносные результаты. Хотя, наверняка, можно придумать и получше.
Также РасшСписокЗначений содержит настройку ЧувствительностьКРегистру, которая соответствующим образом влияет на работу методов с ключами (по умолчанию чувствителен к регистру). Список.ЧувствительностьКРегистру(0) делает его к регистру не чувствительным (как Структура).
Кстати, из-за применения нового движка, а также свежесамописанных упрощенных хэш-таблиц и коллекций эти объекты работают даже немного быстрее, чем в 1С++. И это еще компилиные УЖАСНЫМ компилятором VS6. Как он меня достал! Щас вот закончу пока с написанием компонент и пойду снесу его на#@$. Буду пробовать ставить что-нибудь посвежее из VS и прикручивать к ней Intel Compiler. Даже самый банальный оптимизатор способен сгенерировать код, работающий раза в 3 быстрее, чем после VS6. Я уж не говорю про постоянные Inetrnal Compiler Error, или тупо "Свойство такое-то в таком-то классе не обнаружено", хотя оно там заведомо есть, или вообще забавную компиляцию, когда, например, вместо функции из некоего базового класса функция вызывает саму себя со всеми вытекающими из этого прелестями.
Ладно, ближе к делу.
ОбъектныйМодуль – примитивная замена объектно-ориентированному программированию, которое из 1С++ я так и не решился использовать (слишком уж экстремальным для меня все еще выглядит такое решение), но без которого уже давно вешаюсь и убиваюсь головой об стену. Для самых банальных случаев подойдет ОбъектныйМодуль. Он просто грузит код из файла .ERT и все переменные и процедуры с функциями (точнее только экспортированные, но это настраивается) становятся доступными как свойства и методы объекта. Код компилируется и исполняется с корректной выдачей ошибок точно как в обычных модулях 1С и с переходом по клику в конфигуратор. Правда не проверял как работает отладка, да и вообще еще особо его не тестировал. Может кому пригодится пока хотя бы как пример реализации динамических методов и свойств в описываемом "движке".
Исходники в первом файле, DLL тут: