Имя: Пароль:
1C
1C 7.7
v7: Отобрать сотрудников с определенными должностями
0 dft2014
 
21.04.14
11:22
Подскажите, как отобрать сотрудников с определенными должностями (5штук)? Вот код, но в 77 уже давно выборки не делала:

        Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
        Сотрудники.ВыбратьЭлементы(1);
            
        Пока Сотрудники.ПолучитьЭлемент() = 1 Цикл
        
        СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
        Если СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
            
            ТекДолжность = Сотрудники.Должность.Получить(ДатаФормир).Наименование;
            Если Сотрудники.НайтиПоРеквизиту("Должность",ТекДолжность,1) = 1 Тогда  
                 
             КонецЕсли;
            
        КонецЕсли;
1 dk
 
21.04.14
11:37
учитесь формулировать вопросы
2 dft2014
 
21.04.14
11:52
(1) Надо отобрать сотрудников, у которых наименование должности:
- менеджер
- ведущий менеджер
- главный менеджер
- региональный менеджер
3 dk
 
21.04.14
11:54
как-то туго с вопросами пока
проблема-то в чем?
4 КонецЦикла
 
21.04.14
12:00
(0) Должность - это же справочник?
Тогда почему Получить(ДатаФормир).Наименование;?

(3) Наверное "как это сделать"
5 dft2014
 
21.04.14
12:28
(4) Да, это справочник. Типовая ЗиК.
6 dft2014
 
21.04.14
12:49
Ап!
7 dft2014
 
21.04.14
13:43
Up!
8 eshtrey
 
21.04.14
13:50
что должна делать конструкция?
ТекДолжность = Сотрудники.Должность.Получить(ДатаФормир).Наименование;
            Если Сотрудники.НайтиПоРеквизиту("Должность",ТекДолжность,1) = 1 Тогда

ну и если реквизит периодический, по НайтиПоРеквизиту работать не будет
9 dft2014
 
21.04.14
14:06
(8) Надо вывести в отчет сотрудников с определенными должностями. Поэтому, при переборе спр.Сотрудники надо ставить условие на проверку должности у сотрудника. Если должность входит в эти пять должностей, то отобрать таких сотрудников.
10 dft2014
 
21.04.14
14:16
Если пишу:

    Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
    Сотрудники.ВыбратьЭлементы(1);
        
    Пока Сотрудники.ПолучитьЭлемент() = 1 Цикл
    
    СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
    Если СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
        
        ТекДолжность = Сотрудники.Должность.Получить(ДатаФормир).Наименование;
    //  Если Сотрудники.НайтиПоРеквизиту("Должность",ТекДолжность,1) = 1 Тогда
        Если (СокрЛП(Сотрудники.ТекДолжность) = "Менеджер") Тогда
        // ...
        КонецЕсли;
        
    КонецЕсли;
    
    КонецЦикла;


То пишет ошибку:

Поле агрегатного объекта не обнаружено (ТекДолжность)
11 parasite12
 
21.04.14
14:19
Значение должности пустое, проверяй на пустое значение
12 parasite12
 
21.04.14
14:22
Ну и переменную определи где-нибудь
13 dft2014
 
21.04.14
14:53
(11) Переписала, все равно пишет "Неверное имя реквизита". Вот код:


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

СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
Если СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
    
    ТекДолжность = Сотрудники.Должность.Получить(ДатаФормир).Наименование;
//  Если Сотрудники.НайтиПоРеквизиту("Должность",ТекДолжность,1) = 1 Тогда
//  Если (СокрЛП(Сотрудники.ТекДолжность) = "Менеджер") Тогда  
    Если Сотрудники.НайтиПоРеквизиту("Должность","Менеджер",1) = 1 Тогда
    // ...
    КонецЕсли;
    
КонецЕсли;

КонецЦикла;
14 dft2014
 
21.04.14
14:56
Что-то (13) некрасиво получился. Перевыложу:

    Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
    Сотрудники.ВыбратьЭлементы(1);
        
    Пока Сотрудники.ПолучитьЭлемент() = 1 Цикл
        
    Если ПустоеЗначение(Сотрудники.Должность) = 1 Тогда
    Продолжить;
    КонецЕсли;
    
    СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
    Если СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
        
        ТекДолжность = Сотрудники.Должность.Получить(ДатаФормир).Наименование;
    //  Если Сотрудники.НайтиПоРеквизиту("Должность",ТекДолжность,1) = 1 Тогда
    //  Если (СокрЛП(Сотрудники.ТекДолжность) = "Менеджер") Тогда  
        Если Сотрудники.НайтиПоРеквизиту("Должность","Менеджер",1) = 1 Тогда
        // ...
        КонецЕсли;
        
    КонецЕсли;
    
    КонецЦикла;
15 dft2014
 
21.04.14
14:56
пишет "Неверное имя реквизита".
16 eshtrey
 
21.04.14
15:04
(15) у тебя не будет работать
Если Сотрудники.НайтиПоРеквизиту("Должность","Менеджер",1) = 1 Тогда
потому что реквизит Должность периодический
17 dft2014
 
21.04.14
15:26
(16) и как быть? как дотянуться?
18 2S
 
21.04.14
15:34
(13) "переписала", пол Мужской
Ахтунг, фото залей и рещим все твои проблемы
19 Chum
 
21.04.14
15:36
л_СпрДолжности = СоздатьОбъект("Справочник.Должности");
л_Список = СоздатьОбъект("СписокЗначений");

л_СпрДолжности.НайтипоКоду( ТутКодДолжностиМенеджер );
л_Список.ДобавитьЗначение(л_СпрДолжности.ТекущийЭлемент());
// повторить для
// ведущий менеджер
// главный менеджер
// региональный менеджер


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

Если Сотрудники.ЭтоГруппа() + Сотрудники.ПометкаУдаления() <> 0 тогда
Продолжить;
КонецЕсли;

Если Сотрудники.СостояниеФизЛица <> Перечисление.СостояниеФизлица.СотрудникОсновной тогда
Продолжить;
КонецЕсли;

Если л_Список.НайтиЗначение(Сотрудники.Должность) = 0 Тогда
Продолжить;
КонецЕсли;

// тут какое-то нужное действие с отобранным сотрудником


КонецЦикла; // по сотрудникам
20 2S
 
21.04.14
15:36
Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
    Сотрудники.ВыбратьЭлементы(1);
    Пока Сотрудники.ПолучитьЭлемент() = 1 Цикл
    Если Сотрудники.ЭтоГруппа() = 1 Тогда
        Продолжить;
    КонецЕсли;    
        Должность = Сотрудники.Должность.Получить(ДатаФормир).Наименование;
    СостояниеСотрудника = Сотрудники.СостояниеФизЛица.Получить(ДатаФормир);
    
       Если СостояниеСотрудника = Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
        
        Если Сотрудники.НайтиПоРеквизиту(Должность,"Менеджер, бла, блабла, блаблабла",1) = 1 Тогда
...
        КонецЕсли;
    
    КонецЦикла;
21 2S
 
21.04.14
15:37
пардон
        Если Найти(Должность,"Менеджер, бла, блабла, блаблабла")> 0 Тогда
...
        КонецЕсли;
22 2S
 
21.04.14
15:38
пля, наоборот ))
    Если Найти("Менеджер, бла, блабла, блаблабла",Должность)> 0 Тогда
.
23 asjasj555
 
21.04.14
15:39
Может через запрос
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с (ТекущаяДата()) по (ТекущаяДата());
    |Обрабатывать НеПомеченныеНаУдаление;
    |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
    |Должность = Справочник.Сотрудники.Должность;
    |Группировка Сотрудник;
    |Условие(Должность в Список);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
где Список - список из нужных должностей. А теущую дату можно заменить  на дату формирования
24 2S
 
21.04.14
15:39
(23) автор до черных запросов еще не дорос
25 Duke1C
 
22.04.14
10:51
(10) Правильно пишет, у объекта "Сотрудники" нет реквизита "ТекДолжность"

пиши вместо:
Если (СокрЛП(Сотрудники.ТекДолжность) = "Менеджер") Тогда

КонецЕсли;

так:
Если Найти(Нрег(ТекДолжность),"менеджер")>0 Тогда

КонецЕсли;

а вообще лучше как в (23)
2 + 2 = 3.9999999999999999999999999999999...