• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Поиск в Таблице значений (7.7)

  • Автор темы lira89
  • Дата начала
L

lira89

Здравствуйте. Возник срочный вопрос по поиску в Таблице значений.
Есть сформированная Таблица значений, в которой есть столбцы:
ТЗ1.НоваяКолонка("Студент",,"Строка",80,,"ФИО студента",80);
ТЗ1.НоваяКолонка("ИмяЛиста","Строка",30,,"Имя листа",30);
ТЗ1.НоваяКолонка("РеквизитПоиска",,"Строка",100,,"Реквизит поиска",100);
Заполнение производиться следующим образом:
ТЗ1.НоваяСтрока();
ТЗ1.Студент = Врег((СокрЛП(Строка(ПолучитьЗначение(Лист1,i,1)))));
ТЗ1.ИмяЛиста = СокрЛП(ИмяЛиста);
ТЗ1.РеквизитПоиска = СокрЛП(ТЗ1.Студент+" "+ТЗ1.ИмяЛиста); //этот реквизит служит для более точного и однозначного поиска нужной записи (это 8й столбец ТЗ)
Затем в созданном документе надо выбрать по порядку строки из табличной части и по определенному полю (студент) найти значение в таблице значений:
ВыбратьСтроки(); //идем по табл части документа
Пока ПолучитьСтроку()=1 Цикл
РеквизитДляТочногоПоиска="";
СтрТабл = "";
РеквизитДляТочногоПоиска = ""+Студент+" "+СпецДляПоиска; //записываем нужные для поиска значения выбранной строки в табл части документа
Если ТЗ1.НайтиЗначение(РеквизитДляТочногоПоиска,СтрТабл,8)=1 Тогда
ТЗ1.ПолучитьСтрокуПоНомеру(СтрТабл);
.........делаем что нам нужно с найденной записью

Так вот проблема в том, что значение в таблице значений не находится и вообще, проверяя через отладчик, в ТЗ фигурирует только одна и та же строка и не изменяется. Подскажите в чем проблема, может надо как-то по-другому выполнять поиск по таблице значений или может не хватает какой-либо строки???? Применяя раньше такой способ поиска (правда по числовому полю) все работало, а вот тут возникла проблема(
 
M

mdbm

РеквизитДляТочногоПоиска = ""+Студент+" "+СпецДляПоиска; //записываем нужные для поиска значения выбранной строки в табл части документа
Если ТЗ1.НайтиЗначение(РеквизитДляТочногоПоиска,СтрТабл,8)=1 Тогда

1.Попробуй убрать пробелы
РеквизитДляТочногоПоиска = ""+СокрЛП(Студент)+" "+СпецДляПоиска;

2. У тебя в ТЗ Студент, - это строка с Фамилией
а Табличной части документа, Студент - это наверное справочник...
Если справочник, то попробуй использовать типа СокрЛП(Студент.Наименование)

3. Ты ТЗ заполняешь в приведенном тобой примере только одной строкой...
Покажи полный код заполнения

Также, для проверки содержимого ТЗ, я часто использую функцию ТЗ.ВыбратьСТроку()
Для вызова диалога выбора строки ТЗ....
И в этом диалоге смотрю как заполнена таблица значений
 
L

lira89

Посмотрела таблицу значений методом ВыбратьСтроку() и оказалось, что поле Студент, ИмяЛиста и РеквизитПоиска пустые, хотя вроде как в отладчике они заполнены.

PS: извиняюсь, можешь не читать, что написано выше. Я исправила ошибку в заполнении ТЗ. Проблема была лишь в одной запятой). Исправила вот это
ТЗ1.НоваяКолонка("Студент",,"Строка",80,,"ФИО студента",80);
на вот это ТЗ1.НоваяКолонка("Студент","Строка",80,,"ФИО студента",80); и ТЗ заполнилась нормально.
 
L

lira89

Теперь ТЗ заполнена правильно, а вот все равно поиск не работает.
Изменила поля:
ТЗ1.РеквизитПоиска = СокрЛП(ТЗ1.Студент) + СокрЛП(ТЗ1.ИмяЛиста);
и
РеквизитДляТочногоПоиска = СокрЛП(Студент)+СокрЛП(СпецДляПоиска);
Если ТЗ1.НайтиЗначение(РеквизитДляТочногоПоиска,СтрТабл,8)=1 Тогда
......
В ТЗ поле Студент это строка, а в документе реквизит Студент это справочник. Везде поставила СокрЛП, но все равно выдает, что не находит ни одной записи. СпецДляПоиска тож справочник и я тоже написала СокрЛП.
Понятия не имею, что не так. ;)
 
V

vbs

Попробуй
РеквизитДляТочногоПоиска = СокрЛП(Строка(Студент))+СокрЛП(Строка(СпецДляПоиска));
 
L

lira89

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

Возможно дело в размере поля???? но я же поставила СокрЛП и проблем вроде не должно быть?
 
K

kaa

ДлинаДобавки = 100-СтрДлина(РеквизитДляТочногоПоиска);

инд = 1;
Для инд=1 по ДлинаДобавки Цикл
РеквизитДляТочногоПоиска = РеквизитДляТочногоПоиска+" ";
КонецЦикла;
ТЗ1.НайтиЗначение(РеквизитДляТочногоПоиска,СтрТабл,8)
 
V

vitfil

lira89, при определении колонок ТЗ не указывайте размерность поля "РеквизитПоиска".
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!