Имя: Пароль:
1C
1C 7.7
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
хм...уже не стану проверять, но мне кажется, там будет засада, если в течение периода человек не единожды будет направлен в подразделение (например,помыл посудку в Столовой пару дней, потом адынэс попрограммировал, потом опять в Столовую:))
опять же, надо не только дату установки, но и дату окончания временной должности...
AdBlock убивает бесплатный контент. 1Сергей