Функция перезагрузки Таблицы Значений по условиям

06.11.08

Разработка - Универсальные функции

Возвращает таблицу значений, отфильтрованную по условию в заданной колонке (равно, не равно, больше, меньше, содержит, равны две указанные колонки)
Функция ПерегрузитьТЗ(пТЗ,пУсловие,пЗначение,пНомКол)   
	// пУсловие "=" или ">" или "<" или "<>" или "in,=К"
	// nНомКол - номер колонки в которой nЗначение должно удовлетворять условию
	// "=К" - сравнение значений в двух колонках, в этом случае nЗначение номер второй колоки    
	//--- возвращает ТЗ отфильтрованную по условиию в заданной колонке
	//-- пример вызова:  ТЗ.Загрузить(ПерегрузитьТЗ(ТЗ,"in",5,1));
	Nil=ПолучитьПустоеЗначение();
	Контроль="=,<,>,<>,in,=К";
	Контроль=СтрЗаменить(Контроль,",",РазделительСтрок);
	Ошибка=1;
	Для А=1 По СтрКоличествоСтрок(Контроль) Цикл 
		ТС=СокрЛП(СтрПолучитьСтроку(Контроль,А)); 
		Если ТС=пУсловие Тогда
			Ошибка=0;
			Прервать;
		КонецЕсли; 
	КонецЦикла;      
	Если Ошибка=1 Тогда 
		Сообщить("неверное условие "+пУсловие,"!");
		Возврат  Nil;
	КонецЕсли;
	вТЗ=СоздатьОбъект("ТаблицаЗначений");
	пУсловие=СокрЛП(пУсловие);
	вТЗ.Загрузить(пТЗ);
	вТЗ.УдалитьСтроки();
	Для А=1 По пТЗ.КоличествоСтрок() Цикл
		Если пУсловие="=К"  Тогда
			Если пТЗ.ПолучитьЗначение(А,пНомКол)=пТЗ.ПолучитьЗначение(А,пЗначение) Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;        
		ИначеЕсли пУсловие="="  Тогда
			Если пТЗ.ПолучитьЗначение(А,пНомКол)=пЗначение Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		ИначеЕсли пУсловие=">" Тогда   
			Если пТЗ.ПолучитьЗначение(А,пНомКол)>пЗначение Тогда 
				вТЗ.НоваяСтрока();      
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		ИначеЕсли пУсловие="<" Тогда  
			Если пТЗ.ПолучитьЗначение(А,пНомКол)<пЗначение Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		ИначеЕсли пУсловие="<>" Тогда
			Если пТЗ.ПолучитьЗначение(А,пНомКол)<>пЗначение Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли; 
		ИначеЕсли пУсловие="in" Тогда  
			ТекСтр=Строка(пТЗ.ПолучитьЗначение(А,пНомКол));
			Если Найти(ТекСтр,пЗначение)>0 Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		КонецЕсли; 
	КонецЦикла;  
	Возврат вТЗ; 
КонецФункции 

См. также

Универсальные функции Программист Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    1424    14    user706545_kseg1971    0    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    2369    zhenyat    7    

8

Универсальные функции Программист Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    5189    Zoltan_Black    11    

2

Универсальные функции Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13968    4    alsen    3    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10821    malovandrey    7    

19

Универсальные функции Работа с интерфейсом Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18903    2    HAMMER_59    6    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 06.11.08 09:47 Сейчас в теме
Вообще конечно, все это хорошо для маленьких таблиц.
Автор, убей вот этот код, потому что на больших таблицах он будет жутко тормозить:

вТЗ.Загрузить(пТЗ);
вТЗ.УдалитьСтроки();

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

К тому же непонятна суть затеи - если хочется оставить в ТЗ только нужные по условию строки, то не проще ли сначала отобрать массив ненужных строк, а затем его удалить, зачем все эти перезагрузки?

Предлагаю другой алгол:
1. Сначала отбираешь строки, не удовлетворяющие условию.
2. Потом их чикаешь.

Все, никаких перезагрузок.
7. Abadonna 3969 06.11.08 15:47 Сейчас в теме
(1)>то не проще ли сначала отобрать массив ненужных строк
И что ж ты все к семерке с восьмерочными мерками и методами? Нема такого в семерке
3. Vitek 06.11.08 13:23 Сейчас в теме
(2)Индексированная таблица рулит!
4. alexk-is 6544 06.11.08 14:32 Сейчас в теме
Если без использования внешних компонент, то посмотри http://infostart.ru/blogs/index.php?id=693&ref=34707
blogs/693 (7) рекомендую вариант alexk v.2
замени следующую строку на свои проверки
Код
Если УсловиеВыполняется(ТЗ.К) = 1 Тогда
Показать полностью
6. Abadonna 3969 06.11.08 15:42 Сейчас в теме
(4)>Если Найти(",=,<,>,<>,in,=К,", "," + пУсловие + "," ) = 0 Тогда
Ага! Например, были сиволы >> , и что твоя вернет? Что все зашибись?(!)
8. alexk-is 6544 06.11.08 23:07 Сейчас в теме
5. alexk-is 6544 06.11.08 14:38 Сейчас в теме
Код
   Nil=ПолучитьПустоеЗначение();
   Контроль="=,<,>,<>,in,=К";
   Контроль=СтрЗаменить(Контроль,",",РазделительСтрок);
   Ошибка=1;
   Для А=1 По СтрКоличествоСтрок(Контроль) Цикл 
      ТС=СокрЛП(СтрПолучитьСтроку(Контроль,А)); 
      Если ТС=пУсловие Тогда
         Ошибка=0;
         Прервать;
      КонецЕсли; 
   КонецЦикла;      
   Если Ошибка=1 Тогда 
      Сообщить("неверное условие "+пУсловие,"!");
      Возврат  Nil;
   КонецЕсли;
Показать полностью


замени на
Код
Если Найти(",=,<,>,<>,in,=К,", "," + пУсловие + "," ) = 0 Тогда
   Сообщить("Неверное условие " + пУсловие, "!");
   Возврат  ПолучитьПустоеЗначение();
КонецЕсли;
Показать полностью
Оставьте свое сообщение