Доброго здоровья, Алексей Леонидович!
Если есть в Сервисе возможность получить внешний модуль, насколько трудоемко получить модуль встроенной обработки?
Перекопал все алсы по 1спп, но так и не нашел возможности создать ВыполняемыйМодуль на основе модуля конфигурации, а реализация объектов на внешних файлах имхо есть моветон.
Теоретически есть РасширениеФормы.ТекстМодуля.
Цитата: item от 02 апреля 2024, 13:02Если есть в Сервисе возможность получить внешний модуль, насколько трудоемко получить модуль встроенной обработки?
Можете получить так.
В текущем отчёте открываете диалоговую форму, содержащюю требуемый модуль.
В ней при открытии формексом получаете текст модуля и сохраняете её.
И отрабатываете СтатусВозврата(0);
Код типа:
ФормаРасш = СоздатьОбъект( "РасширениеФормы" );
ФормаРасш.УстановитьФорму( Форма );
Конт = Форма.Параметр; // Получить список параметров
Получаете и сохраняете текст модуля
СтатусВозврата(0);
Цитата: АЛьФ от 02 апреля 2024, 13:21Теоретически есть РасширениеФормы.ТекстМодуля.
Ну, в общем выкрутил, вернул текст модуля ПриОткрытии через гл.переменную,
потому как ВыполняемыйМодуль таки не дружит с Формой и Параметром, и не хочет такой текст потом компилировать.
Цитата: Forum123 от 02 апреля 2024, 14:29Код типа:
Всё так, только вот так:
РасшФормы = СоздатьОбъект("РасширениеФормы");
глТекстМодуля = РасшФормы.ТекстМодуля;
СтатусВозврата(0);
Цитата: item от 02 апреля 2024, 14:34Всё так, только вот так:
Вот и чудненько!
А зачем сохранять в глобальную переменную?
В контексте основного модуля в какую-нибудь переменную сохраняйте.
Имхо, весь функционал ВыполняемыйМодуль должен быть в формексе, а не в iсpp.
Концепцию ООП он там нарушает, как бельмо, а к формексу пристегнулся бы, как родной.
И не путали бы почитатели в своих хотелках формы с модулями.
Цитата: item от 02 апреля 2024, 14:42И не путали бы почитатели в своих хотелках формы с модулями.
А что это за кнопка "Понравилось".
Для чего она?
Цитата: Forum123 от 02 апреля 2024, 14:38А зачем сохранять в глобальную переменную?
В контексте основного модуля в какую-нибудь переменную сохраняйте.
"Галя, я не выкупаю."
И чево потом? Где создать ВыполняемыйМодуль? В модуле обработки? И зарекурсировать его окончательно?
Задача у меня простая, создать коллекцию объектов, разгрузив глобальный модуль.
Цитата: item от 02 апреля 2024, 14:46И чево потом? Где создать ВыполняемыйМодуль? В модуле обработки? И зарекурсировать его окончательно?
Не так.
Из полученного исходника берёте текст требуемых функций и динамически добавляете в контекст модуля.
И используете!
Цитата: item от 02 апреля 2024, 14:46Цитата: Forum123 от 02 апреля 2024, 14:38А зачем сохранять в глобальную переменную?
В контексте основного модуля в какую-нибудь переменную сохраняйте.
"Галя, я не выкупаю."
И чево потом? Где создать ВыполняемыйМодуль? В модуле обработки? И зарекурсировать его окончательно?
Задача у меня простая, создать коллекцию объектов, разгрузив глобальный модуль.
Почему тогда не дополнительные глобальники, а выполняемый модуль?
Цитата: Forum123 от 02 апреля 2024, 14:49Цитата: item от 02 апреля 2024, 14:46И чево потом? Где создать ВыполняемыйМодуль? В модуле обработки? И зарекурсировать его окончательно?
Не так.
Из полученного исходника берёте текст требуемых функций и динамически добавляете в контекст модуля.
И используете!
Каким образом?
Цитата: item от 02 апреля 2024, 14:46Задача у меня простая, создать коллекцию объектов, разгрузив глобальный модуль.
Почему тогда не классы? Они прекрасно живут и в составе md.
Цитата: АЛьФ от 02 апреля 2024, 14:51Каким образом?
1cpp позволяет в конекст модуля добавлять динамически новые процедуры и функции.
Доступ к ним через "Конт.".
Цитата: Forum123 от 02 апреля 2024, 14:53Цитата: АЛьФ от 02 апреля 2024, 14:51Каким образом?
1cpp позволяет в конекст модуля добавлять динамически новые процедуры и функции.
Доступ к ним через "Конт.".
Каким образом?
Цитата: АЛьФ от 02 апреля 2024, 14:56Каким образом?
Класс ВыполняемыйМодуль / ExecuteModule
УстановитьМодуль / AssignSource Устанавливает текст модуля на выполнение.
...
Цитата: Forum123 от 02 апреля 2024, 14:57Цитата: АЛьФ от 02 апреля 2024, 14:56Каким образом?
Класс ВыполняемыйМодуль / ExecuteModule
И как с помощью этого класса добавить динамически в модуль новые процедуры и функции?
Цитата: АЛьФ от 02 апреля 2024, 14:49Почему тогда не дополнительные глобальники, а выполняемый модуль?
Что-то можно и в глобальные модули, и даже правильнее будет так, вопросов нет.
А ВыполняемыйМодуль в том случае, когда нужно завернуть в объект, с переменными и тд.
Без классов и прочего ООП, попроще, как в восьмерке типа.
Цитата: item от 02 апреля 2024, 14:42Имхо, весь функционал ВыполняемыйМодуль должен быть в формексе, а не в iсpp.
Концепцию ООП он там нарушает, как бельмо, а к формексу пристегнулся бы, как родной.
И не путали бы почитатели в своих хотелках формы с модулями.
FormEx как бы намекает на то что это расширение форм, ну а в 1с++ всякого разного много натыкано.
А Классы и ВыполняемыйМодуль выполняют примерно идентичные задачи, так что совсем не место этому в
FormEx. Да и кто же нынче будет это перетаскивать? Тем более что многочисленные попытки собрать 1с++ не увенчались успехом.
Можно скомуниздить код из 1с++ ModuleString.cpp CModuleString::LoadModuleFromMD там кода кот наплакал...
Назначаем исходник, компилируем и используем.
ВыполняемыйМодуль01 = СоздатьОбъект( "ВыполняемыйМодуль" );
ВыполняемыйМодуль01.НазначитьКонтекст( КонтОбъекта );
глВыполняемыйМодуль.ВыполнитьПроцедуруКонтекста(
Конт,
VpНаимФункции,
спСписок
);
// --- Если вызываем процедуру или функцию
//
if ( VpTypeFormul <> -1 ) Then
глВыполняемыйМодуль.ВыполнитьПроцедуруКонтекста(
Конт,
VpНаимФункции,
спСписок
);
endif;
// --- Если просто выражение
//
if VpTypeFormul = -1 Then
глВыполняемыйМодуль.ВыполнитьПроцедуруКонтекста(
Конт,
FormulaWWW,
спСписок
);
endif;
endif; // if 2 = 2 Then
endif; // if ПустоеЗначение( ИмяПоляWWW ) = 0 Then
Цитата: Djelf от 02 апреля 2024, 15:04Можно скомуниздить код из 1с++ ModuleString.cpp CModuleString::LoadModuleFromMD там кода кот наплакал...
Non problem.
Код не сложный.
Цитата: Forum123 от 02 апреля 2024, 15:05Назначаем исходник, компилируем и используем.
ВыполняемыйМодуль01 = СоздатьОбъект( "ВыполняемыйМодуль" );
ВыполняемыйМодуль01.НазначитьКонтекст( КонтОбъекта );
глВыполняемыйМодуль.ВыполнитьПроцедуруКонтекста(
Конт,
VpНаимФункции,
спСписок
);
Это создание нового модуля, а не добавление новых функций и процедур в существующий.
Цитата: Djelf от 02 апреля 2024, 15:04Можно скомуниздить код из 1с++ ModuleString.cpp CModuleString::LoadModuleFromMD там кода кот наплакал...
Не вижу смысла тянуть этот код. Дорабатывать и расширять там вроде нечего, со своими задачами он и в нынешнем виде составе 1С++ справляется.
Цитата: Djelf от 02 апреля 2024, 14:53Почему тогда не классы? Они прекрасно живут и в составе md.
Классы, согласитесь, чуть сложнее в описании и прочем.
Я думаю, что 90% написанных сообществом классов не имеет наследников и применяется исключительно для красоты кода, по сути как ВыполняемыйМодуль.
Цитата: АЛьФ от 02 апреля 2024, 15:14Это создание нового модуля, а не добавление новых функций и процедур в существующий.
НазначитьКонтекст / AssignContext Устанавливает контекст модуля.
УстановитьМодуль(стрТекстМодуля)
КомпилироватьМодуль / Compile Компилирует модуль, установленный с помощью метода УстановитьМодуль.
ВыполнитьМодуль / Execute Выполняет модуль, установленный с помощью метода УстановитьМодуль и откомпилированный методом КомпилироватьМодуль.
Самое главное, что функция выполняется в контексте текущего модуля и может использовать все переменные и функции.
Кстати 1С 7.7 легко интегрируется с Net и из нёё можно много функционала использовать.
Цитата: Djelf от 02 апреля 2024, 15:01FormEx как бы намекает на то что это расширение форм, ну а в 1с++ всякого разного много натыкано.
А Классы и ВыполняемыйМодуль выполняют примерно идентичные задачи, так что совсем не место этому в FormEx...
Формекс тоже был в составе 1с++ ))
И сейчас обе компоненты кое-где пересекаются друг с другом, и как мы видим, не могу друг без друга.
Есть ведь в формексе события, глобальные модули и ВыполнитьПроцедуру, а это немного не про формы.
Цитата: item от 02 апреля 2024, 15:25Формекс тоже был в составе 1с++ ))
Тогда лучше не в формекс добавлять, а новую ВК разработать, которая полностью заменит formex и 1cpp.
Цитата: АЛьФ от 02 апреля 2024, 15:15Не вижу смысла тянуть этот код. Дорабатывать и расширять там вроде нечего, со своими задачами он и в нынешнем виде составе 1С++ справляется.
Если был бы доступ из кода 1С то да, но такого метода нет.
Цитата: Forum123 от 02 апреля 2024, 15:28Цитата: item от 02 апреля 2024, 15:25Формекс тоже был в составе 1с++ ))
Тогда лучше не в формекс добавлять, а новую ВК разработать, которая полностью заменит formex и 1cpp.
Да, да, только в сутках 24 часа... ))
Дружище, когда мы уже пощупаем Ваше API ?
Цитата: Forum123 от 02 апреля 2024, 15:28Тогда лучше не в формекс добавлять, а новую ВК разработать, которая полностью заменит formex и 1cpp.
А еще лучше на gcc, Мама, роди меня обратно...
Цитата: Djelf от 02 апреля 2024, 15:29Цитата: АЛьФ от 02 апреля 2024, 15:15Не вижу смысла тянуть этот код. Дорабатывать и расширять там вроде нечего, со своими задачами он и в нынешнем виде составе 1С++ справляется.
Если был бы доступ из кода 1С то да, но такого метода нет.
Не уловил что значит "доступ из кода 1С".
Цитата: Djelf от 02 апреля 2024, 15:30А еще лучше на gcc, Мама, роди меня обратно...
Уже разработал возможность грузить в memory метаданные и данные любой конфигурации (и системные таблицы).
С ними можно работать!
Но в 1001 раз акцентирую, что это не 1С (в других тредах немного рассказывал о сути разработки).
Метаданные и данные загружаются в дерево!
Как на хабре всё красиво.
Есть единомышленники, коллективы, ...
В жизни хорошо если на три буквы не пошлют.
И за это спасибо и весьма радует!
Цитата: АЛьФ от 02 апреля 2024, 15:33Не уловил что значит "доступ из кода 1С".
Если мы загрузили форму, то у нас есть полный доступ, а если мы не открыли форму то и доступа нет.
ТС хочет выудить код формы без открытия самой формы и этот код есть в 1с++.
Цитата: Forum123 от 02 апреля 2024, 15:36Как на хабре всё красиво.
Может просто банят оперативно?
Цитата: Djelf от 02 апреля 2024, 15:49Может просто банят оперативно?
У меня на нём никогда аккаунта не было.
Программисты всех других программистов считают дураками.
Это аксиома!
Так что в шестую палату наведываться нет никакого желания.
Да не тебя же, тебя то зачем? Токсичных постеров...
Цитата: Djelf от 02 апреля 2024, 15:53Да не тебя же, тебя то зачем? Токсичных постеров...
На хабре неадекватов много.
О разработках лучше ничего не говорить.
Такова селяви не только у меня.
Если кто расковыряет mxl 1С 8.x, то обещаю для семёрки его реализовать.
Цитата: Djelf от 02 апреля 2024, 15:46...ТС хочет выудить код формы без открытия самой формы и этот код есть в 1с++
Это да, именно так, моргать фокусом ПриНачалеРаботыСистемы это не наш метод.
И в 1с++ я такого не нашел.
Цитата: Djelf от 02 апреля 2024, 15:46Цитата: АЛьФ от 02 апреля 2024, 15:33Не уловил что значит "доступ из кода 1С".
Если мы загрузили форму, то у нас есть полный доступ, а если мы не открыли форму то и доступа нет.
ТС хочет выудить код формы без открытия самой формы и этот код есть в 1с++.
Аааа... Ну, это я добавлю.
Цитата: АЛьФ от 02 апреля 2024, 14:59Цитата: Forum123 от 02 апреля 2024, 14:57Цитата: АЛьФ от 02 апреля 2024, 14:56Каким образом?
Класс ВыполняемыйМодуль / ExecuteModule
И как с помощью этого класса добавить динамически в модуль новые процедуры и функции?
Ну, как бы так:
л_ВМ.УстановитьМодуль(ТекстМодуля);
л_ВМ.НазначитьКонтекст(Конт);
л_ВМ.КомпилироватьИВыполнитьМодуль();
Я так добавляю налету кнопки на ActiveX. Если у кнопки есть Идентификатор - создаю виртуальную (ТекстМодуля) процедуру, которая инициализирует класс-обработчик и саму ActiveX кнопку на форме.
Вот тут выкладывал - https://www.1cpp.ru/forum/YaBB.pl?num=1351073387/0#0
Цитата: АЛьФ от 02 апреля 2024, 16:12Аааа... Ну, это я добавлю
Вот, и глобальные модули могут заиграть по-другому, с идентификатором аля 8.
Одновременно с подключением доп.гл.модуля, можно обернуть его же в ВыполняемыйМодуль,
присвоив глобальной переменной - МойМодуль.
Ну, и далее два способа, хошь - МойМодуль.МойМетод() и МойМодуль.МояПерем, а хошь,
напрямую - МойМетод() и МояПерем.
Конечно, события остаются за глобальными модулями.
Цитата: АЛьФ от 02 апреля 2024, 16:12Ну, это я добавлю.
Извиняюсь за вопрос, так как не знаю всех новшеств формекс.
Динамическая загрузка диалогвых форм реализована?
Цитата: item от 02 апреля 2024, 17:13Вот, и глобальные модули могут заиграть по-другому, с идентификатором аля 8.
Много чего можно и нужн в 1С 7.7 реализовать как в 1С 8.x.
Многое можно и много удобней сделать (уже рассказывал в других тредах).
Такого рода функционал фирма 1С не скоро реализует.
Цитата: Forum123 от 02 апреля 2024, 19:03Много чего можно и нужн в 1С 7.7 реализовать как в 1С 8.x.
Огласите весь список, пжалуйста.
Цитата: Forum123 от 02 апреля 2024, 18:57Цитата: АЛьФ от 02 апреля 2024, 16:12Ну, это я добавлю.
Извиняюсь за вопрос, так как не знаю всех новшеств формекс.
Динамическая загрузка диалогвых форм реализована?
Есть только ПриЗагрузкеМодуляФормы и ПриЗагрузкеФормы, в которых можно подменить адрес внутри md, откуда грузится модуль или форма. Для остального есть TurboMD.
Цитата: item от 02 апреля 2024, 19:26Огласите весь список, пжалуйста.
Народ распугать?
Понемножку.
- mxl а-ля 8.x - обещаю реализовать (если кто-нибудь напишет мануал по устройству меданных);
Для 1С 7.7 уже API разработано, можно использовать в любом ЯП и конечно в 1С 7.7
- создание объектов любой сложности на основании методанных и поддержка C++ структур.
У меня уже это реализовано.
Это мой пяточок.
Это API можно будет использовать в любом ЯП и 1С 7.7 конечно.
Цитата: Forum123 от 02 апреля 2024, 20:05Цитата: item от 02 апреля 2024, 19:26Огласите весь список, пжалуйста.
Народ распугать?
Понемножку.
- mxl а-ля 8.x - обещаю реализовать (если кто-нибудь напишет мануал по устройству меданных);
Для 1С 7.7 уже API разработано, можно использовать в любом ЯП и конечно в 1С 7.7
- создание объектов любой сложности на основании методанных и поддержка C++ структур.
У меня уже это реализовано.
Это мой пяточок.
Это API можно будет использовать в любом ЯП и 1С 7.7 конечно.
Так где это можно скачать и посмотреть?
Цитата: Forum123 от 02 апреля 2024, 19:03Много чего можно и нужн в 1С 7.7 реализовать как в 1С 8.x.
- только не нумеровать 10 элементов от 0 до 9...
!!!
Цитата: АЛьФ от 02 апреля 2024, 21:16ак где это можно скачать и посмотреть?
В отпусках буду вести разработку хранилища ресурсов.
Самое главное то, что в нём будут находится фонты.
При этом будут метаданные о их назначении.
Зачем это?
Всё дело в том, что вот скажем имеются две ячейки в mxl используют скажем шрифт Times New Roman (Кириллический).
Так вот если во второй ячейки используется подчёркивание, то для корректной работы нужно использовать файл фонта, который позволяет подчёркивать символами.
Вообщем нюансы имеются.
Когда используем API MSDN, то Microsoft "прячет" от программиста все эти нюансы.
У меня ныне mxl может корректно использовать три вида шрифта.
Так вот ресурсный файл полностью решит эти проблемы.
Кроме этого в него можно будет поместить все метаданные 1С 7.7 и использовать.
На самом деле в хранилище ресурсов можно будет помещать данные любого типа и использовать (например библиотека книг).
Фишка в том, что API позволит пользователю создать такое хранилище, которое он считает удобным.
Хранилище ресурсов тщательно оттестирую и тогда уже опубликую ActiveX.
Sorry, ещё много чего нужно сделать.
А за API mxl не вру.
Корректно работает и тщательно оттестировано на сложных отчётах (в частности корректно работает c набором mxl Йокселя для тестирования).
Вообщем работает хорошо.
Цитата: Forum123 от 03 апреля 2024, 07:57В отпусках буду вести разработку хранилища ресурсов.
Фирма 1С использовала конечно API Windows.
У меня не используются dll Windows.
Для шрифтов у меня свой форк freetype.
Постепенно добавляю в него своё API.
Конечно добавлю в freetype возможность использования хранилища ресурсов.
За два месяца 100% всё API не разработаю конечно.
Кстати, по доп-глобальникам я использую внутреннюю обработку. Например, с названием МодульПочты
Далее в при старте системы
миф = СоздатьОбъект("MetaInfoClasses");
миф.ЗагрузитьОписаниеКлассов("//# класс ГлобальныйМодульПочты = МодульПочты@MD {};"); //Доп глобальник для функций почты. Если инициализировать в Defcls, то КЗК перестанет его шифровать!!!
//И дальше объявляем глобальную переменную:
глМодульПочты = СоздатьОбъект("ГлобальныйМодульПочты");
//И в нужном месте вызываю
Рез=глМодульПочты.ПодписьВПисьме(РусАнгл,Фрм1,ТекДолжн,ПочтАдресОтправителя,ОБъектВК);
При этом модуль внутренней обработки успешно шифруется КЗК2! И она является классом!
Единственное, что для нас неудобно - это функция Я() - у нас есть такая глобальная функция для перевода фраз на другой язык и в модуле обработке приходится вместо неё делать замену на язык().
Цитата: alyuev от 04 апреля 2024, 17:44миф = СоздатьОбъект("MetaInfoClasses");
миф.ЗагрузитьОписаниеКлассов("//# класс ГлобальныйМодульПочты = МодульПочты@MD {};");
Интересно, имеет право на жизнь.
А у меня в алсах и слов то таких нету. (версия 3.1.0.9)
Конечно, глМодульПочты нельзя назвать в полном смысле глобальным модулем.
Как и любой представитель любого класса, как и ВыполняемыйМодуль, это всего лишь удобная переменная, которую можно случайно затереть пустым значением "", и синтаксический анализ не поможет.
Цитата: alyuev от 04 апреля 2024, 17:44миф = СоздатьОбъект("MetaInfoClasses");
миф.ЗагрузитьОписаниеКлассов("//# класс ГлобальныйМодульПочты = МодульПочты@MD {};");
А что, так можно было!? Как-то я пропустил это вот ЗагрузитьОписаниеКлассов... и мучился.
Цитата: item от 04 апреля 2024, 18:08...
Как и любой представитель любого класса, как и ВыполняемыйМодуль, это всего лишь удобная переменная, которую можно случайно затереть пустым значением "", и синтаксический анализ не поможет.
Не понятно в чём претензия. Любую переменную (вне парадигмы ООП, оно тут вообще каким боком?) всегда можно "случайно" затереть и что?
А доп глобальники (и доп события) я использую от упомянутого Wirth'а из его V7Crypt. Там всё с некоторыми ограничениями, например, события формекса в доп глобальники не транслируется.
Цитата: Arbuz от 05 апреля 2024, 16:30Не понятно в чём претензия. Любую переменную (вне парадигмы ООП, оно тут вообще каким боком?) всегда можно "случайно" затереть и что?
Какая же это претензия? Мы здесь два брата-акробата, нашли друг друга.
Делаем одно и то же разными способами. Не бузите.
Цитата: Arbuz от 05 апреля 2024, 16:30А доп глобальники (и доп события) я использую от упомянутого Wirth'а из его V7Crypt. Там всё с некоторыми ограничениями, например, события формекса в доп глобальники не транслируется.
У меня на версии V7Crypt_1.0.1.6 было всё плохо.
Два доп.глобальника, гмЧат и гмВебСервер, в итоге три раза срабатывает ПриЗавершенииРаботы, даже если его нету. ОбработкаВнешнегоСобытия должна быть в каждом, иначе Исключение, но это хрен с ним, всё поборол. Главное - не работает в них отладчик, вылетает нах.
Начал тестить ПриЗаписиДокумента(), пустое тело, так иногда, по неизвестным причинам, документ просто не хочет записываться, тыркаешь как пустую кнопку.
В общем, отложил в сторону.
Пичалька, эти события - те что надо события.
Цитата: Arbuz от 05 апреля 2024, 16:30А что, так можно было!? Как-то я пропустил это вот ЗагрузитьОписаниеКлассов... и мучился.
Я это стал использовать, когда решили разделить классы внутренние (для клиентов) и внешние (для себя). Для себя внешние - чтобы проще и быстрее было отлаживать. Всё же внешняя обработка, а не целый MD-шник. Обновил, закинул куда надо, перегрузил налету классы - и можно тестировать/работать.
//**************************************************************************//*
//Это для того, чтобы можно было обновлять класс и не перезаходить ********//*
миф = СоздатьОбъект("MetaInfoClasses"); //*
миф.ОчиститьДанныеОптимизацииКлассов(); //*
//**************************************************************************//*
Добавлю здесь, что нехитрым способом обманул компилятор ВыполняемогоМодуля,
который испытывает сильную неприязнь к Форме и ее атрибутам.
Таки обработку вполне можно использовать по прямому назначению, не только как хранилище,
если обращаться в модуле к реквизитам формы через собственный контекст,
через Перем Конт = глВзятьКонтекст(Контекст).
Пригодится, например, для интерактивного управления заключенного в обработку Объекта,
и не нужно будет плодить дополнительных Обработок.