Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1C_ПрикладноеПрограммирование8.doc
Скачиваний:
42
Добавлен:
22.09.2019
Размер:
51.67 Mб
Скачать

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

Таблица значения — объект позволяющий строить динамические наборы значений и манипулировать ими. Он может быть наполнен значениями различных типов. Может иметь любое количество колонок и быть связанным с элементом «табличное поле».

Для создания таблицы значений используется конструктор «Новый»:

ТаблицаЗначение=Новый ТаблицаЗначений;

После этого можно создать колонки таблицы (при необходимости можно задать допустимые типы значений для колонки, заголовок и ширину колонки в символах).

//Создать нужные колонки

ТаблицаЗначений.Колонки.Добавить(«Фамилия»);

ТаблицаЗначений.Колонки.Добавить(«Возраст»);

Затем можно добавить новую строку и установить значения в колонках таблицы:

//Добавить новую строку и задать значения в колонках таблицы

НоваяСтрока=ТаблицаЗначений.Добавить();

НоваяСтрока.Фамилия= «Иванов»;

НоваяСтрока.Возраст=23;

или так:

//Добавить новую строку и задать значения в колонках таблицы

НоваяСтрока=ТаблицаЗначений.Добавить();

НоваяСтрока[«Фамилия»]= «Иванов»;

НоваяСтрока[«Возраст»]=23;

Если требуется найти первую строку таблицы значений «ТаблицаЗначений», где присутствует «ИскомоеЗначение», можно сделать так:

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение);

Если требуется найти первую строку, где «ИскомоеЗначение» может быть найдено, например, в колонках «Поставщик» и «Покупатель», то:

НайденнаяСтрока=ТаблицаЗначений.Найти(ИскомоеЗначение,

«Поставщик,Покупатель»);

Если же нужно найти все строки, где в колонке «Сотрудник» присутствует искомое значение, то это можно выполнить при помощи метода «НайтиСтроки()»:

//Сформировать структуру отбора

СтруктураПоиска=Структура(«Сотрудник», ИскомоеЗначение);

//Найти строки

МассивНайденныхСтрок=

ТаблицаЗначений.НайтиСтроки(СтруктураПоиска);

Сначала создаем структуру поиска, каждый элемент которой будет содержать название колонки таблицы значений в качестве ключа и искомое значение в этой колонке - в качестве значения. Далее структуру поиска передаем в качестве параметра методу «НайтиСтроки()». Результат - массив строк таблицы значений, соответствующих структуре поиска.

Если в этом примере в структуру поиска добавить поиск нужного значения, например, еще и в колонке «Ответственный» - то в результате применения метода «НайтиСтроки()» получим все строки, где и «Сотрудник» и «Ответственный» равны искомому значению.

Поскольку здесь мы имеем дело с индексированной коллекцией, то можно использовать цикл перебора элементов коллекции или «цикл-счетчик». Например, чтобы сообщить значения колонки «Сотрудник» всех строк таблицы значений «ТаблицаСотрудников», можно использовать следующий код:

Для Каждого ТекущаяСтрока Из ТаблицаСотрудников Цикл

Сообщить(ТекущаяСтрока.Сотрудник);

КонецЦикла;

То же через «цикл-счетчик»:

СтаршийИндекс=ТаблицаСотрудников.Количество()-1;

Для Сч=0 по СтаршийИндекс Цикл

Сообщить(СписокСотрудниковp[Сч].Сотрудник);

КонецЦикла;

Удаление отдельных строк таблицы значений происходит с обязательным указанием удаляемой строки или индекса удаляемой строки. Если нужно удалить строку «УдаляемаяСтрока», входящую в таблицу значений «ТаблицаЗначений»:

ТаблицаЗначений.Удалить(УдаляемаяСтрока);

А так, например, будет удалена первая строка таблицы значений:

ТаблицаЗначений.Удалить(0);

Естественно, если указанный индекс будет выходить за границу индексов строк таблицы значений - получим сообщение об ошибке. Аналогично и для колонок. Только работать уже надо с коллекцией колонок таблицы значений. Доступ к ней - через свойство «Колонки» таблицы значений.

ТаблицаЗначений.Колонки.Удалить(УдаляемаяКолонка);

Или

ТаблицаЗначений.Колонки.Удалить(0);

Кроме того необходимо учитывать, что удаление строки (или колонки) из середины таблицы значений приведет к уменьшению на единицу индексов строк, стоявших после удаленной (эффект «смыкания рядов», вернее –«смыкание строк»).

Например, решим задачу удаления всех строк таблицы значений «ТаблицаЗначений», содержащих числовые значения хотя бы в одной колонке:

СтаршийИндексКолонок=ТаблицаЗначений.Колонки.Количество()-1;

Индекс=ТаблицаЗначений.Количество()-1;

Пока Индекс>=0 Цикл

Для Сч=0 По СтаршийИндексКолонок Цикл

Если ТипЗнч(ТаблицаЗначений[Индекс][Сч])=

Тип(«Число») Тогда

ТаблицаЗначений.Удалить(Индекс);

Прервать;

КонецЕсли;

КонецЦикла;

Индекс=Индекс-1;

КонецЦикла;

Сначала определяем самые старшие индексы строк и колонок таблицы значений. Цикл проверок и удалений строк будет выполняться, пока очередное значение индекса строки не окажется меньше нуля.

Внутри цикла по строкам делаем цикл-счетчик перебора индексов колонок. Во вложенном цикле определяем тип значения элемента находящегося в строке с текущим индексом и в очередной колонке. Если или «Список значений», «таблица значений», «дерево значений» это число - удаляем строку таблицы значений и прерываем вложенный цикл.

Кроме того, в любом случае на каждом шаге внешнего цикла уменьшаем на единицу значение переменной «Индекс».

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

Если имя колонки, для которой требуется установить значение, содержится в переменной, можно использовать оператор «[ ]»:

НоваяСтрока=ТаблицаЗначений.Добавить();

НоваяСтрока[ИмяКолонки]=Значение;

В вышеприведенном коде:

  • «ТаблицаЗначений» - имя таблицы значений;

  • «ИмяКолонки» - строковая переменная, содержащая имя колонки, по которой нужно заполнить значение;

  • «Значение» - переменная, содержащая само заполняемое значение.

Колонку «ФлагФискального Учета» в таблице значений «ТаблицаЗначений» необходимо заполнить значением «Ложь».

ТаблицаЗначений.ЗаполнитьЗначения(Ложь, «ФлагФискальногоУчета»);

Применяем для таблицы значений метод «ЗаполнитьЗначения()». Первым параметром передаем заполняемое значение. Вторым параметром - имя заполняемой колонки.

Если нужно заполнить несколько колонок значением – их имена указывают через запятую во втором параметре. Если не указать второй параметр - значением заполнятся все поля таблицы.

Если «ТаблицаПолучатель» на момент выполнения операции еще не существует, или ее предыдущие колонки сохранять не нужно, можно создать ее, как полную копию исходной:

ТаблицаПолучатель=ТаблицаИсходная.Скопировать();

Вариант второй: таблица «ТаблицаПолучатель» существует, и жалко терять ее колонки и ограничения на типы данных колонок. Но нужно заполнить данные по колонкам, имена которых совпадают с именами исходной таблицы.

Тогда можно так:

Для Каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл

НоваяСтрока=ТаблицаПолучатель.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсходнойТаблицы);

КонецЦикла;

Для каждой строки исходной таблицы добавляется новая строка в таблицу получатель и выполняется заполнение значений в тех колонках новой таблицы, имена которых совпадают с именами колонок в исходной таблице.

Если у таблиц не будет колонок с одинаковыми именами - таблица-получатель будет в результате содержать столько же строк с пустыми значениями, сколько строк было в таблице-источнике.

Если у каких-то одноименных колонок тип значения данных из таблицы-источника не попадет в массив разрешенных типов колонки таблицы-получателя - в таких полях получим пустые значения.

Рассмотрим третий случай. В случае одноименных колонок – колонку таблицы-получателя нужно привести в полное соответствие колонке таблицы-источника.

ОдноименныеКолонки=Новый Массив();

Для Каждого Колонка Из ИсходнаяТаблица.Колонки Цикл

СовпадающаяКолонка=ТаблицаПолучатель.Колонки.Найти(Колонка,Имя);

Если СовпадающаяКолонка<>Неопределено Тогда

//Получить свойства колонки

Индекс=ТаблицаПолучатель.Колонки.Индекс(СовпадающаяКолонка);

Имя=Колонка.Имя;

ТипЗначения=Колонка.ТипЗначения;

Заголовок=Колонка.Заголовок;

Ширина=Колонка.Ширина;

//Заменить колонки в таблице-получателе

ТаблицаПолучатель.Колонки.Удалить(Индекс);

ТаблицаПолучатель.Колонки.Вставить(Индекс,Имя,ТипЗначения,

Заголовок,Ширина);

//Добавить очередное имя совпадающих колонок в массив

ОдноименныеКолонки.Добавить(Колонка.Имя);

КонецЕсли;

КонецЦикла;

//Цикл перебора строк исходной таблицы.

Для каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл

//Добавить новую строку в таблицу-получатель

НоваяСтрока=ТаблицаПолучатель.Добавить();

//Заполнить значения в совпадающих ячейках

Для каждого ИияКолонки Из ОдноименныеКолонки Цикл

НоваяСтрока[ИмяКолонки]=СтрокаИсходнойТаблицы[ИмяКолонки];

КонецЦикла;

КонецЦикла;

Нам придется заменить колонку в таблице получателе на новую, чьи свойства полностью будут соответствовать колонке таблицы-источника.

Поэтому в случае обнаружения в таблице-получателе одноименной колонки собираем в переменных все свойства для новой колонки. Далее удаляем старую и создаем новую колонку.

Далее выполняем цикл перебора строк исходной таблицы. В цикле добавляем к таблице-получателю новую строку и открываем цикл перебора имен колонок в массиве совпадающих колонок.

Внутри этого вложенного цикла производим заполнение ячеек таблицы получателя данными ячейки таблицы-источника.

При добавлении колонки можно просто указать ее имя, а второй параметр метода «Добавить()» - не трогать. В этом случае тип данных колонки - произвольный.

//Добавить колонку без ограничений по типу

ТаблицаЗначений.Колонки.Добавить(«Объект»);

Можно заполнить значение второго параметра. Туда необходимо передавать описание разрешенного для колонки типа. Само описание можно получить при помощи конструктора, передав последнему в качестве параметра строковое название типа (если много типов – через запятую) или массив допустимых типов.

//Ограничения по типам данных колонки:

//Только элементы справочника «Контрагенты»

ТаблицаЗначений.Колонки.Добавить(«Контрагент»,

Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»));

Если среди типов разрешенных к заполнению данных колонки есть строка - можно ограничить ее разрядность (длину), указать использование переменной или фиксированной длинны. Все это обеспечивается созданием объекта при помощи конструктора «КвалификаторыСтроки». Далее этот объект будет использован в качестве одного из параметров конструктора «ОписаниеТипов».

//Подготовка и установка ограничений для данных типа «Строка»

КвалификаторыСтроки=Новый КвалификаторыСтроки(20,

ДопустимаяДлина.Переменная);

ДопустимыеТипы=Новый ОписаниеТипов(«Строка»,,

КвалификаторыСтроки);

ТаблицаЗначений.Колонки.Добавить(«ПримечаниеСтроковоеКороткое»,

ДопустимыеТипы);

Аналогичные действия можно осуществлять в отношении квалификаторов числа и даты. Обратите внимание, описание типов можно строить конструктором как с нуля, так и использовать как основу уже существующее описание типов.

//Расширение уже использованного ранее описания типов

КвалификаторыЧисла=Новый КвалификаторыЧисла(10,2,

ДопустимыйЗнак.Неотрицательный);

КвалификаторыДаты=Новый КвалификаторыДаты(ЧастиДаты,Дата);

РасширенныеДопустимыеТипы=Новый ОписаниеТипов(ДопустимыеТипы, «Число,Дата»,,КвалификаторыЧисла,КвалификаторыДаты);

ТаблицаЗначений.Колонки.Добавить(«Примечание»,

РасширенныеДопустимыеТипы);