IPB

Здравствуйте, гость ( Вход | Регистрация )

Фото
 
artbear .
artbear
Продвинутый
45
Башкортостан
Ноябрь-21-1973
Интересы
Нет данных
25-July 03
7368*
23rd September 2010 - 11:30
Jul 19 2019, 20:46
887 (0 сообщений в день)
AIM Нет данных
Yahoo Нет данных
ICQ 265666057
MSN Нет данных

artbear

Пользователи

***


Темы
Сообщения
Blogs
10 Apr 2006
Народ, хочется добавить новую фичу в 1С++ - перехват встроенных методов от 1С.

Например, мне не нравится работа методов СохранитьЗначение, ВосстановитьЗначение. Уж очень они медленные sad.gif Если бы был ООП-перехватчик, можно было бы добавить быструю выгрузку/загрузку, например, в индексированный ДБФ-файл.

Что и где менять в коде 1С++, я уже знаю smile.gif
Меня интересует вопрос методологии, т.е. определение/реализация подобной фичи smile.gif

Пока я вижу это так: есть объект 1С++ "ПерехватчикВстроенныхМетодов1С".
У него метод Перехватить(НазваниеВстроенногоМетода, Ключ, ОбъектОбработчик, НазваниеМетодаВОбработчике = "")
где
Ключ - уникальное название для быстрого поиска обработчика
ОбъектОбработчик - любой КОП
НазваниеМетодаВОбработчике - название метода, если не задано, совпадает с НазваниеВстроенногоМетода.
Т.е. что-то наподобие делегата/менеджера событий, но со своей схемой, ведь очень важна скорость, т.к. перехватываться будут все встроенные методы 1С.

1) Удобна ли подобная реализация? или есть другие предложения?
2) Нужен ли метод УдалитьОбработчик(Ключ)?
3) В глобальник не хочу вставлять - потому что медленно и нет ООП smile.gif

Что скажете?
6 Apr 2006
Народ, ИМХО пора сделать утилиту или сделать какой-то скрипт для авторегистрации 1С++ в системе.
Что-то слишком часто начали вопросы возникать
Мое видение - консольная утилита, которую можно запустить через RunAs под учетной записью админа, которая все делает.
Или добавить фичу саморегистрации 1С++ через regsvr32.

PS вроде fez что-то подобное показывал в прошлых годах

PPS или уже есть подобные утилиты?
4 Apr 2006
В 1С++ в последних ночных сборках добавлены следующие фичи
  • Доработано ускорение контекста, в т.ч. и для внешних отчетов, на базе методов ТурбоБЛ
    1) есть возможность обращаться к переменным и методам любой формы напрямую (уже есть в TurboBL)
    2) самое главное, для внешних отчетов больше нет необходимости создавать объект "УскорительГК" в модуле внешнего отчета. Этот код выполняется автоматически при открытии формы любого внешнего отчета.
  • Для всех КОП
    1. Добавлено:
    1. более читабельный метод "ЗаменитьБазовыйОбъект" (ReplaсeBaseObject) - синоним ЗаменитьЭкcзБазовогоКласса
    2. Новый встроенный метод для КОП "ЯвляетсяОбъектом(ИмяКласса)" (англ. "TheClassIs")
    Метод проверяет, является ли КОП объектом переданного класса или унаследован от переданного класса.
    Возвращает 1, если да, 0, если нет.

    2. Исправлено:
    * Тип объекта класса, получаемый в ТипЗначенияСтр, равен тому наименованию, что написал разработчик в файле описания класса,
    а не так, как пользователь напишет в СоздатьОбъект(ТипОбъекта) [bug 2021]

    * исправлен баг 2023 - в методе "ОтправитьСообщениеМодулюХоз" - [bug 2023]
    не удавалось получить возвращаемое значение от обработчика события в модуле-хозяине;
    * в методе "ОтправитьСообщениеМодулюХоз" - если в модуле-хозяине нет обработчика "ОбработкаСобытияОтКласса", выдается исключение

    * Метод Структура::Удалить() выдает исключение, если переданного
    ключа в структуре не существует. [bug 2103]
  • Класс "MetaInfoClasses":
    1. Добавлен новый метод "ЯвляетсяОбъектом" (англ. "IsObject")
    Число ЯвляетсяОбъектом(<ИмяПроверяемогоТипа>, <ИмяТипаНаКоторыйПроверяем>)
    Метод проверяет, является ли <ИмяПроверяемогоТипа> вторым параметрым или унаследован от последнего.
    Возвращает 1, если да, 0, если нет.

    2. Добавлен новый метод "ПолучитьИменаБазовыхКлассов" (англ. "GetBaseClasses")
    Метод возвращает список значений, в котором значения - это названия базовых классов;
  • Класс "ВыполняемыйМодуль":
    1. добавлен новый метод "КомпилироватьИВыполнитьМодуль", который в случае ошибок синтаксиса или выполнения, генерит соответствующее исключение, а не возвращает какие-нибудь значения;
    Рекомендую использовать этот метод вместо вызовов "КомпилироватьМодуль " и "ВыполнитьМодуль".
    2. Добавлены доп. параметры в ВыполняемыйМодуль::GetMethOfContext для получения описаний в ТЗ.
    -------------------------------------------------------------------------
    **Синтаксис:** GetMethOfContext(Объект, тзМетоды = 0, тзСвойства = 0)

    - **Объект** - тип: Контекст, АгрегатныйОбъект. Объект, для которого необходимо получить описание.
    - **тзМетоды** - тип: ТаблицаЗначений. ТЗ, в которую будет возвращено описание методов объекта.
    - **тзСвойства** - тип: ТаблицаЗначений. ТЗ, в которую будет возвращено описание свойств объекта.

    **Описание:** Предоставляет информацию о методах и свойствах объекта.

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

    Если задана хотя бы одна из таблиц (тзМетоды, тзСвойства), описание возвращается в соотв. таблице.
    Иначе описание выводится в окно сообщений.
    -------------------------------------------------------------------------

    2. Исправлено:
    - Метод "Выполнить" при ошибке выполнения типа "Объект.НесуществующийМетод()" не выдает лишнюю ошибку в окно сообщений, а генерит исключение;
ЗЫ Все измененения проверены на тестах и полностью соответствуют указанному функционалу smile.gif
3 Apr 2006
Плотно занявшись тестированием 1С++, начал обнаруживать для себя удивительные абсолютно недокументированные вещи с неоднозначным поведением smile.gif
Например, у каждого КОП есть метод "НазначитьБазовыйКласс", все знают, для чего он используется.
Пишу тестовый код
(есть классы Потомок, его базовый класс Предок и новый базовый класс ДругойПредок)
1Cv7
   Объект.НазначитьБазовыйКласс("ДругойПредок");
   Объект.ЗаменитьБазовыйКласс("ДругойПредок", СоздатьОбъект("ДругойПредок"));

   // такого базового класса больше быть не должно, но он есть :(
   ТипОбъекта = ТипЗначенияСтр(Объект.ПолучитьБазовыйКласс("Предок"));
// здесь тип базового объекта все равно равен "Предок"

   ТипОбъекта = ТипЗначенияСтр(Объект.ПолучитьБазовыйКласс("ДругойПредок"));
// а здесь тип еще одного базового объекта равен равен "ДругойПредок"

   ТипОбъекта = ТипЗначенияСтр(Объект.ПолучитьБазовыйКласс(""));

// здесь тип первого базового объекта (по умолчанию) все равно равен "Предок" :(

Я все время считал, что этот метод должен заменять все базовые классы, если они есть, или один исходныйбазовый класс на один единственный базовый класс, а, оказывается, что это не так sad.gif
Но получается, что методы "НазначитьБазовыйКласс" на самом деле только добавляют базовые классы к иерархии, а не удаляют существующие, что четко видно из исходников 1С++

ИМХО здесь явная недокументированная неоднозначность.

Поэтому предлагаю изменить функционал
1. изменить метод "НазначитьБазовыйКласс" - должен будет удалять всю иерархию и заменять ее на один единственный базовый класс.
например, есть класс Потомок с предками Предок1,Предок2, делаю НазначитьБазовыйКласс("ДругойПредок") и имхо правильнее, чтобы
остался только базовый класс ДругойПредок, а остальных базовых классов нету sad.gif
2. Добавить метод "ДобавитьБазовыйКласс", который и будет добавлять базовые классы в иерархию, т.е. выполнять текущий функционал от "НазначитьБазовыйКласс".
А вот метод ДобавитьБазовыйКласс будет уже добавлять в структуру, т.е. будут базовые классы Предок1, Предок2, ДругойПредок.

В этом случае все удобно, просто и понятно.
Что скажете?

ЗЫ внести поправку в 1С++ смогу сам, измененый код и его полные, проверенные тесты уже есть smile.gif
30 Mar 2006
Народ, у нас с ДмитрО небольшое разногласие по поводу поведения метода "Размер" объекта "BinaryData" при простом получении размера.
Т.е. если вызвать БД.Размер() для получения размера потока/файла, в текущем состоянии указатель потока/файла автоматически сдвигается в конец файла, получаем позицию конца файла (то, что нужно), но после этого позиция не восстанавливается на позицию до вызова этого метода.

Так вот, ДмитрО считает это поведение верным, а я - нет smile.gif

ИМХО это неочевидное поведение. Как правило, этот метод вызывается только для получения размера потока/файла, а для перемещения в конец файла надежнее явно писать БД.Перейти(0,2).
И поэтому я предлагаю поведение метода "Размер" поправить - если новый размер не указан, указатель после выполнения метода нужно восстановить на предыдущую позицию.

Ждем вашего мнения.
Zep


18 Jun 2019 - 15:30


21 Sep 2007 - 4:18


2 Aug 2007 - 8:55

artbear.


657
14th November 2012 - 00:09
RSS Текстовая версия Сейчас: 19th July 2019 - 17:46