Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 03:42

1С 8.3 Упр. приложение, ЗначениеВСтрокуВнутр(..) - аналог на клиенте: надо структуру в строку

Автор PavelVaskan, 25 окт 2024, 10:11

0 Пользователей и 1 гость просматривают эту тему.

PavelVaskan

1С 8.3, Управляемое приложение.

Возникла проблема.

Пишу код. Не могу передать строку ТЧ обработки на сервер,

потому на клиенте нужен аналог функции ЗначениеВСтрокуВнутр(..).

Код:


НовСтрока = Объект.ДокументыЗагрузки.Добавить(); // строка Табл.части обработки

....
....

СтруктураДанныхФайла.Вставить("СтрокаШапки", НовСтрока); СтруктураДанныхФайла.Вставить("Организация", НовСтрока.Организация);
СтруктураДанныхФайла.Вставить("Контрагент", НовСтрока.Контрагент);
//НовСтрока.СтруктураДанныхСтрокой = ЗначениеВСтрокуВнутрНаСервере(СтруктураДанныхФайла); // "";

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку();

СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхФайла, НазначениеТипаXML.Явное);

НовСтрока.СтруктураДанныхСтрокой = ЗаписьJSON.Закрыть();


выдаёт ошибку в строке


СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхФайла, НазначениеТипаXML.Явное);
   
Ошибка:

{ВнешняяОбработка.ВыгрузкаЗагрузка1СeDoc.Форма.Форма.Форма(422)}: Ошибка при вызове метода контекста (ЗаписатьJSON): Ошибка преобразования данных XDTO:
Запись значения свойства:
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data/core}Structure: Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data/core}Value: Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'

В общем, как получить JSON-текст или как бы результат функции ЗначениеВСтрокуВнутр(..) на клиенте?

Как решить задачу вообще, чтобы код "не падал" по ошибке?

Максим75

PavelVaskan, а если не строку передавать НовСтрока, а номер строки НовСтрока.НомерСтроки?
просто сама строка не сериализуется, поэтому и ошибка вылетает.

или надо именно строку передать? может по логике как-то по другому можно?

PavelVaskan

Максим75, Мне этого недостаточно... Мне ещё между сервером и клиентом тогда структуру СтруктураДанныхФайла надо передавать, а оно уже с Клиента на Сервер артачится, не говоря уже чтоб обратно...

Максим75

PavelVaskan, сама структура сериализуется. надо чтобы все значения структуры сериализовались, иначе никак.

PavelVaskan

Максим75, Код

&НаКлиенте
Процедура ЗаполнитьШапкуДокумента(СтруктураДанныхФайла)

    НовСтрока = Объект.ДокументыЗагрузки.Добавить(); // новая строка ТЧ обработки

     ...
    ...

    ЗаполнитьВСтрокеТЧ_СтруктураДанныхСтрокой_ЗначениемВСтрокуВнутрНаСервере(СтруктураДанныхФайла, НовСтрока.НомерСтроки);

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

&НаСервере
Процедура ЗаполнитьВСтрокеТЧ_СтруктураДанныхСтрокой_ЗначениемВСтрокуВнутрНаСервере(СтруктураДанныхФайла, НовСтрокаНомер)
   
    НовСтрока = Объект.ДокументыЗагрузки.НайтиПоИдентификатору(НовСтрокаНомер - 1);
   
    СтруктураДанныхФайла.Вставить("СтрокаШапки",     НовСтрока);
    СтруктураДанныхФайла.Вставить("Организация",     НовСтрока.Организация);
    СтруктураДанныхФайла.Вставить("Контрагент",     НовСтрока.Контрагент);
   
    НовСтрока.СтруктураДанныхСтрокой = ЗначениеВСтрокуВнутр(СтруктураДанныхФайла);       
   
КонецПроцедуры

выдаёт в строке вызова процедуры
ЗаполнитьВСтрокеТЧ_СтруктураДанныхСтрокой_ЗначениемВСтрокуВнутрНаСервере(СтруктураДанныхФайла, НовСтрока.НомерСтроки);

ошибку

{ВнешняяОбработка.ВыгрузкаЗагрузка1СeDoc.Форма.Форма.Форма(424)}: Ошибка при вызове метода контекста (ЗаполнитьВСтрокеТЧ_СтруктураДанныхСтрокой_ЗначениемВСтрокуВнутрНаСервере): Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.: Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param: Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data/core}Value: Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'


PavelVaskan

Полный код двух процедур:

&НаСервере
Процедура ЗаполнитьВСтрокеТЧ_СтруктураДанныхСтрокой_ЗначениемВСтрокуВнутрНаСервере(СтруктураДанныхФайла, НовСтрокаНомер)

НовСтрока = Объект.ДокументыЗагрузки.НайтиПоИдентификатору(НовСтрокаНомер - 1);

СтруктураДанныхФайла.Вставить("СтрокаШапки", НовСтрока);
СтруктураДанныхФайла.Вставить("Организация", НовСтрока.Организация);
СтруктураДанныхФайла.Вставить("Контрагент", НовСтрока.Контрагент);

НовСтрока.СтруктураДанныхСтрокой = ЗначениеВСтрокуВнутр(СтруктураДанныхФайла);   

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


&НаКлиенте
Процедура ЗаполнитьШапкуДокумента(СтруктураДанныхФайла)

НовСтрока = Объект.ДокументыЗагрузки.Добавить();
НовСтрока.ИмяФайла = СтруктураДанныхФайла.ИмяФайла;
НовСтрока.Дата = ВДату(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Date);
НовСтрока.ДатаОплаты = ВДату(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.DueDate);
НовСтрока.НомерДокумента = СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Number);
//НовСтрока.ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию(СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.DocCurrency.Currency), Истина);
НовСтрока.ВалютаДокумента = НайтиВалютуПоНаименованию(СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.DocCurrency.Currency));
НовСтрока.ОрганизацияИзФайла = СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.BuyerParty.Name)  +", reg. "+ СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.BuyerParty.RegNum;
НовСтрока.Организация = НайтиОрганизацию(СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.BuyerParty);
НовСтрока.КонтрагентИзФайла = СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.SellerParty.Name) +", reg. "+  СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.SellerParty.RegNum;
НовСтрока.Контрагент = НайтиКонтрагента(СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.SellerParty);

НовСтрока.ДоговорКонтрагента = УстановитьДоговорКонтрагента_НаСервере(НовСтрока.Организация, НовСтрока.Контрагент, НовСтрока.ВалютаДокумента);

НомерСчетаИзФайла = СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentParties.SellerParty.BankData.ContNr);
НовСтрока.БанковскийСчетКонтрагента = УстановитьБанковскийСчетКонтрагента(НовСтрока.Контрагент, НовСтрока.ВалютаДокумента, НомерСчетаИзФайла);


ТекстОшибок = "";

ТекстОшибок = ?(ПустаяСтрока(НовСтрока.НомерДокумента) , ТекстОшибок +НСтр("lv='';ru='Не указан номер документа'") + Символы.ПС, ТекстОшибок);
ТекстОшибок = ?(НЕ ЗначениеЗаполнено(НовСтрока.Организация) , ТекстОшибок +НСтр("lv='';ru='Не найдена организация: '") + НовСтрока.ОрганизацияИзФайла + Символы.ПС, ТекстОшибок);
ТекстОшибок = ?(НЕ ЗначениеЗаполнено(НовСтрока.Контрагент) , ТекстОшибок +НСтр("lv='';ru='Не найден контрагент: '") + НовСтрока.КонтрагентИзФайла + Символы.ПС, ТекстОшибок);
ТекстОшибок = ?(НЕ ЗначениеЗаполнено(НовСтрока.ВалютаДокумента) , ТекстОшибок +НСтр("lv='';ru='Не найдена валюта документа'") + Символы.ПС, ТекстОшибок);
ТекстОшибок = ?(НЕ ЗначениеЗаполнено(НовСтрока.ДоговорКонтрагента) , ТекстОшибок +НСтр("lv='';ru='Не указан договор контрагента с поставщиком (проверить комбинацию: организация + контрагент + валюта)'") + Символы.ПС, ТекстОшибок);

НовСтрока.Ошибки = ТекстОшибок; //ПроверитьДанные(НовСтрока, "ДокументыЗагрузки");
НовСтрока.СущДок = НайтиСущДокумент(НовСтрока.Контрагент, НовСтрока.НомерДокумента, НовСтрока.Дата);

Если СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Свойство("Discount") Тогда
Если СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Discount.Type) = "%" Тогда
НовСтрока.ПроцентСкидкиОбщий = ВЧисло(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Discount.Value);
ИначеЕсли ВРЕГ(СокрЛП(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Discount.Type)) = "SUM" Тогда
НовСтрока.СуммаСкидки = ВЧисло(СтруктураДанныхФайла.СтруктураДокумента.DocumentInfo.Discount.Value);
КонецЕсли;
КонецЕсли;

//СтруктураДанныхФайла.Вставить("СтрокаШапки", НовСтрока);
//СтруктураДанныхФайла.Вставить("Организация", НовСтрока.Организация);
//СтруктураДанныхФайла.Вставить("Контрагент", НовСтрока.Контрагент);   
//НовСтрока.СтруктураДанныхСтрокой     = ЗначениеВСтрокуВнутрНаСервере(СтруктураДанныхФайла);
//НовСтрока.СтруктураДанныхСтрокой = ЗначениеВСтрокуВнутрНаСервере(СтруктураДанныхФайла, НовСтрока.НомерСтроки); // "";
ЗаполнитьВСтрокеТЧ_СтруктураДанныхСтрокой_ЗначениемВСтрокуВнутрНаСервере(СтруктураДанныхФайла, НовСтрока.НомерСтроки);

//ЗаписьJSON = Новый ЗаписьJSON;
//ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
//ЗаписьJSON.УстановитьСтроку();
//
//СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхФайла, НазначениеТипаXML.Явное);
//
//НовСтрока.СтруктураДанныхСтрокой = ЗаписьJSON.Закрыть();


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

Максим75

PavelVaskan, а сразу на сервере добавить строку в табличную часть нельзя?

PavelVaskan

Цитата: Максим75 от 25 окт 2024, 11:11PavelVaskan, а сразу на сервере добавить строку в табличную часть нельзя?

Строку добавить можно, но дело в передаче переменной СтруктураДанныхФайла на Сервер. 1С её не хочет передавать на сервер (там навороченные данные в этой структуре внутри). Потому оперирую с ней на Клиенте. Отсюда и попытка всё, что можно, совершить на Клиенте. Можно разве что попытаться выбрать нужные данные из структуры, создать другую структуру поменьше, без наворотов, и передать её на сервер... либо вообще вместо структуры передать всё параметрами-переменными на сервер...

Максим75

PavelVaskan, сама универсальная коллекция Структура передается без проблем, значит проблема в каких-то значениях этой структуры.
попробуйте на клиенте "разобрать" структуру и передать только нужные Вам значения. Вы правы, сделайте другую структуру.

PavelVaskan

Максим75,

попробовал. Хрен чего получилось!

Практическое противоречие вот в чём:

структура нужна на сервере "неразобранной" для исполнения серверного оператора (метода)
ЗначениеВСтрокуВнутр(СтруктураДанныхФайла)

Передать сложную структуру же на сервер 1С не даёт (слишком много ссылок и сложных полей).

Мелькает мысль - "разобрать" структуру на клиенте, передать частями на сервер, на сервере "собрать" и получить хорошо отрабатывающий код
ЗначениеВСтрокуВнутр(СтруктураДанныхФайла).

Теги: #8.3 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск