示例#1
0
        // Ищем документ
        // Global    - глобальный контекст конфигурации
        // DocName   - название документа
        // DateStart - начальная дата
        // DateEnd   - конечная дата
        // LabelDoc  - метка документа
        // Возврат:
        //    Найденый документ или null
        private OLE FindDoc(OLE Global, string DocName, DateTime DateStart, DateTime DateEnd, string LabelDoc)
        {
            OLE doc = Global.CreateObject("Документ." + DocName);

            if (!doc.Method("ВыбратьДокументы", DateStart, DateEnd).ToBool())
            {
                return(null);
            }
            while (doc.Method("Получитьдокумент").ToBool())
            {
                if (doc.Property("Операция").Property("Description").ToString().Trim() == OperationDescription)
                {
                    return(doc);
                }
            }
            return(null);
        }
        public аспределения(OLE obj)
        {
            OLE V7Z = obj.Global;

            FRaspr = new List <аспределение>();
            FRaspr.Sort();
            // заполняет список спРаспределения документами Распределения за указанный период
            string ТекстЗапр = "Период с '" + ДатаПериода.Begin.ToShortDateString() + "' по '" + ДатаПериода.End.ToShortDateString() + "';" +
                               "Обрабатывать НеПомеченныеНаУдаление;" +
                               "Рас = Документ.РаспределениеОсновныхНачислений.ТекущийДокумент;" +
                               "Фир = Документ.РаспределениеОсновныхНачислений.Фирма;" +
                               "Сот = Документ.РаспределениеОсновныхНачислений.Сотрудник;" +
                               "Наз = Документ.РаспределениеОсновныхНачислений.Назначение;" +
                               "Под = Документ.РаспределениеОсновныхНачислений.Подразделение;" +
                               "Кат = Документ.РаспределениеОсновныхНачислений.Категория;" +
                               "Группировка Рас без упорядочивания;" +
                               "Условие(Фир.Code = \"" + CommonVariables.GetFirm(obj).Property("CODE").ToString().Trim() /*ZFirm.Code*/ + "\");";

            OLE зРаспределения = V7Z.CreateObject("Запрос");

            if (!(bool)зРаспределения.Method("Выполнить", ТекстЗапр))
            {
                throw new Exception("ОШИБКА!!! Не выполнился запрос по распределениям основных начислений!");
            }

            while ((double)зРаспределения.Method("Группировка", "Рас") == 1.0)
            {
                // в список нужно добавить либо назначение, либо сотрудника, либо подразделение, либо категорию
                OLE ЧтоДобавляем = null;
                if (!OLE.IsEmtyValue(зРаспределения.Property("Кат")))
                {
                    ЧтоДобавляем = зРаспределения.Property("Кат"); // priore 3
                }

                if (!OLE.IsEmtyValue(зРаспределения.Property("Под")))
                {
                    ЧтоДобавляем = зРаспределения.Property("Под"); // priore 2
                }

                if (!OLE.IsEmtyValue(зРаспределения.Property("Сот")))
                {
                    ЧтоДобавляем = зРаспределения.Property("Сот"); // priore 1
                }


                if (!OLE.IsEmtyValue(зРаспределения.Property("Наз")))
                {
                    ЧтоДобавляем = зРаспределения.Property("Наз"); // priore 0
                }

                if (ЧтоДобавляем == null)
                {
                    System.Diagnostics.Trace.WriteLine("В документе " + (string)зРаспределения.Property("Рас") + " не указано ни назначение, ни сотрудник, ни подразделение, ни категория! Документ не учитывается при формировании проводок!");
                    continue;
                }

                аспределение r = new  аспределение();
                r.DocNumber = V7Z.Method("ЗначениеВСтрокуВнутр", ЧтоДобавляем).ToString();
                r.Doc       = ЧтоДобавляем;

                int Инд = Items.BinarySearch(r);
                if (Инд >= 0)
                {
                    // информация о распределении для данного объекта уже есть
                    System.Diagnostics.Trace.WriteLine("Документ РаспределениеОсновныхНачислений " + (string)зРаспределения.Property("Рас").Property("НомерДок") + " дублирует информацию о " + (string)ЧтоДобавляем + ", внесенную документом " + Items[Инд].DocNumber);
                    continue;
                }
                Items.Add(r);
            }
        }
