Имя: Пароль:
1C
1С v8
веб-сервис
0 ic-kat
 
26.06.12
12:01
платформа 8.2
есть веб-сервис, передает и получает данные, все вроде корректно работает.
возникла необходимость отправить в него тз  с данными, пока отправляла только строковые.
отправляю тз, выходит ошибка
Отправка=Прокси.AddInvoices(тз);
по причине:
Несоответствие типов (параметр номер '1')
что не так?
1 Cube
 
26.06.12
12:07
(0) Передавать можно только примитивные типы (строка, число и т.п.). Если нужно передать список строк, то нужно делать XDTO-пакет для списка, а если нужно передать список объектов, то ещё и XDTO-пакет объекта.
2 ic-kat
 
26.06.12
12:11
нужен именно список строк.
если я в другой базе для проверки добавила ws-ссылку для проверки, то там я, понятно, сделаю XDTO-пакет для списка, а если с веб-сервисом работает и отправляет на него данные какая-то сторонняя программа, написанная на си, то там как это делается?
3 Cube
 
26.06.12
12:27
(2) Даже не знаю как объяснить... Нужно на С описать XDTO-пакет и передать в нем строки... Если смотреть со стороны результата - в xml-файл, который формируется на С нужно вставить узел (это наш XDTO-пакет) и натолкать в этот узел наши строки.
4 Fragster
 
гуру
26.06.12
12:28
(3) при чем тут си вообще?
5 Cube
 
26.06.12
12:29
(4) Читай (2) в самом конце.
6 Alex_MA
 
26.06.12
12:30
Ветка метаданных XDTOПакеты - описать твой объект.
В инете поищи, где то на пальцах объяснено как работать с web сервисом.
7 Fragster
 
гуру
26.06.12
12:30
(5) да и xdto не наод, можно просто правильный WSDL сделать
8 ic-kat
 
26.06.12
12:33
правильный - это какой?
9 Fragster
 
гуру
26.06.12
12:34
(8) в котором пакет XDTO описан внутрях. просто 1с пир импорте wsdlя само все создаст как надо
10 ic-kat
 
26.06.12
12:39
что значит, описан внутрях?
в веб-сервисе описала типа получаемых данных как таблицу
11 Serginio1
 
26.06.12
13:04
(10) Как таблица значений? В любом случае ты должен создать объект через Прокси.Создать( ТипОбъектXDTO)
Книга знаний: Использование внешних web-сервисов в 1С:Предприятие 8
12 Serginio1
 
26.06.12
13:08
Если у тебя реально ТЗ тогда
v8: Выгрузить таблицу в xml
Только вместо ФабрикаXDTO используй Прокси
13 Serginio1
 
26.06.12
13:10
Тьфу  Прокси.ФабрикаXDTO
14 Cube
 
26.06.12
13:14
(11) Если я правильно понял, то в статье описывается, как из 1С отправить список... А автору, на сколько я понял, нужно передать в 1С список...
15 Cube
 
26.06.12
13:15
(2) Ты откуда данные-то в 1С передаешь? Есть кусок кода хотя бы, где формируется запрос к web-сервису 1C?
16 ic-kat
 
26.06.12
13:17
(14)да, именно в 1с передать список
17 Cube
 
26.06.12
13:20
(16) Я, конечно не сильно много опыта имею, но выгрузку документов с андройда в 1С через веб сервис написать смог. Так что я знаю, как это написать на андройде и JavaScript, но в других языках, наверное, аналогично...
18 ic-kat
 
26.06.12
13:20
из 1с отправляются таблицы без проблем. как раз с созданием хдто
19 Cube
 
26.06.12
13:21
(18) Ты на (15) ответь.
20 ic-kat
 
26.06.12
13:29
(19) передаю не я, передает сишник, мне нужно в веб-сервисе нужную операцию добавить, чтобы принять данные и потом обрабатывать их.
21 ic-kat
 
26.06.12
13:30
остальные операции тестировала через веб-ссылку, а тут застряла
22 ic-kat
 
26.06.12
13:31
когда веб-сервис принимал строку, то в процедуре просто операцию присваивания использовала, при принятии таблицы что-то меняется?
23 Cube
 
26.06.12
13:34
(20) Ну? В чем проблема? Я тут недавно уже это рассказывал: v8: Список в параметр операции веб-сервиса
Вот скрин веб-сервиса: http://storage4.static.itmages.ru/i/12/0618/h_1340009101_7804304_6936d6e252.jpeg
24 Cube
 
26.06.12
13:35
+(23) Только у меня там список объектов, а у тебя будет список строк, поэтому XDTO-пакет Document создавать тебе не надо.
25 ic-kat
 
26.06.12
13:39
у меня аналог, только имена другие.
XDTO-пакет создавать наверное все-таки нужно, потому что эээ... не совсем список строк, на самом деле массив
7 столбцов, строк куча.
26 ic-kat
 
26.06.12
13:40
тема по поиску почему-то не вышла, читаю
27 Cube
 
26.06.12
13:43
(25) XDTO-пакет объекта тебе не нужен. Столбцы в твоей таблице это будут свойства XDTO-пакета твоего списка. Если в каждойй колонке тип примитивный, то XDTO-пакеты для них не нужны.
28 ic-kat
 
26.06.12
13:46
(27)сейчас у меня вот так http://i079.radikal.ru/1206/3b/7125e9cbf973.jpg
каждое значение массива будет строковым
получается, что у ParametrsInvoices будет тип не InvoiceTable, а InvoiceRecord?
29 Cube
 
26.06.12
13:48
(28) "получается, что у ParametrsInvoices будет тип не InvoiceTable, а InvoiceRecord?"
Получается так...
30 Serginio1
 
26.06.12
14:20
Что то типа такого

Фабрика=Прокси.ФабрикаXDTO;
   
ТипInvoiceTable= Фабрика.Тип(ПространствоИмен,"InvoiceTable");
ТипInvoiceRecord=Фабрика.Тип.Создать(ПространствоИмен,"nvoiceRecord");
   
InvoiceTable= Фабрика.Создать(ТипInvoiceTable);

В цикле создаешь записи и добавляешь их в
InvoiceRecordInvoiceRecord=Фабрика.Создать(ТипInvoiceRecord);

InvoiceTable.InvoiceRecord.Добавить(InvoiceRecord);

и вызываешь метод
Прокси.AddInvoices(InvoiceTable);
31 ic-kat
 
26.06.12
14:46
(30) так все-таки тип InvoiceTable?
32 Serginio1
 
26.06.12
14:48
Да, но строки то у тебя другогг типа.
InvoiceRecordInvoiceRecord=Фабрика.Создать(ТипInvoiceRecord);
InvoiceRecordInvoiceRecord.СвойствоЗаписи="Значение этой записи"
И добавляешь эту запись в таблицу
InvoiceTable.InvoiceRecord.Добавить(InvoiceRecord);
33 Serginio1
 
26.06.12
14:49
34 ic-kat
 
26.06.12
14:53
(33) как вставить кусок кода, чтобы как в (30) отображался?
35 Serginio1
 
26.06.12
14:54
36 Serginio1
 
26.06.12
14:56
Какой ти у твоего InvoiceRecord?
Тебе нужно поставить нужный ТипСтроки
ТипInvoiceRecord=Фабрика.Тип.Создать(ПространствоИмен,ТипСтроки);

Все остальное смотри 30
37 ic-kat
 
26.06.12
14:56
у меня вот так:  
http://i079.radikal.ru/1206/3b/7125e9cbf973.jpg
пишу:

   Фабрика=Прокси.ФабрикаXDTO;
   ТипInvoiceTable= Фабрика.Тип("блабла","InvoiceTable");
   ТипInvoiceRecord=Фабрика.Тип("блабла","InvoiceRecord");
   InvoiceTable = Фабрика.Создать(ТипInvoiceTable);
   
       Для Каждого СтрокаДанных Из ТЗ цикл
           InvoiceRecord                = ФабрикаXDTO.Создать(ТипInvoiceRecord);
           InvoiceRecord.parametr1        = СокрЛП(СтрокаДанных.Первая);
           InvoiceRecord.parametr2      = СокрЛП(СтрокаДанных.Вторая);
           InvoiceRecord.parametr3      = СокрЛП(СтрокаДанных.Третья);
           InvoiceTable.dataRecord.Добавить(InvoiceRecord);
       КонецЦикла;

   Отправка=Прокси.AddInvoices(InvoiceTable);

вываливается ошибка:

Ошибка при вызове метода контекста (Создать)
InvoiceRecord = ФабрикаXDTO.Создать(ТипInvoiceRecord);

по причине:
Несоответствие типов XDTO:
Тип '{блабла}InvoiceRecord' не найден
Тип принадлежит пакету, отсутствующему в фабрике типов XDTO
38 Serginio1
 
26.06.12
14:59
А какой  тип у InvoiceRecord?
39 Serginio1
 
26.06.12
15:00
Согласно рисунку У тебя InvoiceTable.InvoiceRecord.Добавить
40 Serginio1
 
26.06.12
15:02
Так не
InvoiceRecord                = ФабрикаXDTO.Создать(ТипInvoiceRecord);
а
InvoiceRecord                = Фабрика.Создать(ТипInvoiceRecord);
41 ic-kat
 
26.06.12
15:04
ой, прохлопала, сейчас исправлю
42 ic-kat
 
26.06.12
15:06
теперь ругается так:
Поле объекта недоступно для записи (parametr1)
InvoiceRecord.parametr1        = СокрЛП(СтрокаДанных.Первая);
43 Serginio1
 
26.06.12
15:07
А в отладчике какие свойства?
44 ic-kat
 
26.06.12
15:08
(43) где именно в отладчике? и какие свойства?
45 Serginio1
 
26.06.12
15:09
А какой тип у этого  parametr1?
46 ic-kat
 
26.06.12
15:09
строка
47 Serginio1
 
26.06.12
15:11
И у parametr2 тоже недоступно. Покажи рисунок свойств
48 ic-kat
 
26.06.12
15:14
http://s001.radikal.ru/i193/1206/0b/43e3db8692a5.jpg

все три параметра такие
49 Serginio1
 
26.06.12
15:17
Так Parametr1 это список. Тяжело 1С с такими параметрами.
Попробуй InvoiceRecord.parametr1.Добавить(СокрЛП(СтрокаДанных.Первая));
50 ic-kat
 
26.06.12
15:19
почему список?
51 Serginio1
 
26.06.12
15:21
А потому что максимальное равно -1. Посмотри на описание InvoiceRecord
52 Serginio1
 
26.06.12
15:21
в структуре InvoiceTable
53 ic-kat
 
26.06.12
15:22
какое значение должно быть, чтоб был не список?
54 Serginio1
 
26.06.12
15:27
0 и при этом галочки не должно стоять
55 ic-kat
 
26.06.12
15:34
большое спасибо!! все заработало
56 ic-kat
 
26.06.12
15:39
а что за тип данных получается в итоге?
57 ic-kat
 
26.06.12
15:46
(54)циклом не перебирается, метода количество у него нет. как его расковыривать?
58 Serginio1
 
26.06.12
15:58
(57) А вот 1С плохо с такими типами. Мне приходилось создавать прокси через C# используя v8: Объекты Net в IDispatch

В 1С прекрасно живут структуры типа InvoiceTable и InvoiceRecord. Кстати в C# они отображаются как массив структур.
Сейчас под рукой нет 8 ки. Но там можно с этими свойствами поколдовать как с атрибутами.
59 ic-kat
 
26.06.12
16:05
ууу... лес какой.
а есть возможность как-то по-другому или в других типах передать таблицу?
или в любом случае потом изголяться придется, чтобы данные вытащить?
60 Serginio1
 
26.06.12
16:20
Ну во первых смотри ссылку v8: Выгрузить таблицу в xml
ТипОбъектаXDTO=ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core","ValueTable");
Это будет универсальный тип. Между 1С через сериализатор они лекго создаются и востанавливаются. А вот как на других языках не знаю.
А чем тебе не нравится структуры nbgf InvoiceTable и InvoiceRecord?
61 ic-kat
 
26.06.12
16:27
(60) фуу, напугал меня))
вот так все данные веб-сервисом получаются и разбираются:


Функция AddInvoices(ParametrsInvoices)
   
   Строка="";
   Для Каждого Запись Из ParametrsInvoices.InvoiceRecord Цикл
        Строка=Строка+Запись.parametr1+Запись.parametr2+Запись.parametr3;
   КонецЦикла;
   
   Возврат Строка;
КонецФункции


это я для примера, что каждый элемент таблицы обрабатывается и в строку добавляется
62 Serginio1
 
26.06.12
16:35
Ну конечно для примитивных типов это все работает.
Я про другое хотел сказать касаемо Таблицы значений когда у тебя количество колонок неограничено.
Это ответ на вопрос " как-то по-другому или в других типах передать таблицу"