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

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

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

Причина возникновения ошибки

Ошибка возникает из-за того, что объект ДанныеФормыЭлементКоллекции является «живым» объектом интерфейса управляемой формы. Он существует исключительно на стороне клиента и «связан» с элементами управления (например, строкой таблицы формы). Платформа 1С не умеет автоматически преобразовывать (сериализовать) этот объект для передачи по сети на сервер, особенно при использовании директивы &НаСервереБезКонтекста.

Процедуры с директивой &НаСервереБезКонтекста максимально изолированы: они не знают ничего о состоянии формы и текущем контексте интерфейса. Чтобы передать данные в такую процедуру, мы должны передать только «чистые» значения примитивных типов или структур, которые платформа может легко передать через протокол обмена.

Решение 1: Передача отдельных параметров

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

Рассмотрим, как изменить вызов функции:


// На клиенте
ТЗДополнительныеСведенияПриОкончанииРедактированияНаСервере(
    СтрокаКоллекции.Начисление, 
    СтрокаКоллекции.ДопСведение, 
    СтрокаКоллекции.НаименованиеДопСведения
);

На сервере процедура должна принимать соответствующие типы данных:


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

Решение 2: Передача данных через структуру (Рекомендуемый способ)

Если полей много, передавать их списком становится неудобно. В таких случаях мы используем объект Структура. Мы создаем структуру на клиенте, наполняем ее нужными данными из строки коллекции и передаем один единственный объект.

Разберем это по шагам:

  1. Создаем на клиенте объект Новый Структура.
  2. Заполняем структуру необходимыми значениями из СтрокаКоллекции.
  3. Передаем структуру в серверную процедуру.

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

ТЗДополнительныеСведенияПриОкончанииРедактированияНаСервере(ПараметрыЗаписи);

На сервере мы будем обращаться к значениям через ключи структуры:


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

Почему не стоит использовать контекстные вызовы

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

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

← На главную