Как исправить ошибку «Отсутствует отображение для типа ДанныеФормыЭлементЭлементКоллекции» при вызове функции на сервере в 1С?

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

При разработке интерактивного заполнения реквизитов на управляемой форме начинающие разработчики часто сталкиваются с ошибкой сериализации типов. Типичный сценарий: пользователь выбирает услугу или номенклатуру в табличной части, после чего автоматически должна подтягиваться цена из регистра сведений. Однако при попытке передать текущую строку табличной части в внеконтекстную серверную функцию возникает исключение: «Ошибка отображения типов: Отсутствует отображение для типа 'ДанныеФормыЭлементЭлементКоллекции'».

Рассмотрим причины возникновения этой проблемы, разберем правильные способы передачи данных между клиентом и сервером, а также проанализируем оптимизацию вызовов для ускорения работы приложения.

Почему возникает ошибка сериализации?

Проанализируем механику работы управляемого приложения. Переменная, хранящая текущую строку табличной части на клиенте (полученная через Элементы.Таблица.ТекущиеДанные), имеет специальный тип ДанныеФормыЭлементЭлементКоллекции. Это специальная клиентская оболочка, предназначенная для работы с интерфейсом.

Когда мы вызываем процедуру или функцию с директивой &НаСервереБезКонтекста, платформа 1С производит сериализацию всех переданных параметров для отправки их по сети на сервер. Однако тип ДанныеФормыЭлементЭлементКоллекции не является сериализуемым и не может передаваться в внеконтекстный серверный вызов. Сервер без контекста ничего не знает о структуре формы и её внутренних объектах.

Способы решения проблемы

Разберем по шагам, как правильно организовать передачу данных для получения цены или иных реквизитов.

  1. Передача только примитивных типов и ссылок. Вместо передачи всей строки табличной части передавайте в параметр функции только конкретное значение — например, ссылку на справочник (СтрокаТабличнойЧасти.Услуга) и дату документа.
  2. Использование ключевого слова Знач. При объявлении параметров серверной функции указывайте Знач. Это предотвращает обратную сериализацию данных с сервера на клиент после выполнения вызова, что существенно экономит сетевой трафик.
  3. Проверка имени объектов метаданных. Частая причина сопутствующих ошибок после исправления передачи параметров — опечатки в именах регистров сведений или справочников (например, обращение к РегистрыСведений.Расценка вместо РегистрыСведений.Расценки).

Пример некорректного кода

Посмотрим на пример кода, вызывающего ошибку отображения типов:


&НаКлиенте
Процедура ДоговорУслугаПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Договор.ТекущиеДанные;
    // Ошибка: Передаем в внеконтекстный серверный вызов всю строку
    СтрокаТабличнойЧасти.Цена = ДоговорУслугаПриИзмененииНаСервере(Объект.Дата, СтрокаТабличнойЧасти);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДоговорУслугаПриИзмененииНаСервере(АктуальнаяДата, СтрокаТабличнойЧасти)
    Отбор = Новый Структура("Услуга", СтрокаТабличнойЧасти.Услуга);
    ЗначенияРесурсов = РегистрыСведений.Расценки.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    Возврат ЗначенияРесурсов.Цена;
КонецФункции

Пример правильного и оптимизированного кода

Выясним, как написать данный механизм правильно. Передадим исключительно ссылку на услугу и дату, добавим ключевое слово Знач для экономии трафика и выполним предварительную проверку заполнения реквизита на клиенте:


&НаКлиенте
Процедура ДоговорУслугаПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Договор.ТекущиеДанные;
    Если СтрокаТабличнойЧасти = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Если услуга очищена, сбрасываем цену без лишнего вызова сервера
    Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Услуга) Тогда
        СтрокаТабличнойЧасти.Цена = 0;
        Возврат;
    КонецЕсли;

    // Передаем только конкретную ссылку на услугу и дату
    СтрокаТабличнойЧасти.Цена = ПолучитьЦенуУслугиНаСервере(Объект.Дата, СтрокаТабличнойЧасти.Услуга);
КонецПроцедуры

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

Альтернативный вариант: Работа с контекстом формы

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

Для простых задач получения цен или остатков наилучшей практикой в 1С является использование именно внеконтекстных серверных функций &НаСервереБезКонтекста с передачей только необходимых ссылок и примитивных типов данных с ключевым словом Знач.

← На главную