Вход | Регистрация

1С:Предприятие ::

Метки:

З и К. Зачем переписали модуль "ЗаполнитьСписокСотрудников"?

Я
   meet
 
19.08.04 - 07:02
Чел уволен 30.06.04 По нему осталось сальдо. Заполняя список сотрудников на начисление з/п в июле этого человека никаким образом выбрать нельзя кроме как добавить ручками. Это что для удобства сделано? или какие то другие цели преследовались. Релиз 47. Ранее все было нормально и не приходилось мучиться с сальдо.
 
 
   Guk
 
1 - 19.08.04 - 07:07
(0) А при заполнении, разве галочки для уволенных, нет?...
   meet
 
2 - 19.08.04 - 07:11
Галочки то есть, но заполняет уволенных только в ТЕКУЩЕМ ПЕРИОДЕ!!!.
если поставить заполнить на состояние 30.06.04 то этот чел еще считается работающим и в список уволенных не попадает.
   Ninon
 
3 - 19.08.04 - 08:12
(2)И что ты с этим будешь делать? Поделись - тоже интересно.
   meet
 
4 - 19.08.04 - 09:09
Помучались с сальдо в этом месяце. Спасла обработка на проверку наличия документа "Начисления зарплаты". Хоть она все выдает правильно.Тех людей на которых не было начисления добавили в конце подбором и все поехало. Этой проверкой никогда не пользовались и привыкли что все нормально.А тут и не знали на что думать. Может у кого другие варианты этого решения есть?
   Platina
 
5 - 19.08.04 - 09:34
Я не убираю уволенных в папку Уволенные до окончательного расчета с ними. Они остаются в папке, озаглавленной по старинке именем расчетчицы.
   Ninon
 
6 - 19.08.04 - 09:42
(5)Тааак... И ты хочешь сказать, что тогда они попадают в док НачЗарплаты?
У тебя релиз какой?
   Marinka
 
7 - 19.08.04 - 09:45
(6) По всей видимости не новенький... в новеньком - это давно извесная ошибка :)
   Ninon
 
8 - 19.08.04 - 09:51
(7)Мариш, как думаешь - в 248 исправят?
Я из-за этого не ставлю 247 релиз...:((
   Пролд
 
9 - 19.08.04 - 09:56
(0) Ждать 248 релиза. Переделать алгоритм в 247 так как было раньше.
(1) Состояние галочки "уволенные" алгоритму в 247 вообще фиолетово.
   Marinka
 
10 - 19.08.04 - 09:56
(8) Если честно, то сомневаюсь, но все же ещё жду, надеюсь и верю :)
 
  Рекламное место пустует
   Ninon
 
11 - 19.08.04 - 10:02
(9)А поподробней, пожалуйста...(для тупых два раза)..:((
   Пролд
 
12 - 19.08.04 - 10:08
(11) Могу только один раз, а то забанят :(

Функция ПолучитьТаблицуСотрудников(// Моя переделанная функция в 247 релизе

    Перем ТаблицаСотрудников;   // возвращаемая таблица

    
    Для Номер = 1 по 10 Цикл
        Типы[Номер] = 0;
    КонецЦикла;
    Для Номер = 1 по ТипыСотрудников.РазмерСписка() Цикл
        Типы[ТипыСотрудников.ПолучитьЗначение(Номер)] = ТипыСотрудников.Пометка(Номер);
    КонецЦикла;
    Если Типы[1]+Типы[2]+Типы[3]+Типы[4]+Типы[5]+Типы[6]+Типы[7]+Типы[8]+Типы[9]+Типы[10] = 0 Тогда
        ТаблицаСотрудников = СоздатьОбъект("ТаблицаЗначений");
        ТаблицаСотрудников.НоваяКолонка("Сотрудник");
        Возврат ТаблицаСотрудников;
    КонецЕсли;
    ПустаяГруппа    = ПолучитьПустоеЗначение("Справочник.Сотрудники");
    ПустойДокумент    = ПолучитьПустоеЗначение("Документ");
    ПустоеСостояниеФизлица = ПолучитьПустоеЗначение("Перечисление.СостояниеФизлица");
    Группа = СписокГрупп.ПолучитьЗначение(СписокГрупп.ТекущаяСтрока());
    
    Если Типы[1]+Типы[2]+Типы[3]+Типы[4]+Типы[5]+Типы[6]+Типы[7]+Типы[8]+Типы[9] > 0 Тогда
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)

        |Период с ДатаАктуальности по ДатаАктуальности;
        |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
        |СотрРодитель = Справочник.Сотрудники.Родитель;
        |СотрСостояние = Справочник.Сотрудники.СостояниеФизлица;
        |СотрОсновнойЭлемент = Справочник.Сотрудники.ОсновнойЭлемент;
        |Группировка Сотрудник Упорядочить по Сотрудник.Наименование без групп;
        |Условие(Сотрудник.ПометкаУдаления()=0);
        |//}}ЗАПРОС

        ;
        Если ПустоеЗначение(Подразделение)=0 Тогда
            ТекстЗапроса = ТекстЗапроса+"СотрПодразделение = Справочник.Сотрудники.Подразделение;"
            "Условие(СотрПодразделение в Подразделение);"
        КонецЕсли;
        Если ТипЗначения(Группа) = 11 Тогда
            Если ПустоеЗначение(Группа) = 1 Тогда
                ТекстЗапроса = ТекстЗапроса + "Условие(СотрРодитель=ПустаяГруппа);"
            Иначе
                ТекстЗапроса = ТекстЗапроса + "Условие(Сотрудник в Группа);"
            КонецЕсли;
        КонецЕсли;
        
       // сформируем условие по выбранным типам сотрудников

       // заполним список возможных состояний сотрудника

        УсловиеПоТипам = "";
        Если Типы[1]=1 Тогда   // Штатные сотрудники

            УсловиеПоТипам = "(СотрСостояние=Перечисление.СостояниеФизлица.СотрудникОсновной)";
        КонецЕсли;
        Если Типы[3]=1 Тогда   // Внешние совместители

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(СотрСостояние=Перечисление.СостояниеФизлица.СотрудникНеосновной)";
        КонецЕсли;
        Если Типы[4]=1 Тогда   // Военнослужащие по контракту

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(СотрСостояние=Перечисление.СостояниеФизлица.ВоеннослужащийПоКонтракту)"
        КонецЕсли;
        Если Типы[5]=1 Тогда   // Военнослужащие по призыву

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(СотрСостояние=Перечисление.СостояниеФизлица.ВоеннослужащийПоПризыву)"
        КонецЕсли;
        Если Типы[6]=1 Тогда   // Госслужащие

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(СотрСостояние=Перечисление.СостояниеФизлица.Госслужащий)"
        КонецЕсли;
        Если Типы[9] = 1 Тогда   // "В отпусках по уходу за детьми"

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(СотрСостояние=Перечисление.СостояниеФизлица.ВременноНеРаботает)"
        КонецЕсли;
        
        Если (Типы[7] = 1) и (Типы[8] = 1) Тогда
            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(СотрСостояние=ПустоеСостояниеФизлица)"
        ИначеЕсли Типы[7] = 1 Тогда   // Прочие, получающие доход (Договорники) (Типы[8] = 0)

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(глВидРасчетаДействует(Сотрудник,,ДатаАктуальности,ДатаАктуальности)=1)и(СотрСостояние=ПустоеСостояниеФизлица)"
        ИначеЕсли Типы[8] = 1 Тогда   // Прочие физлица

            УсловиеПоТипам = УсловиеПоТипам+?(ПустоеЗначение(УсловиеПоТипам)=0,"или","")
            +"(глВидРасчетаДействует(Сотрудник,,ДатаАктуальности,ДатаАктуальности)=0)и(СотрСостояние=ПустоеСостояниеФизлица)"
        КонецЕсли;
        

        Если ПустоеЗначение(УсловиеПоТипам) = 0 Тогда
            УсловиеПоТипам = "("+УсловиеПоТипам+")и(СотрОсновнойЭлемент=Сотрудник)"
        КонецЕсли;
        Если Типы[2] = 1 Тогда   // Внутренние совместители

            УсловиеПоТипам = ?(ПустоеЗначение(УсловиеПоТипам)=0,"("+УсловиеПоТипам+")или","")
            +"((СотрСостояние<>ПустоеСостояниеФизлица)"
            +"и(СотрОсновнойЭлемент<>Сотрудник))"
        КонецЕсли;
        
        Если (ПустоеЗначение(НачалоПериода) = 1) и (ПустоеЗначение(ОкончаниеПериода) = 0) тогда
            НачалоПериода = НачМесяца(ОкончаниеПериода);
        ИначеЕсли (ПустоеЗначение(ОкончаниеПериода) = 1) и (ПустоеЗначение(НачалоПериода) = 0) тогда
            ОкончаниеПериода = КонМесяца(НачалоПериода);
        ИначеЕсли (ПустоеЗначение(ОкончаниеПериода) = 1) и (ПустоеЗначение(НачалоПериода) = 1) и (ПустоеЗначение(ДатаАктуальности) = 0) тогда
            НачалоПериода = НачМесяца(ДатаАктуальности);
            ОкончаниеПериода = КонМесяца(ДатаАктуальности);
        КонецЕсли;
        
        Если (ПустоеЗначение(НачалоПериода) = 0) и (ПустоеЗначение(ОкончаниеПериода) = 0) Тогда
            ТекстЗапроса = ТекстЗапроса+"Условие(("+УсловиеПоТипам+")или(УдовлетворяетСостояниеСотрудникаУсловию(Сотрудник)=1));"
        Иначе
            ТекстЗапроса = ТекстЗапроса+"Условие("+УсловиеПоТипам+");"
        КонецЕсли;
        
       // сформируем запрос

        Запрос = СоздатьОбъект("Запрос");
        Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
            Возврат СоздатьОбъект("ТаблицаЗначений");
        КонецЕсли;
        
        ТаблицаСотрудников = СоздатьОбъект("ТаблицаЗначений");
        ТаблицаСотрудников.НоваяКолонка("Сотрудник");
        
       // будем исключать уволенных чтобы случайно не включить их в список  

        Пока Запрос.Группировка(1) = 1 Цикл
            ВключитьСотрудника = 1;
            Если Типы[10]=0 Тогда// убираем уволенных когда они не нужны

            
            Периодический.ИспользоватьОбъект("СостояниеФизлица",Запрос.Сотрудник);
            СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);
           // при проверке на пустое состояние физлица нужно исключить уволенных, чтобы потом их включить по отдельной галочке

            Если (ПустоеЗначение(СостояниеФЗ) = 1) и (Типы[8] = 1) Тогда
               // проанализируем почему попал в запрос 

               // 1) захотели Типы[7] = 1 договорников

               // 2) захотели Типы[8] = 1 прочие физлица

                Договорник = глВидРасчетаДействует(Запрос.Сотрудник,,ДатаАктуальности,ДатаАктуальности);
                Если (Типы[7] = 1) и (Договорник = 1) Тогда
                   // включать надо

                Иначе
                    Периодический.ОбратныйПорядок();
                    Периодический.ВыбратьЗначения(,ДатаАктуальности-1);
                    Пока Периодический.ПолучитьЗначение() = 1 Цикл
                        Если ПустоеЗначение(Периодический.Значение) = 0 Тогда
                           // условие в запросе: "Физические лица", а состояние Физлица когда-то(не обязательно в этом месяце) было непустым

                           // значит  этот сотрудник был когда-то уволен, поэтому сейчас и пустое состояние

                           // значит этого сотрудника нельзя включить в запрос:

                            ВключитьСотрудника = 0;
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
            КонецЕсли;
            
            кОНЕЦеСЛИ;
            
            Если ВключитьСотрудника = 1 Тогда
                ТаблицаСотрудников.НоваяСтрока();
                ТаблицаСотрудников.УстановитьЗначение(ТаблицаСотрудников.КоличествоСтрок(),1,Запрос.Сотрудник);
            КонецЕсли;
            
        КонецЦикла;
        
    Иначе
        ТаблицаСотрудников = СоздатьОбъект("ТаблицаЗначений");
        ТаблицаСотрудников.НоваяКолонка("Сотрудник");
    КонецЕсли;
    
   // добавим уволенных в этом месяце с помощью запроса по пустому значению СостояниеФизлица:

    Если Типы[10] = 1 Тогда// уволенные в текущем месяце

        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)

        |Период с ДатаАктуальности по ДатаАктуальности;
        |Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
        |СотрРодитель = Справочник.Сотрудники.Родитель;
        |СотрСостояние = Справочник.Сотрудники.СостояниеФизлица;
        |СотрОсновнойЭлемент = Справочник.Сотрудники.ОсновнойЭлемент;
        |Группировка Сотрудник Упорядочить по Сотрудник.Наименование без групп;
        |Условие(Сотрудник.ПометкаУдаления()=0);
        |Условие((СотрСостояние = ПустоеСостояниеФизлица) и (СотрОсновнойЭлемент = Сотрудник));
        |//}}ЗАПРОС

        ;
        Если ПустоеЗначение(Подразделение)=0 Тогда
            ТекстЗапроса = ТекстЗапроса+"СотрПодразделение = Справочник.Сотрудники.Подразделение;"
            "Условие(СотрПодразделение в Подразделение);"
        КонецЕсли;
        Если ТипЗначения(Группа) = 11 Тогда
            Если ПустоеЗначение(Группа) = 1 Тогда
                ТекстЗапроса = ТекстЗапроса+"Условие(СотрРодитель=ПустаяГруппа);"
            Иначе
                ТекстЗапроса = ТекстЗапроса+"Условие(Сотрудник в Группа);"
            КонецЕсли;
        КонецЕсли;
        
       // сформируем запрос

        Запрос = СоздатьОбъект("Запрос");
        Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
            Возврат СоздатьОбъект("ТаблицаЗначений");
        КонецЕсли;

        Пока Запрос.Группировка(1) = 1 Цикл
            СтрокаНайденная = "";
            КолонкаНайденная = "";
           // если еще не успели его ранее включить в таблицу, возможно, добавим сейчас:

            Если ТаблицаСотрудников.НайтиЗначение(Запрос.Сотрудник,СтрокаНайденная,КолонкаНайденная) = 0 Тогда
                
                Периодический.ИспользоватьОбъект("СостояниеФизлица",Запрос.Сотрудник);
                НачалоПериодаФЗ = ЖЗ.НачалоПериодаПоДате(ДатаАктуальности);
                СостояниеФЗВНачалеМесяца = Периодический.ЗначениеНаДату(НачалоПериодаФЗ);
                Если ПустоеЗначение(СостояниеФЗВНачалеМесяца) = 0 Тогда
                   // этот сотрудник уволен, условие в запросе: пустое состояниефизлица, а оно было не пустым в этом месяце

                    ТаблицаСотрудников.НоваяСтрока();
                    ТаблицаСотрудников.УстановитьЗначение(ТаблицаСотрудников.КоличествоСтрок(),1,Запрос.Сотрудник);
                    Продолжить;
                КонецЕсли;
               //СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);

                Периодический.ОбратныйПорядок();
                Периодический.ВыбратьЗначения(НачалоПериодаФЗ,ДатаАктуальности);
                Пока Периодический.ПолучитьЗначение() = 1 Цикл
                    Если ПустоеЗначение(Периодический.Значение) = 0 Тогда
                       // этот сотрудник уволен, условие в запросе: пустое состояниефизлица, а оно было не пустым в этом месяце

                        ТаблицаСотрудников.НоваяСтрока();
                        ТаблицаСотрудников.УстановитьЗначение(ТаблицаСотрудников.КоличествоСтрок(),1,Запрос.Сотрудник);
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
                
        КонецЦикла;
    КонецЕсли;
    
   // если передали идентификаторы колонок Дата1, Дата2 или Значение добавим соответствующие колонки...

    Если ПустоеЗначение(ИдентификаторДаты1)=0 Тогда
        ТаблицаСотрудников.НоваяКолонка(ИдентификаторДаты1,"Дата");
    КонецЕсли;
    Если ПустоеЗначение(ИдентификаторДаты2)=0 Тогда
        ТаблицаСотрудников.НоваяКолонка(ИдентификаторДаты2,"Дата");
    КонецЕсли;
    Если ПустоеЗначение(ИдентификаторЗначения)=0 Тогда
        ТаблицаСотрудников.НоваяКолонка(ИдентификаторЗначения,ТипВидЗначения,ДлинаЗначения,ТочностьЗначения);
    КонецЕсли;
   // ... и заполним таблицу сотрудников выбранными значениями

    Для Номер = 1 по ТаблицаСотрудников.КоличествоСтрок() Цикл
        Если ПустоеЗначение(ИдентификаторДаты1)=0 Тогда
            ТаблицаСотрудников.УстановитьЗначение(Номер,ИдентификаторДаты1,Дата1);
        КонецЕсли;
        Если ПустоеЗначение(ИдентификаторДаты2)=0 Тогда
            ТаблицаСотрудников.УстановитьЗначение(Номер,ИдентификаторДаты2,Дата2);
        КонецЕсли;
        Если ПустоеЗначение(ИдентификаторЗначения)=0 Тогда
            ТаблицаСотрудников.УстановитьЗначение(Номер,ИдентификаторЗначения,Значение);
        КонецЕсли;
    КонецЦикла;
    Возврат ТаблицаСотрудников

КонецФункции   // ПолучитьТаблицуСотрудников
   Ninon
 
13 - 19.08.04 - 10:31
(12)Спасибо !


Список тем форума
Рекламное место пустует   Рекламное место пустует
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует