1с удалить строку из таблицы значений
Таблица значений — специальный объект в программировании 1С 8.3, который позволяет хранить промежуточные значения в виде двумерного массива со строками и колонками. Таблицы значений можно использовать как источник данных в запросе.
Таблицу значений, как любую коллекцию, можно обойти циклом. Например:
Получить нужную строку можно по индексу, например:
Индексы в 1С начинается с 0 (нуля).
Рассмотрим основные свойства и методы этого объекта на примерах.
Создание и использование таблиц значений 1С в примерах
Создать таблицу можно следующим образом:
Добавить колонки в таблицу значений 1С:
Крайне рекомендую указывать кроме первого еще и второй параметр — тип данных. Он поможет избежать некоторых ошибок.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
После создания колонок добавим несколько новых строк и заполним колонки:
Добавим еще одну колонку:
Которую мы можем заполнить одинаковыми значениями двумя способами — перебором таблицы или функцией ЗаполнитьЗначения:
Сообщим пользователю название первой в списке программы (индекс таблицы значений в 1С начинается с «0»:
Скопировать строку таблицы значений 1С, для примера — первую:
Поиск в таблице значений 1С с ценой «17400» с помощью структуры:
Сортировка программ в таблице по цене:
Количество строк в таблице:
Выгрузить колонку таблицы значений в массив 1С:
Чтобы удалить строку в таблице значений, нужно передать саму строку или индекс в метод «Удалить». Два варианта:
Полностью скопировать таблицу значений 1С можно так:
Просуммировать итог по колонке таблицы значений:
Свернуть таблицу можно так:
При этом в таблице останутся только различные значения из колонки «ВерсияПлатформы» с суммированными полями «Цена».
Ну и напоследок очистим строки таблицы значений 1С 8.3 полностью:
И удалим все колонки:
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Добрый вечер. Подскажите, что нужно сделать, чтобы удаление в таблице значений было корректным? Я методом Найти ищу сроку. Ее удаляю, но после первого удаления строки, строки меняются как то и удаляются или не все или не те.
(1) Добрый день. Удалять надо так:
Сч = 0;
Пока (Сч < ТаблицаДанных.Количество ()) Цикл
Строка = ТаблицаДанных.ПолучитьСтроку (Сч);
Если (УдаляемСтроку (Строка)) Тогда
ТаблицаДанных.Удалить(Сч);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
где Функция УдаляемСтроку () - анализ строки на удаление. Работает правильно и быстро.
Алсушка80; user665211_antonfo; user981405; dimisa; RolexStrider; Merkalov; jaroslav.h; MaxTolya; rmIvanT; + 9 – Ответить
(3) Можно и не обходить. Автор-то не приводит свой код и не ясно что ему нужно. Лишь что-то ищет функцией Найти и удаляет. В этом случае обход может и не понадобится.
Вот куча способов удаление.
(1) Добрый день. Удалять надо так:
Сч = 0;
Пока (Сч < ТаблицаДанных.Количество ()) Цикл
Строка = ТаблицаДанных.ПолучитьСтроку (Сч);
Если (УдаляемСтроку (Строка)) Тогда
ТаблицаДанных.Удалить(Сч);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
где Функция УдаляемСтроку () - анализ строки на удаление. Работает правильно и быстро.
Алсушка80; user665211_antonfo; user981405; dimisa; RolexStrider; Merkalov; jaroslav.h; MaxTolya; rmIvanT; + 9 – Ответить
(6) Я всё таки предпочитаю удалять строки после полной обработки таблицы, и индексы не портятся и не нужно помнить нюансы каждого языка программирования :)
И теперь удаляйте строки в ТаблицаДанных из списка строк Строки
Хотя, это уже изврат если просто нужно удалить строки по какому - то простому условия. Этот алгоритм имеет смысл только если удаление строки зависит от данных в других строках. Тогда да.
(12) А чем не понравился мой вариант (4) с хранением строк которые потом нужно удалить в отдельном массиве? Тем более что если речь идет о таблицах которые динамически отражаются на экране то добавление лишней колонки отнимет лишнее время :)
А чем не понравился мой вариант (4) с хранением строк которые потом нужно удалить в отдельном массиве? Тем более что если речь идет о таблицах которые динамически отражаются на экране то добавление лишней колонки отнимет лишнее время :)
:-)) Я понимаю, что причина в номерах строки, что сбивается. И в решении было видно, что работа идет с этим. А в вашем решении как будто 2 раза одно и тоже по циклу проходит. Код не только должен работать, но и быть понятным, мне просто другой вариант был чисто визуально понятнее. Может он по другим параметрам уступает, но тут это не так важно, этот объект пользователи используют самое частое раз в день. А по факту за прошлый год раз 10. Строк там мало, 5-6. Поэтому не так важно, сколько он будет отрабатывать.
(19) Ну, это уже кому как нравиться. Приносить в жертву понятность и легкость восприятия программного кода в угоду лишней миллисекунде выполнения кода - я думаю, что не стоит. Если бы тут был объем данных, скажем, строк миллиард, то да. Я бы тогда написал уже код или с индексами, или методы статистического анализа применил. Или метод золотого сечения и пр. А тут задача локальная. Мне кажется, что не стоит.
(6) Строка = ТаблицаДанных.ПолучитьСтроку (Сч); - только не получитьстроку, а получить.
Да, работает спасибо!
(6) У вас похоже самый медленный алгоритм удаление из всех представленных. В каждой итерации вычисляется количество строк всей таблицы ТаблицаДанных.Количество () и доп.условия. Чтобы этого не было нужно перебирать с конца, как говорили остальные комментаторы.
Самый быстрый и легкий путь:
Ну если прямо хочется перебирать с начала по каким-то неведомым причинам, то хотя бы нужно переписать ваш код:
(16) Вообще - то количество строк вычисляется компилятором не при каждом обращении к функции КоличестроСтрок(), а просто возвращается из предвычисленного параметра. Т.к. КоличествоСтрок() - это просто функция которая возвращает свойство таблицы КоличествоСтрок. При удалении строки из этого свойства вычитается 1-ца, а при добавлении строки добавляется единица. Так что Вы тут не правы. Это аналог TList -
TList *List = new TList;
for (int i = 0; i < 10; i++)
<
List-Add((void *)(new float[10]));
>
и здесь при обращении int Num = List->Count - также не вычисляется кол-во элементов в списке List, - он просто храниться в свойстве потомка класса.
(24) Ну, во первых тут у Вас время в миллисекундах, и 200 миллисекунд разница. Для чистоты эксперимента надо прогнать алгоритм раз 100 и усреднить. Т.к. при запуске алгоритмов включается такие процессы, как использование кеша процессора/запуск других служб винды и пр. Тут судить нельзя по одному тесту. А во вторых:
Ну, это уже кому как нравиться. Приносить в жертву понятность и легкость восприятия программного кода в угоду лишней миллисекунде выполнения кода - я думаю, что не стоит. Если бы тут был объем данных, скажем, строк миллиард, то да. Я бы тогда написал уже код или с индексами, или методы статистического анализа применил. Или метод золотого сечения и пр. А тут задача локальная. Мне кажется, что не стоит.
Для КоличествоСтрокТЗ = 100 000
Тест1: Время выполнения: 26 286
Тест2: Время выполнения: 20 127
Более 6 секунд на 100 000 строках. Половина из которых удаляется.
Вот это уже затратно.
(25) Хм. Я даже не знаю как это комментировать. Неужели не понятно, что при удалении строки будет пересчет количества строк. И вот в этом алгоритме -
пересчет количества строк не будет - у Вас в переменной хранится (и процессор деление на два заменить на битовый сдвиг) - вы же не знаете сколько строк будет удалено. А тут у Вас известно - ровно половина. Этот алгоритм попахивает нечистотой эксперимента.
Я даже не знаю как это комментировать. Неужели не понятно, что при удалении строки будет пересчет количества строк.
Вообще - то количество строк вычисляется компилятором не при каждом обращении к функции КоличестроСтрок(), а просто возвращается из предвычисленного параметра. Т.к. КоличествоСтрок() - это просто функция которая возвращает свойство таблицы КоличествоСтрок. При удалении строки из этого свойства вычитается 1-ца, а при добавлении строки добавляется единица
(29) Если Вы удаляете из таблицы строку, то из переменной ответственной за хранение кол-ва строк в таблице вычитается 1-ца. Это не относится к тому, что каждый раз при обращении к функции Количество() таблицы значений программа будет каждый раз пробегаться по строкам таблицы и подсчитывать их количество - так никто не делает при разработке компилятора транслятора - делают через хранение кол-ва строк в отдельной переменной - свойстве класса. Это же элементарно :-)
(30) действительно не понимаете о чем речь, или специально в другую сторону уводите?
Удаление строк одинаково в обоих случаях. Тест1 и Тест2.
Если не удалять строки, то разница во времени выполнения не принципиальная. Логично, вычисление ТЗ.Количество() просто кешируется.
Если происходит удаление, то Количество() каждый раз выполняется. И разница во времени становится уже очень заметна.
Так что не надо говорить, что с условием ТЗ.Количество() не будет разницы. Вот о чем речь.
(29) А у Вас метод такой - Вы задаете программе сколько надо удалить строк, и начинаете это количество строк удалять. Вопрос - откуда Вы знаете сколько строк надо удалить?
как у Вас:
Пока (Сч < КоличествоСтрокТЗ/2) Цикл
Если Сч%2 = 0 Тогда
ТЗРезультат.Удалить(Сч);
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
тут Вы откуда то еще до анализа таблицы уже знаете, что надо удалить половину строк таблицы.
(33) Ну а причем тут четные элементы выборки? - прочитайте постановку задачи у автора - ему надо удалить не четные элемент выборки, а анализировать строку на необходимость удаления. Зачем Вы делаете искусственные предположения, когда задача ясна из постановки?
Вообще - то количество строк вычисляется компилятором не при каждом обращении к функции КоличестроСтрок(), а просто возвращается из предвычисленного параметра. Т.к. КоличествоСтрок() - это просто функция которая возвращает свойство таблицы КоличествоСтрок. При удалении строки из этого свойства вычитается 1-ца, а при добавлении строки добавляется единица.
Я даже не знаю как это комментировать. Неужели не понятно, что при удалении строки будет пересчет количества строк.
Я привел абстрактный Тест проверки этих утверждений. Оба теста выполняют одинаковую работу. У обоих одинаковая итерация.
(35) Ну, тогда таких искусственных алгоритмов можно много придумать которые будут быстрее работы некоторого алгоритма но уже в реальных данных. Ценность таких алгоритмов в чем? - просто доказать? - ну хорошо, Вы мне доказали. И?
Объясню алгоритм. Не важно сколько элементов в ТЗ. Всегда будут выполняться только проход и удаление первых 1000 элементов.
И вот итог:
Кол-во элементов в ТЗ | Время мсек
10 000 | 99
100 000 | 997
1 000 000 | 15 532
Показательно. Каждый раз именно рассчитывается количество элементов.
(38) Нет, неправильно. При удалении строки производится перераспределение памяти. Если таблица большая, то и времени на перераспределение памяти больше. Это не относится к расчету кол-ва строк.
Аналог TList в c++ builder. Кстати, в предыдущих Ваших алгоритмах - тоже такая ситуация может быть. Т.к. все зависит от заполненности "кучи" памяти. И для чистоты эксперимента надо прогнать алгоритм раз 50 и потом усреднить.
Т.к. КоличествоСтрок() - это просто функция которая возвращает свойство таблицы КоличествоСтрок. При удалении строки из этого свойства вычитается 1-ца, а при добавлении строки добавляется единица.
Предыдущие тесты (Тест1 и Тест2) оба удаляют строку. Временные затраты на это одинаковые.
Не надо притягивать алгоритмы с++ builder на работу 1С кода.
(41) Относится просто - когда Вы удаляете строку из таблицы с кол-вом строк в 1000 - это одно, а когда из таблицы с кол-вом строк в 1000000 - это другое. Накладные расходы на перераспределение памяти в таблицах с разным кол-вом строк - разное. А по поводу c+++ builder - это я Вам пример привел просто для понимания - т.к. ТаблицаЗначений в 1С - это STL - контейнер. А TList в c++ builder - это динамический список очень похожий на STL - контейнер.
(43) очередная попытка притянуть функциональность c++ builder к 1С.
В каком месте мы вызываем delete объекту? Согласно с++ объекты созданные в куче без явного удаления не уничтожаются.
Где мы выделяем память новому объекту?
Не стоит лезть во внутреннее строение платформы, не зная его механизмов.
(46) delete вызывается неявно. Иначе бы при удалении строк/таблицы была бы утечка памяти. Это, я думал, все знают и не стал это писать.
То что Вы пишите - "Согласно с++ объекты созданные в куче без явного удаления не ничтожаются." - т.е. Вы хотите сказать, что когда я:
Табл = Новый ТаблицаЗначений
и потом
Табл = НеОпределено
память выделенная под Табл не возвращается операционке?
тогда сделайте миллиард Табл = Новый ТаблицаЗначений и также миллиард Табл = НеОпределено и посмотрите сколько памяти у Вас осталось. Уверяю - столько же.
"Где мы выделяем память новому объекту? " - когда делаете Новый (аналог new c++) - это и есть выделение памяти под новый объект.
Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(, , , , , , , )
Добавление строк в таблицу значений
Перебор строк таблицы значений
Сортировка таблицы значений
Поиск в таблице значений
Синтаксис: НайтиЗначение(,,)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр , то поиск производится только по заданной строке
Если указан параметр , то поиск производится только по заданной колонке
Итоги и группировка таблицы значений
//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть
Удаление строк и колонок из таблицы значений
ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.
В этом случае я рекомендую использовать следующий прием:
А вот еще один правильный алгоритм, предложенный Wlad:
Замечание(Туц). Предыдущий вариант не совсем правильный. Случай, когда последняя строка попадает под условие и в условии идёт обращение к строке таблицы, приводит к ошибке. Т.е. происходит попытка чтения для строки 0.
И ещё вариант, предложенный Туц:
Замечание (vligm). А я использую такой алгоритм (это, собственно говоря, шаблон):
Таблица значений как элемент диалога
Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.
Методы УстановитьЗначение и ПолучитьЗначение
Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.
Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).
Форум
Создание таблицы значений
Таблица значений - это двумерный массив в 1С, который предназначен для хранения и обработки промежуточных данных, возникающих в процессе работы программы. Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
ТабЗнач.НоваяКолонка("Номер");
ТабЗнач.НоваяКолонка("Сотрудник");
ТабЗнач.НоваяКолонка("Должность");
ТабЗнач.НоваяКолонка("Оклад");
//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(, , , , , , , )
ТабЗнач.НоваяКолонка("Номер","Число",10,0);
ТабЗнач.НоваяКолонка("Сотрудник","Справочник.Сотрудники");
ТабЗнач.НоваяКолонка("Должность","Справочник.Должности");
ТабЗнач.НоваяКолонка("Оклад","Число",10,2);
Добавление строк в таблицу значений
ТабЗнач.НоваяСтрока();
ТабЗнач.Номер = 1;
ТабЗнач.Сотрудник = "Иванов Иван Иванович"; //следите за типом колонки!
ТабЗнач.Должность = "Программист";
ТабЗнач.Оклад = 20000;
ТабЗнач.НоваяСтрока();
ТабЗнач.Номер = 2;
ТабЗнач.Сотрудник = "Петров Петр Петрович";
ТабЗнач.Должность = "Бухгалтер";
ТабЗнач.Оклад = 10000;
//обычно строки добавляются в цикле
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
. ТабЗнач.НоваяСтрока();
. ТабЗнач.Номер = СпрСотр.Код;
. ТабЗнач.Сотрудник = СпрСотр.ТекущийЭлемент(); //следите за типом колонки!
. ТабЗнач.Должность = СпрСотр.Должность;
. ТабЗнач.Оклад = СпрСотр.Оклад;
КонецЦикла;
Перебор строк таблицы значений
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
. Сообщить(ТабЗнач.Сотрудник);
КонецЦикла;
2-й способ.
Для НомерСтроки = 1 По ТабЗнач.КоличествоСтрок() Цикл
. ТабЗнач.ПолучитьСтрокуПоНомеру(НомерСтроки);
. Сообщить(ТабЗнач.Сотрудник);
КонецЦикла;
Сортировка таблицы значений
//сортировать по должности по возрастанию
ТабЗнач.Сортировать("Должность+");
//сортировать по должности по возрастанию, а внутри должности по убыванию оклада
ТабЗнач.Сортировать("Должность+,Оклад-");
Поиск в таблице значений
Синтаксис: НайтиЗначение(,,)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр , то поиск производится только по заданной строке
Если указан параметр , то поиск производится только по заданной колонке
номстр = 0;
Если ТабЗнач.НайтиЗначение (10000, номстр, "Оклад") = 1 Тогда
. ТабЗнач.ПолучитьСтрокуПоНомеру(номстр);
. Сообщить(ТабЗнач.Сотрудник);
КонецЕсли;
Итоги и группировка таблицы значений
//получить итог по колонке можно методом Итог
ВсеОклады = ТабЗнач.Итог("Оклад")
//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть
//проссумировать оклады по каждой должности
ТабЗнач.Свернуть("Должность","Оклад");
//Можно группировать и суммировать сразу по нескольким колонкам
ТабЗнач.Свернуть("Категория, Должность","Оклад,Налог");
Удаление строк и колонок из таблицы значений
ТабЗнач.Очистить(); //очистить таблицу значений и удалить колонки
ТабЗнач.УдалитьСтроки(); //удаляет все строки (колонки сохраняются)
ТабЗнач.УдалитьСтроку(); //удаляет текущую строку
ТабЗнач.УдалитьСтроку(3); //удаляет 3-ю строку
ТабЗнач.УдалитьКолонку("Оклад"); //удаляет колонку Оклад
ТабЗнач.УдалитьКолонку(2); //удаляет 2-ю колонку
ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.
//ЭТА ПРОГРАММА НЕПРАВИЛЬНАЯ .
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
. Если Тогда
. ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей,
. КонецЕсли;
КонецЦикла;
В этом случае я рекомендую использовать следующий прием:
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
~начало:
. Если Тогда
. ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей
. Если ТабЗнач.НомерСтроки<>0 Тогда
. Перейти ~начало;
. КонецЕсли;
. КонецЕсли;
КонецЦикла;
А вот еще один правильный алгоритм, предложенный Wlad:
ТабЗнач.выбратьстроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
. Пока () и (ТабЗнач.НомерСтроки<>0) Цикл
. ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей
. КонецЦикла;
КонецЦикла;
Таблица значений как элемент диалога
Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.
//установить курсор на указанную колонку или можно узнать, где находится курсор
ТабЗнач.ТекущаяКолонка(НоваяКолонка,ТекКолонка);
//установить курсор на указанную строку или можно узнать, где находится курсор.
ТекСтрока = ТабЗнач.ТекущаяСтрока(НовСтрока);
ТабЗнач.ВидимостьКолонки("Оклад",0); //скрыть колонку Оклад
ТабЗнач.ВидимостьКолонки("Должность, Сотрудник",1); //показать колонки Должность и Сотрудник
ТабЗнач.ВидимостьКолонки("Оклад",1,1); //показать колонку Оклад в 1-й позиции
//можно зафиксировать верхние строки и левые колонки для удобства прокрутки таблицы значений в диалоге
ТабЗнач.Фиксировать(КолСтрок,КолКолонок);
Методы УстановитьЗначение и ПолучитьЗначение
Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.
Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).
ТабЗнач.НоваяСтрока();
ТабЗнач.УстановитьЗначение(1,"Номер",100);
ТабЗнач.УстановитьЗначение(1,"Сотрудник","Иванов Иван Иванович");
ТабЗнач.УстановитьЗначение(1,3,10000); //обращение к 1-й строке и 3-й колонке ("Оклад")
Номер = ТабЗнач.ПолучитьЗначение(1,"Номер");
ФИО = ТабЗнач.ПолучитьЗначение(1,"Сотрудник");
Оклад = ТабЗнач.ПолучитьЗначение(1,3); //обращение к 1-й строке и 3-й колонке "Оклад"
Выгрузка таблицы значений
//выгрузить 10 сотрудников с наибольшими окладами в новую таблицу значений
ТабЗнач.Сортировать("Оклад-");
ТабЗнач.Выгрузить(НоваяТабЗнач,1,10,"Сотрудник,Оклад");
ТаблицаЗначений — это программный объект встроенного языка, позволяющий строить произвольные наборы данных в памяти компьютера, отображать их в табличном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать).
Таблицы состоят из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.
Таблица значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками таблицы, добавляя и удаляя их, но и колонками.
Таблица значений может использоваться явно при создании в коде необходимого количества переменных типа ТаблицаЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с таблицей значений.
Создание таблицы значений
Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый :
Колонки таблицы значений
Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:
- Имя — идентификатор колонки (может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания);
- Заголовок — представление колонки в диалогах (может содержать произвольные символы);
- ТипЗначения — тип значения содержимого ячеек в этой колонке. Если тип не задан, в ячейке можно хранить значения произвольного типа;
- Ширина — ширина колонки в диалогах;
Доступ к колонкам производится через свойство Колонки объекта ТаблицаЗначений . Для добавления новой колонки используется метод Добавить():
Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():
Перебор колонок выполняется следующим образом:
Для удаления колонки используется метод Удалить():
Свойства колонки таблицы значений
Имя | Тип | Описание |
---|---|---|
Имя | Строка | символьный идентификатор колонки, по которому к ней можно обращаться из кода |
Заголовок | Строка | строковое представление колонки на форме |
ТипЗначения | ОписаниеТипов | свойство органичивает пространство доступных значений, которые можно указать в данной колонке |
Ширина | Число | ширина колонки на форме (выражается в количестве символов) |
Методы коллекции колонок таблицы значений
Вставить() | Вставляет новую колонку в указанную позицию коллекции |
Добавить() | Добавляет новую колонку в конец коллекции |
Количество() | Возвращает количество колонок в коллекции |
Найти() | Ищет колонку в коллекции по имени |
Очистить() | Удаляет все колонки из коллекции |
Сдвинуть() | Сдвигает колонку влево или вправо |
Удалить() | Удаляет колонку из коллекции |
Строки таблицы значений
С колонками разобрались. Давайте теперь разберемся со строками. Строки таблицы значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.
Добавление и удаление строк
Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений . Метод возвращает объект СтрокаТаблицыЗначений , с которым доступны дальнейшие манипуляции:
И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:
Обратите внимание, что каждая СтрокаТаблицыЗначений ссылается на таблицу значений с помощью метода Владелец():
Для удаления строки используется метод Удалить() объекта ТаблицаЗначений . Строку можно удалить либо передав методу непосредственно строку, либо ее индекс:
Перебор строк таблицы значений
Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :
Поиск строк
Все методы таблицы значений:
Вставить() | Вставляет строку на указанное место |
ВыбратьСтроку() | Позволяет интерактивно выбрать строку в диалоговом окне |
ВыгрузитьКолонку() | Выгружает значения ячеек указанной колонки в массив значений |
Добавить() | Добавлет новую строку в таблицу значений |
ЗагрузитьКолонку() | Загружает значения в ячейки указанной колонки из массива |
ЗаполнитьЗначения() | Заполняет ячейки указанных колонок определенным значением |
Индекс() | Возвращает индекс строки таблицы значений |
Итог() | Возвращает просуммированный итог по колонке таблицы значений |
Количество() | Возвращает количество строк в таблице значений |
Найти() | Выполняет поиск строки по значению |
НайтиСтроки() | Выполняет поиск строк по указанным параметрам |
Очистить() | Очищает строки таблицы значений |
Получить() | Возвращает строку по ее индексу |
Свернуть() | Выполняет сжатие строк и колонок таблицы значений |
Сдвинуть() | Сдвигает строку вверх или вниз по таблице |
Скопировать() | Создает новую таблицу значений копированием текущей |
СкопироватьКолонки() | Создает новую пустую таблицу значений путем копирования колонок текущей таблицы |
Сортировать() | Выполняет сортировку строк таблицы значений по указанным колонкам |
Удалить() | Удаляет строку таблицы значений |
Иерархию свойств и типов значений, связанных с таблицей значений, схематически можно представить в виде дерева:
Читайте также: