Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 16:40

Получить значение константы 1С8.2 через OLE

Автор NikOzn, 17 мар 2012, 12:19

0 Пользователей и 1 гость просматривают эту тему.

NikOzn

Извиняюсь, что много букав (достало!).

Хочу получить значение константы 1С8.2 через OLE и начинаю разбор ситуации.
Для этого создаю FOle_1C8 - объект доступа к 1С8.2 (в моем наблюдении неважно, через V82.Application или V82.COMConnector). Под объектом я пока подразумеваю что угодно.
Далее выбираю объект FMeta8_Ole := FOle_1C8.Метаданные.Константы; (код Delphi).
Но теперь я уже интересуюсь тем, к какому типу объектов (может классов объектов – не поймешь в вашей каше из 1С !!!) относится вещь FMeta8_Ole, для чего запрашиваю это у самого 1С через конструкцию
FOle_1C8.String(FMeta8_Ole), на что получаю ответ: КоллекцияОбъектовМетаданных;

Пока все логично.

Перебираю в цикле элементы этой коллекции и помещаю их в список.
Тыкнув в произвольную строку этого списка, я должен получить идентификатор элемента этой коллекции (в список помещены именно идентификаторы), и соответствующий элемент должен относиться к какому-нибудь классу или типу 1С. Так я думаю, но ситуация дальше только запутывает меня в понятиях. Чтобы не запутаться, обращаюсь к справке Синтакс-Помощника (название-то какое придумали!!!), набираю в строке Индекс слово Константы, ожидая увидеть что это за объект и что у него за возможности, а главное, как получить на него ссылку через идентификтор из моего списка.
Ничего не нахожу, кроме пустых слов о том, что эта штука в свою очередь коллекция объектов, «которые описывают все константы, определенные в конфигурации». Есть ли у него свойства или методы – полный молчок!!! Выходит эта вешь – фантом, бесполезный объект! Как она может описывать что-нибудь, если у него нет ни свойств, ни методов!

Но разработчики слукавили!
По аналогии со справочниками (а я именно с них начинал близкое знакомство с 1С), подсовываю объекту FMeta8_Ole метод Получить(), он его съедает и выдает какую-то ссылку F1C8_Obj := FMeta8_Ole.Найти(sIdRef);
Здесь я в sIdRef закладываю идентификатор элементов коллекции FOle_1C8.Метаданные.Константы из вышеуказанного списка, конкретно это был Алгоритм подписывания. Т.е. тем самым я получаю подтверждение, что у объекта Константы есть хотя бы метод Получить(). Синтакс-Помощник об этом ничего не знает! Крайне невежливо со стороны разработчиков 1С. Но я ведь должен был получить что-то относительно элемента, который называется Константа! На запрос Константа Синтакс-Помощник беспомощно отвечает, что это тип Картинка из БиблиотекаКартинок. Конгениальная подсказка!

Но мне нужно решить задачу, поэтому я интересуюсь тем, что же за объект я получил, чтобы потом уже все-же обратиться к Синтакс-Помощнику. Запрашиваю FOle_1C8.String(F1C8_Obj), и получаю конкретный ответ Алгоритм подписания. Т.е. я не получаю никакого ответа, потому что это просто синоним чего-то!!! Но чего – от меня скрывают. Это уже грубо!

Погуглив, нахожу, что значение константы можно узнать следующим образом
   Константы.НазваниеОрганизации.Получить(),
но что за объект Константы.НазваниеОрганизации – я не знаю (в моем случае это должно быть что-то типа КонстантаМенеджер.АлгоритмПодписывания). Порывшись в Синтакс-Помощнике, нахожу, что метод Получить() имеет КонстантаМенеджер.<Имя константы>, что тоже не дает ответа на вопрос, что за объект скрывается под КонстантаМенеджер!

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

Могут ли его мне дать гуру по 1С?
Подчеркиваю, что мне нужно от объекта OLE, созданного через V82.Application или V82.COMConnector, добраться до объекта КонстантаМенеджер. Дальше я надеюсь самостоятельно решить задачу с дополнением его до КонстантаМенеджер.<Имя константы> и уже скомандовать Получить(). Поскольку я работаю с 1С через Delphi, то предполагаю, что мне придется еще дополнить конфигурацию соответствющей функцией, т.к. я пока не знаю, как иначе передать строку <Имя константы> в объект OLE.

