СоздатьПеременнуюКонтекста

Автор sau, 30 марта 2024, 21:34

« назад - далее »

sau

Есть УстановитьПеременнуюКонтекста и ПолучитьПеременнуюКонтекста, а можно СоздатьПеременнуюКонтекста?

АЛьФ


sau

Если пользоваться функциями/процедурами глобального модуля, но нужна переменная в контексте (разная в каждом открытом). Например, в ПослеСозданияФормы устанавливаем формулу на атрибуты, в которых счетчик увеличения/уменьшения, а сама формула тоже глобальная. Сейчас использую СохранитьЗначение/ВосстановитьЗначение. Можно объявить переменную в форме, но теряется универсальная динамика.
Кстати, если изменять/устанавливать формулу у элемента "Текст", у которого в конфигураторе она (формула) не установлена, то не работает. Можно в формуле поставить что-нибудь (ставлю "1"), тогда работает.

Forum123

Цитата: АЛьФ от 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__ {


Forum123

Предыдущий пост был о том, что функциональность 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-м году просто в силу своей архитектуры. Это заложено в базе и без исходников не исправить.

Forum123

Цитата: АЛьФ от 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 часов и не отвлекаться на всякую рутину.

trdm

Цитата: Forum123 от 31 марта 2024, 13:34До 2037 ещё 13 лет так что справимся!
Ващет пора начинать.

Forum123

Да и 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

Цитата: Forum123 от 01 апреля 2024, 08:44В wine интересно 1С 7.7 с системной датой 2037 работает?
Ещё вот вспомнил о ReactOS.
На habr был блог в котором рассказывалось как в ReactOS удалось запустить 1С 8.x и нормально работать в ней.

Forum123

Кроме создания в контексте переменных можно в контекст добавлять динамически процедуры и функции.
Это просто супер!
Позволяет разрабатывать обобщённые алгоритмы.
Супер!

АЛьФ

Посмотрел на эту тему, не получится.

Пиит

Контекст.Форма.Параметр может выручить

Djelf

Есть __ДобавитьКонтекст в 1С++ https://www.1cpp.ru/docum/icpp/html/TurboBL.html#addcontext
Разумеется такие переменные будут доступны только в вызывающем кода после открытия формы.

Djelf

Хотя нет, можно и из самой формы достучатся через
Функция глПолучитьПеременнуюКонтекста(Конт,ИмяПеременной) Экспорт
	Перем Значение;
	Конт.Свойство(ИмяПеременной,Значение);
	Возврат Значение;
КонецФункции