Примеры работы с таблицей значений в 1С 8.x

Объекты состоящие из нескольких однотипных элементов, такие как Массив, Структура, Список значений, Таблица значений, Соответствие, используются в программах 1С повсеместно. Рассмотрим основные приемы работы с такими объектами, по другому их можно назвать "коллекциями".

Таблица значений


&НаКлиенте
Процедура ПримерыСТЗ(Команда)
	ПримерыСТЗНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПримерыСТЗНаСервере()
	//Как создать таблицу значений в 1с 8.х
    МояТаблица = Новый ТаблицаЗначений;
	
	//Таблица создана, но в ней нет ни колонок ни строк, создадим колонки, затем добавим строки
 
    //Как добавить колонки в таблицу значений в 1с 8.х 
    МояТаблица.Колонки.Добавить("Фамилия");
    МояТаблица.Колонки.Добавить("Имя");
    МояТаблица.Колонки.Добавить("Отчество");
	МояТаблица.Колонки.Добавить("Возраст", Новый ОписаниеТипов("Число"), "Возраст лет"); //можно задать сразу тип и заголовок
	
	//Как добавить строки в таблицу значений в 1с 8.х 
	Стр = МояТаблица.Добавить();
	Стр.Фамилия = "Иванов";
	Стр.Имя = "Иван";
	Стр.Отчество = "Иванович";
	Стр.Возраст = 21;
	
	Стр = МояТаблица.Добавить();
	Стр.Фамилия = "Петров";
	Стр.Имя = "Сергей";
	Стр.Отчество = "Сергеевич";
	Стр.Возраст = 45;
 
    //Как перебрать все строки в таблице значений в 1с 8.х  
    Для Каждого Стр Из МояТаблица Цикл
        Сообщить(Стр.Фамилия + " " + Стр.Имя + " " + Стр.Отчество 
		+ ", возвраст: " + Стр.Возраст);
	КонецЦикла;
	//второй способ как перебрать все строки по индексам в таблице значений в 1с 8.х 
	Для ИндексСтроки=0 По МояТаблица.Количество()-1 Цикл
		Стр = МояТаблица[ИндексСтроки]; //нумерация начиная с нуля
        Сообщить(Стр.Фамилия + " " + Стр.Имя + " " + Стр.Отчество 
		+ ", возвраст: " + Стр.Возраст);
	КонецЦикла;
 
    //Как перебрать все колонки в таблице значений в 1с 8.х 
    Для Каждого Колонка Из МояТаблица.Колонки Цикл
        Сообщить(Колонка.Имя);
    КонецЦикла; 
 
    //Как выгрузить значения из колонки таблицы значений в массив в 1с 8.х 
    МассивФамилий = МояТаблица.ВыгрузитьКолонку("Фамилия");
 
    //Как заполнить значения в колонке для всех строк таблицы 
    МояТаблица.ЗаполнитьЗначения(0, "Возраст");
 
    //Как изменить значение в строке таблицы значений
    МояТаблица[0].Возраст = 22;
    МояТаблица[1].Возраст = 46;
 
    //Как посчитать итог по колонке таблицы значений в 1с 8.х 
    Сообщить(МояТаблица.Итог("Возраст")); //68
	
    //Как найти значение в таблице значений в 1с 8.х  
    НайденнаяСтрока = МояТаблица.Найти("Петров", "Фамилия"); //значение, колонка для поиска
    Если НайденнаяСтрока <> Неопределено Тогда
        Сообщить(НайденнаяСтрока.Имя+" = "+НайденнаяСтрока.Возраст); // Петров = 46
    КонецЕсли;
 
    //Как найти все строки в таблице значений по переданному значению
	//добавим еще одну строку
	НоваяСтрока = МояТаблица.Добавить();
	НоваяСтрока.Фамилия = "Жарков";
	НоваяСтрока.Возраст = 22;
	
	Фильтр = Новый Структура("Возраст", 22);
	НайденныеСтрокиМассив = МояТаблица.НайтиСтроки(Фильтр);
	Для Каждого СтрокаТаблицы Из НайденныеСтрокиМассив Цикл
		Сообщить(СтрокаТаблицы.Фамилия+" = "+СтрокаТаблицы.Возраст);
	КонецЦикла; 
	
    //Как сдвинуть строку таблицы значений в 1с 8.х 
 
    //сдвигаем первую строку на одну позицию вперёд
	СтрокаТаблицы = МояТаблица.Найти("Жарков");
    МояТаблица.Сдвинуть(СтрокаТаблицы, -1); //положительное число вперед, отрицательное назад
	
	//Как создать копию таблицы значений в 1с 8.х 
    КопияМояТаблица = МояТаблица.Скопировать();
 
    //Как создать копию таблицы значений по нужным колонкам 
    // только две колонки будет Фамилия и Возраст
    КопияМояТаблица = МояТаблица.СкопироватьКолонки("Фамилия, Возраст");
 
    //Как создать копию таблицы значений с наложенным фильтром в 1с 8.х
    Отбор = Новый Структура;
    Отбор.Вставить("Возраст", 22); 
    //таблица будет содержать только строки с возрастом 22
	КопияМояТаблица = МояТаблица.Скопировать(Отбор);
	
	//Как свернуть таблицу значений по колонке в 1с 8.х
    //свернём по возрасту с суммой ЗП
	КопияМояТаблица.Колонки.Добавить("Зарплата");
	КопияМояТаблица[0].Зарплата = 10000;
	КопияМояТаблица[1].Зарплата = 23000;
	КопияМояТаблица.Свернуть("Возраст", "Зарплата");
 
    //Как отсортировать таблицу значений по колонке(ам) в 1с 8.х 
    МояТаблица.Сортировать("Возраст Убыв, Фамилия"); //колонки через запятую; необяз: Возр,Убыв, по умолчанию по возрастанию
 
    //Как удалить строку из таблицы значений в 1с 8.3, 8.2
    МояТаблица.Удалить(0); //передать индекс или строку таблицы
	
	
	//Как быстро создать таблицу значений выбрав информацию из базы данных
	//получить запрос, выполнить и выгрузить в таблицу значений
	Запрос = Новый Запрос();
	Запрос.Текст = "Выбрать ""Иванов"" КАК Фамилия, 35 КАК Возраст";
	МояТаблицаВторая = Запрос.Выполнить().Выгрузить();
	
	//Как создать и заполнить таблицу значений на форме
	//1.получить таблицу значений любым способом из описанных выше
	//2.создать реквизит формы
	//3.создать новый элемент управления на форме
	//4.конвертировать таблицу значений в реквизит формы
	СоздатьТаблицуЗначенийНаФорме(МояТаблицаВторая,"ТаблицаЗначенийНаФорме", Неопределено);
	
	//как добавить индексы в таблицу для ускорения поиска
	МояТаблицаВторая.Индексы.Добавить("Фамилия");
КонецПроцедуры


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

	// добавим реквизиты на форму
	ИзменитьРеквизиты(Реквизиты);

	// добавим элементы формы
	Таб = Элементы.Добавить(ИмяРеквизитаТаблица, Тип("ТаблицаФормы"), ГруппаЭлементовДляРазмещения);
	Таб.ПутьКДанным = ИмяРеквизитаТаблица;

	// запретим менять положение строк и сами строки, отключим командную панель
	//Таб.ИзменятьСоставСтрок = Ложь;
	//Таб.ИзменятьПорядокСтрок = Ложь;
	//Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;

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

	// заполним таблицу
	ЗначениеВРеквизитФормы(ТЗ, ИмяРеквизитаТаблица);    
 
КонецПроцедуры

 

Результат выполнения будет следующим:

Добавить комментарий