![]() |
|
Работа с типами в 1C V83 Com Connector C# | ☑ | ||
---|---|---|---|---|
0
AntonKemov2
22.04.25
✎
17:37
|
Доброго времени суток, подскажите пожалуйста как мне получить информацию о типе данных (наименование и другие поля/методы), который получаю из реквизита.
Вот пример кода: dynamic ссылка = объектСправочника.Ссылка; dynamic метаданные = ссылка.Метаданные(); dynamic реквизиты = метаданные.Реквизиты; foreach (var реквизит in реквизиты) { dynamic тип = реквизит.Тип; dynamic типы = тип.Типы(); } А как дальше с этим работать - хз, мне хотя бы узнать что это за тип данных, ссылка или простой тип |
|||
1
Garykom
гуру
22.04.25
✎
17:45
|
Скажи тебе реально нравится делать операцию на гландах через задний проход?
Сделай уже в 1C банальный http-сервис И дергай его из своей нетленки на C#/.Net |
|||
2
Ёпрст
гуру
22.04.25
✎
17:46
|
(0) XMLТипЗнч(<твой реквизит>).TypeName
|
|||
3
Rovan
гуру
22.04.25
✎
17:49
|
||||
4
Garykom
гуру
22.04.25
✎
17:50
|
||||
5
Garykom
гуру
22.04.25
✎
17:56
|
(0)
dynamic типы = тип.Типы(); "типы" - может быть составным типом поэтому такой изврат в платформе ПодробностиОписание: Получает типы, используемые в объекте. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер. Пример: // Заполнение списка типов документов по указанному элементу формы // Элемент - элемент формы, имеющий составной тип СписокТиповДокументов = Новый СписокЗначений; Для Каждого ТипДокумента Из Элемент.ТипЗначения.Типы() Цикл ДокументСсылка = Новый(ТипДокумента); Имя = ДокументСсылка.Метаданные().Имя; Синоним = ДокументСсылка.Метаданные().Синоним; СписокТиповДокументов.Добавить(Имя, Синоним); КонецЦикла; Использование в версии: Доступен, начиная с версии 8.0. |
|||
6
AntonKemov2
22.04.25
✎
17:58
|
(1) Garykom, Егор, я тебя не оскорблял и не просил агрессивных комментариев, а поросли помощи.
Http-сервис не могут настроить со стороны 1С, 1С разрабы, не хватает скилла или еще что-то - не знаю. Меня же свою очередь туда не пустят. Работаю с тем что есть, да костыльно, да где-то медленно, но ничего не поделать. |
|||
7
AntonKemov2
22.04.25
✎
18:00
|
(2) Спасибо, сейчас изучу материал и отпишусь от результате.
|
|||
8
Garykom
гуру
22.04.25
✎
18:02
|
(6) Расширение обычно не проблема наваять и подключить
И обычно база уже опубликована на веб-сервере, с галочкой по умолчанию для расширений Пока пишешь код для вызовов через COM/OLE тебе один хрен нужна своя доступная тестовая конфа/база и Конфигуратор 1С Чтобы во внешней обработке быстро отладку делать Когда уже код наваян на языке 1С - тогда и занимаешься его переносом на другой ЯП через COM/OLE |
|||
9
Garykom
гуру
22.04.25
✎
18:05
|
(8)+ и да лучше сразу писать код, подходящий для переноса в http-сервис
а не лапшу для COM/OLE |
|||
10
Волшебник
22.04.25
✎
18:06
|
(6) гнилые отмазки
|
|||
11
mikecool
22.04.25
✎
19:49
|
комментарий в (7) очень похож на бота
постоянно такое вижу - изучу и отпишусь |
|||
12
AntonKemov2
23.04.25
✎
14:11
|
(2) (3) - Не работает, вот что пробовал и везде одна и та же ошибка
var реквизит = detail.Instance; var тип = реквизит.Тип; var типВТипах = тип.Типы().Получить(0); // var xmlType = connection.XMLString(реквизит); System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. // var xmlType = connection.XMLString(тип); System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. // var xmlType = connection.XMLString(типВТипах); System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. (4) - Пробовал в ком соеденение найти ТипЗнч - такой функции там нет. А то что в статье описывается, по обходу метаданным справедливо только для ссылочных типов: полныйТипОбъекта = РеквCOM.GetObject().Metadata().FullName(); |
|||
13
oleg_km
23.04.25
✎
14:19
|
А что отладчик показывает в свойствах?
|
|||
14
AntonKemov2
23.04.25
✎
14:22
|
(10) Не знаю о каких "отмазках" да и еще "гнилых" идет речь, но по моему странно, если я не разработчик 1С, и не администратор системы 1С, буду залезать в конфигуратор и настраивать HTTP API, без должных знаний и квалификации в этой системе.
|
|||
15
AntonKemov2
23.04.25
✎
14:23
|
(11) Бот получается, нейросеть.
|
|||
16
AntonKemov2
23.04.25
✎
14:23
|
(13) В отладчике инфы максимально мало, ComObject же
Вот только место где выбрасывается Exception: internal Exception GetException() { int errorCode = this.scode != 0 ? this.scode : (int) this.wCode; Exception exception = Marshal.GetExceptionForHR(errorCode); string message = ExcepInfo.ConvertAndFreeBstr(ref this.bstrDescription); if (message != null) { if (exception is COMException) { exception = (Exception) new COMException(message, errorCode); } else { ConstructorInfo constructor = exception.GetType().GetConstructor(new Type[1] { typeof (string) }); if (constructor != (ConstructorInfo) null) exception = (Exception) constructor.Invoke(new object[1] { (object) message }); } } exception.Source = ExcepInfo.ConvertAndFreeBstr(ref this.bstrSource); string str = ExcepInfo.ConvertAndFreeBstr(ref this.bstrHelpFile); if (str != null && this.dwHelpContext != 0) str = str + "#" + this.dwHelpContext.ToString(); exception.HelpLink = str; return exception; } } И откуда: var xmlType = connection.XMLString(реквизит); |
|||
17
Garykom
гуру
23.04.25
✎
14:27
|
(12)
Пробовал в ком соеденение найти ТипЗнч - такой функции там нет.
Все там есть ТипЗнч - доступно во внешнем соединенииГлобальный контекст (Global context) ТипЗнч (TypeOf) Синтаксис: ТипЗнч(<Значение>) Параметры: <Значение> (обязательный) Тип: Произвольный. Значение, тип которого необходимо получить. Возвращаемое значение: Тип: Тип. Описание: Получает тип значения. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер. Пример: Если ТипЗнч(ТекОбъект) = Тип("СправочникСсылка.Номенклатура") Тогда ... КонецЕсли; Использование в версии: Доступен, начиная с версии 8.0. Методическая информация Если нечто у тебя не работает - или глюки Или что вероятней малый уровень знаний и ошибки банальные Встроенные функции надо вызывать у самого соединения В случае некоторых ЯП приходится извращаться Ну и могут быть проблемы с вызовом процедур/функций (неважно встроенных или общих модулей) если они не доступны для внешнего соединения Причем самая засада когда общая функция экспортная вроде и в модуле с галкой внешнее соединение Но внутри себя вызывает/использует другие процедуры/функции в серверных модулях без галки внешнее соединение Вызов функции общего модуля серверной 1С (8.3) по COM |
|||
18
Garykom
гуру
23.04.25
✎
14:25
|
(14) понимаешь что работа через COM/OLE соединение = по сути "разработчик 1С"
на языке 1С пытаешься писать, не зная его? |
|||
19
AntonKemov2
23.04.25
✎
14:29
|
(18) Ну значит изучу в процессе, ничего не мешает мне его параллельно изучать, я предлагаю закрыть эту не нужную тут тему и сконцентрироваться на решении проблемы изначальной, по которой я задал вопрос.
Наши рассуждения по поводу целесообразности COM/OLE и т.п. - не к чему не приведут. |
|||
20
Garykom
гуру
23.04.25
✎
14:33
|
(19) Еще раз повторю:
1. Возьми конфигуратор 2. Напиши нужный код на ЯП 1С во внешней обработке (используй только методы и объекты доступные через внешнее соединение, смотри описание в СП) 3. Убедись что он работает 4. Вот теперь переноси его на C#/.Net для работы через COM/OLE |
|||
21
AntonKemov2
23.04.25
✎
14:32
|
(17) Сейчас проверю и отпишусь
|
|||
22
AntonKemov2
23.04.25
✎
14:42
|
(20) Ок, буду тогда так пробовать.
|
|||
23
Волшебник
модератор
23.04.25
✎
15:26
|
(19) Ваше предложение отклоняется.
|
|||
24
shuhard
23.04.25
✎
15:39
|
(19)[и сконцентрироваться на решении проблемы изначальной, по которой я задал вопрос]
а нам это зачем ? |
|||
25
AntonKemov2
23.04.25
✎
19:13
|
(20) У меня появился определенный прогресс.
1) У меня почему-то не работают частично русские функции, приходится часть на английском писать. Теперь я могу получать наименование и в целом инфу о простых типах (Строка, число и т.п.) Вот так: соединение.XMLTypeOf(значениеОбъекта); Но это справедливо, только для простых типов, если тип ссылочный, то возвращается null, я попробовал на прямую тип передать вот так: var типРеквизита = реквизит.Тип; var xmlТип = соединение.XMLType(типРеквизита) И тут я получаю ошибку: Код ошибки: 1001 Несоответствие типов (параметр номер '1') |
|||
26
Garykom
гуру
23.04.25
✎
19:38
|
(25) Эндоскопом конечно можно гвозди забивать
Но лучше взять более подходящий инструмент И самое главное научиться им пользоваться Имхо ты дурью маешься Если у тебя задача связана с 1С, которую ты сам не знаешь Есть варианты: 1. Самому сначала изучить 1С 2. Нанять спеца-прога по 1С В итоге выяснится что делал (пытался) не то и не так А все намного проще и быстрей с точки зрения программиста 1С |
|||
27
Pprog151713
24.04.25
✎
07:23
|
(25) Так это не профессионально, так эту проблему решать. Пацаны верно говорят. Эндоскопом.
|
|||
28
Мультук
гуру
24.04.25
✎
08:03
|
Я вот одно не понимаю.
Если автор пишет некую мега-супер-универсальную приблуду это одно. Но скорее всего, он пишет какую-то локальную утилиту импорта ИЗ 1С. В этом случае все объекты и все поля уже описаны в тех.задании вместе с их типами. А еще информацию из базы-1С можно/нужно получать 1С-запросами. А в 1С запросе можно написать всё что угодно, определение типа в том числе. P.S. Смешно будет, если для его целей будет достаточно некой доп.обработки, которая по расписанию будет собирать нужно информацию в XML/JSON/CSV и плевать этот пакет в SMB/FTP/Почта/HTTP |
|||
29
AntonKemov2
24.04.25
✎
20:44
|
(2) (26) В любом случае спасибо за помощь и советы, некоторые оказались очень полезными.
|
|||
30
AntonKemov2
24.04.25
✎
20:45
|
(28) Ты почти угадал, эх.
|
|||
31
lEvGl
гуру
24.04.25
✎
20:51
|
(30) вы занимаетесь ерундой
чтобы через ком что то сделать в базе 1с надо будет изучить язык 1с, ком это просто обертка, дающая возможность вызывать методы, использовать свойства объектов в 1с. Ком это клиент 1с, не тонкий не толстый, а внешнее соединение, его отличает от остальных отсутствие интерфейса |
|||
32
strange2007
25.04.25
✎
13:55
|
(0) 1. Рекомендую использовать только англоязычные аналоги всех ключевых слов. Например, не "тип.Типы()", а "тип.Types()". Для всяких комов это прям важно. Во всяком случае раньше было важным
2. Как посоветовали выше, надо сначала весь код написать и отладить в обработке в конфигураторе той базы, к которой цепляешься. Это прям очень сильно сокращает время 3. Ну его нафиг эти COM-ы. Знаю, что ограничения и прочее, но вот прям рекомендую задуматься про отказ от такого обмена данными |
|||
33
Garykom
гуру
25.04.25
✎
14:15
|
(32) эмм
есть же Выполнить() и Вычислить() :) короче берем кусок кода 1С (можно и русский), выполняем его результат забираем если стандартизировать и параметры и результат, можно обернуть и удобно использовать |
|||
34
strange2007
25.04.25
✎
15:05
|
(33) Это уже высший пилотаж. Тут надо много лет изучать кунг-фу 1С, чтобы приёмы "Выполнить()" познать. Автор же наоборот новичок в таких вещах и ему бы что-то базовое надо
|
|||
35
AntonKemov2
25.04.25
✎
20:02
|
(33) Что-то вроде хранимых процедур в разных базах, вроде звучит даже как решение, спасибо, попробую этот вариант тоже.
|
|||
36
AntonKemov2
25.04.25
✎
20:07
|
(33) Сейчас пробую вместо COM настроить HTTP сервис, мб даже лучше будет, если самому получится сделать, то буду проталкивать его уже в основную базу.
|
|||
37
Волшебник
25.04.25
✎
20:08
|
(36) Можно даже расширением. Тут я даю добро
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |