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