База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как правильно передавать данные из серверной функции на клиент в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 12 часов, 11 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
7 мая 2026 в 18:15 #37013
&НаСервере
Функция ВыполнитьПроведениеНаСервере(НачДата,КонДата)Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РеализацияТоваровУслуг.Дата КАК Дата,
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата»;Запрос.УстановитьПараметр(«КонДата», КонДата);
Запрос.УстановитьПараметр(«НачДата», НачДата);РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса.Выбрать();
КонецФункции
&НаКлиенте
Процедура ВыполнитьПроведение(Команда)Сообщить(«————————————————————«, СтатусСообщения.БезСтатуса);
Сообщить(«Начала обработки документов РеализацияТоваровУслуг «, СтатусСообщения.БезСтатуса);Выборка = ВыполнитьПроведениеНаСервере(Объект.НачДата,Объект.КонДата);
Пока Выборка.Следующий() Цикл
//Объект = Выборка.ПолучитьОбъект();
//СсылкаНаЭлемент = Выборка.Ссылка;
//Форма = СсылкаНаЭлемент.ПолучитьФорму();
//Форма.Открыть();
//
//
//Попытка
// Объект.Записать();
Сообщить(«Документ: «+Выборка.Ссылка+» полностью измен!»);
//Исключение
// Сообщить(«————————————————————«, СтатусСообщения.БезСтатуса);
// Сообщить(«Документ не записан » + ОписаниеОшибки(), СтатусСообщения.Важное);
// Форма.Закрыть();
// Возврат;
//КонецПопытки;
//
//Форма.Закрыть();КонецЦикла;
Сообщить(«————————————————————«, СтатусСообщения.БезСтатуса);
Сообщить(«Обработка документов», СтатусСообщения.БезСтатуса);КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)Объект.НачДата = ‘20260416’;
Объект.КонДата = КонецДня(‘20260416’);КонецПроцедуры
-
7 мая 2026 в 18:15 #37014
Ваша проблема — вы пытаетесь вернуть из серверной функции
ВыполнитьПроведениеНаСервереобъект выборки (РезультатЗапроса.Выбрать()), а потом на клиенте пытаетесь по нему пройтись циклом. Но объект выборки — это серверный объект, он не может быть передан напрямую на клиент.Как правильно сделать:
1. На сервере выполните запрос, получите выборку.
2. Преобразуйте выборку в массив или таблицу значений (например,Выгрузить()), чтобы передать на клиент.
3. На клиенте перебирайте полученный массив или таблицу значений.Пример исправления:
1С (Код)1234567891011121314151617181920&НаСервереФункция ВыполнитьПроведениеНаСервере(НачДата, КонДата)Запрос = Новый Запрос;Запрос.Текст =|ВЫБРАТЬ| РеализацияТоваровУслуг.Дата КАК Дата,| РеализацияТоваровУслуг.Ссылка КАК Ссылка|ИЗ| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг|ГДЕ| РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата";Запрос.УстановитьПараметр("НачДата", НачДата);Запрос.УстановитьПараметр("КонДата", КонДата);РезультатЗапроса = Запрос.Выполнить();// Возвращаем таблицу значений, а не выборкуВозврат РезультатЗапроса.Выгрузить();КонецФункцииНа клиенте:
1С (Код)12345678910111213141516171819202122232425&НаКлиентеПроцедура ВыполнитьПроведение(Команда)Сообщить("-----------------------------------------------------------", СтатусСообщения.БезСтатуса);Сообщить("Начало обработки документов РеализацияТоваровУслуг", СтатусСообщения.БезСтатуса);ТаблицаРезультатов = ВыполнитьПроведениеНаСервере(Объект.НачДата, Объект.КонДата);Для Каждого Строка Из ТаблицаРезультатов Цикл// Строка.Ссылка - это ссылка на документ// Чтобы получить объект документа, нужно вызвать ПолучитьОбъект()ДокументОбъект = Строка.Ссылка.ПолучитьОбъект();// Здесь можно делать действия с объектом, например, провести, записать и т.п.// Попытка// ДокументОбъект.Записать();// Исключение// Сообщить("Ошибка при записи документа " + Строка.Ссылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);// КонецПопытки;Сообщить("Документ: " + Строка.Ссылка + " полностью изменён!");КонецЦикла;Сообщить("-----------------------------------------------------------", СтатусСообщения.БезСтатуса);Сообщить("Обработка документов завершена", СтатусСообщения.БезСтатуса);КонецПроцедурыКлючевые моменты:
—
РезультатЗапроса.Выбрать()— серверный объект, нельзя передавать на клиент.
— ИспользуйтеВыгрузить()для передачи данных из запроса на клиент.
— На клиенте перебирайте таблицу значений, а для работы с документом используйтеСсылка.ПолучитьОбъект().
— Если нужно изменить и записать документ, делайте это на клиенте или через серверные процедуры.Так ваш код будет работать корректно и без ошибок.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.