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