Имя: Пароль:
1C
1С v8
Как правильно проверить сотрудника на состояние? ЗУП 2.5
0 ultrannge89
 
18.11.13
07:29
Регистр ИтПодразделенияОК имеет структуру как у базы УПП Подразделения организаций, каждый сотрудник фактически находится одновременно в двух подразделениях :).
Делаю обработку, которая будет грузить табели из листа excel и формировать документ НеявкиИБолезниОрганизаций. Передаю в нее строку из листа excel.
[code]
Запрос = Новый Запрос(
"ВЫБРАТЬ
|    РаботникиОрганизаций.Сотрудник.Ссылка КАК Ссылка
|ИЗ
|    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
|ГДЕ
|    (РаботникиОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ) И КОНЕЦПЕРИОДА(&НаДату, МЕСЯЦ)
|                И РаботникиОрганизаций.Сотрудник.Наименование = &Сотрудник
|                И РаботникиОрганизаций.итПодразделениеОК В ИЕРАРХИИ (&Подразделение)
|                И РаботникиОрганизаций.Сотрудник.ДатаПриемаНаРаботу <= КОНЕЦПЕРИОДА(&НаДату, МЕСЯЦ)
|                И (РаботникиОрганизаций.Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
|                   ИЛИ РаботникиОрганизаций.Сотрудник.ДатаУвольнения >= НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ)))");
[/code]
1 ultrannge89
 
18.11.13
07:30
Тут я просто хочу получить либо ссылку на сотрудника, либо пустую ссылку...
2 Wobland
 
18.11.13
07:36
а зачем пустая?
3 ultrannge89
 
18.11.13
07:48
Чтобы потом проанализировать в теле основной программы, если ссылка не пустая, то двигаемся, дальше, иначе сообщить("сотрудник не найден").

Я получается сначала проверяю работает ли сотрудник, затем пробегаюсь по дням в листе excel и смотрю в какой день стоит пропуск, если в этом дне имеется состояние работает или пустая ссылка (не заполнено состояние), то я формирую по данному дню документ, вернее я ищу периоды таких пропусков и затем вношу их в табличную часть документа. Но что-то стал проверять и не получается даже сотрудника получить по наименованию.
4 Ofizer
 
18.11.13
08:04
(3) а что ты хочешь добиться при таком условии?
РаботникиОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ) И КОНЕЦПЕРИОДА(&НаДату, МЕСЯЦ)
5 Wobland
 
18.11.13
08:08
(3) как насчёт сразу достать запросом нужное, чтоб не бегать?
6 ultrannge89
 
18.11.13
08:18
(4) Я хочу чтобы выбирался только сотрудник работавший в этом месяце. На форме есть реквизит НаДату, он показывает каким месяцем ведется загрузка табеля. Соответственно по нему же и проверяется дата увольнения тек. сотрудника.
7 Ofizer
 
18.11.13
08:22
(6) если сотрудник принят на работу, например, 01.01.13, а смотришь месяц февраль, думаешь этот сотрудник попадет по твоему условию?
8 aka AMIGO
 
18.11.13
08:23
ИМХО, где-то в недрах модуля вывода сотров по списку есть блочок определения состояния на "сей секунд"
зачем изобретать изобретенное непосрэдственно фирмой 1С?..
9 ultrannge89
 
18.11.13
08:27
(8) Попробую найти =)
10 Apokalipsec
 
18.11.13
08:27
(8) да, и регистр используется СотрудникиОрганизаций, он же кадровая история по юрлицам.
11 ultrannge89
 
18.11.13
08:36
(10) нету такого регистра
12 Ofizer
 
18.11.13
08:39
(11) РаботникиОрганизаций
13 ultrannge89
 
18.11.13
08:39
Ладно, щас просто попробую в консоле построчно комментировать строки, может получится чего...
14 Apokalipsec
 
18.11.13
08:40
(11) да это РаботникиОрганизаций, не проснулся я ещё.))
15 ultrannge89
 
18.11.13
10:33
Стал делать через СрезПоследних  и понял что нужно проверять еще и подразделение, на начало периода и на полный период, Объединить все и если хоть где то встречается данное подразделение, то этого работника следует обрабатывать. Но далее уже при проверке состояния на день, проверять и текущее его подразделение, т.к. в нашей организации часто делают перемещения в ходе месяца.
16 ultrannge89
 
18.11.13
13:34
[code]
    Функция ПроверитьСотрудника(Сотрудник)
        
        Запрос = Новый Запрос(
"ВЫБРАТЬ
|    РаботникиОрганизацийСрезПоследних.Сотрудник.Ссылка КАК СотрудникСсылка
|ИЗ
|    РегистрСведений.РаботникиОрганизаций.СрезПоследних(
|            НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ),
|            Сотрудник.Наименование = &Сотрудник
|                И Сотрудник.итПодразделениеОК В ИЕРАРХИИ (&Подразделение)
|                И Сотрудник.ДатаПриемаНаРаботу <= КОНЕЦПЕРИОДА(&НаДату, МЕСЯЦ)
|                И (Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
|                    ИЛИ Сотрудник.ДатаУвольнения >= НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ))) КАК РаботникиОрганизацийСрезПоследних
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    РаботникиОрганизаций.Сотрудник.Ссылка КАК СотрудникСсылка
|ИЗ
|    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
|ГДЕ
|    РаботникиОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ) И КОНЕЦПЕРИОДА(&НаДату, МЕСЯЦ)
|    И РаботникиОрганизаций.Сотрудник.Наименование = &Сотрудник
|    И РаботникиОрганизаций.Сотрудник.итПодразделениеОК В ИЕРАРХИИ(&Подразделение)
|    И РаботникиОрганизаций.Сотрудник.ДатаПриемаНаРаботу <= КОНЕЦПЕРИОДА(&НаДату, МЕСЯЦ)
|    И (РаботникиОрганизаций.Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
|            ИЛИ РаботникиОрганизаций.Сотрудник.ДатаУвольнения >= НАЧАЛОПЕРИОДА(&НаДату, МЕСЯЦ))");
        Запрос.УстановитьПараметр("Сотрудник",Сотрудник);
        Запрос.УстановитьПараметр("НаДату",НаДату);
        Запрос.УстановитьПараметр("Подразделение",Подразделение);
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            Если Выборка.Ссылка <> Справочники.СотрудникиОрганизаций.ПустаяСсылка() И Выборка.Количество() = 1 Тогда
                Возврат Выборка.Ссылка;
            Иначе
                Сообщить("Сотрудник: "+Сотрудник+" не найден, при запросе к БД. Сотрудник отсутствует или их несколько в списке.");
                Возврат Справочники.СотрудникиОрганизаций.ПустаяСсылка();
            КонецЕсли;
        Иначе
            Сообщить("Сотрудник: "+Сотрудник+" не найден, при запросе к БД. Пустая выборка данных.");
            Возврат Справочники.СотрудникиОрганизаций.ПустаяСсылка();
        КонецЕсли;
    КонецФункции

[\code]

Что то странно, в консоле все работает, при выполнении из внешней обработки нет. Отладчиком встаю на выборке, пишет ошибка чтения... (