Ошибка передачи данных между клиентом и сервером

Ошибка передачи данных между клиентом и сервером. Ошибка преобразования данных XDTO. ☑ 0

Ilnazio

14.06.20

14:59

Доброго времени суток. Просьба не кидаться тухлыми помидорами, только учусь :) Т.к. учусь опишу задачу, вдруг совсем неправильно подхожу к ее решению.

Задача такая: необходимо открыть форму выбора справочника с отбором. Для этого получаю данные отбора из регистра запросом. С клиентской процедуры решил использовать функцию на сервере, которая вернет массив запроса. В последующем результат я обработаю уже на клиенте и открою форму с отбором.

В момент возвращения массива на клиентскую процедуру возникает ошибка, довольно длинная:

//НачалоОшибки

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

по причине:

Ошибка преобразования данных XDTO:

Запись значения свойства ‘ret’:

    форма: Элемент

    имя: {http://v8.1c.ru/8.2/managed-application/modules}ret

по причине:

Ошибка преобразования данных XDTO:

Запись значения свойства ‘Value’:

    форма: Элемент

    имя: {http://v8.1c.ru/8.1/data/core}Value

по причине:

Ошибка отображения типов:

Отсутствует отображение для типа ‘СтрокаТаблицыЗначений’

по причине:

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

по причине:

Ошибка преобразования данных XDTO:

Запись значения свойства ‘ret’:

    форма: Элемент

    имя: {http://v8.1c.ru/8.2/managed-application/modules}ret

по причине:

Ошибка преобразования данных XDTO:

Запись значения свойства ‘Value’:

    форма: Элемент

    имя: {http://v8.1c.ru/8.1/data/core}Value

по причине:

Ошибка отображения типов:

Отсутствует отображение для типа ‘СтрокаТаблицыЗначений’

//Конецошибки

Сам код:

&НаСервере

Функция Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод)

    Запрос = Новый Запрос;

    Запрос.Текст =

    «ВЫБРАТЬ

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура КАК Номенклатура,

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.АлкогольнаяПродукция КАК АлкогольнаяПродукция

    |ИЗ

    |    РегистрСведений.алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры КАК алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры

    |

    |СГРУППИРОВАТЬ ПО

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура,

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.АлкогольнаяПродукция»;

        
    Запрос.УстановитьПараметр(«Наименование», СтрокаСАлкПрод);

    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();

    
    ПараметрыОтбора = Новый Структура();

    ПараметрыОтбора.Вставить(«АлкогольнаяПродукция»,СтрокаСАлкПрод);

    НайденныеСтроки = РезультатЗапроса.НайтиСтроки(ПараметрыОтбора);

    
    Возврат(НайденныеСтроки);    

КонецФункции

&НаКлиенте

Процедура Бит_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    НайденныеСтроки = «ы»;

    
    ТекДанные = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;

    СтрокаСАлкПрод = ТекДанные.АлкогольнаяПродукция;

    СтандартаяОбработка = ложь;

    
    Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

    
    ПараметрыОтбораФормы = Новый Структура();

    Для каждого стр из НайденныеСтроки Цикл

        Значение = стр.Номенклатура;

        ПараметрыОтбораФормы.Вставить(«Номенклатура»,Значение);

    КонецЦикла;

    
    ПараметрыОтбораФормы = ПолучитьИзВременногоХранилища(АдресХранилища);

    Форма = ПолучитьФорму(«Справочник.Номенклатура.ФормаВыбора»,ПараметрыОтбораФормы);

    Форма.Открыть();    

КонецПроцедуры

ну ругайтесь, пожалуйста. облазил сколько смог перед тем как зарегаться тут

1

Ilnazio

14.06.20

15:02

Да еще и код не выделился..

&НаСервере

Функция Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод)

    Запрос = Новый Запрос;

    Запрос.Текст =

    "ВЫБРАТЬ

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура КАК Номенклатура,

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.АлкогольнаяПродукция КАК АлкогольнаяПродукция

    |ИЗ

    |    РегистрСведений.алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры КАК алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры

    |

    |СГРУППИРОВАТЬ ПО

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура,

    |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.АлкогольнаяПродукция";

        
    Запрос.УстановитьПараметр("Наименование", СтрокаСАлкПрод);

    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();

    
    ПараметрыОтбора = Новый Структура();

    ПараметрыОтбора.Вставить("АлкогольнаяПродукция",СтрокаСАлкПрод);

    НайденныеСтроки = РезультатЗапроса.НайтиСтроки(ПараметрыОтбора);

    
    Возврат(НайденныеСтроки);    

КонецФункции

&НаКлиенте

Процедура Бит_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    НайденныеСтроки = "ы";

    
    ТекДанные = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;

    СтрокаСАлкПрод = ТекДанные.АлкогольнаяПродукция;

    СтандартаяОбработка = ложь;

    
    Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

    
    ПараметрыОтбораФормы = Новый Структура();

    Для каждого стр из НайденныеСтроки Цикл

        Значение = стр.Номенклатура;

        ПараметрыОтбораФормы.Вставить("Номенклатура",Значение);

    КонецЦикла;

    
    ПараметрыОтбораФормы = ПолучитьИзВременногоХранилища(АдресХранилища);

    Форма = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",ПараметрыОтбораФормы);

    Форма.Открыть();    

КонецПроцедуры

2

H A D G E H O G s

14.06.20

15:17

Передача Таблицы значений между сервером и клиентом недоступна

3

Ilnazio

14.06.20

15:18

(2) НайденныеСтроки — массив, в отладке смотрел. Читал что вроде его передавать можно

4

Cthulhu

14.06.20

15:19

Отсутствует отображение для типа ‘СтрокаТаблицыЗначений’

— значения типа ‘СтрокаТаблицыЗначений’, ‘ТаблицаЗначений’ — НЕ сериализуются! (и согласно мануалу и реализации —  не существуют в клиенте, хотя в принципе можно и извратиться создать и использовать их — но это лирика не по теме)

5

Cthulhu

14.06.20

15:20

(3): значит в массиве есть значение такого типа… а как ты хотел — для передачи коллекции значений сериализутся все элементы коллекции

6

Ilnazio

14.06.20

15:27

(5) Действительно в массиве хранятся значения типа «СтрокаТаблицыЗначений». Какой выход из ситуации? как можно вернуть инфу на клиент?

7

H A D G E H O G s

14.06.20

15:57

(6) Преобразуй в Структуру

8

Ilnazio

14.06.20

17:16

(7) Преобразовал в структуру в функции на сервере, до вызова функции в процедуре объявил Переменную ПараметрыОтбораФормы, иначе ругался. В момент возвращения в процедуру значения ПараметрыОтбораФормы = неопределенно становится. По идее структуру можно же с сервера на клиент возвращать?

ПараметрыОтбораФормы = Новый Структура();

    Для каждого стр из НайденныеСтроки Цикл

        Значение = стр.Номенклатура;

        ПараметрыОтбораФормы.Вставить("Номенклатура",Значение);

    КонецЦикла;

    
    Возврат(ПараметрыОтбораФормы);    

КонецФункции

&НаКлиенте

Процедура Бит_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    Перем ПараметрыОтбораФормы;

    
    ТекДанные = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;

    СтрокаСАлкПрод = ТекДанные.АлкогольнаяПродукция;

    СтандартаяОбработка = ложь;

    
    Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

9

RomaH

15.06.20

06:45

(8)

Перем ПараметрыОтбораФормы;

вот это тебя подвело

зачем оно тебе?

10

ДенисЧ

15.06.20

06:48

«ПараметрыОтбораФормы = Новый Структура();

    Для каждого стр из НайденныеСтроки Цикл

        Значение = стр.Номенклатура;

        ПараметрыОтбораФормы.Вставить(«Номенклатура»,Значение);

    КонецЦикла;

»

Извините, а сегодня точно не пятница, а понедельник?

11

Kashey

15.06.20

09:54

(0) Можете расписать подробнее, что хотите реализовать? Есть мнение, что Ваш подход неверный в корне.

12

Ilnazio

15.06.20

11:13

(10) воскресенье + неопытный я)) Дай совет дай зеленому, пожалуйста

13

Ilnazio

15.06.20

11:13

(9) Перем поставил из-за того что он ругается. ошибка: Переменная не определена (ПараметрыОтбораФормы)

14

ДенисЧ

15.06.20

11:21

(12) Покрасься

Надеюсь, ты понимаешь, что каждое Вставить в структуру перезаписывает существующее значение?

15

Ilnazio

15.06.20

11:21

(11) В ТЧ обработке устанавливается соответствие между (АП) алкогольной продукцией(пришла из егаиса) и номенклатурой в 1С. В случае когда одной АП соответствует несколько позиции номенклатуры 1С нужно открыть форму выбора справочника номенклатура с предложенным списком вариантов на основе регистра сведений. В регистре сведений прописывается связка всех соответствии АП-номенклатура.

В табличной части где нужно выбрать номенклатуру я получил АП, далее по этому АП нашел все связки запросом и получил массив (НайденныеСтроки).

Чтобы открыть форму с отбором вроде как нужно иметь структуру с одной колонкой — нашими параметрами отбора.

На данный момент столкнулся с несколькими проблемами:

1) не могу вернуть хоть какую-то инфу серверной функцией.

2) пробовал параметры руками проставлять(тестировал смогу открыть форму выбора с желаемыми позициями или нет) — тоже не получилось задуманное.

16

Ilnazio

15.06.20

11:22

(14) Да, это понимаю) в отладке сразу обратил внимание. Простого человеческого добавить нету же(

17

ДенисЧ

15.06.20

11:23

(16) Куда добавить? Структура — она по определению — с уникальными ключами…

18

D_E_S_131

15.06.20

11:27

1. Ищи в запросе сразу по строке «АлкогольнаяПродукция» нужную Номенклатуру.

2. Найденные значения выгружай в массив и этот массив уже возвращай на клиента.

3. На открываемую форму так же передавай свой массив в отдельный параметр.

4. В открываемой форме в ПриСозданииНаСервере сделай установку отбора на основании переданного параметра формы.

19

Ilnazio

15.06.20

11:41

(17) Тогда вопрос на засыпку: Есть одномерный массив с 2-3 элементами. Как можно его превратить в структуру?)

20

D_E_S_131

15.06.20

11:42

(19) Зачем тебе что-то во что-то превращать вообще?

21

dezss

15.06.20

11:46

(0)

   НайденныеСтроки = РезультатЗапроса.Скопировать(ПараметрыОтбора);

   МассивСтрок = ОбщегоНазначения.ТаблицаЗначенийВМассив(НайденныеСтроки);

22

dezss

15.06.20

11:47

(21) + это написать вместо

НайденныеСтроки = РезультатЗапроса.НайтиСтроки(ПараметрыОтбора);

Ну и возвращать МассивСтрок;

23

Kashey

15.06.20

12:05

(15) По запросу — параметр «Наименование» запроса устанавливаете, а в запросе не фильтруете по нему. Выбираются все записи регистра сведений. Ещё не увидел куда результат функции возвращается на клиенте. Из результата запроса  формируете структуру с нужной номенклатурой и возвращаете на клиент. На клиенте полученую структуру помещаете в параметры отбора формы перед её открытием. Должно всё получиться.

24

Ilnazio

15.06.20

12:24

(22) Спасибо большое, учту

25

Ilnazio

15.06.20

12:26

(23) Спасибо. Да с запросом косяк был, переделал. Не понял немного вас:»Ещё не увидел куда результат функции возвращается на клиенте» А как нужно отобразить куда результат функции возвращается?

26

Ilnazio

15.06.20

12:29

(20) При открытии формы необходима структура в качестве параметра отбора. А я получаю по сути массив… Или как-то можно массивом отвертеться?

В сп:

<Параметры> (необязательный)

Тип: Структура.

27

Kashey

15.06.20

12:38

(25)  вызываете функцию, её результат нужно поместить в переменную, иначе нужно использовать процедуру. Как-то так:

НайденныеСтроки = Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

А НайденныеСтроки потом уже обрабатывать как требуется.

28

Ilnazio

15.06.20

12:51

(27) Понял, спасибо огромное Вам! Можете, пожалуйста, посмотреть (26) сообщение, может сходу идея появится какая-нибудь…

29

Kashey

15.06.20

13:18

(28)Поместить список номенклатуры в список значений СЗ. Передать его как параметр отбора в форму выбора.

СтрСписок = Новый Структура(«Ссылка», СЗ);

ПараметрыФормы = Новый Структура(«Отбор», СтрСЗ);

    ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора», ПараметрыФормы);

30

Kashey

15.06.20

13:24

Либо установить отбор в запросе динамического списка в форме выбора и передавать список номенклатуры в неё. При создании на сервере заполнять параметр запроса динамического списка.

31

Ilnazio

15.06.20

13:59

(30) Спасибо большое за советы, дошел до финала — открытие формы. Не разобрался моментом как из массива получить структуру.



