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

Автор Злоп, 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 Тогда    Если ТипЗначенияСТР(Конт) = "Таблица" тогда глВремКонт = Конт; // Внешнее событие не может передавать что-то сложнее строк // - поэтому через глобальную переменную // Сбор данных о адресе ячейки здесь не получится // так как это начало процесса. Сервис.ВнешнееСобытие("Поиск","ПоискВТаблице",""); // А вот внешнее событие запустится после отработки команды     КонецЕслИ;         КонецЕсли; КонецЕслИ; КонецПроцедуры Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)                                                                   Если (Источник = "Поиск")и(Событие = "ПоискВТаблице") тогда лДанные = глВремКонт;                  лЯчейка = ""; Сообщить(лДанные.ЗначениеТекущейЯчейки(лЯчейка)); // Значение Сообщить(лЯчейка); // Адрес         КонецЕслИ; КонецПроцедуры

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