Имя: Пароль:
1C
 
1CV83 COM Connector + C# Работа с табличной частью
0 AntonKemov
 
04.06.24
13:21
Доброго времени суток, есть вопрос по Com Connector, я получаю табличную часть с 1С:ДО, вот пример кода:

...Инициализация Com Connector

var query = comConnector.НовыйОбъект("Запрос");
query.Текст = "ВЫБРАТЬ * ИЗ Справочник.ВходящиеДокументы";
var queryResult = query.Выполнить().Выбрать();

while(queryResult.Следующий())
{
   var date = queryResult.ДатаСоздания; // Тут будет дата
   var comment = queryResult.Комментарий; //Тут будет строка с комментарием
   var questions = queryResult.ВопросыОбращения; //Тут будет табличная часть в виде Com Object, с которой я не знаю как работать, перебор - не работает, и разные методы получения данных тоже

}

Вопросы обращения - это табличная часть, например вот как она у меня отображается в коде, С# после конвертации xsd схемы в класс:

    [System.Xml.Serialization.XmlElementAttribute("ВопросыОбращения")]
    public CatalogTabularSectionRowВходящиеДокументыВопросыОбращения[] ВопросыОбращения {
        get {
            return this.вопросыОбращенияField;
        }
        set {
            this.вопросыОбращенияField = value;
        }
    }

По итогу вопрос следующий, как мне работать с табличной частью?
Я получаю Com Object и ничего дальше с ним не могу сделать.
1 Галахад
 
04.06.24
13:24
Как-то так:
query.Текст = "ВЫБРАТЬ * ИЗ Справочник.ВходящиеДокументы.ВопросыОбращения";
2 AntonKemov
 
04.06.24
13:42
Мне нужен перебор входящих документов и всех его ссылок и табличных частей, то есть правильно ли я понимаю, что мне нужно делать подзапрос?
Не могу ли я как-то из того, что я получаю, из всей выборки документов, от туда нормально достать табличную часть, во время перебора, которая пренадлежит объекту без под запроса?
3 Мультук
 
04.06.24
13:47
while(queryResult.Следующий())
{
   var date = queryResult.ДатаСоздания; // Тут будет дата
   var comment = queryResult.Комментарий; //Тут будет строка с комментарием
   var questions = queryResult.ВопросыОбращения; //Тут будет табличная

  qq = questions.Выбрать();
  while(qq.Следующий()) {

    //имхо так

  }

}
4 Ёпрст
 
04.06.24
13:49
(2) можешь, или как (1).. или как в (0), только как

var questions = queryResult.ВопросыОбращения.Выбрать();
while(questions.Следующий())
{ бла бла бла
5 Garykom
 
04.06.24
13:52
(0) В ДО есть встроенный веб и http-сервис
Используй из C#/.Net его, вместо устаревшего COM/OLE
6 AntonKemov
 
04.06.24
13:54
не содержит определения для "Выбрать"
   в CallSite.Target(Closure , CallSite , Object )
   в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)

При попытке вызвать у табличной части метод выбрать, выдает ошибку выше.
И при попытке ее перебрать тоже возникает ошибка, но формата "IEnumerable не реализован"
7 Ненавижу 1С
 
04.06.24
13:55
Вообще-то в (0) у вас там таблица значений. И ее перебирать надо иначе. Методов Выбрать/Следующий нет
8 AntonKemov
 
04.06.24
13:56
Garykom это безумно хороший вариант, но есть одна проблема, то что COM/OLE используется для интеграции не только с 1С:ДО, но и с 1С:УПП.
Скорее всего я перейду к варианту с веб сервисом, если не найду решения.
9 AntonKemov
 
04.06.24
14:00
Ненавижу 1С, а как необходимо перебирать иначе?
Я пытался вызвать в C# .NET циклы например foreach или for по индексу через индекастор объекта с табличной частью, но выдавало ошибки.
10 Ненавижу 1С
 
04.06.24
14:01
(8) либо foreach (если оно совместимо), либо

for(int i=0; i<questions.Количество();i++)
{
  var item = questions.Получить(i);
  ...
}
11 Garykom
 
04.06.24
14:01
(8) 1С:УПП еще проще - тупо переход на ERP
Фактически это был намек то ты чем то не тем занимаешься
Требуй для решения задачи программиста 1С и интерфейс к ней, с мануалом
12 AntonKemov
 
04.06.24
14:08
Ненавижу 1С, при попытке реализовать твой вариант возникает такая ошибка, при вызове метода Количество():

не содержит определения для "Количество"
   в CallSite.Target(Closure , CallSite , Object )
   в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
13 AntonKemov
 
04.06.24
14:10
(11) Окей, но с переходом на ERP есть проблемы уже на стороне бизнеса, поэтому буду отталкиваться от того что имею, веб сервис на стороне ДО и на стороне УПП, который необходимо настроить будет.
14 Garykom
 
04.06.24
14:10
(12) Как попугаев?
Просто готовить не умеешь...
15 Garykom
 
04.06.24
14:13
16 Ненавижу 1С
 
04.06.24
14:24
(12) код покажи, где падает
17 Ёпрст
 
04.06.24
14:27
(6) покажи дерево метаданных, где видно, что есть ВопросыОбращения
18 AntonKemov
 
04.06.24
14:45
<xs:complexType name="CatalogObject.ВходящиеДокументы">
        <xs:sequence>
            <xs:element name="Ref" type="tns:CatalogRef.ВходящиеДокументы"/>
            <xs:element name="DeletionMark" type="xs:boolean"/>
            <xs:element name="Code" type="xs:string"/>
            <xs:element name="Description" type="xs:string"/>
            <xs:element name="PredefinedDataName" type="xs:string" minOccurs="0"/>
            <xs:element name="Адресат" type="tns:CatalogRef.Пользователи"/>
            <xs:element name="Валюта" type="tns:CatalogRef.Валюты"/>
            <xs:element name="ВидДокумента" type="tns:CatalogRef.ВидыВходящихДокументов"/>
            <xs:element name="ВидОбращения" type="tns:EnumRef.ВидыОбращенийГраждан"/>
            <xs:element name="ВопросДеятельности" type="tns:CatalogRef.ВопросыДеятельности"/>
            <xs:element name="ГрифДоступа" type="tns:CatalogRef.ГрифыДоступа"/>
            <xs:element name="ДатаРегистрации" type="xs:dateTime"/>
            <xs:element name="ДатаСоздания" type="xs:dateTime"/>
            <xs:element name="Дело" type="tns:CatalogRef.ДелаХраненияДокументов"/>
            <xs:element name="Дубликат" type="xs:boolean"/>
            <xs:element name="Заголовок" type="xs:string"/>
            <xs:element name="ЗапретитьАвтоматическоеДобавлениеУчастниковРабочейГруппы" type="xs:boolean"/>
            <xs:element name="Зарегистрировал" type="tns:CatalogRef.Пользователи"/>
            <xs:element name="Источник" type="tns:CatalogRef.ИсточникиДанных"/>
            <xs:element name="ИсходящаяДата" type="xs:dateTime"/>
            <xs:element name="ИсходящийНомер" type="xs:string"/>
            <xs:element name="КоличествоЛистов" type="xs:decimal"/>
            <xs:element name="КоличествоПриложений" type="xs:decimal"/>
            <xs:element name="КоличествоЭкземпляров" type="xs:decimal"/>
            <xs:element name="Комментарий" type="xs:string"/>
            <xs:element name="КонтактноеЛицоПереадресовавшего" type="tns:CatalogRef.КонтактныеЛица"/>
            <xs:element name="ЛистовВПриложениях" type="xs:decimal"/>
            <xs:element name="НоменклатураДел" type="tns:CatalogRef.НоменклатураДел"/>
            <xs:element name="Организация" type="tns:CatalogRef.Организации"/>
            <xs:element name="Ответственный" type="tns:CatalogRef.Пользователи"/>
            <xs:element name="Отправитель" type="tns:CatalogRef.Контрагенты"/>
            <xs:element name="Переадресовавший" type="tns:CatalogRef.Контрагенты"/>
            <xs:element name="Повторное" type="xs:boolean"/>
            <xs:element name="Подписал" type="tns:CatalogRef.КонтактныеЛица"/>
            <xs:element name="ПодписанЭП" type="xs:boolean"/>
            <xs:element name="Проект" type="tns:CatalogRef.Проекты"/>
            <xs:element name="Подразделение" type="tns:CatalogRef.СтруктураПредприятия"/>
            <xs:element name="РегистрационныйНомер" type="xs:string"/>
            <xs:element name="Содержание" type="xs:string"/>
            <xs:element name="Создал" type="tns:CatalogRef.Пользователи"/>
            <xs:element name="СпособПолучения" type="tns:CatalogRef.СпособыДоставки"/>
            <xs:element name="СрокИсполнения" type="xs:dateTime"/>
            <xs:element name="СрокОтветаПереадресовавшему" type="xs:dateTime"/>
            <xs:element name="УдалитьЗапретитьАвтоматическоеДобавлениеУчастниковРабочейГруппы" type="xs:boolean"/>
            <xs:element name="УдалитьШаблон" type="tns:CatalogRef.ШаблоныВходящихДокументов"/>
            <xs:element name="Сумма" type="xs:decimal"/>
            <xs:element name="ТребуетсяОтветПереадресовавшему" type="xs:boolean"/>
            <xs:element name="ЧисловойНомер" type="xs:decimal"/>
            <xs:element name="Шаблон" type="tns:CatalogRef.ШаблоныВходящихДокументов"/>
            <xs:element name="ВопросыОбращения" type="tns:CatalogTabularSectionRow.ВходящиеДокументы.ВопросыОбращения"
                        minOccurs="0" maxOccurs="99999"/>
            <xs:element name="ДополнительныеРеквизиты"
                        type="tns:CatalogTabularSectionRow.ВходящиеДокументы.ДополнительныеРеквизиты" minOccurs="0"
                        maxOccurs="99999"/>
            <xs:element name="СубъектыПерсональныхДанных"
                        type="tns:CatalogTabularSectionRow.ВходящиеДокументы.СубъектыПерсональныхДанных" minOccurs="0"
                        maxOccurs="99999"/>
            <xs:element name="УдалитьРезолюции" type="tns:CatalogTabularSectionRow.ВходящиеДокументы.УдалитьРезолюции"
                        minOccurs="0" maxOccurs="99999"/>
            <xs:element name="УдалитьЭлектронныеЦифровыеПодписи"
                        type="tns:CatalogTabularSectionRow.ВходящиеДокументы.УдалитьЭлектронныеЦифровыеПодписи"
                        minOccurs="0" maxOccurs="99999"/>
        </xs:sequence>
    </xs:complexType>

Вот XSD Схема 1С:ДО, которая отражает метаданные
19 AntonKemov
 
04.06.24
14:47
(16)


while(queryResult.Следующий())
{
   var date = queryResult.ДатаСоздания; // Тут будет дата
   var comment = queryResult.Комментарий; //Тут будет строка с комментарием
   var questions = queryResult.ВопросыОбращения; //Тут будет табличная

var count = questions.Количество() //Тут падает с ошибкой на то, что такого метода "Количество" нет.

}
20 Ёпрст
 
04.06.24
14:55
>>>При попытке вызвать у табличной части метод выбрать, выдает ошибку выше.

в  результате запроса, в ВопросыОбращения будет результатЗапроса, у которого есть метод выбрать().

Показывай больше когда, как применил знания из (3) или (4)
21 Ёпрст
 
04.06.24
14:56
(19) ясен пень. У РезультатаЗапроса нет метода Количество(),
есть только
Выбрать (Select)
Выгрузить (Unload)
Пустой (IsEmpty)
22 lEvGl
 
04.06.24
15:29
+ не забываем пробовать английское написание методов, даже из 1С в 1С по-русски не все работают
Коиличество() - Count()
23 Ненавижу 1С
 
04.06.24
15:52
(22) кстати да
24 AntonKemov
 
04.06.24
19:02
(20) Все получилось, спасибо, использовал английский метод Select()
(21) Select() сработал, спасибо огромное, вы спасли огромное количество моего времени :)
(22) Пробовал и сработало :)

Спасибо огромное всем за помощь, что помогли .NET разработчику разобраться с 1С.