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

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

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

Почему возникает ошибка передачи Таблицы значений?

Архитектура тонкого клиента 1С основана на принципах веб-технологий. Тонкий клиент работает по протоколу, который поддерживает только ограниченный набор типов данных, сериализуемых в XML или JSON. ТаблицаЗначений является специфическим серверным объектом, не имеющим «зеркала» на стороне клиента. Поэтому платформа не знает, как отобразить этот объект в клиентской среде.

Способ 1: Использование массива структур

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

Рассмотрим, как преобразовать таблицу в массив структур на сервере:


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

Получив такой массив на клиенте, вы можете легко перебрать его циклом Для каждого и выполнить необходимые действия.

Способ 2: Использование реквизита формы (ДанныеФормыКоллекция)

Если ваша задача — вывести данные в таблицу на форме, правильным подходом будет создание реквизита формы. Когда вы создаете реквизит и указываете тип ТаблицаЗначений, платформа автоматически превращает его в ДанныеФормыКоллекция — объект, специально созданный для передачи между клиентом и сервером.

Алгоритм действий:

  1. Создайте на форме реквизит (например, ТаблицаНаФорме) с типом ТаблицаЗначений.
  2. На сервере выгрузите результат запроса в обычную ТаблицуЗначений.
  3. Используйте метод ЗначениеВДанныеФормы() для загрузки данных в реквизит формы.

&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
    ТЗ = ПолучитьДанныеИзБазы(); // Ваша функция запроса
    ЗначениеВДанныеФормы(ТЗ, Объект.ТаблицаНаФорме);
КонецПроцедуры

Способ 3: Временное хранилище

Временное хранилище позволяет передавать сложные объекты между серверными вызовами, сохраняя их идентификаторы (адреса). Однако важно помнить: если вы поместили ТаблицуЗначений в хранилище на сервере, вы не сможете напрямую прочитать ее на клиенте как ТаблицуЗначений. Вы можете получить адрес хранилища, но при попытке десериализации объекта на стороне клиента вы снова столкнетесь с ошибкой типов.

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

Практические рекомендации

Следуя этим простым правилам, вы навсегда забудете об «ошибках отображения типов» и сделаете код своей конфигурации чистым и производительным.

← На главную