Имя: Пароль:
1C
1C 7.7
v7: можно ли в запросе (и как) отследить временно перемещенных в др. подразделение?
,
0 e-9
 
25.07.14
16:04
Есть документ КадровыеПеремещения, которым, "в связи с производственной необходимостью", сотрудник на некий период с Начало по Окончание приписывается к другому подразделению. Делается это в обработке проведения так:
//*****
    УстановитьРеквизитСправочника(Сотрудник,"Подразделение",ПодразделениеНовое,Начало);
    УстановитьРеквизитСправочника(Сотрудник,"Подразделение",ПодразделениеСтарое,Окончание+1);

В конце месяца формируются табели отработанного времени ПО ПОДРАЗДЕЛЕНИЯМ. Т.е., необходимо, чтобы такой человек попал в ОБА табеля.
Если делать такой запрос:
//*****
    ТекстЗапроса =
    "//{{ЗАПРОС(СотрудникиПодразделения)
    |Период С {НачМесяца(ДатаДок)} По {КонМесяца(ДатаДок)};
    |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
    |Подр = Справочник.Сотрудники.Подразделение;
    |Группировка Сотр без групп;
    |Условие(Подр В Подразделение);
    |"//}}ЗАПРОС
    ;
то в него попадают только те, у кого на КОНЕЦ месяца Подразделение равно заданному. Т.е., например: если сотрудник был в "Бухгалтерии", его отправили на пару дней (с 30-го по 31-е) мыть посуду ("Столовая"), то этот человек попадет в табель для Столовой, а в табеле по Бухгалтерии его не будет. ЧД???
п.с. Насчет, кстати, периодики - кто-то может спросить "нафига периодика в запросе к СПРАВОЧНИКУ"; вот заранее ответ:
платформа 7.7 - моя любовь, да-да!!! (д...ые запросы)
1 e-9
 
25.07.14
16:04
прст!!...я вроде в ветке v7 создавал - почему в v8 попало???
речь идет о семерке
2 ДенисЧ
 
25.07.14
16:05
31 запрос на каждый день.
Ибо значения периодики берутся на конец периода отчета
3 Wobland
 
25.07.14
16:08
(2) наконец-то! семёрка - лох?
4 ДенисЧ
 
25.07.14
16:09
(3) Ты кого семёркой назвал???
5 Ёпрст
 
25.07.14
16:10
(2) та ну... не наш метод :)

(0) ежели группировка по подразделению не важна, а важно получить только сотрудника, то всё можно сделать в одном чорном запросе.
6 e-9
 
25.07.14
16:10
"31 запрос на каждый день"
это что, шутка???
7 e-9
 
25.07.14
16:11
(5) я пытался через Группировка День Все - не оно?)
8 e-9
 
25.07.14
16:17
...
(2) это что, значит,
Период С {НачМесяца(ДатаДок)} По {КонМесяца(ДатаДок)}
равносильно
Период С {КонМесяца(ДатаДок)} По {КонМесяца(ДатаДок)}
?????????
9 Wobland
 
25.07.14
16:17
(4) будешь вредничать - клюшками обзову ;)
10 ДенисЧ
 
25.07.14
16:20
(8) Нет. Только для периодических.
11 e-9
 
25.07.14
16:23
(3,4,9) хватит заигрывать в моей теме, извращенцы
вроде вот, получилось:
    ТекстЗапроса =
    "//{{ЗАПРОС(СотрудникиПодразделения)
    |Период С {НачМесяца(ДатаДок)} По {КонМесяца(ДатаДок)};
    |Обрабатывать НеПомеченныеНаУдаление;
    |ТабНомер = Справочник.Сотрудники.Код;
    |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
    |Подр = Справочник.Сотрудники.Подразделение;
    |Группировка Сотр;
    |Группировка День все вошедшиевзапрос;
    |"//}}ЗАПРОС
    ;
12 e-9
 
25.07.14
16:24
(11) тьфу, фальстарт
по прежнему чел не обнаруживается в подразделении, в котором он не был в конце месяца:(((
(5) ну че, сказать-то сказал, а подсказать слабо?:)
13 e-9
 
25.07.14
16:35
скажите уже приговор
(так все красиво было: запросом брал сотрудников подразделения, выгружал запрос в тз, добавлял в нее колонки дней месяца, заполнял их часами из графика работы, ворошил записи журнала зарплата на предмет отклонений - конфетка!...
и тут, бац! "а как вы тут сделали, чтобы сотрудник в двух подразделениях в табель выводился?" - "????!!" - "ну а как же - бывает кадровое перемещение, в любой момент среди месяца...")
....через запросы, и без всяких 1с++, никак? (31 запрос не вариант, понятно)
14 Ёпрст
 
25.07.14
16:53
(12) условие Подразделение.Получить(Запрос.День) в СписокПодразделений
15 Ёпрст
 
25.07.14
16:53
только вот группировку по подразделению не слепишь таким образом
16 e-9
 
25.07.14
17:03
//***
ТекстЗапроса =
    "//{{ЗАПРОС(СотрудникиПодразделения)
    |Период С {НачМесяца(ДатаДок)} По {КонМесяца(ДатаДок)};
    |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
    |Подр = Справочник.Сотрудники.Подразделение;
    |Группировка Сотр без групп;
    |Группировка День все вошедшиевзапрос;
    |Условие(Подр.Получить(Запрос.День) В Подразделение);";
    |"//}}ЗАПРОС

Вываливается ошибка:
Ожидается имя переменной или ее составляющая перед 'День'
17 ДенисЧ
 
25.07.14
17:03
(16) А переменная запроса как у тебя называется?
18 e-9
 
25.07.14
17:06
(17) ЗапСотр - но я сразу пробовал ЗапСотр.День, не прокатило
19 e-9
 
25.07.14
17:06
+(18) с той же ошибкой
20 Ёпрст
 
25.07.14
17:16
|Условие(Сотр.Подразделение.Получить(ЗапСотр.День) В Подразделение);";
21 e-9
 
25.07.14
17:20
(20) и? ругань-то идет на переменную перед День
то же самое, короче
22 Ёпрст
 
25.07.14
17:22
(21) покажи как создаешь объект Запрос в коде
23 e-9
 
25.07.14
17:22
а если вообще просто использовать "День" - то: Ошибка в выражении 'День'
Вообще-то есть разведданные о том, что с днем, указанным в группировке, можно так вольно обращаться???? Или просто наугад?
24 e-9
 
25.07.14
17:24
ЗапСотр = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(СотрудникиПодразделения)
    |Период С {НачМесяца(ДатаДок)} По {КонМесяца(ДатаДок)};
    |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
    |Подр = Справочник.Сотрудники.Подразделение;
    |Группировка Сотр без групп;
    |Группировка День все вошедшиевзапрос;
    |"//}}ЗАПРОС
    ;

    Если (Подразделение.Выбран()=1) Тогда
        ТекстЗапроса = ТекстЗапроса+"
        |Условие(Сотр.Подразделение.Получить(ЗапСотр.День) В Подразделение);";
    КонецЕсли;

    Если (ЗапСотр.Выполнить(ТекстЗапроса)=1) Тогда
        Пока (ЗапСотр.Группировка("Сотр")=1) Цикл
        Пока (ЗапСотр.Группировка("День")=1) Цикл
            сообщить(""+ ЗапСотр.ЗначениеГруппировки("День") + СимволТабуляции + ЗапСотр.Подр + СимволТабуляции + ЗапСотр.Сотр);
        КонецЦикла;
        КонецЦикла;
    КонецЕсли;
25 Ёпрст
 
25.07.14
17:34
(24)
|Условие(Сотр.Подразделение.Получить(ЗапСотр.НачалоПериода()) В Подразделение);";
26 an-korot
 
25.07.14
17:41
запросом это не сделаешь.
делай перебор справочника.
27 an-korot
 
25.07.14
17:42
(26) вернее сделаешь но только если по 1 дню шагать будешь. это тебе не восмерка.
28 e-9
 
25.07.14
17:43
(25)нет
(26,27) я уже понял((( все переделываю(((((((((
29 Ёпрст
 
25.07.14
17:53
(28) че нет ?
всё работает
30 Ёпрст
 
25.07.14
17:56
на форме НачДата,КонДата - элементы диалога с типом Дата,
ВыбПодразделение - тип Справочник.Подразделения

наслаждайся

Процедура Сформировать()
    Перем ТЗ;
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса ="
    |Период с НачДата По КонДата;
    |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
    |Условие (Сотрудник.Подразделение.Получить(Запрос.НачалоПериода()) в ВыбПодразделение);
    |Группировка День все ВошедшиеВЗапрос;
    |Группировка Сотрудник;
    |";
    Запрос = СоздатьОбъект("Запрос");
    Запрос.Выполнить(ТекстЗапроса);
    Запрос.Выгрузить(ТЗ);
    ТЗ.ВыбратьСтроку();
КонецПроцедуры
31 e-9
 
25.07.14
18:05
(30) последовательно вываливается:
https://yadi.sk/i/cYOuXIpLXKzkW
https://yadi.sk/i/YU01YSveXKzqw
32 e-9
 
25.07.14
18:06
33 an-korot
 
25.07.14
18:11
(31) попробуй |Условие (Сотрудник.Подразделение.Получить(НачалоПериода()) в ВыбПодразделение);
34 an-korot
 
25.07.14
18:16
(32) правильно и не получится что мы тупим, это функция команды запроса, а не функция языка запроса, понимашь?
кстати не первый раз епрст нерабочий код дает и сваливает :(
сделай перебор и не парься.
35 e-9
 
28.07.14
17:51
(34) ВОИСТИНУ ТАК!!!
Завещаю всем, кто пойдет по стопам моим (от программирования в нормальных системах к 1с семерке) - ф топку ее запросы!!!!
Я-то, гордец, думал - мои предшественники просто не умеют запросами пользоваться, тупой перебор везде налепили...
А как сам попытался в запросах учесть все нюансы за период (прием/увольнение в середине него, декретные отпуска и, наконец, временные кадровые перемещения)...Не, запросы ну никак не прокатывают.
И кстати: прямой перебор достаточно шустро работает!:)
36 Ёпрст
 
29.07.14
09:04
(31) п..ц
Копипасте отменили ужо ?
Скопируй как в  (30) без своего лисапеда

(34) не свисти.
37 Ёпрст
 
29.07.14
09:04
И покажи хоть одну ветку с неправильным запросом
38 e-9
 
29.07.14
09:59
(36) откуда копипасте, с модального окошка?
внимательнее, епрст, надо быть....:)
не фунциклировало. (34) правильно говорит: "мы тупим, это функция команды запроса, а не функция языка запроса,"
39 e-9
 
29.07.14
10:01
а правильнее - "метод" запроса
40 Ёпрст
 
29.07.14
10:13
(38) еще раз, код в (30) - рабочий, скопируй его из этого поста целиком, без своего г..кода.
Твои ошибки - в картинках, это не мой код.
41 Ёпрст
 
29.07.14
10:17
Для тех, кто не умеет пользоваться копипасте, проверяй


http://www.webfile.ru/f78374f5b9148756d82e1836c2113369
42 e-9
 
29.07.14
10:34
дорогой наш Ёпрст! никто не сомневается в твоем непревзойденном мастерстве и гениальности твоего великого кода!....
Но... вне контекста моего г...кода - нафига кому нужен твой шедевр???
Да, я попробовал скопипастить и запустить на очищенной от моего мерзкого контента форме - работает. Но... ровно с той же пользой, что и мой отвратительный запрос - а именно, он выбирает сотрудников только НА НАЧАЛО месяца. Если кого-то в середине месяца переместили на время из другого подразделение в нужное нам - запрос его не выведет, увы...
И стОило так напрягаться, и напрягать занятых людей проверять твои уникальные творения???
43 Ёпрст
 
29.07.14
10:42
(42) уже лучше, запрос всё же работает, но не так как ты ожидал ? Это поправимо
44 e-9
 
29.07.14
10:53
оптимист, однако:)
нет уж, с меня хватит. Я уже переделал на перебор, заточил под этот вариант остальные процедуры/функции.
100% перебора по дням не избежать, даже с запросами. Но уж лучше перебрать вручную весь справочник (кроме тех, кто в папке Уволенные) сотрудников и по каждому из них, на каждый день месяца получить подразделение - чем на каждый день месяца запрос выполнять.
45 VladZ
 
29.07.14
10:53
(0) Алгоритм должен быть следующий:
1. Получить сотрудников с должностями на начало периода по твоему запросу.

2. Получить изменения должности по документам КадровыеПеремещения за нужный период.
46 Ёпрст
 
29.07.14
11:04
(44)
//======================================================================
Функция Вася(Сотрудник)
    Периодический = СоздатьОбъект("Периодический");
    Периодический.ИспользоватьОбъект("Подразделение",Сотрудник);
    Периодический.ВыбратьЗначения(НачДата,КонДата);
    Пока Периодический.ПолучитьЗначение()=1 Цикл
        Если Периодический.Значение = ВыбПодразделение Тогда
            Возврат 1;
        КонецЕсли;
    КонецЦикла;
    Возврат 0;
КонецФункции
Процедура Сформировать()
    Перем ТЗ;
    СписокСотрудников = СоздатьОбъект("СписокЗначений");

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса ="
    |Период с НачДата По КонДата;
    |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
    |Подразделение = Справочник.Сотрудники.Подразделение;
    |Условие (Вася(Сотрудник)=1);
    |Группировка Сотрудник;
    |";
    Запрос = СоздатьОбъект("Запрос");
    Запрос.Выполнить(ТекстЗапроса);
    Запрос.Выгрузить(ТЗ,1,0);
    ТЗ.ВыбратьСтроку();
КонецПроцедуры
Программист всегда исправляет последнюю ошибку.