При разработке в среде 1С:Предприятие 8 в режиме управляемого приложения каждый программист рано или поздно сталкивается с ошибкой Отсутствует отображение для типа {http://v8.1c.ru/8.1/data/core}ValueTable. Эта ошибка часто сбивает с толку, так как возникает не в момент формирования данных, а в момент передачи управления с сервера на клиент. Давайте подробно разберем, почему это происходит и как правильно передавать данные.
В архитектуре управляемого приложения 1С существует строгое разделение на сервер и клиент. Тип данных ТаблицаЗначений является серверным объектом. Это означает, что он может существовать и полноценно функционировать только в памяти сервера или в толстом клиенте. В тонком и веб-клиенте такого класса объектов, как ТаблицаЗначений, попросту не существует.
Когда мы вызываем процедуру на сервере и возвращаем результат на клиент, платформа пытается сериализовать (упаковать в специальный формат) все данные, которые мы передаем. Поскольку у клиента нет инструментов для работы с ТаблицаЗначений, платформа прерывает процесс с ошибкой, сообщая, что отображение для этого типа отсутствует.
Важный нюанс: Ошибка проявляется именно в момент возврата из серверного вызова. Поэтому часто бывает, что процедура ПриСозданииНаСервере выполняется успешно, а ошибка вылетает уже после её завершения, когда платформа начинает «собирать» данные для отправки на клиент.
Существует несколько проверенных подходов для обхода этого ограничения. Рассмотрим их подробнее.
Самый распространенный и универсальный способ. Мы преобразуем ТаблицаЗначений в массив, где каждая строка таблицы становится структурой, а имена колонок — ключами этой структуры.
Разберем пример реализации такой функции на сервере:
&НаСервере
Функция ПолучитьДанныеКакМассивСтруктур()
ТЗ = ПолучитьТаблицуЗначенийНаСервере(); // Наша исходная таблица
Результат = Новый Массив;
Для Каждого СтрокаТЗ Из ТЗ Цикл
СтруктураСтроки = Новый Структура;
Для Каждого Колонка Из ТЗ.Колонки Цикл
СтруктураСтроки.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
Результат.Добавить(СтруктураСтроки);
КонецЦикла;
Возврат Результат;
КонецФункции
Такой массив структур 1С легко сериализует и передает на клиент. На клиенте мы сможем легко обойти этот массив и использовать данные.
Если объем данных очень велик, передача массива структур может существенно замедлить работу системы. В таких случаях мы используем ПоместитьВоВременноеХранилище.
ТабличныйДокумент или иные элементы, поддерживающие работу с хранилищем.Если необходимо передать данные во внешнюю систему или веб-клиенту, можно воспользоваться сериализацией в формат JSON. Это делает данные максимально переносимыми и компактными.
&НаСервере
Функция ПолучитьJSONДанные()
ТЗ = ПолучитьДанные();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТЗ);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Проанализируем ситуацию: чтобы не допускать подобных сбоев, всегда следуйте правилам:
ТаблицаЗначений, ДеревоЗначений или Запрос напрямую из серверной функции в клиентскую.СписокЗначений — он корректно сериализуется платформой.&НаСервере.Помните, что тонкий клиент — это облегченная среда, работающая по принципу «сервер знает всё, клиент показывает то, что дали». Придерживаясь этого принципа, вы легко избежите ошибок сериализации и сделаете ваш код надежным и производительным.