1с удалить строку из таблицы значений

Обновлено: 04.07.2024

Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.

//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(<Идентификатор>, <Тип>, <Длина>, <Точность>, <Заголовок>, <Ширина>, <Формат>, <Положение>)

Добавление строк в таблицу значений

Перебор строк таблицы значений

Сортировка таблицы значений

Поиск в таблице значений

Синтаксис: НайтиЗначение(<Знач>,<Строка>,<Колонка>)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр <Строка>, то поиск производится только по заданной строке
Если указан параметр <Колонка>, то поиск производится только по заданной колонке

Итоги и группировка таблицы значений

//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть

Удаление строк и колонок из таблицы значений

ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.

В этом случае я рекомендую использовать следующий прием:

А вот еще один правильный алгоритм, предложенный Wlad:

Замечание(Туц). Предыдущий вариант не совсем правильный. Случай, когда последняя строка попадает под условие и в условии идёт обращение к строке таблицы, приводит к ошибке. Т.е. происходит попытка чтения для строки 0.

И ещё вариант, предложенный Туц:

Замечание (vligm). А я использую такой алгоритм (это, собственно говоря, шаблон):

Таблица значений как элемент диалога

Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.

Методы УстановитьЗначение и ПолучитьЗначение

Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.
Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).

Синтаксис: УстановитьЗначение(<Строка>,<Колонка>,<Знач>)
Синтаксис: ПолучитьЗначение(<Строка>,<Колонка>)

Electronic Software Distribution

Я шесть лет назад участвовал в этом конкурсе.
Поэтому есть одно, но существенное замечание. Тест на 10 элементах не показывает ошибки сортировки. Ошибки вылазят на 20 элементах теста. Т.е. изменяется первоначальный порядок строк.

Предлагаю вариант проверки на 20 строках и 2 новых способа от alexk aka alexk-is:

Код
Показать полностью

(7) 0_о Это релиз для NASA метода удаления строк из таблиц?

а не проще таблицу с конца обходить?

пока всего > 0 цикл
ТЗ.Получитьстрокупономеру(Всего);
Проверка условий .

Всего = Всего -1;
КонецЦикла;

(8) В коде проще, но не быстрее. Самый быстрый и "правильный" из известных мне "alexk v.2"
А самый простой по коду ниже:
Код
Показать полностью
user613407_vladzvn; simgo83; akmich; bendarik; nofear; insurgut; 1v7; tatoshka0403; freeek; Slypower; feniks_pro90; Бывалый77; bigmalex; leonidt84; CratosX; ya.Avoronov; wolfsoft; Fiz; + 18 – Ответить Огонек; Bozhevilnoe; Divedition; simgo83; Mechanik21; CratosX; nofear; + 7 – Ответить

Если скорость не очень важна, то можно юзать универсальную функцию из библиотеки функций.

//fixin 200707072
//Удаляет строки таблицы значений по условию
//ТЗ - таблица значений
//Код - код проверки условия, например "Р=Стр.Статья<>П"
//П - один или несколько (структура) параметров
//При проверке условия в переменную Р нужно вернуть результат (истина - удалять, ложь - не удалять),
// при этом доступна текущая строка СТР и переданный параметр Т.
Функция обУдалитьСтрокиТЗПоУсловию(ТЗ, Код, П=Неопределено) Экспорт
Всего=ТЗ.Количество();
Для Инд=1 По Всего Цикл
Поз=Всего-Инд;
Стр=ТЗ[Поз];
Р=ложь;
Выполнить(Код);
Если Р=истина Тогда
ТЗ.Удалить(Поз);
КонецЕсли;
КонецЦикла;

(12) Кроме того, что при удалении строки переписывается все последующие строки, так тут еще и компиляция "Код" в цикле.
. еще один образец того "как делать не надо".

Вот мой вариант фильтрации ТЗ по одному или нескольким условиям. Довольно быстрый, но не самый быстрый. По крайней мере несколько лет пользуюсь только им - хватает.

Код
Показать полностью

Код
Показать полностью

В последнем примере комментарий неверно сформулировал. Надо читать так:
Код
Показать полностью
Статья стала полезной однако, после того как отцы комментов накидали :)
Плюс! Можно фильтровать ТЗ по точному значению
//ПараметрыОтбора = новый Структура;
//ПараметрыОтбора.Вставить(сИмя,сЗнач);
//где сИмя - колонка, сЗнач - значение отбора
ТЗ = ТЗ.Скопировать(ПараметрыОтбора); tatoshka0403; Светлый ум; Alexey_A; DennyPhilord; frost_a; rayastar; yuraskas; rhtr; mikmike; igyo; + 10 – Ответить Спасибо! Очень помогло. Обычный способ в 1С действительно глючит какой-такой "обычный" способ.
.я тут вчера кучу времени убил.. - две ТЗ, вроде как одинаковые даже по составу данных (колонки артикул и колво, сортируем по Артикул), сравниваю путем преобразования в строку. ан нет.. то что совершенно одинаково видится как визуальная ТЗ - при ЗначениеВстроку(ТЗ) - получается совсем не отсортированной!

пользуюсь вот такими.
//******************************************************************************
// ОчисткаТЗ()
// Параметры: ТЗ, которую надо очистить
// В ТЗ д.б. Колонки с идентификаторами "НадоУдалить" и "ОПС" (оригинальный порядок строк)
// Описание: очищает ТЗ от ненужных строк
Процедура глОчисткаТЗ(ТЗдляЧистки, ОПС="+ОПС", КолонкаУдалить="НадоУдалить", Режим=0) Экспорт

Попытка НадоУдалить = ТЗдляЧистки.Итог(КолонкаУдалить);
Исключение Возврат;
КонецПопытки;

ТЗКС = ТЗдляЧистки.КоличествоСтрок();
Если Режим <> 0 Тогда
Сообщить("> ["+ТекущееВремя()+"]: *** удаляем "+НадоУдалить+" из "+ТЗКС+" ****");
КонецЕсли;

Если НадоУдалить <= 0 Тогда Возврат; КонецЕсли;

Читайте также: