Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   7.7 Таблица значений. И в чем я туплю? (http://forums.kuban.ru/f1040/7_7_tablica_znachenij_i_v_chem_ya_tuplyu-3863001.html)

victuan 14.03.2013 13:06

Нет смысла в методе [B]НайтиЗначение [/B]при Стр<>0.

Buhta 14.03.2013 13:55

41-victuan > вопрос не в смысле, а в том, что не соответствует описанию...

VZ 14.03.2013 13:59

42-Buhta >соответствует.

Ткачик 14.03.2013 17:23

СП купить еще не предлагали? Странно...

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

То есть: после "Стр=5, потом Стр=Стр+1" поиск будет осуществляться только в 6-й строке. И "Стр=6" при этом выглядит вполне логично.

EarlyBird 14.03.2013 17:35

объясните, зачем искать, например, значение в 5-ой строке, в колонке "Контрагент" ?
какого результата вы ждёте от поиска?
зачем искать то, что итак лежит известно где?

Buhta 14.03.2013 17:40

44-Ткачик > это кому? если мне, то я там и читаю, см (16) и абсолютно не спорю с тем, что Стр=6:) это тут некоторые уже и про пиво спорили и т.п... меня как раз смущает тот факт, что "поиск будет осуществляться [b]только по указанной строке"[/b] и при этом поиск выдает =1, хотя сотрудник в строке 6 совсем уже другой...

Buhta 14.03.2013 17:46

45-Ирли Бёрд > опять про смысл? ну хотела таким образом перебор строк сделать до того момента, когда сменится сотрудник, т.к. таблица отсортирована. т.е. предполагалось, что в момент смены сотрудника в очередной строке таблицы внутренний цикл прервется... но в очередной строке сотр меняется, а поиск как-бы находит старого сотра:)

victuan 14.03.2013 18:57

47-Buhta >Так не получится. НайтиЗначение ищет только первое вхождение искомого значения. Но либо среди всех строк, либо среди всех колонок. Поиск по заданной строке и заданной колонке не работает

EarlyBird 14.03.2013 19:13

47-Buhta >

ТекСотрудник = "";
i=0;
Пока i < ТЗ.КоличествоСтрок() Цикл
i=i+1;
Если ТЗ.[b]ПолучитьЗначение[/b](i, "Сотрудник") <> ТекСотрудник Тогда
Сообщить("Сменился сотрудник в строке "+i);
КонецЕсли;
КонецЦикла;

Buhta 14.03.2013 20:10

49-Ирли Бёрд > большое спасибо:) но мне как-бы просто было интересно почему не работает так, как написано в книжке и СП:)

СthuIhu 14.03.2013 20:14

а у меня работает.
может на тебя кто-то порчу навел?..

Buhta 14.03.2013 20:15

51-Cthulhu > не исключено:)

Ткачик 14.03.2013 22:00

"[em]поиск выдает =1, хотя сотрудник в строке 6 совсем уже другой...[/em]" - врет, как бухгалтер программисту!

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

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

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

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

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

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

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

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

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

СthuIhu 14.03.2013 23:05

(53):
Сообщить("Стр="+Стр+"(Тип="+ТипЗначенияСтр(Стр)+"): ...

qweqwe123123 15.03.2013 07:52

(0) тут не дети. выкладывай обработку, давай ссылку на неё и номер её строки.

Ткачик 15.03.2013 09:03

(54) Кэп, это эквивалентно:

Сообщить("Номер строки ТЗ может быть только числом!")

Buhta 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;
Иначе
Прервать
КонецЕсли;
КонецЦикла;

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


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

Buhta 15.03.2013 10:47

на 25-м релизе та-же фигня

Buhta 15.03.2013 11:18

Ладно, я пошла к детям:)

Buhta 15.03.2013 13:05

Ну и? у кого код (57) соответствует описанию, т.е. тому, что [b]"только по указанной строке."[/b]? или у всех тоже порча?;)

Buhta 15.03.2013 15:44

люди!!! (или не люди?) снимите порчу! восстановите ауру! а то мну даже тут на работу в качестве астролога/телепатки и специалиста по другим интимным вопросам не берут:(
ЗЫ: у мну не работает, т.е. не соответствует описанию в конкретном случае, поэтому честно, в сответствии с некоторыми заявленными постами, я позволила купить себе пиво...

Кибер 15.03.2013 17:01

(61)(поводя манипуляторами)снимаю с тебя порчу
у меня сегодня тоже писалось, что то подобное
для справочника контрагенов поиск по ИНН+КПП,
получилось после удаления найденной строки в ТЗ;)
ну и кстати может кто подскажет: две ТЗ на форме
обработки, одна на одной закладке заполняется и отображается, а на вторй закладке в процедуре вижу
что заполняется, а на форме пустая :()

Ткачик 15.03.2013 17:28

"Снимаю. Порчу. Дорого" (с)

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

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

Можно еще с документами и перечислениями поэкспериментировать, но без пива что-то лениво...

Чучундер 15.03.2013 17:29

во первых - при работе с ТЗ, которые еще и лежат на форме - надо очень аккуратно.

Чучундер 15.03.2013 17:30

лена, там где у тебя неправильно нашлось - выведи на печать ТЗ
типа ПечатьТЗ(ТЗдляпечати) и посмотри... ну что-то сильно уменя сомнения, что в 6 строке у тебя Петров, а находит там иванова...

Кибер 15.03.2013 17:56

(64) а что там с аккуратность с ТЗ на форме?

Чучундер 15.03.2013 18:06

ну как наступишь на грабли - вспомни!

Кибер 15.03.2013 18:21

ну так я уже писал:
две ТЗ на форме
обработки, одна на одной закладке заполняется и отображается, а на вторй закладке в процедуре вижу
что заполняется, а на форме пустая :()

Buhta 15.03.2013 18:47

65-Чучундер > ну вот счас все совсем брошу и еще на печать буду выводить:) Ну даже по коду (57) не может там быть Иванова, когда туда честно Петров записан! Просто скопипасть в обработку код (57) и выводи какие захочешь таблицы на печать:) я же на уникальность своих/твоих данных не претендую;) кста, а обсудить есть что;)
63-Ткачик > Спасибо, мил. человек! Что порчу снял:) С документами и перечислениями мне тоже уже лениво, т.к. пиво кончилось:) пойду лучше что-нить поищу в своей "дамской сумочке";)

Чучундер 15.03.2013 18:51

(68) надо смотреть, что вы там "видите" и что вы там отображаете.
как вариант - "в процедуре вижу что заполняется, а на форме пустая" вставить Форма.Обновить();

Кибер 15.03.2013 19:13

(70) Спасибо за пинок, признаваться что было даже стыдно!
сосредоточился на поиске, а перед выбором в редыдущей ТЗ
не поставил ТЗ.ВыбратьСтроки()
''':(
Поыпаю пеплом центральный процессор

Кибер 15.03.2013 19:22

(71)+ Хотя когда я вызов этой процедуры вешал
на кнопку на форме она отрабатывала заполнение
:(

Чучундер 15.03.2013 19:35

(57) а что за идентификатор колонки
"Со трудник"
.
????

Buhta 15.03.2013 19:39

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

Чучундер 15.03.2013 19:44

(69) исследую, занятно...

Чучундер 15.03.2013 22:31

(74) да хз, что ты там откопала еще в особенностях функционирования ;-) может пробел несет тайный смысл? ;-0

Чучундер 15.03.2013 22:32

я на эту фичу и не натыкался ни разу.. бо видимо не дорос до таких извращений... ;-)

Чучундер 15.03.2013 22:32

а вообще - задолбюало меня програмимить за 30 лет.
еще сегодня узнал - близкий товарищ умер.
капец полный.
просто жпс.

Ткачик 15.03.2013 22:41

(78) Думаешь, что-то другое за 30 лет не задолбало бы?

Чучундер 15.03.2013 22:45

(79) ну конечно если каждый день...
.
главное. чтобы смысл в этом был. а я когда работу делаю, смысла которой не вижу - я зверею. особенно когда ошибку делает один муй, а ипсравлять приходится другому мую, т.е. мне ;-) эти смыслы у меня вышимбают охоту работать раз в 10 сильнее... а раз работать неоохота раз в 10 сильнее - т мотивация сделать это д.б. нехреновая.. но всем ПОХРЕН.


Текущее время: 14:53. Часовой пояс GMT +3.