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