Таб.Найти("Чтото") - есть ли...?

Автор Злоп, 20 мая 2025, 03:43

« назад - далее »

Злоп

Имеем сформированный моксель: печформу или сам макет, в т.ч., например, открытую через Таб.Открыть(ИмяФайлаМокселя).
.
Можно ли как-то провести поиск в Таб, не перебирая ячейки, типа
Таб.Найти("Чтото",КоординатыПоиска), где КоординатыПоиска - если не задано = вся Таб, если задано = то в указанном диапазоне. Пусть даже для начала просто тупо Таб.Найти("ЧтоТо") по всей Таб.
Результатом поиска будет адрес ячейки.
.
м.б. такое есть в Йокселе, или TableDoc - но не нашел
?

1ex

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


//*******************************************
Процедура НайтиВТаблице()                       
	
	ПоисковаяСтрока = "Весы";
	
	Таб = СоздатьОбъект("Таблица");
	Таб.Открыть("C:\Base\Test.mxl"); // Берем moxcel
	Таб.Записать("C:\Base\Test.txt",3); // и в текст его.

	лтз = СоздатьОбъект("ТаблицаЗначений");
	лтз.НоваяКолонка("Ячейка");
	лтз.НоваяКолонка("Значение");
	
	лтекст = СоздатьОбъект("Текст");
	лтекст.Открыть("C:\Base\Test.txt");

	для инд = 1 по лтекст.КоличествоСтрок() Цикл // Строки - это ИД строки
		лСтрока = СимволТабуляции+лтекст.ПолучитьСтроку(инд); // добавляем первую невидимую колонку.  
		лсзБуф = РазборСтрокиНаЗапчасти(лСтрока,СимволТабуляции);
		Для инд1 = 1 по лсзБуф.РазмерСписка() Цикл // тут ИД колонок
			ВремЗнач = лсзБуф.ПолучитьЗначение(инд1);
			Если ПустаяСтрока(ВремЗнач) = 0 тогда
				
				Если Найти(нрег(ВремЗнач),нрег(ПоисковаяСтрока)) = 0 тогда // Ищем чего надо
					продолжить;
				КонецЕслИ;
				
				лтз.НоваяСтрока();
				лтз.Ячейка = "R"+Сокрлп(инд)+"С"+ Сокрлп(инд1-1);  // уменьшаем на добавленную первую колонку
				лтз.Значение = ВремЗнач;
			КонецЕслИ;
		КонецЦикла
	КонецЦикла;              
	лтз.ВыбратьСтроки();	
	Пока лтз.ПолучитьСтроку() = 1 Цикл
		Сообщить(лтз.Ячейка+" "+лтз.Значение); 
	КонецЦикла;   
	
	

КонецПроцедуры
Это конечно работает прикольно, пока в ячейке Moxcel`я не воткнуть символ табуляции посередине текста...

другой вариант - пользование поля поиска на главном окне. Точнее командами Shift+f3/alt+f3
Процедура ПриПолученииКомандыГлавнымОкном(Команда,НулевойПараметр,ФСО)
	перем конт;
	Если (Команда = 32835)или(Команда = 32836) тогда
		//Сообщить("Вызван поиск - кнопки вниз или кнопки вверх на панельке");	
        Сервис = СоздатьОбъект("Сервис");
        Если Сервис.АктивныйКонтекст(Конт) = 1 Тогда   
			Если ТипЗначенияСТР(Конт) = "Таблица" тогда
				глВремКонт = Конт; // Внешнее событие не может передавать что-то сложнее строк 
									// - поэтому через глобальную переменную
									// Сбор данных о адресе ячейки здесь не получится
									// так как это начало процесса.
				
				Сервис.ВнешнееСобытие("Поиск","ПоискВТаблице",""); 
									// А вот внешнее событие запустится после отработки команды
	   		КонецЕслИ;
        КонецЕсли;
	КонецЕслИ;
КонецПроцедуры

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
	                                                                  
	Если (Источник = "Поиск")и(Событие = "ПоискВТаблице") тогда 
		лДанные = глВремКонт;                  
		лЯчейка = "";
		Сообщить(лДанные.ЗначениеТекущейЯчейки(лЯчейка)); // Значение
		Сообщить(лЯчейка); // Адрес
        КонецЕслИ;
КонецПроцедуры

Не рисовки ради. Кидайте тапками.