Имя: Пароль:
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С пытаешься писать, не зная его?
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) Можно даже расширением. Тут я даю добро
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший