В разработке под управляемое приложение 1С:Предприятие 8.3 часто возникает задача обработки реквизитов документа на клиенте. Однако напрямую обращаться к реквизитам через точку от ссылки на клиенте (например, СсылкаНаДокумент.Дата) крайне не рекомендуется: это приводит к неявным серверным вызовам и считыванию объекта целиком, что существенно снижает производительность системы. Кроме того, привычный объект ТаблицаЗначений недоступен на клиенте.
Разберем, как получить сразу все необходимые реквизиты примитивных типов (строка, число, дата, булево) за один серверный вызов и эффективно оперировать ими в клиентском контексте.
Выясним причину, почему возникает сложность при работе с данными объекта на клиенте:
ТаблицаЗначений существует только на сервере, в толстом клиенте или во внешнем соединении. Передать его напрямую с сервера на тонкий или веб-клиент нельзя.Самый простой и эффективный способ получить набор реквизитов документа за один серверный вызов — упаковать их на сервере в объект Структура. Примитивные типы данных штатно сериализуются и передаются между клиентом и сервером без задержек.
Рассмотрим пример реализации. На форме или в клиенском модуле вызывается серверная функция, которая считывает реквизиты и возвращает структуру:
&НаКлиенте
Процедура ОбработатьРеквизитыНаКлиенте()
// Получаем реквизиты за один серверный вызов
РеквизитыДокумента = ПолучитьРеквизитыНаСервере(СсылкаНаДокумент);
// Обрабатываем полученные данные на клиенте
Если РеквизитыДокумента <> Неопределено Тогда
Сообщение = СтрШаблон("Документ № %1 от %2 на сумму %3",
РеквизитыДокумента.Номер,
РеквизитыДокумента.Дата,
РеквизитыДокумента.СуммаДокумента);
ПоказатьПредупреждение(, Сообщение);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьРеквизитыНаСервере(СсылкаНаДокумент)
Результат = Новый Структура;
Результат.Вставить("Номер", СсылкаНаДокумент.Номер);
Результат.Вставить("Дата", СсылкаНаДокумент.Дата);
Результат.Вставить("СуммаДокумента", СсылкаНаДокумент.СуммаДокумента);
Результат.Вставить("Проведен", СсылкаНаДокумент.Проведен);
Возврат Результат;
КонецФункции
Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), нет необходимости вручную писать функции для сбора реквизитов в структуру. В БСП предусмотрен готовый программный интерфейс, который выполняет запрос к базе данных и возвращает структуру значений.
Посмотрим, как обращаться к функциям БСП с клиента:
&НаКлиенте
Процедура ПолучитьДанныеЧерезБСП()
// Формируем список нужных реквизитов через запятую
ИменаРеквизитов = "Номер, Дата, СуммаДокумента, Комментарий";
// Вызываем функцию БСП с серверным вызовом
ЗначенияРеквизитов = ОбщегоНазначенияВызовСервера.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, ИменаРеквизитов);
// Обрабатываем результат
ДатаДокумента = ЗначенияРеквизитов.Дата;
Сумма = ЗначенияРеквизитов.СуммаДокумента;
КонецПроцедуры
Метод ОбщегоНазначенияВызовСервера.ЗначенияРеквизитовОбъекта выполняет оптимизированный запрос к базе данных только по указанным полям, упаковывает их в Структура и возвращает на клиент за один контекстный или бесконтекстный вызов.
Если кроме шапки документа вам необходимо передать и обработать на клиенте набор строк (например, строки табличной части), замените ТаблицаЗначений на Массив, элементами которого являются объекты Структура.
Проанализируем пример получения табличных данных:
&НаСервереБезКонтекста
Функция ПолучитьТабличнуюЧастьНаСервере(СсылкаНаДокумент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.НомерСтроки КАК НомерСтроки,
| ТЧ.Количество КАК Количество,
| ТЧ.Цена КАК Цена,
| ТЧ.Сумма КАК Сумма
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ТЧ
|ГДЕ
| ТЧ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Выборка = Запрос.Выполнить().Выбрать();
Результат = Новый Массив;
Пока Выборка.Следующий() Цикл
СтрокаТЧ = Новый Структура("НомерСтроки, Количество, Цена, Сумма");
ЗаполнитьЗначенияСвойств(СтрокаТЧ, Выборка);
Результат.Добавить(СтрокаТЧ);
КонецЦикла;
Возврат Результат;
КонецФункции
При выборе подхода к обработке данных на клиенте придерживайтесь следующих правил:
&НаСервереБезКонтекста. На клиент следует возвращать только готовый результат (например, итоговые суммы или флаговые значения).