示例#1
0
        // OLE     Проводка         - элемент справочника ЭП_Проводки, на основании которого формируется проводка
        // decimal Сумма            - сумма проводки
        // string СотрудникКод      - код сотрудника, по которому формирует проводка
        // string ПодразделениеКод  - код подразделения по которому формируется проводка
        // DateTime Period          - Период формируемой проводки
        // bool ЭтоНачисленияНаОтпуск - Прзнак начисления на отпуск
        public Проводка(OLE ШаблонПроводки, decimal Сумма, string СотрудникКод, string ПодразделениеКод, DateTime Period, bool ЭтоНачисленияНаОтпуск)
        {
            if (OLE.IsEmtyValue(ШаблонПроводки.Property("СчетДебета")) && OLE.IsEmtyValue(ШаблонПроводки.Property("СчетКредита")))
            {
                Error = "В проводке " + ШаблонПроводки.Property("Код") + " хоз. операции " + ШаблонПроводки.Property("Владелец").Property("Description") + " не заданы счета! Проводка не формируется!";
                return;
            }


            Сумма = decimal.Round(Сумма, 2);

            if (Сумма == 0)
            {
                Error = "По проводке №" + ШаблонПроводки.Property("Код") + " хоз. операции " + ШаблонПроводки.Property("Владелец").Property("Description") + " сумма 0! Проводка не формируется!";
                return;
            }


            if (ШаблонПроводки.Property("УказанПроцент").ToBool())
            {
                Summ = decimal.Round(Сумма * ШаблонПроводки.Property("Процент").ToDecimal() / 100, 2);
            }
            else
            {
                Summ = Сумма;
            }

            Debit   = new Debit(ШаблонПроводки, СотрудникКод, ПодразделениеКод, Period, ЭтоНачисленияНаОтпуск);
            Credit  = new Credit(ШаблонПроводки, СотрудникКод, ПодразделениеКод, Period, ЭтоНачисленияНаОтпуск);
            Comment = " ";
        }
示例#2
0
        private bool НужноРаспределятьПоЗаказам(OLE Пров)
        {
            // Назначение:
            //		По проводке определяет, нужно ли распределять сумму между заказами
            // Аргументы:
            //		Пров - проводка, элемент справочника
            // Возвращает:
            //		true - нужно, false - нет

            string стрДебетКредит = "Дебет";

            for (int Инд = 1; Инд < 2; Инд++)
            {
                for (int ИндСубк = 1; ИндСубк < Проводка.МаксКоличествоСубконто; ИндСубк++)
                {
                    // дебет
                    if ((double)Пров.Method("ПолучитьАтрибут", "АвтоСубконто" + стрДебетКредит + ИндСубк) == 1.0)
                    {
                        OLE Счет = Пров.Method("ПолучитьАтрибут", "Счет" + стрДебетКредит + "а");
                        if (!OLE.IsEmtyValue(Счет))
                        {
                            // автоматически могут определяться также сотрудники и подразделения
                            OLE ВидСубк = Счет.Method("ПолучитьАтрибут", "ВидСубконто" + ИндСубк);
                            if (OLE.IsEmtyValue(ВидСубк))
                            {
                                continue;
                            }
                            string ИдентВидСубк = ВидСубк.Property("Идентиф").ToString().Trim().ToLower();
                            if ((double)V7Z.Property("глСпецВидыСубконто").Method("НайтиЗначение", ИдентВидСубк) == 0)
                            {
                                return(true);
                            }
                        }
                        else
                        {
                            return(true);
                        }
                    }
                }
                стрДебетКредит = "Кредит";
            }
            return(false);
        }
示例#3
0
        private void New(OLE Сотрудник, OLE Назначение, OLE Проводка, OLE Rasch, decimal Сумма, OLE Comu)
        {
            // Процедура предназначена для добавления проводки к списку проводок
            // Сотрудник, Назначение - используются для выдачи сообщений и проводок
            // Проводка - уже найденная проводка
            // Сумма - сумма для распределения между заказами
            // Распределение - документ "Распределение основных начислений", согласно которому выполняется распределение
            string СотрудникКод     = Сотрудник.Property("Code").ToString().Trim();
            string ПодразделениеКод = Rasch.Property("Объект").Property("Подразделение").Property("Code").ToString().Trim();

            // Вводим поддержку подразделений из назначения
            if (!OLE.IsEmtyValue(Rasch.Property("Назначение")))
            {
                ПодразделениеКод = Rasch.Property("Назначение").Property("МестоРаботы").Property("Владелец").Property("Code").ToString().Trim();
            }
            DateTime period = Rasch.Property("ДатаНачала").ToDateTime();


            Item.Add(new Проводка(Проводка, Сумма, СотрудникКод, ПодразделениеКод, period));
        }
示例#4
0
        private void НайтиРаспределение(OLE ПоЧемИщем, ref OLE аспределение, ref OLE ХозОперация)
        {
            // процедура предназначена для поиска документа-распределения и хозоперации в списке
            // ПоЧемИщем - назначение, сотрудник, подразделение или категория, по которой ищем в списке
            // Распределение - найденный документ "Распределение основных начислений"
            // ХозОперация - найденная хозоперация
            if (!OLE.IsEmtyValue(аспределение))
            {
                return;                                  // распределение уже выбрано
            }
            // собственно поиск
            аспределение r = new  аспределение();

            r.DocNumber = ПоЧемИщем.Global.Method("ЗначениеВСтрокуВнутр", ПоЧемИщем).ToString();
            r.Doc       = ПоЧемИщем;


            int Инд = аспределения.Items.BinarySearch(r);

            if (Инд >= 0)
            {
                // получилось найти документ-распределение в списке
                аспределение = аспределения.Items[Инд].Doc;
            }
            else
            {
                if (OLE.IsEmtyValue(ХозОперация))
                {
                    // найдем хозоперацию
                    // возможно для элемента справочника ПоЧемИщем хозоперация задана явно
                    try
                    {
                        ХозОперация = ПоЧемИщем.Property("ХозОперация");
                    }
                    catch { }
                }
            }
        }
示例#5
0
        public void Add(OLE Rasch, decimal rez, List <НалогНаФОП> NalogsFOP)
        {
            string PodrCod = Rasch.Property("Объект").Property("Подразделение").Property("Code").ToString().Trim();

            // Вводим поддержку подразделений из назначения
            if (!OLE.IsEmtyValue(Rasch.Property("Назначение")))
            {
                PodrCod = Rasch.Property("Назначение").Property("МестоРаботы").Property("Владелец").Property("Code").ToString().Trim();
            }

            FOPDivision Division;

            if (FOPDivision.ContainsKey(PodrCod))
            {
                Division = FOPDivision[PodrCod];
            }
            else
            {
                Division = new FOPDivision();
                FOPDivision.Add(PodrCod, Division);
            }

            Division.Add(Rasch, rez, NalogsFOP);
        }
        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);
            }
        }
示例#7
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);
                    }
                }
            }
        }
示例#8
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, НомерПроводки);
                //        }
                //    } // по строкам документа
            }
        }
示例#9
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);
                }
            }
        }
示例#10
0
        void  аспределитьПоПроводке(OLE Сотрудник, OLE Назначение, OLE Проводка, OLE Rasch, OLE аспределение, decimal Сумма)
        {
            // Процедура предназначена для распределения суммы по уже известной проводке и документу
            // "Распределение основных начислений" между заказами, либо просто для формирования проводки,
            // когда по заказам распределять не нужно
            // Сотрудник, Назначение - используются для выдачи сообщений и проводок в ДБФ
            // Проводка - уже найденная проводка
            // Сумма - сумма для распределения между заказами
            // Распределение - документ "Распределение основных начислений", согласно которому выполняется распределение

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

            if (OLE.IsEmtyValue(аспределение))
            {
                // а распределения-то нет
                if (НужноРаспределятьПоЗаказам(Проводка))
                {
                    // есть субконто, значения которых нужно определить автоматически
                    System.Diagnostics.Trace.WriteLine("Для хоз. операции " + ХозОперация.Property("Description") + " в проводках указано автоматическое определение субконто, однако по Назначению " + Назначение.Property("Description") + "\n   сотрудника " + Сотрудник.Property("Description") + " найти документ-распределение не удалось! Проводка не сформирована!");
                    return;
                }
                else
                {
                    New(Сотрудник, Назначение, Проводка, Rasch, Сумма, null);
                }
            }
            else
            {
                // распределение есть, выполняем следующее: распределяем по известной проводке суммы по субконто-заказам
                // будем оперировать локальными таблицами значений для увеличения скорости
                OLE тбПолная    = V7Z.CreateObject("ТаблицаЗначений");
                OLE тбСвернутая = V7Z.CreateObject("ТаблицаЗначений");
                throw new Exception("Stop point Проводки  ----------");

                //        Распределение.Method("ВыгрузитьТабличнуюЧасть", тбПолная.Handle);
                //        тбПолная.Method("Выгрузить", тбСвернутая.Handle);
                //        // свернутая таблица нужна для получения промежуточного итога весовых коэффициентов только по одной хозоперации
                //        // сначала сворачиваем, а потом ищем
                //        тбСвернутая.Method("Свернуть", "ХозОперация", "ВесовойКоэф");

                //        decimal ИтогПоХозОперации = 0;
                //        double чНомерСтроки = 0;
                //        if ((double)тбСвернутая.Method("НайтиЗначение", ХозОперация.Handle, чНомерСтроки, "ХозОперация") != 0)
                //        {
                //            // нужная нам ХозОперация присутствует в документе
                //            тбСвернутая.Method("ПолучитьСтрокуПоНомеру", чНомерСтроки);
                //            ИтогПоХозОперации = (decimal)(double)тбСвернутая.Method("ВесовойКоэф");
                //        }

                //        if (ИтогПоХозОперации == 0)
                //        {
                //            Static.ShowInfo("В документе " + (string)Распределение.Property("Description") + " сумма весовых коэффициентов по хоз. операции " + ХозОперация.Property("Description") + "   равна 0! Не удается выполнить распределение для Назначения " + (string)Назначение.Property("Description") + " Сотрудника " + (string)Сотрудник.Property("Description") + "! Проводка не сформирована!");
                //        }

                //        // теперь обыкновенное распределение по весовым коэффициентам, только
                //        // учитываем, что для последней строки сумму определяем не округлением, а как остаток
                //        // между общей суммой и уже распределенной суммой
                //        OLE ПоследнийЗаказ = null;
                //        decimal УжеРаспределено = 0;
                //        decimal ПоследняяСумма = 0;

                //        тбПолная.Method("ВыбратьСтроки");
                //        while ((double)тбПолная.Method("ПолучитьСтроку") == 1.0)
                //        {
                //            if (тбПолная.Property("ХозОперация") != ХозОперация.Handle)
                //            {
                //                continue; // пропускаем другие хозоперации
                //            }
                //            if (ПоследняяСумма != 0)
                //            {
                //                // на предыдущей итерации определили некую сумму и заказ
                //                ПроводкуВДБФ(Сотрудник, Назначение, Проводка, ПоследняяСумма, ПоследнийЗаказ, Вир, null, НомерПроводки);
                //                УжеРаспределено = УжеРаспределено + ПоследняяСумма;
                //            }
                //            decimal Коэф = (decimal)(double)тбПолная.Property("ВесовойКоэф") / ИтогПоХозОперации;
                //            ПоследняяСумма = decimal.Round(Коэф * Сумма, 2);
                //            ПоследнийЗаказ = тбПолная.Property("Заказ");
                //        }
                //        if (ПоследняяСумма != 0)
                //        {
                //            // на последней итерации определили заказ, а сумму берем так, чтобы избежать округлений
                //            ПроводкуВДБФ(Сотрудник, Назначение, Проводка, Сумма - УжеРаспределено, ПоследнийЗаказ, Вир, null, НомерПроводки);
                //        }
            }
        }