Как правильно использовать метод ЗначениеВДанныеФормы для программно созданных таблиц

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

При разработке на платформе 1С:Предприятие 8.3 (управляемые формы) программисты часто сталкиваются с необходимостью создания динамических интерфейсов. Одной из самых сложных задач в этом контексте является программное создание таблицы значений, её отображение на форме и последующее обновление данных. Ошибка "Недопустимое значение параметра (параметр номер 2)" при вызове метода ЗначениеВДанныеФормы — классическая преграда, сигнализирующая о несоответствии типов или структуры данных. В этой статье мы подробно разберем, как избежать этой ошибки и правильно организовать цикл обновления данных. Для решения схожей задачи пригодится готовая методика программного вывода произвольной таблицы значений на управляемую форму.

Разбор причины ошибки: данные против элементов управления

Первым делом проанализируем ситуацию, описанную автором темы. Основная ошибка заключается в непонимании того, что именно передается во второй параметр метода ЗначениеВДанныеФормы. Рассмотрим основные моменты:

  1. Реквизит формы (данные): Это объект типа ДанныеФормыКоллекция (для таблиц). Он существует в памяти сервера как часть структуры формы.
  2. Элемент формы (визуализация): Это визуальная таблица (тип ТаблицаФормы), которую видит пользователь.

Метод ЗначениеВДанныеФормы ожидает во втором параметре именно реквизит. Если вы создали таблицу программно через ИзменитьРеквизиты(), обращение к ней должно идти по имени, которое вы указали при создании. Ошибка часто возникает, если разработчик пытается передать туда имя элемента формы или если программный реквизит не был корректно инициализирован.

Проблема изменения структуры колонок

Как справедливо замечено в сообщениях форума, метод ЗначениеВДанныеФормы требует строгого соответствия структуры исходной ТаблицыЗначений и целевого реквизита формы. Если в процессе обработки данных вы добавили в ТЗ новую колонку или переименовали существующую, попытка вернуть эти данные на форму вызовет исключение. Платформа не умеет "на лету" достраивать структуру реквизита формы на основании структуры переданной таблицы значений.

Разберем по шагам правильный алгоритм обновления программной таблицы при изменении её состава колонок:

Шаг 1. Удаление старых реквизитов и элементов

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


// Удаляем визуальные элементы (колонки таблицы на форме)
Для Каждого ЭлементКолонка Из Элементы.ТаблицаДляОбработки.ПодчиненныеЭлементы Цикл
    Элементы.Удалить(ЭлементКолонка);
КонецЦикла;

// Готовим массив имен реквизитов для удаления
МассивРеквизитовДляУдаления = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты("ТаблицаДляОбработки");
Для Каждого Реквизит Из РеквизитыДляУдаления Цикл
    // Добавляем путь к реквизитам колонок
    МассивРеквизитовДляУдаления.Добавить("ТаблицаДляОбработки." + Реквизит.Имя);
КонецЦикла;

// Применяем изменения
ЭтаФорма.ИзменитьРеквизиты(, МассивРеквизитовДляУдаления);

Шаг 2. Создание новой структуры реквизитов

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


МассивНовыхРеквизитов = Новый Массив;
Для Каждого КолонкаТЗ Из ТЗ.Колонки Цикл
    НовыйРеквизит = Новый РеквизитФормы(КолонкаТЗ.Имя, КолонкаТЗ.ТипЗначения, "ТаблицаДляОбработки", КолонкаТЗ.Заголовок);
    МассивНовыхРеквизитов.Добавить(НовыйРеквизит);
КонецЦикла;

ЭтаФорма.ИзменитьРеквизиты(МассивНовыхРеквизитов);

Шаг 3. Перенос данных методом ЗначениеВДанныеФормы

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


// Обратите внимание: мы обращаемся к реквизиту через ЭтаФорма["Имя"]
ЗначениеВДанныеФормы(ТЗ, ЭтаФорма["ТаблицаДляОбработки"]);

Шаг 4. Восстановление визуальных элементов

Данные уже в форме, но пользователь их не видит, так как мы удалили элементы управления на первом шаге. Нам нужно создать их заново и связать с данными через свойство ПутьКДанным.


Для Каждого КолонкаТЗ Из ТЗ.Колонки Цикл
    НовыйЭлемент = Элементы.Добавить("ТаблицаДляОбработки" + КолонкаТЗ.Имя, Тип("ПолеФормы"), Элементы.ТаблицаДляОбработки);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = "ТаблицаДляОбработки." + КолонкаТЗ.Имя;
КонецЦикла;

Использование метода Загрузить() как альтернатива

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

Важный нюанс: метод Загрузить() доступен непосредственно у объекта коллекции данных формы, поэтому обращение выглядит так:

ЭтаФорма.ТаблицаДляОбработки.Загрузить(ТЗ);

Но помните: этот способ сработает только в том случае, если реквизит ТаблицаДляОбработки уже объявлен в метаданных формы или создан программно ранее.

Резюме и рекомендации

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

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

← На главную