示例#3
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);
                    }
                }
            }
        }
示例#4
0
        private void AtherRaschet(OLE Sotr, OLE Rasch, decimal rez)
        {
            OLE спрВидыРасчетов = Sotr.CreateObject("Справочник.ВидыРасчетов");

            if (!спрВидыРасчетов.Method("НайтиПоРеквизиту", "Расчет", Rasch.Property("ВидРасч"), 1).ToBool())
            {
                throw new Exception("Вид расчета " + Rasch + " не найден в справочнике \"Виды расчетов\". Нужно добавить его в справочник и установить для него хоз. операцию!" +
                                    "   Проводка не сформирована!");
            }

            OLE Хоз = Rasch.Property("ХозОперация");

            if (OLE.IsEmtyValue(Хоз))
            {
                Хоз = спрВидыРасчетов.Property("Хозоперация");
            }
            if (OLE.IsEmtyValue(Хоз))
            {
                if (Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.ВсеНачисления")).ToBool() ||
                    Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.ВсеУдержания")).ToBool() ||
                    Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.ВсеВыплаты")).ToBool() ||
                    (Rasch.Property("ВидРасч").ToObject() == Rasch.EvalExpr("ВидРасчета.ВозвратВКассу").ToObject()))
                {
                    // для этих видов расчетов имеет смысл задавать хозоперацию в справочнике
                    // то, что она не задана, скорее всего ошибка
                    System.Diagnostics.Trace.WriteLine("В справочнике \"Виды расчетов\" для " + спрВидыРасчетов.Method("ТекущийЭлемент").Property("Description").ToString() + " не задана хоз. операция!" +
                                                       "   Проводка не сформирована!");
                }
                return;
            }

            OLE спрПроводки = Rasch.CreateObject("Справочник.Проводки");

            спрПроводки.Method("ИспользоватьВладельца", Хоз);
            спрПроводки.Method("ВыбратьЭлементы");
            while (спрПроводки.Method("ПолучитьЭлемент").ToBool())
            {
                if (спрПроводки.Method("ПометкаУдаления").ToBool())
                {
                    continue;
                }
                if (НужноРаспределятьПоЗаказам(спрПроводки.Method("ТекущийЭлемент")) &&
                    (Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.ИсполнительныеЛисты")).ToBool() || (Rasch.Property("ВидРасч").ToObject() == Rasch.EvalExpr("ВидРасчета.ПроцентПочтыБанка").ToObject())))
                {
                    // получим аналитику по исполнительным листам непосредственно
                    // из документа
                    OLE жрнЗарплата = Rasch.CreateObject("ЖурналРасчетов.Зарплата");
                    жрнЗарплата.Method("ВыбратьПериодПоОбъекту", Sotr, ДатаПериода.Begin);
                    while (жрнЗарплата.Method("ПолучитьЗапись").ToBool())
                    {
                        if (жрнЗарплата.Property("ВидРасч").ToObject() != Rasch.Property("ВидРасч").ToObject())
                        {
                            continue;                                                                                                            // отбираем только записи по "нашему" виду расчета
                        }
                        if (OLE.IsEmtyValue(жрнЗарплата.Property("ХозОперация")))
                        {
                            continue;                                                                              // отбираем только записи по "нашей" хоз операции
                        }
                        if (жрнЗарплата.Property("Документ").Property("Вид").ToString() != "ИсполнительныйЛист")
                        {
                            System.Diagnostics.Trace.WriteLine("По сотруднику " + Sotr.Property("Description").ToString() + " найдены записи по исполнительным листам (алиментам), которые внесены не документом \"Исполнительный лист\". Автоматически определить аналитику для проводок невозможно!" +
                                                               "    Проводка не сформирована!");
                        }
                        else
                        {
                            OLE Кому = жрнЗарплата.Property("Документ").Property("Кому");
                            OLE Наз  = Rasch.Property("Назначение");
                            New(Sotr, Наз, спрПроводки.Method("ТекущийЭлемент"), Rasch, rez, Кому);
                        }
                    }
                }
                else
                {
                    OLE Наз = Rasch.Property("Назначение");
                    New(Sotr, Наз, спрПроводки.Method("ТекущийЭлемент"), Rasch, rez, null);
                }
            }
        }