К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

7.7 Таблица значений. И в чем я туплю?

Гость
0 - 13.03.2013 - 16:43
Решила тут покодить немного от скуки, чтоб в памяти освежить...
Вопчем есть таблица значений, у которой есть колонка "Сотрудник". Задаю конкретного сотрудника, конкретный номер строки и колонку "Сотрудник". Почему мне НайтиЗначение выдает =1, если в этой строке совсем другой сотрудник? или все-таки он не только по этой строке ищет?



41 - 14.03.2013 - 13:06
Нет смысла в методе НайтиЗначение при Стр<>0.
Гость
42 - 14.03.2013 - 13:55
41-victuan > вопрос не в смысле, а в том, что не соответствует описанию...
Гость
43 - 14.03.2013 - 13:59
42-Buhta >соответствует.
44 - 14.03.2013 - 17:23
СП купить еще не предлагали? Странно...

<Строка> - идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.

То есть: после "Стр=5, потом Стр=Стр+1" поиск будет осуществляться только в 6-й строке. И "Стр=6" при этом выглядит вполне логично.
45 - 14.03.2013 - 17:35
объясните, зачем искать, например, значение в 5-ой строке, в колонке "Контрагент" ?
какого результата вы ждёте от поиска?
зачем искать то, что итак лежит известно где?
Гость
46 - 14.03.2013 - 17:40
44-Ткачик > это кому? если мне, то я там и читаю, см (16) и абсолютно не спорю с тем, что Стр=6:) это тут некоторые уже и про пиво спорили и т.п... меня как раз смущает тот факт, что "поиск будет осуществляться только по указанной строке" и при этом поиск выдает =1, хотя сотрудник в строке 6 совсем уже другой...
Гость
47 - 14.03.2013 - 17:46
45-Ирли Бёрд > опять про смысл? ну хотела таким образом перебор строк сделать до того момента, когда сменится сотрудник, т.к. таблица отсортирована. т.е. предполагалось, что в момент смены сотрудника в очередной строке таблицы внутренний цикл прервется... но в очередной строке сотр меняется, а поиск как-бы находит старого сотра:)
48 - 14.03.2013 - 18:57
47-Buhta >Так не получится. НайтиЗначение ищет только первое вхождение искомого значения. Но либо среди всех строк, либо среди всех колонок. Поиск по заданной строке и заданной колонке не работает
49 - 14.03.2013 - 19:13
47-Buhta >

ТекСотрудник = "";
i=0;
Пока i < ТЗ.КоличествоСтрок() Цикл
i=i+1;
Если ТЗ.ПолучитьЗначение(i, "Сотрудник") <> ТекСотрудник Тогда
Сообщить("Сменился сотрудник в строке "+i);
КонецЕсли;
КонецЦикла;
Гость
50 - 14.03.2013 - 20:10
49-Ирли Бёрд > большое спасибо:) но мне как-бы просто было интересно почему не работает так, как написано в книжке и СП:)
Гость
51 - 14.03.2013 - 20:14
а у меня работает.
может на тебя кто-то порчу навел?..
Гость
52 - 14.03.2013 - 20:15
51-Cthulhu > не исключено:)
53 - 14.03.2013 - 22:00
"поиск выдает =1, хотя сотрудник в строке 6 совсем уже другой..." - врет, как бухгалтер программисту!

Элементарный код для проверки:

ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код","Число",1,0);
ТЗ.НоваяКолонка("Имя","Строка",3,0);

ТЗ.НоваяСтрока();
ТЗ.Код=1;
ТЗ.Имя="ААА";
ТЗ.НоваяСтрока();
ТЗ.Код=2;
ТЗ.Имя="БББ";
ТЗ.НоваяСтрока();
ТЗ.Код=1;
ТЗ.Имя="ВВВ";

Стр=0;
Сообщить("Стр=0; ТЗ.НайтиЗначение(""ААА"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("ААА",Стр,"Имя")+"; Стр="+Стр);
Стр=0;
Сообщить("Стр=0; ТЗ.НайтиЗначение(""БББ"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("БББ",Стр,"Имя")+"; Стр="+Стр);
Стр=0;
Сообщить("Стр=0; ТЗ.НайтиЗначение(""ВВВ"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("ВВВ",Стр,"Имя")+"; Стр="+Стр);
Стр=1;
Сообщить("Стр=1; ТЗ.НайтиЗначение(""ААА"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("ААА",Стр,"Имя")+"; Стр="+Стр);
Стр=2;
Сообщить("Стр=2; ТЗ.НайтиЗначение(""БББ"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("БББ",Стр,"Имя")+"; Стр="+Стр);
Стр=3;
Сообщить("Стр=3; ТЗ.НайтиЗначение(""ААА"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("ААА",Стр,"Имя")+"; Стр="+Стр);
Стр=3;
Сообщить("Стр=3; ТЗ.НайтиЗначение(""БББ"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("БББ",Стр,"Имя")+"; Стр="+Стр);
Стр=1;
Сообщить("Стр=1; ТЗ.НайтиЗначение(""ВВВ"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("ВВВ",Стр,"Имя")+"; Стр="+Стр);

Заодно, чтобы два раза не бегать - для проверки "почему стр = ""? Должно быть стр = 0" добавляем:

