示例#1
0
        private void MainRaschet(OLE Sotr, OLE Rasch, decimal rez)
        {
            OLE Сот = Rasch.Property("Объект");
            OLE Наз = Rasch.Property("Назначение");
            OLE Хоз = Rasch.Property("ХозОперация");

            if (OLE.IsEmtyValue(Наз))
            {
                throw new Exception("По сотруднику " + Sotr.Property("Наименование") + " в журнале расчетов обнаружены записи по основным начислениям с незаполненным реквизитом Назначение! Проводки по ним не сформированы!");
            }

            if (OLE.IsEmtyValue(Хоз))
            {
                // хозоперация не выбрана, распределяем между хозоперациями
                аспределить(Сот, Наз, null, rez, Rasch);
            }
            else
            {
                // хозоперация выбрана непосредственно в журнале расчетов, используем именно ее
                // для распределения по заказам
                OLE спрПроводки = Sotr.CreateObject("Справочник.Проводки");
                спрПроводки.Method("ИспользоватьВладельца", Хоз);
                спрПроводки.Method("ВыбратьЭлементы");
                while (спрПроводки.Method("ПолучитьЭлемент").ToBool())
                {
                    if (спрПроводки.Method("ПометкаУдаления").ToBool())
                    {
                        continue;
                    }
                    //глТрассировка("Обрабатываю проводку "+спрПроводки.ТекущийЭлемент());
                    //НомерПроводки = НомерПроводки + 1;

                    if (НужноРаспределятьПоЗаказам(спрПроводки.Method("ТекущийЭлемент")))
                    {
                        // есть субконто, значения которых нужно определить автоматически
                        if ((Rasch.Method("CalculKind").ToObject() == Rasch.EvalExpr("ВидРасчета.СдельныйНаряд").ToObject()) || (Rasch.Method("CalculKind").ToObject() == Rasch.EvalExpr("ВидРасчета.БригадныйНаряд").ToObject()))
                        {
                            // распределение по заказам хранится в документе (СдельныйНаряд или НарядБригады)
                            OLE    Наряд  = Rasch.Property("Документ");
                            string ВидДок = Наряд.Method("Вид").ToString();
                            if (ВидДок == "СдельныйНаряд")
                            {
                                // СдельныйНаряд - в документе несколько строк по разным хозоперациям и заказам
                                decimal ИтогПоХозоперации = 0;
                                Наряд.Method("ВыбратьСтроки");
                                while (Наряд.Method("ПолучитьСтроку").ToBool())
                                {
                                    if (Наряд.Property("ХозОперация").ToObject() != Хоз.ToObject())
                                    {
                                        continue;                                                                                            // пропускаем с другими хозоперациями
                                    }
                                    ИтогПоХозоперации = ИтогПоХозоперации + Наряд.Property("Сумма").ToDecimal();
                                }

                                if (ИтогПоХозоперации != 0)
                                {
                                    Наряд.Method("ВыбратьСтроки");
                                    while (Наряд.Method("ПолучитьСтроку").ToBool())
                                    {
                                        if (Наряд.Property("ХозОперация").ToObject() != Хоз.ToObject())
                                        {
                                            continue;                                                                                                 // пропускаем с другими хозоперациями
                                        }
                                        decimal СуммаПоЗаказу = Наряд.Property("Сумма").ToDecimal() * rez / ИтогПоХозоперации;
                                        New(Сот, Наз, спрПроводки.Method("ТекущийЭлемент"), Rasch, СуммаПоЗаказу, null);
                                    }
                                }
                                continue;
                            }
                            if (ВидДок == "НарядБригады")
                            {     // НарядБригады - в документе один заказ в шапке
                                if (OLE.IsEmtyValue(Наряд.Property("Заказ")))
                                { // распределяем по заказам
                                    аспределить(Сот, Наз, спрПроводки.Method("ТекущийЭлемент"), rez, Rasch);
                                }
                                else
                                {// известны и заказ, и хозоперация
                                    New(Сот, Наз, спрПроводки.Method("ТекущийЭлемент"), Rasch, rez, null);
                                }
                                continue;
                            }
                            // неизвестный документ - распределяем обычным способом
                            аспределить(Сот, Наз, спрПроводки.Method("ТекущийЭлемент"), rez, Rasch);
                        }
                        else
                        {// остальные основные начисления (оклад)
                            аспределить(Сот, Наз, спрПроводки.Method("ТекущийЭлемент"), rez, Rasch);
                        }
                    }
                    else
                    {
                        New(Сот, Наз, спрПроводки.Method("ТекущийЭлемент"), Rasch, rez, null);
                    }
                }
            }
        }
示例#2
0
        private void  аспределить(OLE Сотрудник, OLE Назначение, OLE Проводка, decimal Сумма, OLE Вир)
        {
            // процедура предназначена для распределения указанной суммы между хозоперациями и заказами
            // Сотррудник,Назначение - сотрудник и назначение, для которых распределяем (Подразделение и Категорию получаем по Назначению)
            // Проводка - задает проводку (и соответственно Хозоперацию) по которой распределяется сумма (может быть не выбрана)
            // Сумма - сумма, которую необходимо распределить

            //Static.ShowInfo("Распределить:" + (string)Сотрудник.Property("Description") + ":" + (string)Назначение.Property("Description") + ":" + Проводка + ":" + Сумма);
            OLE аспределение = null;
            OLE ХозОперация  = null;

            if (!OLE.IsEmtyValue(Проводка))
            {
                ХозОперация = Проводка.Property("Владелец");
            }

            // начинаем поиск с самого подробного, т.е. с Назначения и двигаемся вплоть до Категории
            НайтиРаспределение(Назначение, ref аспределение, ref ХозОперация);
            НайтиРаспределение(Сотрудник, ref аспределение, ref ХозОперация);

            // теперь Подразделение
            OLE Подразделение = null;

            try
            {
                Подразделение = Назначение.Property("МестоРаботы").Property("Владелец");
            }
            catch
            {
                System.Diagnostics.Trace.WriteLine("Не могу определить Подразделение по Назначению " + (string)Назначение.Property("Description") + " для Сотрудника " + (string)Сотрудник.Property("Description"));
                Подразделение = null;
            }

            if (!OLE.IsEmtyValue(Подразделение))
            {
                // справочник Подразделения многоуровневый
                for (int Уровень = 1; Уровень < (int)(double)V7Z.EvalExpr("Метаданные.Справочник(\"Подразделения\").КоличествоУровней"); Уровень++)
                {
                    НайтиРаспределение(Подразделение, ref аспределение, ref ХозОперация);
                    try
                    {
                        Подразделение = Подразделение.Property("Родитель");
                    }
                    catch
                    {
                        break;
                    }
                    if (OLE.IsEmtyValue(Подразделение))
                    {
                        break;
                    }
                }
            }

            // и, наконец, Категория
            OLE Категория = null;

            try
            {
                Категория = Назначение.Property("МестоРаботы").Property("Должность").Property("Категория");
            }
            catch
            {
                System.Diagnostics.Trace.WriteLine("Не могу определить Категорию по Назначению " + (string)Назначение.Property("Description") + " для Сотрудника " + Сотрудник.Property("Description"));
                Категория = null;
            }

            if (!OLE.IsEmtyValue(Категория))
            {
                НайтиРаспределение(Категория, ref аспределение, ref ХозОперация);
            }

            // теперь найдены распределение и хозоперация (причем должно быть хотя бы одно из них)
            //глТрассировка("Распределение = "+Распределение+": Хозоперация = "+Хозоперация);
            if (OLE.IsEmtyValue(аспределение) && OLE.IsEmtyValue(ХозОперация))
            {
                System.Diagnostics.Trace.WriteLine("Для Назначения " + Назначение.Property("Description") +
                                                   " Сотрудника " + Сотрудник.Property("Description") +
                                                   " не внесена информация о распределении основных начислений," +
                                                   "   а также не заданы хоз. операции в справочниках! Проводки по основным начислениям сотрудника не сформированы!");
                return;
            }

            if (!OLE.IsEmtyValue(ХозОперация))
            {
                // хозоперация задана явно
                if (!OLE.IsEmtyValue(Проводка))
                {
                    // значит, проводку передали в качестве параметра в функцию
                    // требуется обработать именно ее
                    аспределитьПоПроводке(Сотрудник, Назначение, Проводка, Вир, аспределение, Сумма);
                }
                else
                {
                    // проводка не выбрана, но хозоперация выбрана
                    OLE спрПроводки = V7Z.CreateObject("Справочник.Проводки");
                    спрПроводки.Method("ИспользоватьВладельца", ХозОперация.ToObject());
                    спрПроводки.Method("ВыбратьЭлементы");
                    while ((double)спрПроводки.Method("ПолучитьЭлемент") == 1.0)
                    {
                        if ((double)спрПроводки.Method("ПометкаУдаления") == 1.0)
                        {
                            continue;
                        }
                        // распределяем для каждой проводки
                        аспределитьПоПроводке(Сотрудник, Назначение, спрПроводки.Method("ТекущийЭлемент"), Вир, аспределение, Сумма);
                    }
                }
            }
            else
            {
                // если не задана хозоперация, то должно быть задано Распределение,
                // это мы проверили выше
                OLE тбПолная = V7Z.CreateObject("ТаблицаЗначений");
                //    Распределение.Method("ВыгрузитьТабличнуюЧасть", тбПолная.Handle);

                //    decimal ИтогПоДокументу = (decimal)(double)Распределение.Method("Итог", "ВесовойКоэф");
                //    if (ИтогПоДокументу == 0)
                //    {
                //        Static.ShowInfo("В документе " + Распределение + " итоговая сумма весовых коэффициентов равна 0!" + "   Не могу сформировать проводки для Назначения " + Назначение + " Сотрудника " + Сотрудник + "!");
                //        return;
                //    }

                //    decimal УжеРаспределено = 0;
                //    int Ном = 1;

                //    тбПолная.Method("ВыбратьСтроки");
                //    while ((double)тбПолная.Method("ПолучитьСтроку") == 1.0)
                //    {
                //        decimal Коэф = (decimal)(double)тбПолная.Property("ВесовойКоэф") / ИтогПоДокументу;
                //        decimal ТекСумма = decimal.Round(Коэф * Сумма, 2);
                //        if ((int)(double)тбПолная.Method("КоличествоСтрок") == Ном)
                //        {
                //            // для последней строки берем остаток, чтобы избежать округлений
                //            ТекСумма = Сумма - УжеРаспределено;
                //        }

                //        УжеРаспределено = УжеРаспределено + ТекСумма;
                //        Ном = Ном + 1;

                //        // для каждой строки документа нужно просмотреть хозоперацию и проводки по ней
                //        OLE спрПроводки = V7Z.CreateObject("Справочник.Проводки");
                //        спрПроводки.Method("ИспользоватьВладельца", тбПолная.Property("ХозОперация"));
                //        спрПроводки.Method("ВыбратьЭлементы");
                //        НомерПроводки = 0;
                //        while ((double)спрПроводки.Method("ПолучитьЭлемент") == 1.0)
                //        {
                //            if ((double)спрПроводки.Method("ПометкаУдаления") == 1.0) continue;
                //            НомерПроводки++;
                //            ПроводкуВДБФ(Сотрудник, Назначение, спрПроводки.Property("ТекущийЭлемент"), ТекСумма, тбПолная.Property("Заказ"), Вир, null, НомерПроводки);
                //        }
                //    } // по строкам документа
            }
        }