Есть УстановитьПеременнуюКонтекста и ПолучитьПеременнуюКонтекста, а можно СоздатьПеременнуюКонтекста?
Как это можно использовать?
Если пользоваться функциями/процедурами глобального модуля, но нужна переменная в контексте (разная в каждом открытом). Например, в ПослеСозданияФормы устанавливаем формулу на атрибуты, в которых счетчик увеличения/уменьшения, а сама формула тоже глобальная. Сейчас использую СохранитьЗначение/ВосстановитьЗначение. Можно объявить переменную в форме, но теряется универсальная динамика.
Кстати, если изменять/устанавливать формулу у элемента "Текст", у которого в конфигураторе она (формула) не установлена, то не работает. Можно в формуле поставить что-нибудь (ставлю "1"), тогда работает.
Цитата: АЛьФ от 30 марта 2024, 22:06Как это можно использовать?
О создании переменных для контекстов модуля и динамических переменных.
У меня для каждой диалоговой формы md имеется xml файл (для каждого пользователя свой).
Он содержит права на работу с данными, метаданные формируемых отчётов (в т.ч. для ПараметрыСтраницы() ), метаданные для фильтров, диаграмм, ...
Эти метаданные сушественно упрощают коды модулей.
Так вот при открытии диалоговой формы данные из xml помещаются в создаваемую переменную контекста (структурв).
Её в модуле нет!
Фича в том, что исходный код много упрошается да ещё множество метаданных, которые используются и при диалоге и при формировании отчётов (а их бывает и с десяток разных в модуле отчёта).
Это то что касается создания переменных контекста.
API позволяет создавать переменные в текстах модулей.
Это объект, который содержит метаданные о переменной и сами данные.
Кстати переменная может быть структурой C++.
Удобство в том, что поля в структуре могут быть любого базового типа (см. https://learn.microsoft.com/ru-ru/cpp/cpp/fundamental-types-cpp?view=msvc-170).
По существу это API создаёт динамические переменные, которые можно в частности использовать в 1С 7.7.
Это позволяет без проблем получать и изменять поля например каким-то структур C++.
У меня такого рода динамические переменные используются например API для работы с mxl.
API для работы с mxl ничего не знает о том, что существует 1С 7.7, но прекрасно с ней дружит.
Пример кода
// Создание метаданных и самого объекта согласно данным оператора struct
//
гл_IMetaObject = гл_oWWW1C.GetIMetaObject(); // Для работы с объектами о которых имеются метаданные
VpПутьКStruct = КаталогИБ() + "ExtForms\include\" + "ПотребителиDyn.h";
глIMetaObject = гл_IMetaObject.CreateMetaDataObject(
VpПутьКStruct, // Полное имя файла, содержащего определение оператора struct
"ПотребителиDyn_"
);
if Найти( ТипЗначенияСтр( глIMetaObject ), "OLE" ) = 0 Then
Сообщить( "Error при создании метаданных и самого объекта согласно данным оператора struct" );
endif;
...
Это пример использования своего API для работы с mxl.
Метаданные шаблона mxl берутся из md.
глIMetaObject это как раз динамические переменные, созданные в модуле 1С.
CodeRet = Таб.ИсходнаяТаблица( // Выбор исходного шаблона Moxcel
"Отчеты.ПотребителиDyn.Потребители",
глIMetaObject
);
if CodeRet < 0 Then
Сообщить( "Error при открытии исходного шаблона отчета" );
endif;
Остальной код ничем не отличается от кода, использующего объект 1С 7.7 "Таблица", так API на 100% совместимо по методам с 1С 7.7
Ниже текст ПотребителиDyn.h
// Переменные, используемые для формирования отчета
//
typedef struct ПотребителиDyn__ {
TCHAR *VpPage; // Номер листа
TCHAR *Header001; // Заголовок шапки
INT VpNpp; // N п/п
TCHAR *VpАдрес; // Адрес
TCHAR *VpПримечание; // Примечание
TCHAR *VpНаимУлицыOld; // Наименование улицы
TCHAR *VpДолжностьРуководителя; // Должность руководителя
TCHAR *VpРуководитель02; // Руководитель
TCHAR *VpПолнНаименованиеПредприятия; // Полное наименование предприятия
TCHAR *VpНаимОператора03; // Наименование оператора
TCHAR *LinkПотребитель; // Расшифровка
} ПотребителиDyn_; // typedef struct ПотребителиDyn__ {
Предыдущий пост был о том, что функциональность 1С 7.7 можно и нужно расширять.
Обратите внимание в 1C.7.7, теперь можно использовать struct C++ любой сложности и любые базовые типы данных архитектур x86 и x64.
GUI конечно в 1С 7.7 слабовато (ИМХО "лаба"), но этот вопрос вполне решаем (при желанни).
Разговоры о том, что 1С 7.7 "старая" и скоро помрёт в от тех кто ленится, что-либо разрабатывать и ждёт халявы.
И конечно они "знают" (вообщем беллетристика и трёп "знающих").
А-ля 1С не разрабатываю, но разрабатываемое API можно использовать в любом ЯП (в т.ч. в 1С 7.7).
Кое-что ещё разработаю, проверю на 1С 7.7, 1C 8.x и скорее всего на Python и будет новый als.
Текучки по работе много.
В апреле два месяца отпуска возьму и надеюсь много полезного API разработаю.
Поделюсь обязательно ActiveX (ВК вовсе не обязательно разрабатывать.).
Надеюсь к концу года "хотелки" реализую, проверю и поделюсь.
Цитата: Forum123 от 31 марта 2024, 13:10Разговоры о том, что 1С 7.7 "старая" и скоро помрёт в от тех кто ленится, что-либо разрабатывать и ждёт халявы.
Семёрка умрет в 2037-м году просто в силу своей архитектуры. Это заложено в базе и без исходников не исправить.
Цитата: АЛьФ от 31 марта 2024, 13:17Семёрка умрет в 2037-м году просто в силу своей архитектуры. Это заложено в базе и без исходников не исправить.
API для использования метаданных уже позволяет без проблем загрузить метаданные любой конфигурации для 1С 7.7 да и метаданные 1С 8.x вполне можно будет загружать .
Проще говоря реализовано core для создания например а-ля конфигуратора для 1С 8.x.
API разрабатывалось не для создания 1С, но так как 1С использует метаданные, то их можно без проблем будет использовать.
До 2037 ещё 13 лет так что справимся!
API универсально, можно использовать для создания игр, мультимедия, ... и 1С в т.ч.
Планирую дополнить API возможностью создавать и использовать баз знаний.
Проблема лишь одна - нужно, чтобы в сутках было 48 часов и не отвлекаться на всякую рутину.
Цитата: Forum123 от 31 марта 2024, 13:34До 2037 ещё 13 лет так что справимся!
Ващет пора начинать.
Да и Windows при наступлении 2037 загнётся.
https://learn.microsoft.com/en-us/answers/questions/695707/windows-server-date-issue-after-setting-the-time-t Проблема с датой Windows Server: после установки времени на 13 сентября 2037 г. 2:46:6 UTC и далее члены домена не могут войти в систему или применить объект групповой политики к компьютерам домена.
При тестировании проблемы 2038 года я обнаружил, что вход в домен или приложение GPO больше невозможны после установки 2038 года. Кроме того, попытка сбросить дату на 2022 год оказалась непростой. Поэтому не пытайтесь повторить это в производственной системе. Выпустит ли Microsoft исправление в ближайшее время?
Последующие тесты показали, что проблема на самом деле начинается примерно 13 сентября 2037 года в 2:46:5.0001 UTC.
Тесты, проведенные на Windows Server 2022, выявили ту же проблему.
В wine интересно 1С 7.7 с системной датой 2037 работает?
Цитата: Forum123 от 01 апреля 2024, 08:44В wine интересно 1С 7.7 с системной датой 2037 работает?
Ещё вот вспомнил о ReactOS.
На habr был блог в котором рассказывалось как в ReactOS удалось запустить 1С 8.x и нормально работать в ней.
Кроме создания в контексте переменных можно в контекст добавлять динамически процедуры и функции.
Это просто супер!
Позволяет разрабатывать обобщённые алгоритмы.
Супер!
Посмотрел на эту тему, не получится.
Контекст.Форма.Параметр может выручить
Есть __ДобавитьКонтекст в 1С++ https://www.1cpp.ru/docum/icpp/html/TurboBL.html#addcontext
Разумеется такие переменные будут доступны только в вызывающем кода после открытия формы.
Хотя нет, можно и из самой формы достучатся через
Функция глПолучитьПеременнуюКонтекста(Конт,ИмяПеременной) Экспорт
Перем Значение;
Конт.Свойство(ИмяПеременной,Значение);
Возврат Значение;
КонецФункции
Вообще не понял проч то речь. Надо на досуге перечитать ветку.
Цитата: Злоп от 02 апреля 2024, 01:25Вообще не понял проч то речь. Надо на досуге перечитать ветку.
Если переменной не было присвоено где-то ранее значение или объявлена в Перем, то её нельзя использовать.
1С скажет, что нет такой переменной.
Так вот в любой момент в контекст модуля вы можете добавить новую переменную и обращаться к ней Конст.ИмяПеременной.
Это динамическая переменная.
Ещё имеется возможность в контекст добавить новую функцию или процедуру, которой в модуле нет и использовать её.
Эти фичи упрощают разработку обобщённых алгоритмов.
Так есть же ВыполняемыйМодуль.
Цитата: Forum123 от 02 апреля 2024, 07:53Если переменной не было присвоено где-то ранее значение или объявлена в Перем, то её нельзя использовать.
1С скажет, что нет такой переменной.
.
попробуй выполнить оператор где-нить посреди кода:
ПростоНеобъявленнаяПеременная = ПростоНеобъявленнаяПеременная/0; // пронаблюдай что получится
Цитата: Forum123 от 02 апреля 2024, 07:53Так вот в любой момент в контекст модуля вы можете добавить новую переменную и обращаться к ней Конст.ИмяПеременной.
Это динамическая переменная.
.
ну, наверное полезная фича для еще большего запутывания всего и вся, особенно если добавляться в контекст будет извне ... ;-)
Цитата: Djelf от 01 апреля 2024, 12:54Хотя нет, можно и из самой формы достучатся через
Функция глПолучитьПеременнуюКонтекста(Конт,ИмяПеременной) Экспорт
Перем Значение;
Конт.Свойство(ИмяПеременной,Значение);
Возврат Значение;
КонецФункции
А можно поподробнее по .Свойство()? Что-то я не нашел такого...
Для установки значений реквизита/переменной контекста я написал такую процедуру:
Процедура УстановитьЗначениеРеквизита(Конт,ИдРеквизита,Значение) Экспорт
//В качестве ИдРеквизита может выступать и переменная модуля, а не только реквизит формы.
Перем ВМ,Текст;
Текст="
|Процедура УстановитьЗначение(НовоеЗначение)
| Перем ПредЗнач;
| ПредЗнач = "+ ИдРеквизита + ";
| "+ ИдРеквизита + " = НовоеЗначение;
|КонецПроцедуры
|";
ВМ = ВыполнитьМодуль(Конт,Текст);
ВМ.УстановитьЗначение(Значение,ПодсветкаИзмененного);
КонецПроцедуры
Цитата: alyuev от 23 апреля 2024, 13:41А можно поподробнее по .Свойство()? Что-то я не нашел такого...
Это Структура, см. динамические свойства в https://www.1cpp.ru/docum/icpp/html/TurboBL.html
Хотя нет, это я вроде информатором у Конт (Формы) нашел.
Слишком много нынче приходится в оперативной памяти мосха держать и что-то постоянно уходит в глубокий своп...
Цитата: Djelf от 23 апреля 2024, 15:23и что-то постоянно уходит в глубокий своп...
это
1. из-за малой применимости/малого кодинга
2. отсутствия нормальной документациибазы знаний.
Цитата: alyuev от 23 апреля 2024, 13:41Конт.Свойство(ИмяПеременной,Значение);
- поясните, что это такое и зачем оно/как..?