Стр="";
Сообщить("Стр=""""; ТЗ.НайтиЗначение(""ВВВ"",Стр,""Имя"")="+ТЗ.НайтиЗн ачение("ВВВ",Стр,"Имя")+"; Стр="+Стр);

Ну, и если не баловаться с переменной, а указывать номер строки явно:

Сообщить("ТЗ.НайтиЗначение(""ААА"",1,""Имя"")="+ТЗ .НайтиЗначение("ААА",1,"Имя"));
Сообщить("ТЗ.НайтиЗначение(""БББ"",2,""Имя"")="+ТЗ .НайтиЗначение("БББ",2,"Имя"));
Сообщить("ТЗ.НайтиЗначение(""ВВВ"",1,""Имя"")="+ТЗ .НайтиЗначение("ВВВ",1,"Имя"));
Сообщить("ТЗ.НайтиЗначение(""ААА"",2,""Имя"")="+ТЗ .НайтиЗначение("ААА",2,"Имя"));

Выводы пусть каждый сделает сам - по описанию оно работает или нет.
Гость
54 - 14.03.2013 - 23:05
(53):
Сообщить("Стр="+Стр+"(Тип="+ТипЗначенияСтр(Стр)+") : ...
Гость
55 - 15.03.2013 - 07:52
(0) тут не дети. выкладывай обработку, давай ссылку на неё и номер её строки.
56 - 15.03.2013 - 09:03
(54) Кэп, это эквивалентно:

Сообщить("Номер строки ТЗ может быть только числом!")
Гость
57 - 15.03.2013 - 10:14
код (53) работает. со справочником - нет (по крайней мере у меня). вот код с сотрудниками: //взять небольшую ЗИК или Бух с кол-вом сотрудников >5. строк много для надежности:)
//*******************************************
Процедура Сформировать()

ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Сотрудник","Справочник.Сотрудники ");
ТЗ.НоваяКолонка("Код","Число",1,0);

Н=0;

Сотр=СоздатьОбъект("Справочник.Сотрудники");
Сотр.ВыбратьЭлементы();
Пока Сотр.ПолучитьЭлемент()=1 цикл
Сотрудник=Сотр.ТекущийЭлемент();
Если Н<6 тогда
ТЗ.НоваяСтрока();
ТЗ.Сотрудник=Сотрудник;
ТЗ.Код=1;
ТЗ.НоваяСтрока();
ТЗ.Сотрудник=Сотрудник;
ТЗ.Код=2;
ТЗ.НоваяСтрока();
ТЗ.Сотрудник=Сотрудник;
ТЗ.Код=3;
Н=Н+1;
Иначе
Прервать
КонецЕсли;
КонецЦикла;

//На всякий случай, чтоб вопросов не возникало, отсортируем и будем использовать другие переменные:
ТЗ.Сортировать("Сотрудник,Код");


Н1=0;
Сотр1=СоздатьОбъект("Справочник.Сотрудники");
Сотр1.ВыбратьЭлементы();
Пока Сотр1.ПолучитьЭлемент()=1 цикл
Сотрудник1=Сотр1.ТекущийЭлемент();
Стр1=0;
Сообщить("Стр1=0; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+?(ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Со трудник")=1," Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"), "Сотрудник не найден"));
Стр1=1;
Сообщить("Стр1=1; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=2;
Сообщить("Стр1=2; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=3;
Сообщить("Стр1=3; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=4;
Сообщить("Стр1=4; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=5;
Сообщить("Стр1=5; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=6;
Сообщить("Стр1=6; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=7;
Сообщить("Стр1=7; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));

//Заодно, чтобы два раза не бегать - для проверки "почему стр = ""? Должно быть стр = 0" добавляем:
Стр1="";
Сообщить("Стр1=""""; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+?(ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Со трудник")=1," Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"), "Сотрудник не найден"));
Стр1=1;
Сообщить("Стр1=1; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=2;
Сообщить("Стр1=2; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=3;
Сообщить("Стр1=3; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=4;
Сообщить("Стр1=4; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=5;
Сообщить("Стр1=5; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=6;
Сообщить("Стр1=6; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));
Стр1=7;
Сообщить("Стр1=7; ТЗ.НайтиЗначение("+Сотрудник1+",Стр1,""Сотрудник"" )="+ТЗ.НайтиЗначение(Сотрудник1,Стр1,"Сотрудник")+ "; Стр1="+Стр1+" Сотрудник в строке: "+ТЗ.ПолучитьЗначение(Стр1,"Сотрудник"));


//Ну, и если не баловаться с переменной, а указывать номер строки явно:
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",1,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,1,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(1,"Сотрудник"));
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",2,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,2,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(2,"Сотрудник"));
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",3,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,3,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(3,"Сотрудник"));
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",4,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,4,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(4,"Сотрудник"));
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",5,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,5,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(5,"Сотрудник"));
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",6,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,6,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(6,"Сотрудник"));
Сообщить("ТЗ.НайтиЗначение("+Сотрудник1+",7,""Сотр удник"")="+ТЗ.НайтиЗначение(Сотрудник1,7,"Сотрудни к")+"; Сотрудник в строке: "+ТЗ.ПолучитьЗначение(7,"Сотрудник"));


Если Н1<6 тогда
Н1=Н1+1;
Иначе
Прервать
КонецЕсли;
КонецЦикла;

//Выводы пусть каждый сделает сам - по описанию оно работает или нет. :)


КонецПроцедуры
Гость
58 - 15.03.2013 - 10:47
на 25-м релизе та-же фигня
Гость
59 - 15.03.2013 - 11:18
Ладно, я пошла к детям:)
Гость
60 - 15.03.2013 - 13:05
Ну и? у кого код (57) соответствует описанию, т.е. тому, что "только по указанной строке."? или у всех тоже порча?;)
Гость
61 - 15.03.2013 - 15:44
люди!!! (или не люди?) снимите порчу! восстановите ауру! а то мну даже тут на работу в качестве астролога/телепатки и специалиста по другим интимным вопросам не берут:(
ЗЫ: у мну не работает, т.е. не соответствует описанию в конкретном случае, поэтому честно, в сответствии с некоторыми заявленными постами, я позволила купить себе пиво...
62 - 15.03.2013 - 17:01
(61)(поводя манипуляторами)снимаю с тебя порчу
у меня сегодня тоже писалось, что то подобное
для справочника контрагенов поиск по ИНН+КПП,
получилось после удаления найденной строки в ТЗ;)
ну и кстати может кто подскажет: две ТЗ на форме
обработки, одна на одной закладке заполняется и отображается, а на вторй закладке в процедуре вижу
что заполняется, а на форме пустая :()
63 - 15.03.2013 - 17:28
"Снимаю. Порчу. Дорого" (с)

Авторы движка 1С, похоже, руководствовались здравым смыслом: НайтиЗначение() надо использовать именно для поиска, что можно искать в одной строке? Тем более, в одной ячейке - это что, дамская сумочка, что ли?

Но несмотря на это, поиск по простым типам данных работает как описано, хотя описание наверняка составляли совсем другие люди, не программисты.

Можно еще с документами и перечислениями поэкспериментировать, но без пива что-то лениво...
64 - 15.03.2013 - 17:29
во первых - при работе с ТЗ, которые еще и лежат на форме - надо очень аккуратно.
65 - 15.03.2013 - 17:30
лена, там где у тебя неправильно нашлось - выведи на печать ТЗ
типа ПечатьТЗ(ТЗдляпечати) и посмотри... ну что-то сильно уменя сомнения, что в 6 строке у тебя Петров, а находит там иванова...
66 - 15.03.2013 - 17:56
(64) а что там с аккуратность с ТЗ на форме?
67 - 15.03.2013 - 18:06
ну как наступишь на грабли - вспомни!
68 - 15.03.2013 - 18:21
ну так я уже писал:
две ТЗ на форме
обработки, одна на одной закладке заполняется и отображается, а на вторй закладке в процедуре вижу
что заполняется, а на форме пустая :()
Гость
69 - 15.03.2013 - 18:47
65-Чучундер > ну вот счас все совсем брошу и еще на печать буду выводить:) Ну даже по коду (57) не может там быть Иванова, когда туда честно Петров записан! Просто скопипасть в обработку код (57) и выводи какие захочешь таблицы на печать:) я же на уникальность своих/твоих данных не претендую;) кста, а обсудить есть что;)
63-Ткачик > Спасибо, мил. человек! Что порчу снял:) С документами и перечислениями мне тоже уже лениво, т.к. пиво кончилось:) пойду лучше что-нить поищу в своей "дамской сумочке";)
70 - 15.03.2013 - 18:51
(68) надо смотреть, что вы там "видите" и что вы там отображаете.
как вариант - "в процедуре вижу что заполняется, а на форме пустая" вставить Форма.Обновить();
71 - 15.03.2013 - 19:13
(70) Спасибо за пинок, признаваться что было даже стыдно!
сосредоточился на поиске, а перед выбором в редыдущей ТЗ
не поставил ТЗ.ВыбратьСтроки()
''':(
Поыпаю пеплом центральный процессор
72 - 15.03.2013 - 19:22
(71)+ Хотя когда я вызов этой процедуры вешал
на кнопку на форме она отрабатывала заполнение
:(
73 - 15.03.2013 - 19:35
(57) а что за идентификатор колонки
"Со трудник"
.
????
Гость
74 - 15.03.2013 - 19:39
73-Чучундер > билин, а что нельзя? какое-то тайное сочетание символов? или пробелы форума убрать не можешь?;)
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Сотрудник","Справочник.Сотрудники ");
ТЗ.НоваяКолонка("Код","Число",1,0);
75 - 15.03.2013 - 19:44
(69) исследую, занятно...
76 - 15.03.2013 - 22:31
(74) да хз, что ты там откопала еще в особенностях функционирования ;-) может пробел несет тайный смысл? ;-0
77 - 15.03.2013 - 22:32
я на эту фичу и не натыкался ни разу.. бо видимо не дорос до таких извращений... ;-)
78 - 15.03.2013 - 22:32
а вообще - задолбюало меня програмимить за 30 лет.
еще сегодня узнал - близкий товарищ умер.
капец полный.
просто жпс.
79 - 15.03.2013 - 22:41
(78) Думаешь, что-то другое за 30 лет не задолбало бы?
80 - 15.03.2013 - 22:45
(79) ну конечно если каждый день...
.
главное. чтобы смысл в этом был. а я когда работу делаю, смысла которой не вижу - я зверею. особенно когда ошибку делает один муй, а ипсравлять приходится другому мую, т.е. мне ;-) эти смыслы у меня вышимбают охоту работать раз в 10 сильнее... а раз работать неоохота раз в 10 сильнее - т мотивация сделать это д.б. нехреновая.. но всем ПОХРЕН.


К списку вопросов






Copyright ©, Все права защищены