Спасибо?

NikOzn

Прошу извинить, в том месте, где написано ....FMeta8_Ole метод Получить()...., надо исправить на FMeta8_Ole метод Найти(), и далее в этом абзаце речь идет именно о методе Найти().

Dethmontt

А так тебя не устроит?
FVal_Const_Ole := FOle_1C8.Константы.<ИмяТвоейКонстанты>.Получить();

Через FMeta8_Ole и функции Найти() ты можешь проверить, а существует ли в колекции FMeta8_Ole искомая тобой константа
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

NikOzn

Я это пробовал делать, но пока безуспешно.
А именно, я запросил объекты
  v := OLE1C.Метаданные.Константы.Найти('' + ConstName); - это объект, описывающий конкретную константу
  wS := v.Имя; - это его идентификатор
  wEvalS := OLE1C.ПолучитьЗначениеКонстанты_OLE(v, wS); - эту функцию я сам дописал в конфигураторе.
Может быть, она неверная, но пока не знаю, как ее исправить.

Выглядит она очень просто:

// Получить значение константы
Функция ПолучитьЗначениеКонстанты_OLE(Константа, ИмяКонстанты) Экспорт
   Возврат Константы.ИмяКонстанты.Получить();
КонецФункции

В ответ на обращение к ней я получаю ошибку: Общий модуль.ozLib_Soft: Поле объекта не обнаружено (ИмяКонстанты). Может быть, подскажете, как ее исправить. Тогда я получил бы то, что хотел.
Спасибо!

NikOzn

При посте я уже увидел, что выложил не то, что было.
Функция такая:
// Получить значение константы
Функция ПолучитьЗначениеКонстанты_OLE(МояКонстанта, ИмяМоейКонстанты) Экспорт
   Возврат МояКонстанта.ИмяМоейКонстанты.Получить();
КонецФункции

Но она дает именно ту ошибку, что я описал: Поле объекта не обнаружено (ИмяМоейКонстанты)

Dethmontt

Если ИмяКонстанты имеет тип string
Функция ПолучитьЗначениеКонстанты_OLE(Константа, ИмяКонстанты) Экспорт
  Возврат Константы[ИмяКонстанты].Получить();
КонецФункции
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

А что вот так не работает?
wEvalS := OLE1C.Константы.ИмяКонстанты.Получить();
Или
wEvalS := OLE1C.Константы[ConstName].Получить();
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

NikOzn

Цитата: Dethmontt от 17 мар 2012, 17:26
А что вот так не работает?
wEvalS := OLE1C.Константы.ИмяКонстанты.Получить();
Или
wEvalS := OLE1C.Константы[ConstName].Получить();

Это все через OLE не работает. Реально надо писать примерно так:
OLE1C.Константы.Руководитель.Получить();

Но я же нахожусь в программе Delphi, а там Рувоводитель - это уже просто строка, которая в объекте OLE1C.Константы не может быть использована. Поэтому и приходится в конфигуратор добавлять функцию, которая это делает, и уже возвращает объект, понятный для OLE. Точно также конструкции с индексами в квадратных скобках [] компиляторы языков воспринимают как свои объекты, и они не могут использоваться для объектов OLE. Поэтому мне сейчас остается одно: докручивать функцию ПолучитьЗначениеКонстанты_OLE так, чтобы она возвращала FOle_1C8.Константы.<ИмяМоейКонстанты>.Получить(); Пока не добился результатов.

Но от гуру 1С я ожидал получить более фундаментальную подсказку, которая прямо из OLE давала бы мне возможность достучаться, скажем, до Менеджера значений или что-нибудь аналогичное.

NikOzn

[wEvalS := OLE1C.Константы[ConstName].Получить();
[/quote]
Эта вещь уже интересная! Надо ее впихнуть в функцию ПолучитьЗначениеКонстанты_OLE. Вдруг сработает.

NikOzn

Заработало вот с такой функцией в конфигураторе:
Функция ПолучитьЗначениеКонстанты_OLE(ИмяМоейКонстанты) Экспорт
   Возврат Константы[ИмяМоейКонстанты].Получить();
КонецФункции

Спасибо за наводку!!!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск