Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 18:39

Как программно перейти к нужной строке в журнале документов?

Автор nick_E, 18 окт 2011, 16:47

0 Пользователей и 1 гость просматривают эту тему.

nick_E

Делаю быстрый поиск по колонке журнала, не могу найти, как сделать переход к нужной строке. :(
Подскажите такое вообще возможно в журнале документов, конфигурация любая 8.2?
Код следующий, делаю выборку в журнале нахожу документ с нужную суммой, дальше надо узнать в какой строке журнала документ и перейти к ней. Процедура привязана к кнопке на форме журнала.

Процедура ПоискВКолонке(Колонка,Данные)
Колонка =  ЭлементыФормы.ЖурналДокументовСписок.ТекущаяКолонка.Имя;
Данные = Число(500);
Сообщить("ТекущаяКолонка="+Колонка);
Выборка = ЖурналыДокументов.БанковскиеВыписки.Выбрать();
Пока Выборка.Следующий() Цикл

Сообщить("Найден документ: " +Выборка.ПолучитьОбъект()+" на сумму "+ Выборка.Списано);

Если Выборка.Списано = Данные тогда
// здесь нужно сделать переход к строке с нужным документом
           КонецЕсли;
КонецЦикла


КонецПроцедуры


has

Если надо один раз перейти к самой первой найденной строке то примерно так.

//ищем документ с суммой 50000
ОтборПоиска = Новый Структура;
ОтборПоиска.Вставить("Приход", 50000);
Выборка = ЖурналыДокументов.КассовыеДокументы.Выбрать(,,ОтборПоиска);
если Выборка.Следующий() тогда
ЭлементыФормы.ЖурналДокументовСписок.ТекущаяСтрока = ВЫборка.Ссылка;
КонецЕсли;

Если же надо при каждом нажатии на кнопку поиска позиционироваться на новый найденный документ, то тут уже немного сложнее. Тут придется отсеивать уже найденные. В таком случае лучше подойдет отбор, хотя конечно все зависит от задачи.

nick_E


nick_E

Ну, вот кое-как сделала быстрый поиск по колонке в журнале документов! :)
Делал для конфигурации «Бухгалтерия бюджетного учреждения версия 1.0.22.2»,  наверно многим пригодится, т.к. в 8й версии почему-то быстрый поиск убрали.
Кому не лень, пожалуйста, оптимизируйте код, наверняка можно сделать его намного меньше и использовать другие функции, про которые я давно забыл. :)
Модераторы можете переименовать тему в «Быстрый поиск в журнале документов для версии 8х»

nick_E


//*************************************************************************************************
//********************* ПРОЦЕДУРЫ БЫСТРОГО ПОИСКА В КОЛОНКЕ ***************************************
//*************************************************************************************************
//
// кроме того добавляем строки:
// ПредыдущиеДанные = "";
//     НайденныйОбъект = Новый СписокЗначений;
// в процедуру ПриОткрытии()
//
// и глобальные переменные:
// Перем ПредыдущиеДанные,НайденныйОбъект;
//
// ну и конечно кнопку "Быстрый поиск" на панель инструментов
//
// п.с. 5ть лет не брался за 1ску, тогда еще была 7ка, в 8ке оказывается сильно изменился
// встроенный язык, про что вспомнил на том и написал :)
//*************************************************************************************************

nick_E


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


nick_E


Функция ВернутьИдентификатор(Выборка,ИмяИдентификатора)
Если ИмяИдентификатора = "Выбыло" тогда
Возврат(Выборка.Выбыло);
ИначеЕсли ИмяИдентификатора = "Поступило" тогда
Возврат(Выборка.Поступило);
ИначеЕсли ИмяИдентификатора = "Номер" тогда
Возврат(Выборка.Номер);
ИначеЕсли ИмяИдентификатора = "Вид документа" тогда
Возврат(Выборка.ВидПервичногоДокумента);
ИначеЕсли ИмяИдентификатора = "Дата документа" тогда
Возврат(Выборка.ДатаПервичногоДокумента);
ИначеЕсли ИмяИдентификатора = "Основание" тогда
Возврат(Выборка.Основание);
ИначеЕсли ИмяИдентификатора = "Вид операции" тогда
Возврат(Выборка.ВидОперации);
//ИначеЕсли ИмяИдентификатора = "" тогда
КонецЕсли;
КонецФункции


nick_E


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


nick_E


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



nick_E

Одним сообщением весь код добавить не получилось, пришлось кусками. :(

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск