Почему возникает ошибка «Неверное значение параметра 2» в методе ЗначениеВРеквизитФормы и как правильно заполнить таблицу на сервере

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

Разберем типичную проблему при разработке в среде 1С:Предприятие 8.3 на управляемых формах: попытка преобразовать прикладную таблицу значений обратно в реквизит формы с составным путем приводит к ошибке выполнения.

Рассмотрим конкретный сценарий. В серверном обработчике формы (например, в событии ПриЧтенииНаСервере или ПриСозданииНаСервере) разработчик выполняет следующий код:


ТаблицаТовары = РеквизитФормыВЗначение("Объект.Товары");
// Заполнение или модификация данных в ТаблицаТовары
ЗначениеВРеквизитФормы(ТаблицаТовары, "Объект.Товары");

Первая строка успешно создает объект ТаблицаЗначений, однако на второй строке платформа выдает исключение: «Неверное значение параметра 2». Выясним причину такого поведения платформы и изучим правильные подходы к решению задачи.

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

Проанализируем сигнатуру и особенности работы системных методов контекста управляемой формы:

  1. Метод РеквизитФормыВЗначение умеет считывать данные по составному пути через точку (например, "Объект.Товары") и возвращает соответствующий прикладной объект — ТаблицаЗначений.
  2. Метод ЗначениеВРеквизитФормы имеет жесткое ограничение: во втором параметре он принимает исключительно строковое имя корневого реквизита формы (например, "Объект" или "ТаблицаФормы"). Пути через точку вида "Объект.Товары" данный метод не поддерживает.
  3. Реквизит Объект.Товары на форме является объектом типа ДанныеФормыКоллекция, а не классической табличной частью объекта базы данных.

Рассмотрим основные способы правильной работы с табличными данными на сервере управляемой формы.

Способ 1. Использование метода ЗначениеВДанныеФормы

Если требуется поместить подготовленную таблицу значений в табличную часть Объект.Товары без конвертации всего основного реквизита, используем специализированный метод ЗначениеВДанныеФормы.

Главное отличие: метод ЗначениеВДанныеФормы во втором параметре принимает не строковое имя, а прямой путь к самой коллекции данных формы:


ТаблицаТовары = РеквизитФормыВЗначение("Объект.Товары");

// Выполняем заполнение или обработку колонок
Для Каждого Стр Из ТаблицаТовары Цикл
    Стр.ИмяРеквизита = ВычисленноеЗначение;
КонецЦикла;

// Загружаем результат обратно в реквизит формы
ЗначениеВДанныеФормы(ТаблицаТовары, Объект.Товары);

Способ 2. Преобразование объекта формы целиком

Если в процессе заполнения требуется обращаться к методам модуля объекта базы данных или типовым механизмам расчета документа, преобразуем весь объект целиком:


// Получаем полный объект базы данных
ДокОбъект = РеквизитФормыВЗначение("Объект");

// Работаем с ДокОбъект.Товары как с обычной табличной частью
Для Каждого Стр Из ДокОбъект.Товары Цикл
    Стр.ИмяКолонки = Значение;
КонецЦикла;

// Переносим изменения обратно в реквизит формы целиком
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

Важное ограничение: если в таблицу на форме добавлены искусственные колонки (существующие только на форме и отсутствующие в реквизитах объекта метаданных), при вызове ЗначениеВРеквизитФормы(ДокОбъект, "Объект") эти добавленные колонки будут очищены.

Способ 3. Прямой обход ДанныеФормыКоллекция без промежуточной таблицы

Для модификации реквизитов строк не обязательно тратить ресурсы сервера на создание промежуточных объектов ТаблицаЗначений. Тип ДанныеФормыКоллекция доступен для прямого чтения и записи:


Для Каждого Стр Из Объект.Товары Цикл
    Стр.ИмяРеквизита = РассчитанноеЗначение;
КонецЦикла;

Такой подход обеспечивает максимальное быстродействие и минимальный расход оперативной памяти сервера.

Способ 4. Использование метода Загрузить() у коллекции формы

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

Объект.Товары.Загрузить(ТаблицаТовары);

← На главную