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

Передача результата запроса на клиента

Автор dimanuga, 20 фев 2019, 07:33

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

dimanuga

Пытаюсь сделать выгрузку в csv или Excel:


&НаСервереБезКонтекста
Функция ПолучитьСправочник() экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
|Животные.Наименование КАК Наименование,
|Животные.ДатаДобавленияЖивотного КАК ДатаДобавленияЖивотного,
|Животные.ПородаЖивотного КАК ПородаЖивотного,
|Животные.ПолЖивотного КАК ПолЖивотного,
|Животные.ТипИдентификацииЖивотного КАК ТипИдентификацииЖивотного,
|Животные.НомерИдентификатораЖивотного КАК НомерИдентификатораЖивотного
| ИЗ
|Справочник.Животные КАК Животные";

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

&НаСервереБезКонтекста
// Создаем строку загоовков для CSV-файла
Функция СоздатьЗаголовкиCSV(ТаблицаЗначений,разделитель) экспорт
    //разделитель = "|";
    колонкиТЗ=ТаблицаЗначений.колонки;
    Для каждого колонка Из колонкиТЗ Цикл
        стрКолонки = "" + стрКолонки + колонка.Имя + разделитель ;
    КонецЦикла;
    Возврат стрКолонки;
КонецФункции


&НаСервереБезКонтекста
// Создаем текст CSV: текст заголовков и текст данных
Функция СоздатьДанныеCSV(ТаблицаЗначений,разделитель) экспорт

    текст="";
    для каждого запись из ТаблицаЗначений Цикл
        если текст="" тогда
            текст=СоздатьЗаголовкиCSV(ТаблицаЗначений,разделитель)
                + Символы.ПС;   
        КонецЕсли;   

        сообщить(запись.Наименование);
        текст = текст + запись.Наименование
            + разделитель + запись.ДатаДобавленияЖивотного
            + разделитель + запись.ПородаЖивотного
+ разделитель + запись.ПолЖивотного
+ разделитель + запись.ТипИдентификацииЖивотного
+ разделитель + запись.НомерИдентификатораЖивотного
            + Символы.ПС;       
    КонецЦикла;

        //сообщить(текст);
    Возврат текст;

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

&НаКлиенте// Запишем данные в файл
Функция ЗаписатьCSV(текст,имяФайла) экспорт             
    кодировка = КодировкаТекста.ANSI;

ТекстовыйФайлЗапись = Новый ЗаписьТекста(имяФайла,Кодировка);           
    ТекстовыйФайлЗапись.ЗаписатьСтроку(текст);
    ТекстовыйФайлЗапись.Закрыть();   
    Возврат 0;

КонецФункции // ЗаписатьCSV()

&НаКлиенте
// Основная логика:
Функция ВыгрузитьВCSV(имяФайлаCSV) экспорт
    разделитель = "|";
    ТаблицаЗначений = ПолучитьСправочник();
    текст = СоздатьДанныеCSV(ТаблицаЗначений,разделитель);
    ЗаписатьCSV(текст,имяФайлаCSV);

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

&НаКлиенте
Процедура ВыгрузкаДанныхCSV(ПолноеИмяФайла) экспорт
ВыгрузитьВCSV("C:\my.csv");
КонецПроцедуры


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

Как передать результат запроса клиенту?

Vit1501

С сервера на клиент нельзя возвращать ссылки на объекты. Проверьте чтоб у вас в результате запроса были только простые типы данных. Сдается мне там например "полЖивотного", "породаЖивотного" или "ТипИдентификацииЖивотного" могут быть ссылочного типа

bsn-chita

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

&НаСервереБезКонтекста
Функция ПолучитьСправочник()
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |Животные.Наименование КАК Наименование,код
        |    ИЗ
        |Справочник.Животные КАК Животные";
   
    Результат = Запрос.Выполнить();
    ТаблицаЗначений = Результат.Выгрузить();
Возврат ПоместитьВоВременноеХранилище(ТаблицаЗначений, Новый УникальныйИдентификатор);
КонецФункции


&НаКлиенте
Функция ВыгрузитьВCSV(имяФайлаCSV)
    разделитель = "|";
    АдресВХ = ПолучитьСправочник();
    текст = СоздатьДанныеCSV(АдресВХ,разделитель);
    ЗаписатьCSV(текст,имяФайлаCSV);
КонецФункции

Добавлено: 20 фев 2019, 09:05


Или вообще

&НаКлиенте
// Основная логика:
Функция ВыгрузитьВCSV(имяФайлаCSV)
    разделитель = "|";
    текст = СоздатьДанныеCSV(разделитель);
    ЗаписатьCSV(текст,имяФайлаCSV);
КонецФункции

А сам запрос и выгрузку таблицы значений делать в СоздатьДанныеCSV.

alex0402

Цитата: Vit1501 от 20 фев 2019, 08:38С сервера на клиент нельзя возвращать ссылки на объекты.
С сервера на клиент нельзя передать таблицу значений равно как и создать таблицу значений на клиенте.
Можно сформировать, например массив структур или создать таблицу на форме и заполнять ее (тогда не получится на сервере без контекста) .
Спасибо за Сказать спасибо

Теги:

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

Рейтинг@Mail.ru

Поиск