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