![]() |
7.7 Таблица значений. И в чем я туплю? Решила тут покодить немного от скуки, чтоб в памяти освежить... Вопчем есть таблица значений, у которой есть колонка "Сотрудник". Задаю конкретного сотрудника, конкретный номер строки и колонку "Сотрудник". Почему мне НайтиЗначение выдает =1, если в этой строке совсем другой сотрудник? или все-таки он не только по этой строке ищет? |
поделись кодом |
ТЗ.НайтиЗначение(ЗначениеЧто,поз,"ИдентификаторКолонки") . если поз = 0 или опущен - ищется по всей ТЗ в указанной колонке. |
1-Маус > чуть попозжее, отойти надо 2-Чучундер > я в отладчике туда даже конкретную цифру ставлю, а он все-равно =1 выдает:( |
А значение поз после поиска какое? |
(3) чудес не бывает.. ;-) ты же знаешь... . давай на почту ид и пароль для тима, посмотрим тугеза ;-) |
В смысле значение переменной куда возвращается номер строки? |
так делаешь? ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Сотрудник", "Справочник.Сотрудники"); стр=0; Если ТЗ.НайтиЗначение(РеквизитНаФормеСТипомЗначенияСправочникСотрудники, стр, "Сотрудник")=1 Тогда Сообщить("Ура"); КонецЕсли; |
конкретный номер строки и конкретная колонка... как бы "чо искать та?". если координаты известны, просто получи значение. PS в переменной номера строки после поиска номер не той строки, которая была на входе. готов поспорить на пиво (не проверял, так что по честному). |
Вот типа такой код: ТабДанных=ПолучитьТаблицуДанных(); ТабПериодов=ПолучитьТаблицуПериодов(); Сотр=СоздатьОбъект("Справочник.Сотрудники"); Сотр.ВыбратьЭлементы(); Пока Сотр.ПолучитьЭлемент()=1 цикл Сотрудник=Сотр.ТекущийЭлемент(); Ном=Ном+1; ТабУ.ВывестиСекцию("Строка|Основа"); ТабПериодов.ВыбратьСтроки(); Пока ТабПериодов.ПолучитьСтроку()=1 цикл Стр=""; Период=ТабПериодов.ОтчетныйПериод; Пока ТабДанных.НайтиЗначение(Сотрудник,Стр,"Сотрудник")=1 цикл ТабДанных.ПолучитьСтрокуПоНомеру(Стр); Если ТабДанных.ОтчетныйПериод=Период тогда ТабУ.ПрисоединитьСекцию("Строка|Период"); КонецЕсли; Если (Стр+1)<=ТабПринятыхДанных.КоличествоСтрок() тогда Стр=Стр+1; Иначе Прервать; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; после того, как находит первого сотра до последней строки сотрудник уже не меняется, т.е. по внешнему циклц не переходит, хотя ТабДанных.Сотрудник = выдает совсем другого сотра... |
ищется всегда! первое! вхождение. поэтому обычно ТЗ сначала сортируем, а после нахождения первого значения уходим в перебор пока не получим другого сотра |
можно попробовать ещё удалять строку найденную из ТЗ |
и про пиво чот не понял... проспорила? |
10-Зелёный тролль > переменная "Стр" после первого нахождения должна принять конкретное значение. далее идет Стр=Стр+1 и должно искать уже по конкретному значению строки. таблицы отсортированы |
13-Buhta > не должно, если указан номер строки конкретный, тогда обнуляй переменную с именем колонки и проверяй её. а если имя колонки указано, то будет искаться первая строка ТЗ с искомым значением в указанной колонке. |
почему у меня выдает тупо ТабДанных.НайтиЗначение(Сотрудник,[b]20[/b],"Сотрудник") [b]=1[/b] а после перехода к 20-й строке ТабДанных.Сотрудник<>Сотрудник? |
"<Строка> - идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке." я что-то не так читаю? |
чему равен номер строки после того как = 1? |
17-Зелёный тролль >тот, который Стр? с Стр все в порядке |
Сортировка |
[em]Пока [b]ТабДанных[/b].НайтиЗначение(Сотрудник,Стр,"Сотрудник") =1 цикл Если (Стр+1)<=[b]ТабПринятыхДанных[/b].КоличествоСтрок() тогда Стр=Стр+1; Иначе Прервать; КонецЕсли;[/em] с меня пиво |
19-Helen1986 > на 25 релизе работает |
20-Зелёный тролль > ерунда. не исправила при копировании. читай [b]ТабДанных[/b]. Стр честно увеличивается. и ситуация (15) никуда не девается... 19-Helen1986 > куда? |
а на 27? что-то у мну кажись 25-го уже не найдется... если только однопользовательский. сейчас поищу... хотя мну воткнуть его только в старый комп можно... |
мда, нашла аж 20-й:) |
19-Helen1986 >22-Buhta > гыы. работает только если отсортирована ТЗ по колонке. с меня два пива походу. |
Перем тз; //******************************************* Процедура Сформировать() зн = 2; Стр = ""; Пока тз.НайтиЗначение(зн,стр,"Зн") = 1 Цикл тз.получитьстрокупономеру(стр); Сообщить("Стр = " + Стр + " зн = " + тз.зн + " номерстроки = " + тз.НомерСтроки); стр = стр + 1; КонецЦикла; КонецПроцедуры //******************************************* Процедура ПриОТкрытии() тз = СоздатьОбъект("ТаблицаЗначений"); тз.НоваяКОлонка("Зн"); тз.НоваяКОлонка("Зн"); тз.новаяСтрока(); тз.зн = 1; тз.новаяСтрока(); тз.зн = 2; тз.новаяСтрока(); тз.зн = 1; тз.новаяСтрока(); тз.зн = 2; тз.новаяСтрока(); тз.зн = 2; КонецПроцедуры Стр = 2 зн = 2 номерстроки = 2 |
что в общем то логично |
25-Зелёный тролль > ТабДанных.Свернуть("Сотрудник,ОтчетныйПериод",""); ТабДанных.Сортировать("Сотрудник,ОтчетныйПериод") - это не? не подходит? |
28-Buhta > значит аура у тебя не та, тренируй ауру. я вот как клиентам захожу так у них сразу всё работать начинает, даже ещё и к компу подойти не успеваю. |
Ну не знаю, что у меня с аурой... ну да ладно, есть и обходные пути. а нет ли какого-нить метода, может недокументированного, чтоб соответствие по нескольким колонкам искать? или только через "Ключ"? ЗЫ: это вообще все к тому, что 1С-ка неправильно понимает многочисленные корректировки данных ПФ по одному и тому-же сотруднику за один и тот же период, т.к. глПереписатьИзТаблицыВТаблицу тупо дополняет таблицу с корректировками... |
Все корректировки делаю [b]только[/b] в специализированных прогах ПФР. А из 1Ски что выгрузилось - то и выгрузилось, сырец, заготовка. |
31-Ткачик > да в принципе этим можно пользоваться:) если корректировки не накладываются, то все распределяется вполне прилично. последний год по всем клиентам пользують только типовыми механизмами и никаких проблем не возникало. но вот тут сильно мощщные корректировщики попались:) корректируют и корректируют - не остановить:) у ПФ крыша аж поехала и программа повисла - у них тоже многочисленные корректировки не воспринимаются:) вот и решила проверочку написать и посмотреть куда и как ложится и что с этим теперь делать... |
30-Buhta > Если хочешь иметь временную таблицу с полным функционалом по выборке, то придется отказаться от ТЗ, и применить "настоящий" формат временной таблицы. Для скуля, естественно, родные временные таблицы, для дбф-ной базы - дбф, само собой. И здесь можешь насладится всей прелестью составных индексов. Нескольких даже. Можно даже не цеплять драйверы фокспро: встроенный функционал работы с дбф по выборке и сортировке шире, чем с ТЗ изначально. P.S. Несложный фокус поможет загнать в поле дбф даже id агрегатного объекта (чтоб легко было достать стандартными способами). |
+33 дбф быстрее тз в разы. |
33-VZ > да ладно, мне уж не настолько скучно:))) ЗЫ: наверно пока переписывать механизм заполнения таблицы принятых данных не имеет смысла. но пред. корректировки (или строки с корректируемыми сотрами) из загруженных данных необходимо удалять... |
+ а насчет сабжа - я так и не поняла, почему метод не отрабатывается:( багофича 27 релиза или все-таки аура? |
почему [b]стр = ""[/b]? Должно быть [b]стр = 0[/b] |
И почему упорно игнорируется вопрос типа (4)? |
37-victuan > так тоже пробовала - не помогает. Стр после поиска так и остается, как и должно быть, т.е. напр первый раз нашло в Стр=5, потом Стр=Стр+1 ТабДанных.НайтиЗначение(Сотрудник,Стр,"Сотрудник") =1 Стр=6 и т.п. |
Текущее время: 22:09. Часовой пояс GMT +3. |