Контекстный поиск в 7.7

Процедура контекстного поиска в журнале документов.

Сам я уже отошел от написания чего бы то ни было серьезного на 1С, больше конешно по причине, что не вижу перспектив работать в этом направлении в нашем городе. Но  не об этом я хотел написать, началось все с того что на работе сократили всех маркетологов и вообще всех, кто работал с клиентами ,а обязанности по решению технических вопросов навесили на нашего системщика. К тому же начальство в плане выдачи идиотских заданий, по поводу вытянуть нечто нестандартное из базы, факт отсутствия людей не сколько не беспокоит. Вот и приходится по мелочи дописывать старую конфигурацию, на предмет микроотчетов, и прочих фишек для выуживания данных. Поэтому поводу и пришлось вспомнить про обработку, которую писал еще в далеком 2005, правда, конфигурации не сохранилось, но да какая разница, все, что было когда-то написано, всегда можно написать заново.

Итак, встречайте — процедура поиска заданной строки в журнале документов. Процедура просто перебирает реквизиты документов в поисках требуемой строки. Конечно, со внешниим компонентами это работало бы быстрее, а в 8-ке это есть на уровне платформы, но для 7.7 подобная обработка для подобного вида поиска способна здорово помочь.

Параметры:

Поиск_ — искомая строка

Журнал_ — имя журнала ( в 7.7 из контекста нельзя получить имя журнала документа)

Контекст_ — сам контекст журнала документов

 

Процедура глГлобальныйПоиск(Знач Поиск_,Журнал_,Контекст_) Экспорт
Если ПустаяСтрока(Поиск_) = 1 Тогда
Возврат;
Иначе
Поиск_  = Врег(СокрЛП(Поиск_));
КонецЕсли;
ВсегоНайдено_ = 0;
ТЗРезультат = СоздатьОбъект("ТаблицаЗначений");
ТЗРезультат.НоваяКолонка("Описание","Строка");
ТЗрезультат.НоваяКолонка("Документ","Документ");

СЗШапка_ = СоздатьОбъект("СписокЗначений");
СЗТаблица_ = СоздатьОбъект("СписокЗначений");


ИмяОтбора_ = "";
ЗначениеОтбора_ = "";
Если Контекст_.ПолучитьОтбор(ИмяОтбора_,ЗначениеОтбора_) = 1 Тогда
Если ПустоеЗначение(ЗначениеОтбора_) = 1 Тогда
Док = СоздатьОбъект("Документ."+ИмяОтбора_);
Док.ВыбратьДокументы(Контекст_.НачалоИнтервала(),Контекст_.КонецИнтервала());
Иначе
Док = СоздатьОбъект("Документ");
Док.ВыбратьПоЗначению(Контекст_.НачалоИнтервала(),Контекст_.КонецИнтервала(),ИмяОтбора_,ЗначениеОтбора_);
КонецЕсли;
Иначе
Док = СоздатьОбъект("Документ");
Док.ИспользоватьЖурнал(Журнал_);
Док.ВыбратьДокументы(Контекст_.НачалоИнтервала(),Контекст_.КонецИнтервала());
КонецЕсли;
Пока Док.ПолучитьДокумент() = 1 Цикл
СЗ = СЗШапка_.Получить(Док.Вид());
Если ПустоеЗначение(СЗ) = 1 Тогда
СЗПоля_ = СоздатьОбъект("СписокЗначений");
Для а = 1 По Метаданные.Документ(Док.Вид()).РеквизитШапки() Цикл;
СЗПоля_.ДобавитьЗначение(Метаданные.Документ(Док.Вид()).РеквизитШапки(а).Идентификатор);
КонецЦикла;
Для а = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
СЗПоля_.ДобавитьЗначение(Метаданные.ОбщийРеквизитДокумента(а).Идентификатор);
КонецЦикла;
СЗШапка_.Установить(Док.Вид(),СЗПоля_);
СЗ = СЗШапка_.Получить(Док.Вид());
КонецЕсли;
Для а =1 По СЗ.РазмерСписка() Цикл
Идентификатор_ = СЗ.ПолучитьЗначение(а);
Стр_ = Док.ПолучитьАтрибут(Идентификатор_);
Если Найти(Врег(Стр_),Поиск_) > 0 Тогда
ВсегоНайдено_ = ВсегоНайдено_ + 1;
ТЗРезультат.НоваяСтрока();
ТЗРезультат.Документ = Док.ТекущийДокумент();
ТЗРезультат.Описание = ""+сокрЛП(Стр_)+" в "+Идентификатор_+" "+Док.ТекущийДокумент();
КонецЕсли;
КонецЦикла;
СЗ = СЗТаблица_.Получить(Док.Вид());
Если ПустоеЗначение(СЗ) = 1 Тогда
СЗПоля_ = СоздатьОбъект("СписокЗначений");
Для а = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл;
СЗПоля_.ДобавитьЗначение(Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(а).Идентификатор);
КонецЦикла;
СЗТаблица_.Установить(Док.Вид(),СЗПоля_);
СЗ = СЗТаблица_.Получить(Док.Вид());
КонецЕсли;
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()= 1 Цикл
Для а =1 По СЗ.РазмерСписка() Цикл
Идентификатор_ = СЗ.ПолучитьЗначение(а);
Стр_ = Док.ПолучитьАтрибут(Идентификатор_);
Если Найти(Врег(Стр_),Поиск_)> 0 Тогда
ВсегоНайдено_ = ВсегоНайдено_ + 1;
ТЗРезультат.НоваяСтрока();
ТЗРезультат.Документ = Док.ТекущийДокумент();
ТЗРезультат.Описание = ""+сокрЛП(Стр_)+" в "+Идентификатор_+" в строке "+Док.НомерСтроки+" "+Док.ТекущийДокумент();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если ВсегоНайдено_ > 0 Тогда
Рез = 0;
Если ТЗРезультат.ВыбратьСтроку(Рез,"Результаты поиска",) = 1 Тогда
ТЗРезультат.ПолучитьСтрокуПоНомеру(Рез);
ОткрытьФорму(ТЗРезультат.Документ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры//глГлобальныйПоиск

2 Comments

  1. aves

    Делал похожее. 2009 год.

    http://infostart.ru/public/20034/

    Reply
  2. zsi_uk

    Спасибо, интересная обработка. Случайно увидел, подключил к своей базе, нравится как работает.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *