Форум Кладовочки АЛьФ`а

Общие вопросы => 7.7 => Тема начата: Злоп от 20 мая 2025, 03:43

Название: Таб.Найти("Чтото") - есть ли...?
Отправлено: Злоп от 20 мая 2025, 03:43
Имеем сформированный моксель: печформу или сам макет, в т.ч., например, открытую через Таб.Открыть(ИмяФайлаМокселя).
.
Можно ли как-то провести поиск в Таб, не перебирая ячейки, типа
Таб.Найти("Чтото",КоординатыПоиска), где КоординатыПоиска - если не задано = вся Таб, если задано = то в указанном диапазоне. Пусть даже для начала просто тупо Таб.Найти("ЧтоТо") по всей Таб.
Результатом поиска будет адрес ячейки.
.
м.б. такое есть в Йокселе, или TableDoc - но не нашел
?
Название: Re: Таб.Найти("Чтото") - есть ли...?
Отправлено: 1ex от 21 мая 2025, 16:37
Простого - с точки зрения вызова метода я не припомню.
У меня в конфе есть пара вариантов - на такой случай.
Перебор ячеек - понятно - не стану приводить.
Но вот есть такое (лобовой штурм - грубо и некрасиво):
// Возвращает Список значений с содержащимися в них значениями
// если строка была передана в формате Знач_знач_знач
Функция РазборСтрокиНаЗапчасти(лсСтр,лРазбор = "_")  экспорт
лсСпис = СоздатьОбъект("СписокЗначений");
ВсегоЗначений = СтрЧислоВхождений(лсСтр,лРазбор); 
Для инд = 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 Тогда   
Если ТипЗначенияСТР(Конт) = "Таблица" тогда
глВремКонт = Конт; // Внешнее событие не может передавать что-то сложнее строк
// - поэтому через глобальную переменную
// Сбор данных о адресе ячейки здесь не получится
// так как это начало процесса.

Сервис.ВнешнееСобытие("Поиск","ПоискВТаблице","");
// А вот внешнее событие запустится после отработки команды
    КонецЕслИ;
        КонецЕсли;
КонецЕслИ;
КонецПроцедуры

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


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