МассивОтбора = Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);    ОткрытьФорму("Справочник.алкВидыАкциза.ФормаВыбора",МассивОтбора);



Бьет ошибку несоответствие типов. передается массив, ожидает увидеть структуру.

32

Ilnazio

15.06.20

13:59

(18) Тоже спасибо сказал все по делу, но все-таки для открытия формы необходима структура. Массив передаю — выдает ошибку несоответствие типов(

33

Ilnazio

15.06.20

14:00

(29) Вроде тут описали схему без мудреных для меня на данный момент динамических списков. Можете, пожалуйста, подробнее рассказать?

34

Ilnazio

15.06.20

14:10

https://makrus.ru/chastye-voprosy-po-1s/kak-otkryt-formu-vybora-s-opredelennym-otborom-v-1s-82.html

Вот здесь хороший пример есть для обычных форм. Второй кусок кода демонстрирует проверку при отборе ВидСравнение.Всписке. То что нужно, но для УФ надо такое же(

35

Kashey

15.06.20

14:16

(30) Если вариант из (29) — ваша функция должна вернуть список значений (не массив), который вы и поместите в структуру для передачи в форму подбора.

36

Ilnazio

15.06.20

14:30

(35) У вас в коде или ошибка или я пробка.. я, конечно, склоняюсь ко второму варианту, но уточню:



СтрСписок = Новый Структура("Ссылка", СЗ);

ПараметрыФормы = Новый Структура("Отбор", СтрСЗ);

    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы);



По коду:

СЗ — список значений. СтрСписок — теперь структура из нашего массива. ПараметрыФормы — новая структура из какого-то СтрСЗ? я связь потерял

37

Ilnazio

15.06.20

14:30

(36) СтрСписок — теперь структура из нашего *СпискаЗначений*, опечатку допустил

38

Kashey

15.06.20

14:35

(37) Да, ошибка. СтрСЗ = СтрСписок

39

D_E_S_131

15.06.20

14:36

(32) А какой тип у параметра формы поставил? Произвольный?

40

D_E_S_131

15.06.20

14:48

Хотя как рекомендовано в (29) сделать более правильно и изящнее.

41

craxx

15.06.20

14:54

(0) Индексы строк передавай, а не сами строки

ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока

42

Ilnazio

15.06.20

14:56

(38) (40) (41) Сделал как в 29, все отрабатывает, но уходит в типовой код и открывает совсем другую форму.



&НаКлиенте

Процедура Бит_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    
    ТекДанные = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;

    СтрокаСАлкПрод = ТекДанные.АлкогольнаяПродукция;

    СтандартаяОбработка = ложь;

    
    СЗ = Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

    
    
    СтрСписок = Новый Структура("Ссылка", СЗ);

    ПараметрыФормы = Новый Структура("Отбор", СтрСписок);

    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы);

    
КонецПроцедуры

Видимо не достаточно что стоит стандартная обработка = ложь

43

Ilnazio

15.06.20

14:58

(42) Причем открывает две формы, типовую что должна открыться и то что я вызываю, только то что я вызвал уходит в типовой код и в коде я отловил момент когда моя форма подменяется другой. По итогу открываются две формы, обе не мои)

44

Kashey

15.06.20

15:03

(43) СтандартаяОбработка = ложь;

45

D_E_S_131

15.06.20

15:03

(43) А что у тебя здесь — «Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод)»?

46

Kashey

15.06.20

15:04

(43) Внимательно прочтите имя переменной

47

Ilnazio

15.06.20

15:12

(45) Функция которая вернула СписокЗначений



&НаСервере

Функция Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод)

    Запрос = Новый Запрос;

    Запрос.Текст =

        "ВЫБРАТЬ

        |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура.Наименование КАК НоменклатураНаименование

        |ИЗ

        |    РегистрСведений.алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры КАК алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры

        |ГДЕ

        |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.АлкогольнаяПродукция.Ссылка = &Наименование

        |

        |СГРУППИРОВАТЬ ПО

        |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура.Наименование";

    
    Запрос.УстановитьПараметр("Наименование", СтрокаСАлкПрод);

    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();

    СЗ = Новый СписокЗначений();

    Для Каждого стр из РезультатЗапроса Цикл

        СЗ.Добавить(стр.НоменклатураНаименование);

    КонецЦикла;

    Возврат(СЗ);    

КонецФункции

48

D_E_S_131

15.06.20

15:18

«…и в коде я отловил момент когда моя форма подменяется другой.» — этот код ПриОткрытии формы выбора срабатывает?

49

Kashey

15.06.20

15:19

(47) Зачем наименование выбираете в запросе? Ссылка нужна. А в секции ГДЕ как раз наименование нужно, похоже, а не ссылка ))

50

Ilnazio

15.06.20

15:20

(46) Да, моя невнимательность была. Теперь же форма открывается одна — моя. Точнее пытается открыться, но в процессе заменяется типовой формой другой, то есть проходит в типовую процедуру сразу же после выполнения команды открытьформу.

Заметил что как только выхожу из своей процедуры стандартная обработка автоматом проставляется «Истина»! сцуко…

Попадает в следующую процедуру:

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

    
    Если ВидФормы = "ФормаОбъекта" Тогда    

        Если Параметры.Свойство("ЗначениеКопирования") Тогда

            ОбъектКопирования = Параметры.ЗначениеКопирования;

            Если Не ОбъектКопирования.ЭтоГруппа Тогда

                СтандартнаяОбработка = Ложь;

                Параметры = Новый Структура("ЗначениеКопирования", ОбъектКопирования);

                ВыбраннаяФорма = "ФормаЭлемента";

            КонецЕсли;

        ИначеЕсли Параметры.Свойство("РежимВыбора") Тогда

            Если Параметры.РежимВыбора

                И (Не Параметры.Свойство("ЭтоГруппа")

                     Или Не Параметры.ЭтоГруппа) Тогда

                СтандартнаяОбработка = Ложь;

                ВыбраннаяФорма = "ФормаЭлемента";

            КонецЕсли;

        КонецЕсли;

    ИначеЕсли ВидФормы = "ФормаВыбора" Тогда

        ВыборГруппИЭлементов = Неопределено;

        Если Параметры.Свойство("ВыборГруппИЭлементов",ВыборГруппИЭлементов) Тогда

            Если ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы Тогда

                СтандартнаяОбработка = Ложь;

                ВыбраннаяФорма = "ФормаВыбораГруппИЭлементов";

            КонецЕсли;

        Иначе

            СтандартнаяОбработка = Ложь;

            ВыбраннаяФорма = "ФормаВыбораГруппИЭлементов";

        КонецЕсли;

    КонецЕсли;

    
КонецПроцедуры

Вот тут замена идет



ИначеЕсли ВидФормы = "ФормаВыбора" Тогда

        ВыборГруппИЭлементов = Неопределено;

        Если Параметры.Свойство("ВыборГруппИЭлементов",ВыборГруппИЭлементов) Тогда

            Если ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы Тогда

                СтандартнаяОбработка = Ложь;

                ВыбраннаяФорма = "ФормаВыбораГруппИЭлементов";

            КонецЕсли;

        Иначе

            СтандартнаяОбработка = Ложь;

            ВыбраннаяФорма = "ФормаВыбораГруппИЭлементов";

        КонецЕсли;

    КонецЕсли;

    
КонецПроцедуры

51

Ilnazio

15.06.20

15:21

(49) там все работает)) ну я посмотрю что вы имеете в виду)

52

D_E_S_131

15.06.20

15:25

Открывай через «ОткрытьФорму(«Справочник.Номенклатура.Формы.ФормаВыбора», ПараметрыФормы)», если она не заработает в режиме выбора, то придется через ПолучитьФорму() сделать и установить ей режим выбора, закрытие при выборе и т.п.

53

Cthulhu

15.06.20

15:33

54

Cthulhu

15.06.20

15:34

(53) — готовый код тз в структуру

55

Kashey

15.06.20

15:45

(51) А форму выбора самостоятельно добавляли? Если да, то нужно указать в первом параметре ОткрытьФорму() её имя.

56

Ilnazio

15.06.20

15:56

(52) Отрабатывает нормально, спасибо. Но форма выбора открывается пустой, без списка номенклатуры. Также стандартнаяобработка после выхода из моей процедуры меняется на Истину.

57

Ilnazio

15.06.20

16:07

(55) Открываю самостоятельно, имя прописываю.

Если прописываю Справочник.Номенклатура.ФормаВыбора — моя форма заменяется другой.

Если же Справочник.Номенклатура.Форма.ФормаВыбора, то открывается нужная форма, но пустая



&НаКлиенте

Процедура Бит_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    
    ТекДанные = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;

    СтрокаСАлкПрод = ТекДанные.АлкогольнаяПродукция;

    
    СтандартнаяОбработка = Ложь;

    
    СЗ = Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

    
    СтрСписок = Новый Структура("Ссылка", СЗ);

    ПараметрыФормы = Новый Структура("Отбор", СтрСписок);

    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", ПараметрыФормы);

    
КонецПроцедуры

58

D_E_S_131

15.06.20

16:10

«Но форма выбора открывается пустой, без списка номенклатуры» — смотреть отладчиком какие данные (и каких типов) получились в СЗ.

«Также стандартнаяобработка после выхода из моей процедуры меняется на Истину.» — в смысле «после выхода»? Куда вышло? Может в том месте уже свой параметр СтандартнаяОбработка?

59

Kashey

15.06.20

16:10

(57) См. 49, нужна ссылка

60

Ilnazio

15.06.20

17:17

(59) Действительно — проблема в ссылке была. Задача решена, всем огромное спасибо. Рабочий код прилагается



&НаСервере

Функция Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод)

    Запрос = Новый Запрос;

    Запрос.Текст =

        "ВЫБРАТЬ

        |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура КАК Номенклатура

        |ИЗ

        |    РегистрСведений.алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры КАК алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры

        |ГДЕ

        |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.АлкогольнаяПродукция.Ссылка = &Наименование

        |

        |СГРУППИРОВАТЬ ПО

        |    алкСоответствияАлкогольнойПродукцииЕГАИСИНоменклатуры.Номенклатура";

    
    Запрос.УстановитьПараметр("Наименование", СтрокаСАлкПрод);

    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();

    СЗ = Новый СписокЗначений();

    Для Каждого стр из РезультатЗапроса Цикл

        СЗ.Добавить(стр.Номенклатура);

    КонецЦикла;

    Возврат(СЗ);    

КонецФункции

&НаКлиенте

Процедура Бит_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    
    ТекДанные = ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;

    СтрокаСАлкПрод = ТекДанные.АлкогольнаяПродукция;

    
    СтандартнаяОбработка = Ложь;

    
    СЗ = Бит_ТоварыНоменклатураНачалоВыбораНаСервере(СтрокаСАлкПрод);

    
    СтрСписок = Новый Структура("Ссылка", СЗ);

    ПараметрыФормы = Новый Структура("Отбор", СтрСписок);

    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", ПараметрыФормы);

КонецПроцедуры

61

Ilnazio

15.06.20

17:17

(59) Сколько в сфере 1с работаете если не секрет?)

62

D_E_S_131

15.06.20

17:25

(60) Еще в условии «ГДЕ» ссылку сравниваешь с чем, опять со строкой?

63

Ilnazio

15.06.20

17:28

(62) Нет, там ссылка приходит.

64

Ilnazio

15.06.20

17:29

(59) (62) Короч нифига не все)) отбор произведен, но номенклатура не выбирается из списка.. сцуко, рано обрадовался

65

D_E_S_131

15.06.20

17:57

(64) см. второй вариант в (52). :)

66

Kashey

15.06.20

18:02

(64) В открываемой форме элемент формы Список — в свойствах режим выбора стоит?

67

Ilnazio

16.06.20

09:55

(66) Не очень понял где смотреть. Форму которую открываю — типовая. Есть подозрения что не задана форма владельца и значение тупо не возвращается, может быть такое?

68

Ilnazio

16.06.20

10:33

(66) Проблему решил, передал владельцем элемент откуда вызывалась процедура, значение возвращает. Но если же объясните что вы имели в виду будет полезно для общего развития.

Для будущих поколений: дополнил строчку открытия формы

ОткрытьФорму(«Справочник.Номенклатура.Форма.ФормаВыбора», ПараметрыФормы,Элемент);

69

D_E_S_131

16.06.20

10:39

«Есть подозрения что не задана форма владельца…» — это не подозрение, а факт судя по вашему коду. Еще так же полезно настроить режим открытия окна формы (последний параметр метода ОткрытьФорму()).

70

Ilnazio

16.06.20

10:53

(69) Спасибо) Чем он помогает?

71

D_E_S_131

16.06.20

11:13

(70) Ну если использовать режим БлокироватьОкноВладельца, то выбор элемента будет более естественным.

72

Ilnazio

16.06.20

11:34

(71) Понял, протестирую

73

Kashey

16.06.20

11:44

(66) Если коротко — есть форма списка, есть форма выбора. Поведение отличается, хотел уточнить что используете именно форму выбора. Для общего развития рекомендую изучить работу с управляемыми формами, там очень много нюансов. Нахрапом не возьмёшь, нужно именно понимание.

74

Ilnazio

17.06.20

11:59

(73) Понял, изучу. спасибо большое) Есть какие-либо источники которые с уверенностью можете посоветовать?


Evgenii
Пользователь
19.12.2016 08:55
При передаче таблицы значений на клиент выдает ошибку.

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа ‘{http://v8.1c.ru/8.1/data/core}ValueTable’

&НаСервере
Функция ПолучитьТаблицуТоваров()

Запрос

= Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование,
| Номенклатура.Количество,
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура"
;

РезультатЗапроса

= Запрос.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();Возврат Таблица;КонецФункции

&НаКлиенте


Процедура Команда(Команда)
Таблица = ПолучитьТаблицуТоваров();
КонецПроцедуры

Ответы (5)


Кодер
Пользователь
19.12.2016 09:16
Номер  (1)

Какая конфигурация?
Управляемое или обычное приложение?


Evgenii
Пользователь
19.12.2016 09:31
Номер  (2)

Управляемое приложение УТ 11.
В файловой базе такой ошибки нет. Ошибка появляется только в клиент-серверном варианте.


Кодер
Пользователь
19.12.2016 10:06
Номер  (3)

Видимо у вас:
На сервере запускается в «Тонком клиенте». В этом режиме с сервера на клиент нельзя передавать таблицу значений и некоторые другие типы данных.

В файловом варианте запускается в «Толстом клинете». Этот режим работы позволяет передавать ТЗ.


Evgenii
Пользователь
19.12.2016 10:33
Номер  (4)

Файловая база используеттся для тестирования.
А как можно ее запустить в тонком клиенте для отладки?


progv8
Пользователь
19.12.2016 15:13
Номер  (5)

В конфигураторе Сервис->Параметры->Запуск 1С:Предприятия
Обязательно должен быть установлен компонент «Тонкий клиент».

Обсуждение закрыто

  • Регистрация
  • Восстановить пароль
  • Вход
 

При входе в базу 1с вы можете увидеть “Ошибка преобразования данных XDTO:

Начало Свойства: errorProcessingSettings

Форма: Элемент

Тип: {http://v8.1c.ru/8.2/managed-application/core}ErrorProcessingSettings по причине

Чаще всего ошибка возникает при определенном типе запуска: это либо через тонкий клиент, либо через линк42, случаи бывают разные. Через браузер такие базы запускаются без ошибок.

Есть простое решение данной проблемы.

Достаточно запустить базу доступным нам способом (где нет ошибки) включить Функции тех. специалиста (Меню — Настройки — Параметры — Режим технического специалиста)

В Функциях для технического специалиста ищем Управление настройками обработки ошибок (Стандартные)

Запускаем

Готово!

Уже более 10 000 компаний работают
в облачной 1С от 42Clouds

— Консультация по 1С Бесплатно!

— Поддержка 24/7 по техническим вопросам: в чате, по телефону, по почте

— Все типовые конфигурации онлайн, доступ через RDP, Remote App, Web

  

Chameleon1980

12.12.22 — 09:36

Приветствую Всех.

Вот такая хрень постоянно при отладке вылазит (практически в любом месте):

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

по причине:

Ошибка преобразования данных XDTO:

Значение: QEGDgoLBgsBVgEONHQQCTkuGumb7YE4YqpXfY5HdPZxoTYSvEptS02+agsGaCDIwLjA0LjIygYGhIK0AKIHhy1WhILWXKw1KpTfjS7mKQ4Q0sSh0gSA=    Тип: {http://www.w3.org/2001/XMLSchema}base64Binary

Отладка HTTP

1С:Предприятие 8.3 (8.3.22.1709)

Управление холдингом, редакция 3.2 (3.2.2.22)

Клиент-сервер

Кто-нибудь сталкивался? и как победить?

  

asady

1 — 12.12.22 — 09:43

(0) вангую — возникает на форме объекта.

  

Chameleon1980

2 — 12.12.22 — 09:51

ну, например, в ПриСозданииНаСервере

  

Chameleon1980

3 — 12.12.22 — 09:51

и потом отдалка просто отваливается
просто ничего нет в предметах отладки

  

Chameleon1980

4 — 12.12.22 — 09:52

(1) тут же вообще чисто серверная
тоько сервер-сервер

  

Chameleon1980

5 — 12.12.22 — 10:09

беда… блин

  

DayDreamer

6 — 12.12.22 — 10:12

переходите на 8.3.20.2184
21 и 22 платформа содержат различные баги, даже в последних релизах

  

Kassern

7 — 12.12.22 — 10:12

(4) «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.» — «тоько сервер-сервер» неувязочка получается)

  

Kassern

8 — 12.12.22 — 10:14

(0) если сервис ваш, то попробуйте строкой передавать, а в base64 уже на приемнике конвертировать

  

Chameleon1980

9 — 12.12.22 — 10:19

1. нет никакой передачи.

2. еще раз повторю — возникает, например в процедуре ПриСозданииНаСервере, а она где ?? правильно — на сервере.

какие клиенты тут?

более придерживаюсь - (6)

жду еще читателей - может кто знает секрет

  

Chameleon1980

10 — 12.12.22 — 10:21

https://dropmefiles.com/fPuQ3

вот на этой строке падает

и отладка напрочь отваливается после этого

https://dropmefiles.com/fPuQ3

  

Chameleon1980

11 — 12.12.22 — 10:22

(10) тут клиентом не пахнет

  

Kassern

12 — 12.12.22 — 10:54

(11) а без отладки код отрабатывает?

  

Chameleon1980

13 — 12.12.22 — 11:08

(12) ага. без отладки все гладко.

  

Kassern

14 — 12.12.22 — 11:09

(13) А если через TCP/IP отладку запустить?

  

Chameleon1980

15 — 12.12.22 — 11:15

(14) пока не пробовали. я предлагал, но пока откатились до

1С:Предприятие 8.3 (8.3.20.2180)

эта ошибка ушла

Спасибо огромное всем, кто оказался рядом в трудную минуту и пытался помочь. :)

С наступающим всем новым годом !!!

Dimasikkk1

12 / 9 / 3

Регистрация: 29.03.2018

Сообщений: 94

1

1C 8.x

13.04.2021, 18:13. Показов 10301. Ответов 5

Метки нет (Все метки)


Во время изучения 1с предприятия столкнулся с данной проблемой:

Код

Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}Ref	Форма: Элемент	Тип: {http://www.w3.org/2001/XMLSchema}anyType
{Документ.ПоступлениеТоваров.Форма.ФормаДокумента.Форма(8)}:	Заказ = ПолучитьЗаказПоставщикуНаСервере(Объект.Заказ);

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret	Форма: Элемент	Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}Ref	Форма: Элемент	Тип: {http://www.w3.org/2001/XMLSchema}anyType

Делаю что-то похожее на ввод на основании для ПоступленияТоваров, только при изменение реквизита ссылки на документ ЗаказПоставщику.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&НаСервереБезКонтекста
Функция ПолучитьЗаказПоставщикуНаСервере(Заказ)
    Возврат Заказ.ПолучитьОбъект();   
КонецФункции
 
&НаКлиенте
Процедура ЗаказПриИзменении(Элемент)
    Заказ = ПолучитьЗаказПоставщикуНаСервере(Объект.Заказ);
    
    Объект.Поставщик = Заказ.Поставщик;
    Объект.Склад = Заказ.Склад;
    Объект.Товары.Очистить();
    
    Для Каждого ТекСтрокаТовары Из Заказ.Товары Цикл
        НоваяСтрока = Объект.Товары.Добавить();
        НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
        НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
        НоваяСтрока.Характеристика = ТекСтрокаТовары.Характеристика;
        НоваяСтрока.Стоимость = ТекСтрокаТовары.Стоимость;
        НоваяСтрока.ЦенаПоступления = ТекСтрокаТовары.ЦенаПоступления;
    КонецЦикла;
КонецПроцедуры

Если запрашивать данные заказа по одному реквизиту, или выполнять данный код в режиме толстого клиента, то ошибки не появляются. Это так и должно работать или я что-то не так делаю?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

260 / 216 / 94

Регистрация: 07.04.2011

Сообщений: 1,334

13.04.2021, 21:46

2

Что есть «Объект.Заказ»? Заказ — табличная часть?
&НаСервереБезКонтекста — без контекста формы. На сервере будут недоступны данные формы.

Если пытаетесь передать что-то с формы, то директива должна быть «&НаСервере».
Если без контекста, то выгрузить нужно табличную часть, например в ТЗ,, поместить во временное хранилище, и передать на сервер.

1

12 / 9 / 3

Регистрация: 29.03.2018

Сообщений: 94

14.04.2021, 00:43

 [ТС]

3

Цитата
Сообщение от OverDozero
Посмотреть сообщение

Что есть «Объект.Заказ»?

Заказ — это реквизит типа ДокументСсылка.ЗаказПоставщику в документе ПоступлениеТовара, в модуле формы которого выполняется код. Товары — это табличная часть.

Ещё хочу узнать, правильно ли я обратился к данным поля через «Объект.»? Или правильно обращаться через «Элементы.»?

Мне нужно получить объект из поля формы типа ДокументСсылка.ЗаказПоставщику, типа как в коде я написал и читать данные через переменную «Заказы.<реквизит>».

0

260 / 216 / 94

Регистрация: 07.04.2011

Сообщений: 1,334

14.04.2021, 05:10

4

Лучший ответ Сообщение было отмечено Dimasikkk1 как решение

Решение

Вся работа с объектами осуществляется на сервере. ПолучитьОбъект выполняется на сервере.
Вы пытаетесь на клиента вернуть полученный «объект». Тут и ошибка т.к. это считается «мутабельным» типом. А в толстом клиенте нет такой ошибки потому что и клиент и сервер это 1 и то же.

Вам нужно при изменении сделать вызов СЕРВЕРНОЙ процедуры, в ней же получить объект не возвращая на клиента, и делать все что угодно с объектом опять же на сервере.

Обращение через «элементы» нужно чтобы получить например текущую выделенную строку табличной части:»Элементы.ИмяТч.ТекущиеДанные». Или когда элемент формы не связан с объектом

1

Dimasikkk1

12 / 9 / 3

Регистрация: 29.03.2018

Сообщений: 94

14.04.2021, 05:50

 [ТС]

5

Большое спасибо!

Цитата
Сообщение от OverDozero
Посмотреть сообщение

Вам нужно при изменении сделать вызов СЕРВЕРНОЙ процедуры, в ней же получить объект не возвращая на клиента, и делать все что угодно с объектом опять же на сервере.

А я думал что из серверного вызова нельзя менять данные в форме, а нужно запрашивать объект с сервера и уже на клиенте работать с ним.

Финальный код, если у кого-нибудь случится такая же ситуация:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&НаСервере
Процедура ЗаполнениеНаОснованииНаСервере()
    Заказ = Объект.Заказ;
    
    Объект.Поставщик = Заказ.Поставщик;
    Объект.Склад = Заказ.Склад;
    Объект.Товары.Очистить();
    
    Для Каждого ТекСтрокаТовары Из Заказ.Товары Цикл
        НоваяСтрока = Объект.Товары.Добавить();
        НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
        НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
        НоваяСтрока.Характеристика = ТекСтрокаТовары.Характеристика;
        НоваяСтрока.Стоимость = ТекСтрокаТовары.Стоимость;
        НоваяСтрока.ЦенаПоступления = ТекСтрокаТовары.ЦенаПоступления;
    КонецЦикла;
КонецПроцедуры
 
&НаКлиенте
Процедура ЗаказПриИзменении(Элемент)
    ЗаполнениеНаОснованииНаСервере();
КонецПроцедуры

0

260 / 216 / 94

Регистрация: 07.04.2011

Сообщений: 1,334

14.04.2021, 06:21

6

Цитата
Сообщение от Dimasikkk1
Посмотреть сообщение

А я думал что из серверного вызова нельзя менять данные в форме

Почему же нельзя?Можно. РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.

В этом случае, как я понимаю, работа ведется не с основным объектом,а с «вспомогательным». В форме документа что-то изменяется, и в подчиненном объекте это тоже надо поменять.Но Вы же работает не с формой подчиненного объекта, а с объектом. Поэтому все и на сервере, так как «вручную» в форме подчиненного объекта не вносятся никакие изменения.

1

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

14.04.2021, 06:21

6

1С 8 Ошибка «Ошибка преобразования данных XDTO:» при открытии базы в режиме 1С: Предприятие

Описание ошибки:
База была выгружена из ирхива .dt. База файловая, конфигурация 1С: Бухгалтерия предприятия, редакция 3.0. При работе в конфигураторе и при запуска конфигуратора ошибок не возникает. Ошибка проявляет себя только при попытке запуска в режиме 1С: Предприятие. Даже не выводится форма для авторизации пользователя, как возникает ошибка. Релиз платформы 1С: Предприятие — 8.3.12.89.

Найденные решения:

Нажатие на изображении увеличит его
1С 8, как устранить, убрать, исправить ошибку, при запуске базы, Ошибка преобразования данных XDTO, НачалоСвойства: errorProcessingSettings, messageTemplates, category

Полный текст ошибки:

Ошибка преобразования данных XDTO:

НачалоСвойства: errorProcessingSettings Форма: Элемент Тип: {http://v8.1c.ru/8.2/managed-application/core}ErrorProcessingSettings

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: messageTemplates Форма: Элемент Тип: {http://v8.1c.ru/8.2/managed-application/core}ErrorMessagesTexts

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: category Форма: Элемент Тип: {http://v8.1c.ru/8.1/data/core}ErrorCategory

Ошибка в некотором роде редкая, но не настолько, чтобы остаться неизвестной. Короткое обсуждение на форуме dev.mista.ru, содержащее ссылку на описание в каталоге ошибок (потребуется авторизация для сайта ИТС) продукта технологической платформы позволило точно определить проблему — неподходящий релиз платформы. Как указано — использовался релиз платформы 8.3.18.1289.



Нажатие на изображении увеличит его
ошибка при запуске базы 1С 8, Ошибка преобразования данных XDTO, форма, элемент тип: http://v8.1c.ru/8.2/managed-application/core

Таким образом оказалось, что необходимо установить более высокую минорную версию релиза 8.3.18 — 8.3.18.13.63 или позднее. Так же ошибка может возникать для более ранних релизов версий 8.3.17 (до 17.2127), 8.3.19 (до релиза 19.1150), а так же для 8.3.20 (ранее релиза 20.1363).

Обновление релиза платформы 1С:предприятие на релиз 8.3.18.1563 на рабочем месте, где возникла ошибка, исправило ситуацию и база была запущена в ошибок.

Оцените, помогло ли Вам предоставленное описание решения ошибки?




© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

04-10-2021

Журавлев А.С.
(Сайт azhur-c.ru)

Здравствуйте ! помогите разобраться) Вчера было внезапное выключение электроэнергии, работаем в 1С:Предприятие 8.3 (8.3.10.2753) . Теперь при открытии проводок выдает «Ошибка преобразования данных XDTO: НачалоСвойства: {http://v8.1c.ru/8.2/uobjects}structure Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType»
Боюсь что вылезут еще ошибки. Читала что можно почистить кэшь в такой ситуации. Но можно поподробнее , как это сделать?

г. Благовещенск173 360 баллов

Добрый день!

Цитата (Bux25):Боюсь что вылезут еще ошибки. Читала что можно почистить кэшь в такой ситуации. Но можно поподробнее , как это сделать?

Самый простой вариант: в окне запуска 1С:Предприятие сначала удалить «проблемную» базу, а затем заново её подключить.
Перед удалением записи необходимо запомнить путь до базы данных.

Заполнить и подать уведомление об исчисленных суммах налогов и взносов

г. Санкт-Петербург5 баллов

Да, так я сделала все получилось. Но вылезла другая проблема. Не делается резервная копия базы. Точнее она сделалась но весит только 1кб. 
Из картинки видно, что до этого копии я делала и они весят существенно, а то что сделала сегодня всего1 КБ

г. Благовещенск173 360 баллов

1 — сделайте копию папки с базой данный в другое место (можете туда же куда и обычно делаете копии)
2 — запустите 1С в режиме конфигуратора. Провести тестирование и исправление базы (меню Администрирование). Флажки и кнопки переключения желательно установить в положения, которое приведено на рисунке.

Одним из самых популярных форматов данных, используемых практически в любой компании, является XML (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.

Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.

Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.

Существует два способа добавить XDTO-пакет в конфигурацию:

  • Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;

    Рис.1 XDTO пакеты

    Рис.1 XDTO пакеты
  • Импорт присланной схемы. Когда нам присылают данные, их схема может оказаться какой угодно, особенно, если раньше мы не работали с источником. Сильно упростит ситуацию, если вместе с XML нам пришлют и файл формата xsd. В нем содержится выгрузка XDTO-пакета, который может разобрать конкретные XML. Нам останется лишь импортировать его.

Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.

Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.

Это происходит следующими командами:


ФайлXSD = Новый Массив();
ФайлXSD.Добавить("D:1strust.xsd");
ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD);
Номенклатура = ФабрикаXDTOИзФайла.Тип("http://www.1c.ru/products", "Номенклатура");

Экспорт и импорт файла

После того как мы разобрались с принципами использования пакетов XDTO, нужно посмотреть на механику работы с файлами XML. Лучше всего это будет видно на простом примере, чтобы понять основы. Добавим новый элемент в раздел XDTO-пакетов и настроим его следующим образом:

  1. Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
  2. Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.

Рис.2 Параметры пакета

Рис.2 Параметры пакета

Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:

  1. Определение схемы будущей XML;
    
    ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
    

  2. Заполнение свойств номенклатуры;
    
    Номенклатура = ФабрикаXDTO.Создать(ТипФабрики);
    Номенклатура.Наименование = "Тест XML";
    Номенклатура.Артикул = "2";
    

  3. Создание нового XML файла.
    
    ИмяФайла = "D:1struct1.xml";
    МойXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
    МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
    МойXML.ЗаписатьОбъявлениеXML();
    ФабрикаXDTO.ЗаписатьXML(МойXML, номенклатура);
    МойXML.Закрыть();
    

Чтение XML-файлов с помощью конкретной фабрики XDTO по уже созданному в конфигурации пакету ничуть не сложнее. Алгоритм похож по структуре и отличается только операциями взаимодействия с XML-файлами. В данном случае нам нужно воспользоваться объектом платформы «ЧтениеXML» и прочитать содержимое в переменную. На выходе у нее будет тип «ОбъектXDTO», и вы сможете обращаться ко всем ее свойствам через точку.


ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
 
ИмяФайла = "D:1struct1.xml";
МойXML = Новый ЧтениеXML;
МойXML.ОткрытьФайл(ИмяФайла);
номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики);
МойXML.Закрыть();

Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.

Рис.3 Экспорт XDTO-пакета

Рис.3 Экспорт XDTO-пакета

Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.

Исправление ошибок

Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.

Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:

  • Ошибки в обновлении платформы или конфигурации;
  • Обмен между базами разных версий;
  • Недочеты в алгоритме приема данных;
  • Проблемы с временной памятью конкретного компьютера.

Чтобы исправить эту ошибку, сначала почистите кэш или удалите, а также заново добавьте информационную базу в список баз. Затем внимательно проверьте файл XML – вдруг случайно сделали ошибку в его тексте, проверьте соответствие структуры пакету XDTO. Если ошибка появилась после обновления, сделайте тестирование и исправление ИБ, сохранив перед этим резервную копию базы. Если проблема не уйдет, вернитесь на предыдущую версию и подождите, пока разработчики 1С не разберутся с этой проблемой.

Рис.4 Ошибка преобразования данных

Рис.4 Ошибка преобразования данных

Еще одна проблема, часто мучающая программистов 1С, работающих с XDTO, – ошибка проверки данных. Если при импорте вы видите подобный текст, то с высокой долей вероятности источник проблемы в несоответствии файла нужной схеме. Но проблема может быть не на вашей стороне, а в базе, из которой выгружали XML. Чтобы исправить эту оплошность, придется внимательно изучить всю последовательность действий и найти, после чего файл перестал соответствовать ожиданиям.

Рис.5 Ошибка проверки данных

Рис.5 Ошибка проверки данных

Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.

Рис.6 Несоответствие типов XDTO

Рис.6 Несоответствие типов XDTO

На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.

30.06.2022

При разработке своих отчетов, как правило, мы их делаем на последних версиях платформы. А некоторые наши клиенты скачивают отчеты и пытаются работать на старых платформах. И сталкиваются с тем, что их платформа их просто не открывает. Поэтому мы решили создать для себя (и поделиться с вами) небольшой базой знаний, что следует учитывать при разработке отчетов на СКД

Условное оформление на СКД

Очень интересный момент. Если сделать отчет на СКД и добавить условное оформление на платформе 8.3.19 и потом попытаться открыть этот отчет на платформе 8.3.12 или 8.3.10 то сталкиваемся с проблемой, что отчет не открывается и ругается на Ошибка преобразования данных XDTO. Причем если то же самое условное оформление сделать на платформе 8.3.10 с абсолютно такими же настройками, то он нормально работает на платформе 8.3.10. Но если этот отчет открыть в конфигураторе 8.3.19 и просто сохранить его, то он уже не откроется на старой платформе. Видимо, 8.3.19 что-то добавляет в отчет свое.

Какой выход: либо делать отчеты на старых платформах, либо задавать условное оформление программным путем. Мы пошли по второму пути

Использовать группировки запроса если возможно

Еще один кейс. Если в СКД поставить флаг “Использовать группировки запроса если возможно”, то он также не будет открываться на платформе 8.3.12. Отчет будет выдавать ошибку:

Ошибка загрузки документа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: dataSet Форма: Элемент Тип: {http://v8.1c.ru/8.1/data-composition-system/schema}DataSet
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data-composition-system/schema}useQueryGroupIfPossible Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType

Чтобы отчет открывался на старых платформах эта галочка должна быть установлена во всех наборах, во всех схемах компоновки данных этого отчета:

2022 10 25 16 30 32

2022 10 25 16 30 32

В 1С 8.3 на управляемых формах передать таблицу значений с Сервера на Клиент не получится. При попытке это сделать вы увидите ошибку вида:

[stextbox id=’warning’]Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.[/stextbox]

На Клиенте в принципе нельзя использовать таблицу значений. Этот момент можно обойти преобразовав таблицу значений в массив структур, используя следующий код:

МассивСтруктур = Новый Массив;

Для Каждого Строка Из ТЗ Цикл

ЭлементСтр = Новый Структура;

Для Каждого ИмяКолонки Из ТЗ.Колонки Цикл

ЭлементСтруктура.Вставить(ИмяКолонки.Имя, Строка[ИмяКолонки.Имя]);

КонецЦикла;

МассивСтруктур.Добавить(ЭлементСтр);

КонецЦикла;

Далее на Клиенте можно перебирать массив структур точно так же, как и таблицу значений. Используя:

Для Каждого Строка из МассивСтруктур Цикл

...

КонецЦикла;

Также для передачи таблицы значений с клиента на сервер есть возможность использовать временное хранилище, но описанный выше способ по-моему более наглядный.

А если вы хотите освоить профессию Аналитик 1С — приглашаю Вас на мой курс Аналитик 1С

Добрый день. Сегодня наступил на интересные грабли:

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: param Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа ‘{http://v8.1c.ru/8.1/data/core}ValueTable’

Подобная ошибка возникает при попытке передать с клиента на сервер таблицу значений, и это мне давно известно, однако я получил эту ошибку без явной передачи таблицы. Вот часть кода с которым произошла ошибка:

&НаКлиенте
Процедура Заполнить(Команда)
тМассив = Новый Массив;
тМассив .Добавить(Объект.Организация);
ПоискНаСервере(тМассив);
КонецЕсли;
КонецПроцедуры

Процедура ПоискСсылокНаСервере(тМассив, тОсновнаяТаблица = Неопределено)

тДанныеВФорму = Ложь;

Если тОсновнаяТаблица = Неопределено Тогда

тОсновнаяТаблица = Новый ТаблицаЗначений;

тОсновнаяТаблица.Колонки.Добавить(«Ссылка»);

тДанныеВФорму = Истина;

КонецЕсли; 

<<<<>>>>>>

Если <<<<>>>>>> Тогда 

ПоискСсылокНаСервере(МассивСсылок,тОсновнаяТаблица);

КонецЕсли;

Если тДанныеВФорму Тогда

ЗначениеВРеквизитФормы(тОсновнаяТаблица,»ТаблицаСсылок»);

КонецЕсли;

КонецПроцедуры

В этом  коде процедура  с клиента вызывает выполнение кода на сервере, с одним единственным параметром, — массив ссылок. Хотя в процедуре есть два входящих параметра это массив и таблица значение — которая является не обязательным параметром и используется при рекурсивном вызове. И не смотря на то что при вызове с клиента на сервер мы не используем второй параметр, приложение пытается отправить данное значение на клиент и мы получаем вышеописанную ошибку. Выход из данной ситуации один перед возвратом на клиент убить таблицу написав код:

тОсновнаяТаблица = Неопределено

На сегодня все.

Понравилась статья? Поделить с друзьями:
  • Ошибка плагин недоступен честный знак рутокен
  • Ошибка передачи данных vcm
  • Ошибка победителя это
  • Ошибка плагин недоступен сбербанк аст
  • Ошибка передачи данных twain