1С 8.3 Программное создание таблицы значений на форме в управляемом приложении
Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Перейти в основной раздел:
Выводим на форму заполненную Таблицу значений в 1С 8.3:
&НаСервере
Процедура ПриОткрытииНаСервере()
// Описание таблицы значений как реквизита
МассивТипа = Новый Массив;
МассивТипа.Добавить(Тип("ТаблицаЗначений"));
// Добавление ТаблицыЗначений в массив реквизитов
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
МассивРеквизитовФормы = Новый Массив;
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТаблицаСотрудников", ОписаниеТипа, "", "ТЗСотр"));
// Создание ТаблицыЗначений с описанием колонок
КвалификаторыСтроки = Новый КвалификаторыСтроки(10);
ОписаниеСтроки_10 = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ОписаниеСотрудника = Новый ОписаниеТипов("СправочникСсылка.Сотрудники");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код", ОписаниеСтроки_10);
ТЗ.Колонки.Добавить("Сотрудник", ОписаниеСотрудника);
// ТЗ.Колонки.Добавить - можно и в цикле
// Добавление в массив реквизитов колонок ТаблицыЗначений
Для Каждого Колонка Из ТЗ.Колонки Цикл
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаСотрудников"));
КонецЦикла;
// Удаление - если таблица существует
ЭлементТаблица = Элементы.Найти("ТаблицаСотрудников");
Если ЭлементТаблица <> Неопределено Тогда
Элементы.Удалить(ЭлементТаблица);
Иначе
ИзменитьРеквизиты(МассивРеквизитовФормы);
КонецЕсли;
// Добавление ТаблицыЗначений на форму
ТаблицаПолейВыбора = Элементы.Добавить("ТЗСотр", Тип("ТаблицаФормы"));
ТаблицаПолейВыбора.ПутьКДанным = "ТаблицаСотрудников";
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панели
Для Каждого Колонка Из ТЗ.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ТаблицаСотрудников." + Колонка.Имя;
НовыйЭлемент.Ширина = 10;
КонецЦикла;
// Заполнение ТаблицыЗначений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Код КАК Код,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Строка = ТЗ.Добавить();
Строка.Код = ВыборкаДетальныеЗаписи.Код;
Строка.Сотрудник = ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
// Передача ТаблицыЗначений в реквизит формы
ЗначениеВРеквизитФормы(ТЗ, "ТаблицаСотрудников");
КонецПроцедуры
Процедура ПриОткрытииНаСервере()
// Описание таблицы значений как реквизита
МассивТипа = Новый Массив;
МассивТипа.Добавить(Тип("ТаблицаЗначений"));
// Добавление ТаблицыЗначений в массив реквизитов
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
МассивРеквизитовФормы = Новый Массив;
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТаблицаСотрудников", ОписаниеТипа, "", "ТЗСотр"));
// Создание ТаблицыЗначений с описанием колонок
КвалификаторыСтроки = Новый КвалификаторыСтроки(10);
ОписаниеСтроки_10 = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ОписаниеСотрудника = Новый ОписаниеТипов("СправочникСсылка.Сотрудники");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код", ОписаниеСтроки_10);
ТЗ.Колонки.Добавить("Сотрудник", ОписаниеСотрудника);
// ТЗ.Колонки.Добавить - можно и в цикле
// Добавление в массив реквизитов колонок ТаблицыЗначений
Для Каждого Колонка Из ТЗ.Колонки Цикл
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаСотрудников"));
КонецЦикла;
// Удаление - если таблица существует
ЭлементТаблица = Элементы.Найти("ТаблицаСотрудников");
Если ЭлементТаблица <> Неопределено Тогда
Элементы.Удалить(ЭлементТаблица);
Иначе
ИзменитьРеквизиты(МассивРеквизитовФормы);
КонецЕсли;
// Добавление ТаблицыЗначений на форму
ТаблицаПолейВыбора = Элементы.Добавить("ТЗСотр", Тип("ТаблицаФормы"));
ТаблицаПолейВыбора.ПутьКДанным = "ТаблицаСотрудников";
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панели
Для Каждого Колонка Из ТЗ.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ТаблицаСотрудников." + Колонка.Имя;
НовыйЭлемент.Ширина = 10;
КонецЦикла;
// Заполнение ТаблицыЗначений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Код КАК Код,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Строка = ТЗ.Добавить();
Строка.Код = ВыборкаДетальныеЗаписи.Код;
Строка.Сотрудник = ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
// Передача ТаблицыЗначений в реквизит формы
ЗначениеВРеквизитФормы(ТЗ, "ТаблицаСотрудников");
КонецПроцедуры
Обработка события Таблицы на форме в 1С 8.3:
//Для добавления обработчика события таблицы "Выбор":
ТаблицаПолейВыбора.УстановитьДействие("Выбор","ТЗВыбор");
//Для обработки данного события в форме процедуры прописывается отдельная процедура (НаКлиенте):
&НаКлиенте
Процедура ТЗВыбор(ТЗ, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
//Код для обработки обработчика
КонецПроцедуры
ТаблицаПолейВыбора.УстановитьДействие("Выбор","ТЗВыбор");
//Для обработки данного события в форме процедуры прописывается отдельная процедура (НаКлиенте):
&НаКлиенте
Процедура ТЗВыбор(ТЗ, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
//Код для обработки обработчика
КонецПроцедуры
Чтение программно созданной Таблицы на форме в 1С 8.3:
// При обращении к реквизиту получите ошибку: Переменная не определена
// Для чтения реквизита, который создан программно, используется метод РеквизитФормыВЗначение
ТекущаяТаблица=РеквизитФормыВЗначение("ТаблицаСотрудников");
// Для чтения реквизита, который создан программно, используется метод РеквизитФормыВЗначение
ТекущаяТаблица=РеквизитФормыВЗначение("ТаблицаСотрудников");
1
комментарий
Елена
29 июн 2022
Спасибо, эта статья мне была очень полезна!
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник