Имя: Пароль:
1C
1C 7.7
v7: Состояние сотрудника "Физическое лицо" отобрать как?
0 dft2014
 
23.04.14
15:06
В спр.Сотрудники есть типовая ф-ция, определяющая состояние сотрудника:

Если глВидРасчетаДействует(ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности)=1 Тогда
            Возврат "Физическое лицо, получающее доход на предприятии (договорник)";
        Иначе
            Возврат "Физическое лицо"
        КонецЕсли;

Как мне из спр.Сотрудники отобрать тех, у кого состояние - "Физическое лицо"?
1 Рэйв
 
23.04.14
15:07
Смотри что у тебя в глВидРасчетаДействует() и делай запрос.
2 dft2014
 
23.04.14
15:42
(1) А проще можно как-нибудь вытянуть? Что-то типа:
СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной
3 Ювелир
 
23.04.14
15:46
(0)(2) Замечательная идея. Можешь анализировать наличие связи со справочником сотрудники организации, ну и анализировать состояние сотрудника связанного с ФЛ (м.б. уволен).
4 Ювелир
 
23.04.14
15:47
(3) а, извини непонял вопрос...
5 YF
 
23.04.14
15:48
(0) Перебирая сотрудников или запросам с условием (глВидРасчетаДействует(ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности) <> 1)
6 dft2014
 
23.04.14
15:53
Если пишу условие:

Сотрудники.ОсновнойЭлемент = Сотрудники.ТекущийЭлемент()

То попадают уволенные.
7 asjasj555
 
23.04.14
16:02
Может так:
СпрСотрудники=СоздатьОбъект(Справочник.Сотрудники);
СпрСотрудники.ВыбратьЭлементы();
Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
Если глВидРасчетаДействует(СпрСотрудники.ТекущийЭлемент().ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности) <> 1 тогда
Сообщить(СпрСотрудники.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Ну и условие по уволенным надо добавить что бы не попадали
8 dft2014
 
23.04.14
16:11
(7) Ошибку выдает в Вашем коде.

Написала так:

Если (глВидРасчетаДействует(Сотрудники.ОсновнойЭлемент,,ДатаФормир,ДатаФормир) <> 1) И (Сотрудники.ОсновнойЭлемент = Сотрудники.ТекущийЭлемент()) И  Тогда

Попадают опять только уволенные.
9 batman69
 
23.04.14
16:13
(8) Пол мужской.
10 dft2014
 
23.04.14
16:15
(9) Женщина я )))
11 asjasj555
 
23.04.14
16:16
Что за ошибка? Выложи свой код полностью. (8)
13 Voronve
 
23.04.14
16:23
(10) Докажи. Фото в профиль выкладывай
14 dft2014
 
23.04.14
16:24
(13) А фото в фас не пойдет??? )))
15 Voronve
 
23.04.14
16:25
(14) Сойдет. Выкладывай
16 asjasj555
 
23.04.14
16:33
(8) СпрСотрудники=СоздатьОбъект("Справочники.Сотрудники");
17 dft2014
 
23.04.14
16:39
(11) Вот почти полностью мой код:

    Процедура Сформировать()
        
        
    Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
    Сотрудники.ВыбратьЭлементы(1);
        
    ИтераторСотр = 1;
    
    Пока Сотрудники.ПолучитьЭлемент() = 1 Цикл
    
    Если Сотрудники.ЭтоГруппа() + Сотрудники.ПометкаУдаления() <> 0 тогда
        Продолжить;
    КонецЕсли;
            
    СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
    
    ПустоеСостояниеФизлица = ПолучитьПустоеЗначение("Перечисление.СостояниеФизлица");  
    
    Если (глВидРасчетаДействует(Сотрудники.ТекущийЭлемент(),,ДатаФормир,ДатаФормир)=1) И (СостояниеСотрудника = ПустоеСостояниеФизлица) Тогда
      
           ИтераторСотр = ИтераторСотр + 1;
           x.WorkSheets(ИмяФайла).Cells(ИтераторСотр,1).Value        = "'"+Сотрудники.Код;
        x.WorkSheets(ИмяФайла).Cells(ИтераторСотр,2).Value        = "'"+Сотрудники.Наименование;  
        x.WorkSheets(ИмяФайла).Cells(ИтераторСотр,3).Value        = "'"+СостояниеСотрудника;  
           
    КонецЕсли;
    
    КонецЦикла
    
    КонецПроцедуры
18 asjasj555
 
23.04.14
16:44
Почему глВидРасчетаДействует(Сотрудники.ТекущийЭлемент(),,ДатаФормир,ДатаФормир)=1, ведь нужно "Физическое лицо",а не "Физическое лицо, получающее доход на предприятии (договорник)";?
19 dft2014
 
23.04.14
16:52
(18) Пробовала и =1 и <>1, все равно попадают уволенные!!!!
20 asjasj555
 
23.04.14
16:55
(19) уволенных надо убрать дополнительным условием, к сожалению я не знаю как твоя конфигурация определяет уволен человек или нет, тут не помогу(
21 dft2014
 
23.04.14
17:10
Вот вся функция из типовой ЗиК (не пойму, как ее правильно  использовать для моей задачи):


Функция СостояниеСотрудника()
    Перем ОписаниеСостояния;

    Если (ПустоеЗначение(ТекущийЭлемент())=1)или(ЭтоГруппа()=1) Тогда
        Возврат ""
    КонецЕсли;
    ДатаПриема = Дата(0);
    ДатаУвольнения = Дата(0);
    ДатаАктуальности = ИспользоватьДату();
    Периодический.ИспользоватьОбъект("СостояниеФизлица",ТекущийЭлемент());
    СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);
    Если ПустоеЗначение(СостояниеФЗ)=0 Тогда
        Если Периодический.НайтиЗначение(ДатаАктуальности,-1)=1 Тогда
            ДатаПриема = Периодический.ДатаЗнач
        КонецЕсли;
        Если Периодический.НайтиЗначение(ДатаАктуальности+1,1)=1 Тогда
            ДатаУвольнения = Периодический.ДатаЗнач-1
        КонецЕсли;
        Если ТекущийЭлемент().ОсновнойЭлемент<>ТекущийЭлемент() Тогда
            ОписаниеСостояния = "Внутреннее совместительство";
            Если СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда                
                ОписаниеСостояния = "Внутреннее совмест-во, временно не работает";
            ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботаетВоеннослужащий Тогда
                ОписаниеСостояния = "Внутреннее совмест-во, военнослужащий, временно не работает";                
            КонецЕсли;
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
            ОписаниеСостояния = "Штатный сотрудник";
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.СотрудникНеосновной Тогда
            ОписаниеСостояния = "Внешний совместитель";
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.Госслужащий Тогда
            Если Константа.ЕстьМуниципальныеСлужащие = 1 Тогда
                ОписаниеСостояния = "Муниципальный служащий";
            Иначе
                ОписаниеСостояния = "Государственный служащий";    
            КонецЕсли;
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда
            ОписаниеСостояния = "Временно не работает";
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботаетВоеннослужащий Тогда
            ОписаниеСостояния = "Военнослужащий временно не работает";            
        Иначе
            ОписаниеСостояния = "Военнослужащий";
        КонецЕсли;
        Возврат ОписаниеСостояния+" с "+ДатаПриема+?(ПустоеЗначение(ДатаУвольнения)=1,""," по "+ДатаУвольнения)
    Иначе
        Периодический.ОбратныйПорядок();
        Периодический.ВыбратьЗначения(,ДатаАктуальности);
        Пока Периодический.ПолучитьЗначение()=1 Цикл
            Если ПустоеЗначение(Периодический.Значение)=1 Тогда
                Возврат "Сотрудник уволен "+(Периодический.ДатаЗнач-1)
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    Если ОсновнойЭлемент=ТекущийЭлемент() Тогда
        Если глВидРасчетаДействует(ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности)=1 Тогда
            Возврат "Физическое лицо, получающее доход на предприятии (договорник)";
        Иначе
            Возврат "Физическое лицо"
        КонецЕсли;
    Иначе
        Возврат "Не принят на внутреннее совместительство"
    КонецЕсли;

КонецФункции    // СостояниеСотрудника
22 dft2014
 
23.04.14
17:33
Ап!
23 Voronve
 
23.04.14
17:46
(22) Фото де ?
24 dft2014
 
23.04.14
17:59
(23) Фото будет, если будет помощь полезная )))
25 Voronve
 
23.04.14
18:00
(24) Фото - исторически сложившаяся плата за помощь. Так что, пока нет денег - нет мультиков.
26 dft2014
 
23.04.14
18:10
Up!
27 asjasj555
 
23.04.14
18:17
Скопируй функцию Состояние сотрудника к себе в обработку. Добавь туда параметр Сотрудник. Замени в теле функции ТекущийЭлемент() на имя параметра (Сотрудник). И вместо
Если (глВидРасчетаДействует(Сотрудники.ТекущийЭлемент(),,ДатаФормир,ДатаФормир)=1) И (СостояниеСотрудника = ПустоеСостояниеФизлица) Тогда

Вызови Если СостояниеСотрудника(Сотрудник)="Физическое лицо" тогда
28 asjasj555
 
23.04.14
18:27
И еще в функции стоит заменить
ДатаАктуальности = ИспользоватьДату();
на нужную тебе дату
Например ДатаАктуальности = ДатаФормир;
29 dft2014
 
23.04.14
18:39
(27) Сделала, как Вы посоветовали, выдает ошибку при запуске:

Периодический.ИспользоватьОбъект("СостояниеФизлица",Сотрудник);
{C:\DOCUMENTS AND SETTINGS\TDEMKINA\DESKTOP\77_8\4.ERT(18)}: Значение не представляет агрегатный объект (ИспользоватьОбъект)


Вот сам код:


Функция СостояниеСотрудника(Сотрудник)
    Перем ОписаниеСостояния;


    ДатаПриема = Дата(0);
    ДатаУвольнения = Дата(0);
    ДатаАктуальности = ДатаФормир;
    Периодический.ИспользоватьОбъект("СостояниеФизлица",Сотрудник);
    СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);
    Если ПустоеЗначение(СостояниеФЗ)=0 Тогда
        Если Периодический.НайтиЗначение(ДатаАктуальности,-1)=1 Тогда
            ДатаПриема = Периодический.ДатаЗнач
        КонецЕсли;
        Если Периодический.НайтиЗначение(ДатаАктуальности+1,1)=1 Тогда
            ДатаУвольнения = Периодический.ДатаЗнач-1
        КонецЕсли;
        Если Сотрудник.ОсновнойЭлемент<>Сотрудник Тогда
            ОписаниеСостояния = "Внутреннее совместительство";
            Если СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда                
                ОписаниеСостояния = "Внутреннее совмест-во, временно не работает";
            ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботаетВоеннослужащий Тогда
                ОписаниеСостояния = "Внутреннее совмест-во, военнослужащий, временно не работает";                
            КонецЕсли;
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
            ОписаниеСостояния = "Штатный сотрудник";
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.СотрудникНеосновной Тогда
            ОписаниеСостояния = "Внешний совместитель";
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.Госслужащий Тогда
            Если Константа.ЕстьМуниципальныеСлужащие = 1 Тогда
                ОписаниеСостояния = "Муниципальный служащий";
            Иначе
                ОписаниеСостояния = "Государственный служащий";    
            КонецЕсли;
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда
            ОписаниеСостояния = "Временно не работает";
        ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботаетВоеннослужащий Тогда
            ОписаниеСостояния = "Военнослужащий временно не работает";            
        Иначе
            ОписаниеСостояния = "Военнослужащий";
        КонецЕсли;
        Возврат ОписаниеСостояния+" с "+ДатаПриема+?(ПустоеЗначение(ДатаУвольнения)=1,""," по "+ДатаУвольнения)
    Иначе
        Периодический.ОбратныйПорядок();
        Периодический.ВыбратьЗначения(,ДатаАктуальности);
        Пока Периодический.ПолучитьЗначение()=1 Цикл
            Если ПустоеЗначение(Периодический.Значение)=1 Тогда
                Возврат "Сотрудник уволен "+(Периодический.ДатаЗнач-1)
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    Если Сотрудник.ОсновнойЭлемент=Сотрудник Тогда
        Если глВидРасчетаДействует(Сотрудник.ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности)=1 Тогда
            Возврат "Физическое лицо, получающее доход на предприятии (договорник)";
        Иначе
            Возврат "Физическое лицо"
        КонецЕсли;
    Иначе
        Возврат "Не принят на внутреннее совместительство"
    КонецЕсли;

КонецФункции    // СостояниеСотрудника



Процедура ВыгрузитьСотрудников()
    
Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
Сотрудники.ВыбратьЭлементы(1);
    
ИтераторСотр = 1;

Пока Сотрудники.ПолучитьЭлемент() = 1 Цикл

    Если Сотрудники.ЭтоГруппа() + Сотрудники.ПометкаУдаления() <> 0 тогда
    Продолжить;
    КонецЕсли;
    
СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
        
Если СостояниеСотрудника(Сотрудники)="Физическое лицо" Тогда
    ИтераторСотр = ИтераторСотр + 1;
    
    x.WorkSheets(ИмяФайла).Cells(ИтераторСотр,1).Value        = "'"+Сотрудники.Код;
    x.WorkSheets(ИмяФайла).Cells(ИтераторСотр,2).Value        = "'"+Сотрудники.Наименование;
    x.WorkSheets(ИмяФайла).Cells(ИтераторСотр,3).Value    = "'"+СостояниеСотрудника;  
    
КонецЕсли;

КонецЦикла;

КонецПроцедуры
30 asjasj555
 
23.04.14
18:48
После ДатаАктуальности = ДатаФормир;
попробуйте добавить
Периодический = СоздатьОбъект("Периодический");
31 Voronve
 
23.04.14
18:50
(30) Не напрягайся - у вас прям бокс по переписке получаеццо. Щас dft2014 сообразит выложиться фотку - подключимся, посмотрим что там происходит; разжуем где не правы.
32 asjasj555
 
23.04.14
18:56
(31) Так "Фото будет, если будет помощь полезная )))"(с)
Вот я и стараюсь ради общего блага))))
33 Voronve
 
23.04.14
19:05
(32) А ты расслабься и благо общее наступит ;)
34 dft2014
 
23.04.14
19:08
(30) Спасибо, сейчас попробую...
(31) Фото будет только активно помогавшим.
35 НастоящееИмя
 
23.04.14
19:16
че тут думать.СостояниеФизлица<>СотрудникПоОсновному и СостояниеФизлица <> ВременоНеРаботает и так далее
36 dft2014
 
23.04.14
19:18
(35)Общая задача стоит так, вывести:
- штатных сотрудников
- временно не работающих
- физ.лиц


В этом топике я только физ.лиц выделила.
37 НастоящееИмя
 
23.04.14
19:24
(36) так потому что все остальное ерунда.Я только для физиков и предложил
38 НастоящееИмя
 
23.04.14
19:27
если сотрудник  не основной, не совместитель, не временно неработающий, там еще что то по военным значит он физик. Причем он может быть уволенным физиком
39 dft2014
 
23.04.14
19:28
(38) А мне сотрудники по основному - нужны.
40 НастоящееИмя
 
23.04.14
19:30
ну и?...  состояние = сотрудникосновной
41 НастоящееИмя
 
23.04.14
19:31
в одном условии не получится всем отсортировать
42 НастоящееИмя
 
23.04.14
19:31
в одном условии не получится всех отсортировать
43 dft2014
 
23.04.14
19:31
(30) Добавила, вообще стал вылетать с ошибкой Server busy:

x.Workbooks.Add();   //книга
{C:\77_8\выгр.ERT(188)}: Поле агрегатного объекта не обнаружено (Workbooks)
44 dft2014
 
23.04.14
19:32
(42) А мне надо в одном списке их всех получить:

- штатных сотрудников
- временно не работающих
- физ.лиц
45 dft2014
 
23.04.14
19:32
Как быть?
46 Мигало
 
23.04.14
19:33
(42) Еще один...
47 НастоящееИмя
 
23.04.14
19:33
кстати, пои открытии списка сотрудников, программа ведь видит кто есть кто. Покопайся там, в коде списка сотрудников
48 НастоящееИмя
 
23.04.14
19:34
(42) один список <> одно условие
49 asjasj555
 
23.04.14
19:38
(43) ну нормально теперь нужно смотреть как там в Excel выгружается, проверьте в диспетчере задач не висит ли зависший процесс Excel перед запуском обработки, если висит закройте его
50 dft2014
 
23.04.14
19:46
(49) Сняла процесс зависший. Снова запустила свою обработку. Теперь она дошла до конца, но ничего в Эксель не собрала...
51 asjasj555
 
23.04.14
19:53
Замените
Если СостояниеСотрудника(Сотрудники)="Физическое лицо" Тогда

на
Если СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Физическое лицо" Тогда

и еще можно перед условием добавить
Сообщить(СостояниеСотрудника(Сотрудники.ТекущийЭлемент())")
и посмотреть что функция возвращает
52 НастоящееИмя
 
23.04.14
19:53
отладчик в руки
53 Мигало
 
23.04.14
19:54
Казалось бы - фотка, меньшее зло; однако ж будем колоться, но пытаться жрать кактус ...
54 НастоящееИмя
 
23.04.14
19:55
а вообще, могу выехать по месту и решить проблему
55 Мигало
 
23.04.14
19:56
Уважаю как упертую; нипанимаю как алчущую
56 Мигало
 
23.04.14
20:01
Страшненькая чтоль ?
57 НастоящееИмя
 
23.04.14
20:03
(56) тихо...  спугнешь
58 Мигало
 
23.04.14
20:04
(57) Чет я как то даже забуксовал ....
59 dft2014
 
23.04.14
20:13
(51) Заменила. В окне сообщений пробегают разные состояния, т.е. мы на верном пути. Дождусь как Эксель сформируется...
60 dft2014
 
23.04.14
20:26
(51) УРА!!! Выходят только ФИЗЛИЦа!!! Избавились наконец-то от уволенных!!!

asjasj555 - Вам большое СПАСИБО!!! :*)

Теперь еще условия надо добавить на штатных сотрудников и  временно не работающих.
61 asjasj555
 
23.04.14
20:28
Ну там функция возвращает все состояния, нужно только выбрать нужные)))
62 dft2014
 
23.04.14
20:52
Почему, если в условии пишу:

Если (СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Физическое лицо")  И ((ПустоеЗначение(Сотрудники.ДатаДоговора))<>1) И ((ПустоеЗначение(Сотрудники.ДатаОкончанияДоговора))=1) Тогда  
    Если СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
        Если СостояниеСотрудника = Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда    
    Сообщить(СостояниеСотрудника(Сотрудники.ТекущийЭлемент()));

То ничего не выводит.
63 dft2014
 
23.04.14
20:54
+(62) ДатаДоговора и ДатаОкончанияДоговора - это наши добавленные реквизиты.
64 asjasj555
 
23.04.14
21:00
Состояние сотрудника не может в данном случае быть равно
СостояниеСотрудника = Перечисление.СостояниеФизлица.ВременноНеРаботает
так как оно уже равно
СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной
65 dft2014
 
23.04.14
21:01
(64) Как быть тогда? Мне их надо всех в одном списке получить.
66 asjasj555
 
23.04.14
21:03
Да и СостояниеСотрудника это же вроде функция, почему же используется переменная?
67 dft2014
 
23.04.14
21:07
(66) Ой, сейчас поправлю...
68 asjasj555
 
23.04.14
21:08
Думаю тут так:
Если ((ПустоеЗначение(Сотрудники.ТекущийЭлемент().ДатаДоговора))<>1) И ((ПустоеЗначение(Сотрудники.ТекущийЭлемент().ДатаОкончанияДоговора))=1) Тогда  
//перечислим все нужные статусы
Если (СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Физическое лицо") ИЛИ
(СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Временно не работает")

тогда
КонецЕсли;

КонецЕсли;
69 asjasj555
 
23.04.14
21:11
С форматированием не освоюсь никак. В общем сначала проверим договоры, и если проверку договоров прошли, то будем проверять состояния возвращаемые функцией, где в условии через ИЛИ перечислим нужные нам состояния
70 dft2014
 
23.04.14
21:14
Я вот так написала, т.к. договора надо только у ФЛ смотреть:

Если ((СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Физическое лицо")  И ((ПустоеЗначение(Сотрудники.ДатаДоговора))<>1) И ((ПустоеЗначение(Сотрудники.ДатаОкончанияДоговора))=1)) ИЛИ
    (СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Штатный сотрудник") ИЛИ (СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Временно не работает") Тогда
71 asjasj555
 
23.04.14
21:16
Если (((СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Физическое лицо")  И ((ПустоеЗначение(Сотрудники.ДатаДоговора))<>1) И ((ПустоеЗначение(Сотрудники.ДатаОкончанияДоговора))=1))) ИЛИ
    (СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Штатный сотрудник") ИЛИ (СостояниеСотрудника(Сотрудники.ТекущийЭлемент())="Временно не работает") Тогда

скобки добавил
72 asjasj555
 
23.04.14
21:17
что бы операция И применялась только к договорам и физ лицам
73 dft2014
 
23.04.14
21:21
Ок! Спасибо! А то у меня зависло все...
74 НастоящееИмя
 
25.04.14
10:12
(73) Так, а фотка где?