Примеры работы с таблицей значений в 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.конвертировать таблицу значений в реквизит формы
СоздатьТаблицуЗначенийНаФорме(МояТаблицаВторая,"ТаблицаЗначенийНаФорме", Неопределено);
//как добавить индексы в таблицу для ускорения поиска
МояТаблицаВторая.Индексы.Добавить("Фамилия");
КонецПроцедуры
&НаСервере
Процедура СоздатьТаблицуЗначенийНаФорме(ТЗ, ИмяРеквизитаТаблица, ГруппаЭлементовДляРазмещения)
// добавим таблицу: сначала саму таблицу, потом колонку.
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизитаТаблица, Новый ОписаниеТипов("ТаблицаЗначений")));
Для Каждого СтрокаТаблицы ИЗ ТЗ.Колонки Цикл
Реквизиты.Добавить(Новый РеквизитФормы(СтрокаТаблицы.Имя, СтрокаТаблицы.ТипЗначения, ИмяРеквизитаТаблица));
КонецЦикла;
// добавим реквизиты на форму
ИзменитьРеквизиты(Реквизиты);
// добавим элементы формы
Таб = Элементы.Добавить(ИмяРеквизитаТаблица, Тип("ТаблицаФормы"), ГруппаЭлементовДляРазмещения);
Таб.ПутьКДанным = ИмяРеквизитаТаблица;
// запретим менять положение строк и сами строки, отключим командную панель
//Таб.ИзменятьСоставСтрок = Ложь;
//Таб.ИзменятьПорядокСтрок = Ложь;
//Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
Для Каждого СтрокаТаблицы ИЗ ТЗ.Колонки Цикл
Рек = Элементы.Добавить("Колонка" + СтрокаТаблицы.Имя, Тип("ПолеФормы"), Таб);
Рек.Вид = ВидПоляФормы.ПолеНадписи;
Рек.ПутьКДанным = ИмяРеквизитаТаблица + "." + СтрокаТаблицы.Имя;
Рек.Заголовок = СтрокаТаблицы.Заголовок;
КонецЦикла;
// заполним таблицу
ЗначениеВРеквизитФормы(ТЗ, ИмяРеквизитаТаблица);
КонецПроцедуры
Результат выполнения будет следующим: