public НалогиНаФОП()
        {
            Sotrs = new List <SotrFOP>();
            List <НалогНаФОП> NalogsFOP = new List <НалогНаФОП>();

            OLE ноЗПФонды;
            OLE СпрШкала = V7Z.CreateObject("Справочник.ШкалаСтавок");

            if (СпрШкала.Method("НайтиПоКоду", (object)"ЗПФонды").ToBool())
            {
                ноЗПФонды = СпрШкала.Method("ТекущийЭлемент");
            }
            else
            {
                throw new Exception("ОШИБКА !!! Не могу найти сведения о налогах с фонда оплаты труда \n В справочнике 'Шкалы ставок' не обнаружен элемент с кодом 'ЗПФонды'");
            }

            СпрШкала.Method("ИспользоватьРодителя", ноЗПФонды);
            СпрШкала.Method("ИспользоватьДату", ДатаПериода.End);
            СпрШкала.Method("ПорядокКодов");
            СпрШкала.Method("ВыбратьЭлементы");

            while (СпрШкала.Method("ПолучитьЭлемент").ToBool())
            {
                НалогНаФОП nalog = new НалогНаФОП((string)СпрШкала.Property("Код"));
                NalogsFOP.Add(nalog);
            }
        }
Example #2
0
        public static OLE GetReferenceElementZIK(string ReferenceType, string Code)
        {
            OLE reference = V7Z.CreateObject("Справочник." + ReferenceType);

            if (reference.Method("FindByCode", Code).ToBool())
            {
                return(reference.Method("CurrentItem"));
            }
            return(null);
        }
Example #3
0
        public decimal Procent(DateTime onDate)
        {
            OLE СпрШкала = V7Z.CreateObject("Справочник.ШкалаСтавок");

            if (!СпрШкала.Method("НайтиПоКоду", СпрШкалаКод).ToBool())
            {
                throw new Exception("Ошибка позиционирования по коду ШкалаСтавок.");
            }
            return((decimal)СпрШкала.Property("Ставка").Method("Получить", onDate));
        }
Example #4
0
        public decimal Predel(DateTime onDate)
        {
            OLE СпрШкала = V7Z.CreateObject("Справочник.ШкалаСтавок");

            if (!СпрШкала.Method("НайтиПоКоду", СпрШкалаКод).ToBool())
            {
                throw new Exception("Ошибка позиционирования по коду ШкалаСтавок.");
            }
            string s     = (string)СпрШкала.Property("Дополнительно").Method("Получить", onDate);
            int    start = s.LastIndexOf('=') + 1;

            s = s.Substring(start, s.IndexOf(';', start) - start);
            return(decimal.Parse(s));
        }
Example #5
0
        public void GenEntries(ref Проводки prov, OLE Sotr, List <НалогНаФОП> NalogsFOP)
        {
            foreach (FOPDivision Division in FOPDivision.Values)
            {
                foreach (PeriodFOP per in Division.Period)
                {
                    for (int i = 0; i < per.Nalogs.Count; i++)
                    {
                        OLE спрПроводки = V7Z.CreateObject("Справочник.Проводки");
                        спрПроводки.Method("ИспользоватьВладельца", per.Nalogs[i].НалогНаФОП.ХозОперация);
                        спрПроводки.Method("ВыбратьЭлементы");
                        System.Diagnostics.Trace.WriteLine("Налог на фонд " + per.Nalogs[i].НалогНаФОП.СпрШкалаКод + " за период " +
                                                           per.PerD.ToShortDateString() + " - " + per.Nalogs[i].Налог.ToString() +
                                                           " с отпуска - " + per.Nalogs[i].Налог_с_Отпуска.ToString());

                        while (спрПроводки.Method("ПолучитьЭлемент").ToBool())
                        {
                            if (спрПроводки.Method("ПометкаУдаления").ToBool())
                            {
                                continue;
                            }
                            // Проведём деление на отпускные
                            if (NalogFOP.ИспользоватьРезервОтпусков)
                            {
                                prov.Item.Add(new Проводка(спрПроводки.Method("CurrentItem"),                    //Проводка
                                                           per.Nalogs[i].Налог_с_Отпуска,                        //Сумма
                                                           Code,                                                 //Сотрудник
                                                           FOPDivision.Keys[FOPDivision.IndexOfValue(Division)], //Division
                                                           per.PerD,                                             //Период
                                                           true));

                                //471 счёт
                            }

                            prov.Item.Add(new Проводка(спрПроводки.Method("CurrentItem"),                    //Проводка
                                                       per.Nalogs[i].Налог,                                  //Сумма
                                                       Code,                                                 //Сотрудник
                                                       FOPDivision.Keys[FOPDivision.IndexOfValue(Division)], /*Division*/
                                                       per.PerD));
                            //Период
                        }
                    }
                }
            }
        }
Example #6
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);
        }
Example #7
0
        protected override bool doExecute()
        {
            OLE ZIKReferences = V7Z.CreateObject("—правочник.¬иды—убконто");
            OLE ZIKRefChild   = V7Z.CreateObject("—правочник.ќбъектыјналит”чета");

            #region  ашиƒенежные—чета
            OLE PUBRefMain = V7B.CreateObject("—правочник.Ќашиƒенежные—чета");
            PUBRefMain.Method("»спользовать¬ладельца", CommonVariables.GetFirm(V7B) /* CommonVariables.BFirm.CurrentItem */);

            if ((double)ZIKReferences.Method("Ќайтиѕо–еквизиту", (object)"»дентиф", (object)"Ќашиƒенежные—чета", (object)1) != 1.0)
            {
                MessageBox.Show("Ќе могу найти в «и  субконто Ќашиƒенежные—чета", "ќшибка текущей формы !!!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return(false);
            }
            ZIKRefChild.Method("»спользовать¬ладельца", ZIKReferences.Method("“екущийЁлемент"));
            System.Diagnostics.Trace.WriteLine("ќбрабатываем справочник Ќашиƒенежные—чета");
            Sinchro(PUBRefMain, ZIKRefChild);
            cbƒенежные—редства.Checked = true;
            #endregion
            #region Ўкала—тавок
            PUBRefMain = V7B.CreateObject("—правочник.Ўкала—тавок");
            if ((double)ZIKReferences.Method("Ќайтиѕо–еквизиту", (object)"»дентиф", (object)"Ўкала—тавок", (object)1) != 1.0)
            {
                MessageBox.Show("Ќе могу найти в «и  субконто Ўкала—тавок", "ќшибка текущей формы !!!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return(false);
            }
            ZIKRefChild.Method("»спользовать¬ладельца", ZIKReferences.Method("“екущийЁлемент"));
            System.Diagnostics.Trace.WriteLine("ќбрабатываем справочник Ўкала—тавок");
            Sinchro(PUBRefMain, ZIKRefChild);
            cbЎкала—тавок.Checked = true;
            #endregion
            #region  онтрагенты
            PUBRefMain = V7B.CreateObject("—правочник. онтрагенты");
            if ((double)ZIKReferences.Method("Ќайтиѕо–еквизиту", (object)"»дентиф", (object)" онтрагенты", (object)1) != 1.0)
            {
                MessageBox.Show("Ќе могу найти в «и  субконто  онтрагенты", "ќшибка текущей формы !!!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return(false);
            }
            ZIKRefChild.Method("»спользовать¬ладельца", ZIKReferences.Method("“екущийЁлемент"));
            System.Diagnostics.Trace.WriteLine("ќбрабатываем справочник  онтрагенты");
            Sinchro(PUBRefMain, ZIKRefChild);
            cb онтрагенты.Checked = true;
            #endregion
            #region ¬иды«атрат
            PUBRefMain = V7B.CreateObject("—правочник.¬иды«атрат");
            if ((double)PUBRefMain.Method("FindByDescr", (object)"«арплата") == 0)
            {
                MessageBox.Show("Ќе могу найти в сравочнике ¬иды«атрат ѕ”Ѕ папку «арплата", "ќшибка текущей формы !!!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return(false);
            }
            object zarp = PUBRefMain.Method("CurrentItem");
            PUBRefMain.Method("UseParent", zarp, 0);
            if ((double)ZIKReferences.Method("Ќайтиѕо–еквизиту", (object)"»дентиф", (object)"¬иды«атрат", (object)1) == 0)
            {
                MessageBox.Show("Ќе могу найти в «и  субконто ¬иды«атрат", "ќшибка текущей формы !!!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return(false);
            }
            ZIKRefChild.Method("»спользовать¬ладельца", ZIKReferences.Method("“екущийЁлемент"));
            System.Diagnostics.Trace.WriteLine("ќбрабатываем справочник ¬иды«атрат");
            Sinchro(PUBRefMain, ZIKRefChild);
            cb¬иды«атрат.Checked = true;
            #endregion
            CommonVariables.ProgressBarHide();
            return(true);
        }
Example #8
0
        protected override bool doExecute()
        {
            Refresh();
            Trace.WriteLine("Начата синхронизация даных");
            Base DataBase = new Base();

            conf.RestopeBase(ref DataBase);
            OLE temp;

            // Активируем соединения с 1С7.7
            if (CommonVariables.ZConnection != null)
            {
                CommonVariables.ZConnection.Dispose();
            }
            try
            {
                CommonVariables.ZConnection = new NTICS.OLE1C77.OLEConnection(conf.CONNECTION_BasePatchZ, (NTICS.OLE1C77.V77Servers)conf.CONNECTION_ServerType, false, conf.UserName, conf.PassWord);
            }
            catch (Exception e)
            {
                Trace.WriteLine("Неудачная попытка подключения к  " + conf.CONNECTION_BasePatchZ + "\n" + e.Message);
                CommonVariables.ZConnection = null;
                return(false);
            }
            System.Diagnostics.Trace.WriteLine("Вы подключились к Зик.");
            if (CommonVariables.ZConnection == null)
            {
                return(false);
            }

            OLE FirmZ = CommonVariables.GetFirm(CommonVariables.ZConnection.Global);

            if (FirmZ == null)
            {
                System.Diagnostics.Trace.WriteLine("Отсутствует хотябы одна зарегистрированая фирма в ЗиК !!!");
                return(false);
            }


            if (CommonVariables.BConnection != null)
            {
                CommonVariables.BConnection.Dispose();
            }
            try
            {
                CommonVariables.BConnection = new NTICS.OLE1C77.OLEConnection(conf.CONNECTION_BasePatchB, (NTICS.OLE1C77.V77Servers)conf.CONNECTION_ServerType, false, conf.UserName, conf.PassWord);
            }
            catch
            {
                Trace.WriteLine("Неудачная попытка подключения к  " + conf.CONNECTION_BasePatchB);
                CommonVariables.BConnection = null;
                return(false);
            }
            System.Diagnostics.Trace.WriteLine("Вы подключились к Бухгалтерии.");
            if (CommonVariables.BConnection == null)
            {
                return(false);
            }
            OLE FirmB = CommonVariables.GetFirm(CommonVariables.BConnection.Global);

            if (FirmB == null)
            {
                System.Diagnostics.Trace.WriteLine("Отсутствует хотябы одна зарегистрированая фирма в Бухгалтерии !!!");
                return(false);
            }

            System.Diagnostics.Trace.WriteLine("Соединение прошло успешно");



            CommonVariables.ДатаПериода = new NTICS.Period(selectPeriod.Period);

            // Справочник Сотрудников ПУБ
            PUBRefWoker = V7B.CreateObject("Справочник.Сотрудники");

            // Заполним список сотрудников
            CommonVariables.MEMPUBWoker = MEMReferences.CopyOLERefToMEMRef(PUBRefWoker, "ИНН");
            CommonVariables.MEMPUBWoker.Sort();

            Проводка.МаксКоличествоСубконто = 4;


            // Перебираем всех сотрудников
            OLE Сотрудники     = V7Z.CreateObject("Справочник.Сотрудники");
            OLE ЖурналЗарплата = V7Z.CreateObject("ЖурналРасчетов.Зарплата");


            Сотрудники.Method("ВыбратьЭлементы");
            Проводки prov = new Проводки();

            //НалогиНаФОП nalogs = new НалогиНаФОП();
            CommonVariables.аспределения = new  аспределения(V7Z);

            // Список действующих налогов на фоп
            List <НалогНаФОП> NalogsFOP = НалогНаФОП.ПолучитьСписокТекущихНалоговНаФОП();

            #region Create Entries and nalogs on FOP
            while (Сотрудники.Method("ПолучитьЭлемент").ToBool())
            {
                Trace.WriteLine("Сотрудник - " + Сотрудники.Property("Description").ToString().Trim());

                // Пропустим сотрудника без начислений
                if (!ЖурналЗарплата.Method("SelectPeriodByObject", Сотрудники.Method("CurrentItem"), ДатаПериода).ToBool())
                {
                    continue;
                }

                SotrFOP Сотрудник = new SotrFOP();
                Сотрудник.INN = Сотрудники.Property("ФизическоеЛицо").Property("ИНН").ToString();
                while (ЖурналЗарплата.Method("GetRecord").ToBool()) // Выведем проводки по даному начислению
                {
                    decimal rez = (decimal)ЖурналЗарплата.Property("Результат");
                    if (rez == 0)
                    {
                        continue;           // пропустим нулевые
                    }
                    if (Проводки.СистемныйВидРасч(ЖурналЗарплата))
                    {
                        continue;                                            // пропустим системные расчёты
                    }
                    Trace.WriteLine("Вид расчёта - " + ЖурналЗарплата.Property("ВидРасч").Property("Code").ToString().Trim() + " на сумму - " + rez);
                    prov.Add(Сотрудники.Method("CurrentItem"), ЖурналЗарплата, rez);
                    Сотрудник.Add(ЖурналЗарплата, rez, NalogsFOP);
                }
                Сотрудник.GenEntries(ref prov, Сотрудники, NalogsFOP);  // Сгенегируем проводки для налогов ФОП
                Trace.WriteLine("Проводок - " + prov.Item.Count.ToString());
                Application.DoEvents();
            }
            #endregion
            Trace.WriteLine("Проводок - " + prov.Item.Count.ToString());

            #region Generate Entries

            OLE Operation = CreateOperation();
            OLE DOC       = GenDoc231();

            int WriteCount = 0;
            foreach (Проводка provodka in prov.Item)
            {
                if (provodka.Debit == null)
                {
                    continue;
                }
                if (provodka.Debit.Account == null)
                {
                    continue;
                }
                if (provodka.Credit.Account == null)
                {
                    continue;
                }
                // счёт 231
                if (provodka.Debit.Account.Property("CODE").ToString().Trim() == "231")
                {
                    SetLineDoc(ref DOC, provodka, WriteCount);
                    WriteCount++;
                    continue;
                }

                Operation.Method("НоваяПроводка");
                Trace.WriteLine(WriteCount + " Проводка - Д(" + provodka.Debit.Account.Property("Код").ToString() +
                                ") K(" + provodka.Credit.Account.Property("Код").ToString() +
                                ") SUMM(" + (double)provodka.Summ + ")");

                Operation.Property("Дебет").Property("Счет", provodka.Debit.Account);
                int i;
                for (i = 0; i < provodka.Debit.Subconto.Length; i++)
                {
                    if (provodka.Debit.Subconto[i] != null)
                    {
                        Operation.Property("Debit").Method("Subconto", i + 1, provodka.Debit.Subconto[i]);
                    }
                }


                Operation.Property("Кредит").Property("Счет", provodka.Credit.Account);
                for (i = 0; i < provodka.Credit.Subconto.Length; i++)
                {
                    if (provodka.Credit.Subconto[i] != null)
                    {
                        Operation.Property("Credit").Method("Subconto", i + 1, provodka.Credit.Subconto[i]);
                    }
                }

                Operation.Property("Сумма", (double)provodka.Summ);
                Operation.Property("Комментарий", provodka.Comment);
                Operation.Property("НашаФирма", CommonVariables.GetFirm(Operation) /* CommonVariables.BFirm.CurrentItem */);
                WriteCount++;

                if (WriteCount % 100 == 0)
                {
                    try
                    {
                        Operation.Method("Записать");
                        Debug.WriteLine("WRITE OK");
                    }
                    catch
                    {
                        Debug.WriteLine("WRITE ERROR");
                    }
                }
            }
            try
            {
                Operation.Method("Записать");
                DOC.Method("Провести");
                DOC.Method("Записать");
                Debug.WriteLine("WRITE OK");
            }
            catch
            {
                Debug.WriteLine("WRITE ERROR");
            }
            Operation.Dispose();
            Operation = null;



            #endregion

            CommonVariables.MEMPUBWoker = null;
            PUBRefWoker = null;
            CommonVariables.ZConnection = null;
            CommonVariables.BConnection = null;
            Trace.WriteLine("Сохраним базу даных ...");
            conf.StoreBase(DataBase);
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Trace.WriteLine("ОК");
            Trace.WriteLine("Перенос проводок выполнен.", Traces.Status);
            return(true);
        }
Example #9
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, НомерПроводки);
                //        }
                //    } // по строкам документа
            }
        }
Example #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, НомерПроводки);
                //        }
            }
        }