Odin | База знаний 1С

Как передать таблиц...
 

Как передать таблицу значений с сервера на клиент в 1С без ошибки?


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

Есть функция в модуле формы на сервере в ней через цикл вставляется табличную часть, есть процедура на клиенте в которую нужно передавать таблицу значений, часть кода из функции "
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Код");
Таб.Колонки.Добавить("Адрес");
Таб.Колонки.Добавить("Страна");

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Стр = Таб.Добавить();
Стр.Код = ВыборкаДетальныеЗаписи.Код;
Стр.Адрес = ВыборкаДетальныеЗаписи.Ссылка;
Стр.Страна =ВыборкаДетальныеЗаписи.Страна ;
КонецЦикла;

Возврат Таб;
" часть кода в процедуре на клиенте "ТабЗначений = ПолучениеДляТаблицыДанных(Структура);" , а приходит ошибка "Ошибка отображения типов:
Отсутствует отображение для типа '{
{Документ.ПЛ_ПланЛогистики.Форма.ФормаДокумента.Форма(625)}: ТабЗначений = ПолучениеДляТаблицыДанных(Структура);

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret Форма: Элемент Тип: {
по причине:
Ошибка отображения типов:
"



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

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

Вот как можно это реализовать:

1. **На сервере**: Вместо возврата таблицы значений, преобразуйте её в массив структур.

1C
Функция ПолучениеДляТаблицыДанных(Структура) Экспорт
    Таб = Новый ТаблицаЗначений;
    Таб.Колонки.Добавить("Код");
    Таб.Колонки.Добавить("Адрес");
    Таб.Колонки.Добавить("Страна");

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Стр = Таб.Добавить();
        Стр.Код = ВыборкаДетальныеЗаписи.Код;
        Стр.Адрес = ВыборкаДетальныеЗаписи.Ссылка;
        Стр.Страна = ВыборкаДетальныеЗаписи.Страна;
    КонецЦикла;

    // Преобразуем таблицу значений в массив структур
    МассивДанных = Новый Массив;
    Для Каждого Строка Из Таб Цикл
        СтруктураСтроки = Новый Структура;
        Для Каждого Колонка Из Таб.Колонки Цикл
            СтруктураСтроки.Вставить(Колонка.Имя, Строка[Колонка.Имя]);
        КонецЦикла;
        МассивДанных.Добавить(СтруктураСтроки);
    КонецЦикла;

    Возврат МассивДанных; // Возвращаем массив структур
КонецФункции

2. **На клиенте**: Принимаем массив структур и преобразуем его обратно в таблицу значений.

1C
Процедура ПолучениеДанных(Структура) Экспорт
    МассивСтрок = ПолучениеДляТаблицыДанных(Структура); // Получаем массив структур

    ТабЗначений = Новый ТаблицаЗначений;
    ТабЗначений.Колонки.Добавить("Код");
    ТабЗначений.Колонки.Добавить("Адрес");
    ТабЗначений.Колонки.Добавить("Страна");

    Для Каждого Элемент Из МассивСтрок Цикл
        НоваяСтрока = ТабЗначений.Добавить();
        Для Каждого Имя Из Элемент.Ключи Цикл
            НоваяСтрока[Имя] = Элемент[Имя];
        КонецЦикла;
    КонецЦикла;

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

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



   
ОтветитьЦитата