|
v7: платформа 7.7 - моя любовь, да-да!!! (д...ые запросы) | ☑ | ||
---|---|---|---|---|
0
e-9
16.07.14
✎
10:51
|
Простейший запрос (привожу целиков всю функцию, где он отрабатывает):
//********************** Функция ЗапросСотрудников() Перем ТекстЗапроса; ЗапСотр = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(СотрудникиПодразделения) |ТабНомер = Справочник.Сотрудники.Код; |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент; |Подр = Справочник.Сотрудники.Подразделение; |Группировка Сотрудник без групп; |"//}}ЗАПРОС ; Если (Подразделение.Выбран()=1) Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(Подр В Подразделение);"; КонецЕсли; Если (Расч.Выбран()=1) Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(Сотрудник В Расч);"; КонецЕсли; Если (ЗапСотр.Выполнить(ТекстЗапроса)=1) Тогда ТЗСотр = СоздатьОбъект("ТаблицаЗначений"); Если (ЗапСотр.Выгрузить(ТЗСотр,1,0)=1) Тогда сообщить("вроде ок"); Пока ЗапСотр.Группировка(1)=1 Цикл Сообщить(ЗапСотр.ТабНомер+ЗапСотр.Сотрудник+ЗапСотр.Подр); КонецЦикла; Возврат 1; КонецЕсли; КонецЕсли; Возврат 0; КонецФункции //********************** Несколько дней назад он работал, как надо - сотрудники выбранного в форме подразделения выгружались в ТЗСотр (как и ЗапСотр, объявлена в модуле формы), в другой процедуре подгружались в многострочную часть документа и все были счастливы. Потом я отвлекся на другую задачу, только причесал эту функцию - просто удалил некоторые лишние, уже ранее закомментированные строки в запросе. Наконец, вернулся к доделке этой задачи (будет сие творение табелем, в итоге) - НЕ ПРЕТ! А именно - если НЕ указывать в форме Подразделение или Расч(етчика), то благополучно выводятся все сотрудники. Но если указать Подразделение или Расч, то... Даже не знаю, что происходит. Иногда выводится один какой-нибудь человечек (хотя в подразделении их десятки), но в основном - никого. Хотя получаю сообщение "вроде ок" - см. функцию. А вот дальнейший перебор результатов запроса не происходит... Но люди точно никуда не девались, данные все те же!!! Это зависит от фаз луны??? |
|||
1
tdm
16.07.14
✎
10:53
|
в начало выборки(вашем случае ТЗ) вроде в 7-ке нужно позиционироваться
|
|||
2
DeiMos
16.07.14
✎
10:55
|
SQL?
|
|||
3
DmitriyDI
16.07.14
✎
10:57
|
Подразделение и Расч это Список значений ? тогда почему выбран попробуйте
Если ПустоеЗначение(Расч)=0 Тогда и Если ПустоеЗначение(Подразделение)=0 Тогда |
|||
4
ivanov-i-i
16.07.14
✎
11:04
|
Когда ты выбираешь в Расч конкретного сотрудника, а Подр не заполнено, то у тебя и выводит одного сотрудника с его подразделением. Если указал конкретное подразделение, то, если оно совпало с подразделением выбранного сотрудника, тогда есть результат, если нет - тогда пусто. Подумай над переменной "Расч" - что это у тебя.
|
|||
5
e-9
16.07.14
✎
11:12
|
(ого, как тут оперативно!!:))
(1) не было у меня никакого явного позиционирования в начало выборки, и все работало; однако ж, для очистки совести, добавил следующий код ПЕРЕД началом перебора строк запроса (Пока ЗапСотр.Группировка(1)=1 Цикл): //******** Если (ЗапСотр.вНачалоВыборки()=1) Тогда сообщить("я вернулся!"); КонецЕсли; //******** чуда не произошло - по-прежнему запрос пуст, либо дает одного человечка (смотря какое подразделение выбрано) (2) нет, файловая (3) у меня все работало и с Выбран(), какая разница? в Отладчике вижу, что условие выполняется либо не выполняется, как требуется (4) в Расч выбирается не конкретный сотрудник, а группа справочника Сотрудники. Собственно, сейчас у нас на предприятии вообще всего две группы - "Уволенные" и "<Фамилия расчетчика>". И, кроме того, запрос тупит, даже если Расч и не выбран |
|||
6
tdm
16.07.14
✎
11:15
|
(5) Сотрудники.Подразделение - это периодический реквизит(( думаю вам надо к (3) прислушаться
|
|||
7
e-9
16.07.14
✎
11:25
|
(6) прислушался - никаких изменений. Все один в один, как было((...
Насчет того, что периодический - у меня тоже была мысль, что как-то с этим связано. Но КАК??????? Данные не менялись (работаю с тестовой, даже сделал откат на те данные когда точно работало), за время от того момента, когда запрос работал, до того, как перестал, модифицировалась незначительно парочка модулей, никак не связанных с этим документом... Да, еще - переехали в другой кабинет. Могло повлиять?:) Я всего от семерки ожидаю. |
|||
8
e-9
16.07.14
✎
11:32
|
Чтобы не быть голословным - вот измененная функция:
//******************************************* Функция ЗапросСотрудников() Перем ТекстЗапроса; ЗапСотр = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(СотрудникиПодразделения) |ТабНомер = Справочник.Сотрудники.Код; |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент; |Подр = Справочник.Сотрудники.Подразделение; |Группировка Сотрудник без групп; |"//}}ЗАПРОС ; //Если (Подразделение.Выбран()=1) Тогда Если (ПустоеЗначение(Подразделение)=0) Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(Подр В Подразделение);"; КонецЕсли; //Если (Расч.Выбран()=1) Тогда Если (ПустоеЗначение(Расч)=0) Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(Сотрудник В Расч);"; КонецЕсли; Если (ЗапСотр.Выполнить(ТекстЗапроса)=1) Тогда ТЗСотр = СоздатьОбъект("ТаблицаЗначений"); Если (ЗапСотр.Выгрузить(ТЗСотр,1,0)=1) Тогда ЗагрузитьТабличнуюЧасть(ТЗСотр); //Возврат 1; КонецЕсли; КонецЕсли; Возврат 0; КонецФункции //******************************************* ...убрал отладочный перебор записей запроса - все это ботва ненужная; после выгрузки результатов запроса в тз, из нее загружается многострочная часть: ЗагрузитьТабличнуюЧасть(ТЗСотр); Повторюсь: если не указаны ни расчетчик, ни подразделение - то ВСЕ сотрудники благополучно перекочовывают в многострочную часть; если что-то указать, начинается мистика |
|||
9
ADirks
16.07.14
✎
11:35
|
Периодика в семёрке - злое зло.
Попробуй всёж в запросе написать Период с ДатаПериодики по ДатаПериодики; |
|||
10
aka AMIGO
16.07.14
✎
11:38
|
переиндексировать базу еще не советовали?
иногда помогает.. |
|||
11
пипец
16.07.14
✎
11:41
|
Периодика берется на конец запроса ... если есть группировки то может быть ОЙ
ЗЫ смотри смысл своей периодики |
|||
12
aka AMIGO
16.07.14
✎
11:45
|
кстати, в отладчике можно глянуть, что там есть в СЗ "Расч"
|
|||
13
DmitriyDI
16.07.14
✎
11:50
|
(12) ну да и еще что там в ТЗСотр.ВЫбратьСтроку()
|
|||
14
e-9
16.07.14
✎
11:51
|
(9) ПОМОГЛО!
|Период С {НачМесяца(РабочаяДата())} По {КонМесяца(РабочаяДата())}; (но почему раньше не требовалось????) счас еще попробую убрать периодику и переиндексацию сделать - самому интересно (12) там все как надо (13) затык был на этапе запроса - см. первый пост |
|||
15
DmitriyDI
16.07.14
✎
11:53
|
(14) ничего не даст переиндексация, ему прост надо дату на которую выбирать значение
|
|||
16
e-9
16.07.14
✎
11:55
|
(15) но ведь раньше ему не надо было эту дату
запрос генерировался изнчально с помощью конструктора - никакую периодику конструктор в конечный текст запроса к справочникам не добавляет |
|||
17
КонецЦикла
16.07.14
✎
11:55
|
(14) >>(но почему раньше не требовалось????)
Dозможно не было условия по подразделению либо периодики Ваш КЭП. |
|||
18
e-9
16.07.14
✎
11:59
|
(17) условия были все те же, и по подразделению, и по расчетчику. А что значит ...либо периодики"? в каком смысле ее не было? в запросе - да, не была прописана, и все работало. О чем и речь.
(сдуру поставил полное тестирование и исправление - это надолго...) |
|||
19
aka AMIGO
16.07.14
✎
12:02
|
(16) добавляет.. просто ты во-время убрал галку :)
|
|||
20
aka AMIGO
16.07.14
✎
12:03
|
(18) извини, это я виноват, что подтолкнул тебя к ТИИ
зы. больше не буду :) |
|||
21
e-9
16.07.14
✎
12:03
|
(ппц...коллеги, если я прибью семерку во время проверки физической целостности - проблем не будет? а то завис на одном документе...)
|
|||
22
e-9
16.07.14
✎
12:06
|
хотя, все равно тестовая - прибил.
(20) меня ж никто не толкал ВСЕ галки ставить попытка №2 |
|||
23
ADirks
16.07.14
✎
12:12
|
(14) потому что периодика такая периодика
она вообще странная, а в запросах ещё страньше (20) кстати, хорошая мысль: на любой вопрос по семёрке первым делом предлагать ТИИ. Автор немедля уходит в астрал, и просветляется :)) (21) скачай http://infostart.ru/public/14645/ полезная штука |
|||
24
e-9
16.07.14
✎
12:14
|
итак, реиндексация не помогла
(9) ADirks - большое спасибо! (3)(6) остался осадок, что я чего-то "не догоняю": коллеги, может, разжуете, как, в смысле работы с периодическими реквизитами, отличаются Выбран() и ПустоеЗначение()??? Я все ж оставил привычный вариант с Выбран() - он работает, причем во всех местах конфигурации (правда, уже давно и глубоко нетиповой) используется именно такая зюзя... |
|||
25
e-9
16.07.14
✎
12:24
|
и, да:
(19) галку оставляю - см. https://yadi.sk/i/jAHWYXrtWhXKd и все равно периодика не добавляется в конечный текст запроса^ ТекстЗапроса = "//{{ЗАПРОС(тестттт) |ТекущийЭлемент = Справочник.Сотрудники.ТекущийЭлемент; |Наименование = Справочник.Сотрудники.Наименование; |Группировка ТекущийЭлемент без групп; |"//}}ЗАПРОС ; (я не зануда:) просто до сих пор был счастливым кодером на нормальных языках в нормальных средах) |
|||
26
aka AMIGO
16.07.14
✎
12:58
|
(25) не вижу галки!! - самая первая строка в диалоге - пустой квадратик.. вот и нет периодики
|
|||
27
DrZombi
гуру
16.07.14
✎
13:08
|
(24) >>> отличаются Выбран() и ПустоеЗначение()???
Да они никак не отличаются. Все дело в скорости. Выбран() - Работает дольше, Чем ПустоеЗначение() - Работает быстрее, но может пропустить битую ссылку на Объект (Справочник, Документ) + Периодические реквизиты лучше получать все же на конкретную дату... И Это 1С, версия 7.7 или 8.х... ни важно там и там есть моменты, о которых нужно просто знать, их нельзя Понять :) |
|||
28
пипец
16.07.14
✎
13:38
|
(27) отличаются , ртфм
|
|||
29
КонецЦикла
16.07.14
✎
13:42
|
||||
30
Ясный перец
16.07.14
✎
13:47
|
(29) Немного не о том ;)
|
|||
31
e-9
16.07.14
✎
16:08
|
(26) "а он есть" (с)
Первая галко вообще не по теме - см. внимательнее (30) в принципе, как раз о том: [q]Как найти битую ссылку? Если (ПустоеЗначение(Док.Докум) = 0) и (Док.Докум.Выбран() = 0) Тогда Сообщить("В документе " + Док + " есть битая ссылка"); КонецЕсли; [/q] (так что правильно, что у меня везде используется Выбран()) |
|||
32
Ёпрст
16.07.14
✎
16:12
|
(31) не угадал.
|
|||
33
Ёпрст
16.07.14
✎
16:13
|
Если в базе нет битых ссылок, то Выбран..в разы медленее, чем проверка на пустое значение
|
|||
34
e-9
16.07.14
✎
17:10
|
(33) а если они есть?
в разы - т.е., вместо 1 миллисекунды - 10? |
|||
35
Ёпрст
16.07.14
✎
17:36
|
(34) гораздо медленнее, особенно заметно в sql базе
|
|||
36
lavalit
23.07.14
✎
20:03
|
А где извиняюся строка
Запрос.Выполнить(ТекстЗапроса) ??? конечно запрос будет пустой. |
|||
37
ДенисЧ
23.07.14
✎
20:04
|
(36) Если (ЗапСотр.Выполнить(ТекстЗапроса)=1) Тогда
|
|||
38
lavalit
23.07.14
✎
20:05
|
а нет сори есть ... не углядел сразу))
|
|||
39
e-9
29.07.14
✎
12:21
|
Ёпрст, почему-то в нашем сегодняшнем общении в теме
можно ли в запросе (и как) отследить временно перемещенных в др. подразделение? меня "забанили"... Реально - как только открываю эту тему, оказываюсь не авторизованным! Модераторы, в чем дело? Там все по теме, бз флуда и прочих нарушений. Поэтому пока продолжу тут:) Итак, по теме можно ли в запросе (и как) отследить временно перемещенных в др. подразделение? (45) Именно это было первой моей мыслью. Но сразу же начинаюся вопросы: 1. при этом окажуться пропущенными те сотрудники, которые НЕ были в подразделении на начало периода, но были потом. 2. За какой период перебирать КадровыеПеремещения, чтобы наверняка ничего не упустить (ну, тут можно, конечно, сделать вполне приемлемые допущения)? Вообще, в данном случае, ввиду еще и таких нюансов, как прием/увольнение, уход/выход из декретного в течение периода - оптимальнее прямой перебор. (46) смешно. В выборку попадают ТОЛЬКО те сотрудники, которые оказались в подразделении либо кадровым перемещением, либо были приняты на работу в течение периода с Начало по Окончание. "ШТАТНЫЕ" сотрудники (т.е. те которые были приняты давно и никуда не перемещались) подразделений в выборку не попадают. Ни для какого подразделения. Я правильно догадался, что объект Периодический берет только данные, которые вообще ИЗМЕНЯЛИСЬ внутри заданного интервала времени? |
|||
40
1Сергей
29.07.14
✎
13:34
|
ТА, видимо, сдвинули
|
|||
41
e-9
29.07.14
✎
13:50
|
(40) не трогали
|
|||
42
1Сергей
29.07.14
✎
13:54
|
(41) и чему оно ровно сейчас?
|
|||
43
e-9
29.07.14
✎
14:02
|
(42) тому же, что и ранее - 31.07.14
|
|||
44
uno-group
29.07.14
✎
14:03
|
Переодинка берется на момен конца запроса. у тебя нет групировок по подразделению в Тзкогда выгружаеш и доп переменые поидее оно поподает в запрос недолжно
|
|||
45
uno-group
29.07.14
✎
14:05
|
Если Подразделение выбран и ...
ненужно достаточно просто подразделение в выбподразделение. когда оно не выбрано туда и так все войдет. аналогично с сотрудник |
|||
46
uno-group
29.07.14
✎
14:06
|
можно еще добавить групировку день тогда тебе попадут все сотрудники которые в указаный период были в выбраном подразделении хотя бы день
|
|||
47
Neg
29.07.14
✎
14:13
|
(43) Тебе это приснилось, забудь.
|
|||
48
Ёпрст
29.07.14
✎
15:04
|
(39) я те там написал новую версию, проверяй.
|
|||
49
e-9
29.07.14
✎
15:16
|
(48) так я в (39) и откликнулся на новую версию:)
(47) спокойной ночи (44-46) см. в другой, упомянутой выше теме - там с группировкой день уже пытались |
|||
50
Ёпрст
29.07.14
✎
16:02
|
(49) Тебе нужно не пропустить кого-то на начало периода ?
Дык, тупо либо ОбратныйПорядок(1) и перебор периодических значений без даты, либо еще одно условие на граничную начальную дату в функцию.. усё. |
|||
51
Ёпрст
29.07.14
✎
16:04
|
И да .. периодический - это тупо прямое позиционирование в табличке 1сконст.. бегает по записям периодики.
В функцию, воткни еще проверку на дату начала и привет |
|||
52
Ёпрст
29.07.14
✎
16:05
|
Функция Вася(Сотрудник)
Периодический = СоздатьОбъект("Периодический"); Периодический.ИспользоватьОбъект("Подразделение",Сотрудник); Периодический.ВыбратьЗначения(НачДата,КонДата); Пока Периодический.ПолучитьЗначение()=1 Цикл Если Периодический.Значение = ВыбПодразделение Тогда Возврат 1; КонецЕсли; КонецЦикла; Если Сотрудник.Подразделение.Получить(НачДата)= ВыбПодразделение Тогда Возврат 1; КонецЕсли; Возврат 0; КонецФункции |
|||
53
Ёпрст
29.07.14
✎
16:06
|
Только, лучше так:
Функция Вася(Сотрудник) Периодический = СоздатьОбъект("Периодический"); Периодический.ИспользоватьОбъект("Подразделение",Сотрудник); Периодический.ОбратныйПорядок(1); Периодический.ВыбратьЗначения(НачДата,КонДата); Пока Периодический.ПолучитьЗначение()=1 Цикл Если Периодический.Значение = ВыбПодразделение Тогда Возврат 1; КонецЕсли; КонецЦикла; Если Сотрудник.Подразделение.Получить(НачДата)= ВыбПодразделение Тогда Возврат 1; КонецЕсли; Возврат 0; КонецФункции |
|||
54
DmitriyDI
29.07.14
✎
16:08
|
(39) это не бан, это глюк мисты
|
|||
55
e-9
29.07.14
✎
16:38
|
(53) да, похоже, это то! Жму наши мужественные руки!!;)
На самом деле, за удачный пример с объектом "Периодический" - спасибо, не дошел еще до этого объекта. (Вообще, теперь меня в запросе удивляет один момент - вроде бы в запросе указали "Период С НачДата По КонДата". Как уже упоминали многие, периодика работает на конец указанного периода - т.е., запрос вроде бы должен в любом случае отсечь всех, кто в конце периода был не в указанном подразделении, независимо от того, что прописано в "Условие(...)"...но ладно, пусть его). Как бы то ни было, в контексте моей задачи, оставлю все же прямой перебор - мне ведь надо не просто знать, какие сотрудники "засветились" в подразделении за месяц - но и знать, в какие именно дни. Можно, конечно, по выбранным в запросе сотрудникам пробежаться, уже по каждому дню - но что-то мне подсказывает, что в совокупности все это будет весьма не быстро....уже сейчас, этот запрос ощутимо притормаживает и работает медленнее, чем весь мой табель, начиная с перебора всех сотрудников и заканчивая перебором их записей в журнале Зарплата. |
|||
56
Ёпрст
29.07.14
✎
16:50
|
(55) На счет дней, тоже можно слепить..и в этом же запросе
|
|||
57
Ёпрст
29.07.14
✎
16:51
|
тебе дату установки долности надо иметь в этом запросе ?
|
|||
58
Ёпрст
29.07.14
✎
16:56
|
//======================================================================
Функция Вася(Сотрудник) Периодический = СоздатьОбъект("Периодический"); Периодический.ИспользоватьОбъект("Подразделение",Сотрудник); Периодический.ОбратныйПорядок(1); Периодический.ВыбратьЗначения(,КонДата); Пока Периодический.ПолучитьЗначение()=1 Цикл Если Периодический.Значение = ВыбПодразделение Тогда Возврат 0+Периодический.ДатаЗнач; КонецЕсли; КонецЦикла; //Если Сотрудник.Подразделение.Получить(НачДата)= ВыбПодразделение Тогда // Возврат 1; //КонецЕсли; Возврат 0; КонецФункции Процедура Сформировать() Перем ТЗ; СписокСотрудников = СоздатьОбъект("СписокЗначений"); Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса =" |Период с НачДата По КонДата; |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент; |Подразделение = Справочник.Сотрудники.Подразделение; |Функция ДатаУстановки = Сумма(Вася(Сотрудник)); |Условие (Вася(Сотрудник)<>0); |Группировка Сотрудник; |"; Запрос = СоздатьОбъект("Запрос"); Запрос.Выполнить(ТекстЗапроса); Запрос.Выгрузить(ТЗ,1,0); ТЗ.УстановитьПараметрыКолонки("ДатаУстановки","Дата"); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
59
e-9
29.07.14
✎
17:03
|
хм...уже не стану проверять, но мне кажется, там будет засада, если в течение периода человек не единожды будет направлен в подразделение (например,помыл посудку в Столовой пару дней, потом адынэс попрограммировал, потом опять в Столовую:))
опять же, надо не только дату установки, но и дату окончания временной должности... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |