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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В разработке под управляемое приложение 1С:Предприятие 8.3 часто возникает задача обработки реквизитов документа на клиенте. Однако напрямую обращаться к реквизитам через точку от ссылки на клиенте (например, СсылкаНаДокумент.Дата) крайне не рекомендуется: это приводит к неявным серверным вызовам и считыванию объекта целиком, что существенно снижает производительность системы. Кроме того, привычный объект ТаблицаЗначений недоступен на клиенте.

Разберем, как получить сразу все необходимые реквизиты примитивных типов (строка, число, дата, булево) за один серверный вызов и эффективно оперировать ими в клиентском контексте.

Причины ограничений платформы

Выясним причину, почему возникает сложность при работе с данными объекта на клиенте:

  1. Недоступность ТаблицыЗначений на клиенте. Объект ТаблицаЗначений существует только на сервере, в толстом клиенте или во внешнем соединении. Передать его напрямую с сервера на тонкий или веб-клиент нельзя.
  2. Избыточность вызовов сервера. Если обращаться к каждому реквизиту отдельным вызовом или через точку от ссылки, клиент будет постоянно обращаться к базе данных, создавая лишнюю нагрузку на сеть и сервер.

Вариант 1. Использование структуры для передачи данных с сервера

Самый простой и эффективный способ получить набор реквизитов документа за один серверный вызов — упаковать их на сервере в объект Структура. Примитивные типы данных штатно сериализуются и передаются между клиентом и сервером без задержек.

Рассмотрим пример реализации. На форме или в клиенском модуле вызывается серверная функция, которая считывает реквизиты и возвращает структуру:


&НаКлиенте
Процедура ОбработатьРеквизитыНаКлиенте()
    
    // Получаем реквизиты за один серверный вызов
    РеквизитыДокумента = ПолучитьРеквизитыНаСервере(СсылкаНаДокумент);
    
    // Обрабатываем полученные данные на клиенте
    Если РеквизитыДокумента <> Неопределено Тогда
        Сообщение = СтрШаблон("Документ № %1 от %2 на сумму %3", 
            РеквизитыДокумента.Номер, 
            РеквизитыДокумента.Дата, 
            РеквизитыДокумента.СуммаДокумента);
        ПоказатьПредупреждение(, Сообщение);
    КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьРеквизитыНаСервере(СсылкаНаДокумент)
    
    Результат = Новый Структура;
    Результат.Вставить("Номер", СсылкаНаДокумент.Номер);
    Результат.Вставить("Дата", СсылкаНаДокумент.Дата);
    Результат.Вставить("СуммаДокумента", СсылкаНаДокумент.СуммаДокумента);
    Результат.Вставить("Проведен", СсылкаНаДокумент.Проведен);
    
    Возврат Результат;
    
КонецФункции

Вариант 2. Использование функций БСП

Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), нет необходимости вручную писать функции для сбора реквизитов в структуру. В БСП предусмотрен готовый программный интерфейс, который выполняет запрос к базе данных и возвращает структуру значений.

Посмотрим, как обращаться к функциям БСП с клиента:


&НаКлиенте
Процедура ПолучитьДанныеЧерезБСП()
    
    // Формируем список нужных реквизитов через запятую
    ИменаРеквизитов = "Номер, Дата, СуммаДокумента, Комментарий";
    
    // Вызываем функцию БСП с серверным вызовом
    ЗначенияРеквизитов = ОбщегоНазначенияВызовСервера.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, ИменаРеквизитов);
    
    // Обрабатываем результат
    ДатаДокумента = ЗначенияРеквизитов.Дата;
    Сумма = ЗначенияРеквизитов.СуммаДокумента;

КонецПроцедуры

Метод ОбщегоНазначенияВызовСервера.ЗначенияРеквизитовОбъекта выполняет оптимизированный запрос к базе данных только по указанным полям, упаковывает их в Структура и возвращает на клиент за один контекстный или бесконтекстный вызов.

Вариант 3. Передача табличных данных через Массив структур

Если кроме шапки документа вам необходимо передать и обработать на клиенте набор строк (например, строки табличной части), замените ТаблицаЗначений на Массив, элементами которого являются объекты Структура.

Проанализируем пример получения табличных данных:


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

Рекомендации по проектированию архитектуры

При выборе подхода к обработке данных на клиенте придерживайтесь следующих правил:

  1. Переносите вычислительную логику на сервер. Стандарты разработки 1С рекомендуют выполнять все тяжелые расчеты и обходы коллекций на сервере в процедурах с директивой &НаСервереБезКонтекста. На клиент следует возвращать только готовый результат (например, итоговые суммы или флаговые значения).
  2. Минимизируйте объем передаваемых данных. Запрашивайте на сервере только те реквизиты, которые действительно необходимы для работы алгоритма на клиенте.
  3. Используйте функции БСП. Это снижает количество дублируемого кода и гарантирует оптимальное использование ресурсов платформы.
← На главную