База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как правильно передавать данные из серверной функции на клиент в 1С? › Ответ в теме: Как правильно передавать данные из серверной функции на клиент в 1С?
Ваша проблема — вы пытаетесь вернуть из серверной функции ВыполнитьПроведениеНаСервере объект выборки (РезультатЗапроса.Выбрать()), а потом на клиенте пытаетесь по нему пройтись циклом. Но объект выборки — это серверный объект, он не может быть передан напрямую на клиент.
Как правильно сделать:
1. На сервере выполните запрос, получите выборку.
2. Преобразуйте выборку в массив или таблицу значений (например, Выгрузить()), чтобы передать на клиент.
3. На клиенте перебирайте полученный массив или таблицу значений.
Пример исправления:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
&НаСервере Функция ВыполнитьПроведениеНаСервере(НачДата, КонДата) Запрос = Новый Запрос; Запрос.Текст = |ВЫБРАТЬ | РеализацияТоваровУслуг.Дата КАК Дата, | РеализацияТоваровУслуг.Ссылка КАК Ссылка |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата"; Запрос.УстановитьПараметр("НачДата", НачДата); Запрос.УстановитьПараметр("КонДата", КонДата); РезультатЗапроса = Запрос.Выполнить(); // Возвращаем таблицу значений, а не выборку Возврат РезультатЗапроса.Выгрузить(); КонецФункции |
На клиенте:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
&НаКлиенте Процедура ВыполнитьПроведение(Команда) Сообщить("-----------------------------------------------------------", СтатусСообщения.БезСтатуса); Сообщить("Начало обработки документов РеализацияТоваровУслуг", СтатусСообщения.БезСтатуса); ТаблицаРезультатов = ВыполнитьПроведениеНаСервере(Объект.НачДата, Объект.КонДата); Для Каждого Строка Из ТаблицаРезультатов Цикл // Строка.Ссылка - это ссылка на документ // Чтобы получить объект документа, нужно вызвать ПолучитьОбъект() ДокументОбъект = Строка.Ссылка.ПолучитьОбъект(); // Здесь можно делать действия с объектом, например, провести, записать и т.п. // Попытка // ДокументОбъект.Записать(); // Исключение // Сообщить("Ошибка при записи документа " + Строка.Ссылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное); // КонецПопытки; Сообщить("Документ: " + Строка.Ссылка + " полностью изменён!"); КонецЦикла; Сообщить("-----------------------------------------------------------", СтатусСообщения.БезСтатуса); Сообщить("Обработка документов завершена", СтатусСообщения.БезСтатуса); КонецПроцедуры |
Ключевые моменты:
— РезультатЗапроса.Выбрать() — серверный объект, нельзя передавать на клиент.
— Используйте Выгрузить() для передачи данных из запроса на клиент.
— На клиенте перебирайте таблицу значений, а для работы с документом используйте Ссылка.ПолучитьОбъект().
— Если нужно изменить и записать документ, делайте это на клиенте или через серверные процедуры.
Так ваш код будет работать корректно и без ошибок.