Имя: Пароль:
1C
 
Работа с типами в 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С пытаешься писать, не зная его?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn