示例#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
 public static bool СистемныйВидРасч(OLE Вир)
 {
     // Возвращает 1, если вид расчета является системным (нач. сальдо, к выплате за месяц)
     if ((Вир.Property("ВидРасч").Property("CODE").ToString() == "НачальноеСальдо") ||
         (Вир.Property("ВидРасч").Property("CODE").ToString() == "КВыплатеЗаМесяц") ||
         (Вир.Property("ВидРасч").Property("CODE").ToString() == "ВыплатаЧерезКассу") ||
         (Вир.Property("ВидРасч").Property("CODE").ToString() == "ВыплатаЧерезБанк"))
     {
         return(true);
     }
     return(false);
 }
示例#3
0
        private void SetLineDoc(ref OLE DOC, Проводка provodka, int WriteCount)
        {
            DOC.Method("НоваяСтрока");
            Trace.WriteLine(WriteCount + " Проводка - Д(" + provodka.Debit.Account.Property("Код").ToString() +
                            ") K(" + provodka.Credit.Account.Property("Код").ToString() +
                            ") SUMM(" + (double)provodka.Summ + ")");

            DOC.Property("ВидДеятельности", provodka.Debit.Subconto[0]);
            DOC.Property("Подразделение", provodka.Debit.Subconto[1]);
            if (provodka.Debit.Zatrat != null)
            {
                DOC.Property("ВидЗатрат", provodka.Debit.Zatrat);
            }
            else
            {
                DOC.Property("ВидЗатрат", provodka.Credit.Zatrat);
            }
            DOC.Property("Счет", provodka.Credit.Account);
            int i;

            for (i = 0; i < provodka.Credit.Subconto.Length; i++)
            {
                if (provodka.Credit.Subconto[i] != null)
                {
                    DOC.Method("НазначитьТип", "Субконто" + (i + 1), provodka.Credit.Account.Method("ВидСубконто", i + 1));
                    DOC.Property("Субконто" + (i + 1), provodka.Credit.Subconto[i]);
                }
            }

            DOC.Property("Сумма", (double)provodka.Summ);
            DOC.Property("Примечание", provodka.Comment);
            //Operation.Property("НашаФирма", CommonVariables.FirmB /* CommonVariables.BFirm.CurrentItem */);
        }
示例#4
0
        public static List <MEMReferences> CopyOLERefToMEMRef(OLE OLERef, string Index, bool ISMethodIndex, bool NoDeleted, bool NoGroup)
        {
            List <MEMReferences> MEMRef = new List <MEMReferences>();

            OLERef.Method("¬ыбратьЁлементы");
            while (OLERef.Method("ѕолучитьЁлемент").ToBool())
            {
                if (NoDeleted)
                {
                    if (OLERef.Method("DeleteMark").ToBool())
                    {
                        continue;
                    }
                }

                if (NoGroup)
                {
                    if ((double)OLERef.Method("IsGroup") == 1.0)
                    {
                        continue;
                    }
                }

                MEMReferences MR = new MEMReferences();
                try
                {
                    if (ISMethodIndex)
                    {
                        MR.INDEX = OLERef.Method(Index).ToString().Trim();
                    }
                    else
                    {
                        MR.INDEX = OLERef.Property(Index).ToString().Trim();
                    }
                }
                catch
                {
                    throw new Exception("ќшибка копировани¤ справочника");
                }

                MR.CODE        = OLERef.Property("Code").ToString().Trim();
                MR.DESCRIPTION = OLERef.Property("Description").ToString().Trim();
                MR.Reference   = OLERef.Method("CurrentItem");
                MR.FULLCODE    = OLERef.Method("FullCode").ToString().Trim();
                MEMRef.Add(MR);
            }
            return(MEMRef);
        }
示例#5
0
        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);
            }
        }
示例#6
0
        public static OLE ПолучитьСотрудникаПУБ(string СотрудникКод)
        {
            OLE           SotrZIK = GetReferenceElementZIK("Сотрудники", СотрудникКод);
            string        TIN     = SotrZIK.Property("ФизическоеЛицо").Property("ИНН").ToString().Trim();
            MEMReferences MR      = new MEMReferences();

            MR.INDEX = TIN;
            int i   = 0;
            OLE PUB = V7B.CreateObject("Справочник.Сотрудники");

            do
            {
                i = MEMPUBWoker.BinarySearch(MR);
                if (i < 0)
                {
                    // Нет сотрудника в ПУБ
                    MR.DESCRIPTION = SotrZIK.Property("Description").ToString().Trim();
                    if (AutoInsertUser)
                    {
                        MR.Reference = SotrZIK;
                        PUB.Method("New");
                        PUB.Property("ИНН", MR.INDEX);
                        PUB.Property("Description", MR.DESCRIPTION);
                        PUB.Method("Write");
                        MR.CODE     = PUB.Property("Code").ToString().Trim();
                        MR.FULLCODE = PUB.Method("FullCode").ToString().Trim();
                        MEMPUBWoker.Add(MR);
                        MEMPUBWoker.Sort();
                        Trace.WriteLine("Вставим сотрудника в Бухгалтерию - " + MR.CODE + "  " + MR.DESCRIPTION + " ИНН - " + MR.INDEX);
                        return(PUB.Method("CurrentItem"));
                    }
                    DialogResult result = MessageBox.Show("В 1С7.7 Бух отсутствует сотрудник " + MR.DESCRIPTION + " с кодом ИНН - " + MR.INDEX +
                                                          ". Загрузите не монопольно 1С7.7 и введите даного пользователя, после чего нажмите ОК.",
                                                          "Ошибка в справочнике Сотрудники.",
                                                          MessageBoxButtons.OKCancel);
                    if (result == DialogResult.Cancel)
                    {
                        return(null);
                    }
                    CommonVariables.MEMPUBWoker = MEMReferences.CopyOLERefToMEMRef(PUB, "ИНН");
                    MEMPUBWoker.Sort();
                }
            } while (i < 0);
            PUB.Method("FindByCode", MEMPUBWoker[i].CODE);
            return(PUB.Method("CurrentItem"));
        }
示例#7
0
        public decimal Procent(DateTime onDate)
        {
            OLE СпрШкала = V7Z.CreateObject("Справочник.ШкалаСтавок");

            if (!СпрШкала.Method("НайтиПоКоду", СпрШкалаКод).ToBool())
            {
                throw new Exception("Ошибка позиционирования по коду ШкалаСтавок.");
            }
            return((decimal)СпрШкала.Property("Ставка").Method("Получить", onDate));
        }
示例#8
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));
        }
示例#9
0
        public void Add(OLE Rasch, decimal rez, List <НалогНаФОП> NalogsFOP)
        {
            PeriodFOP p = new PeriodFOP(Rasch.Method("НачалоПериодаПоДате", Rasch.Property("ДатаНачала")).ToDateTime(), Rasch.Property("Объект"), NalogsFOP);
            int       i = Period.BinarySearch(p);

            if (i < 0) // New Period
            {
                Period.Add(p);
                Period.Sort();
                i = Period.BinarySearch(p);
            }
            Period[i].Add(Rasch, rez);
        }
示例#10
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));
        }
示例#11
0
 public void Add(OLE Sotr, OLE Rasch, decimal rez)
 {
     if (Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.ОсновныеНачисления")).ToBool())
     {
         MainRaschet(Sotr, Rasch, rez);
         return;
     }
     if (СистемныйВидРасч(Rasch))
     {
         return;                                 // системные виды расчета (нач.сальдо, к выплате за месяц) не эспортируем
     }
     AtherRaschet(Sotr, Rasch, rez);
     return;
 }
示例#12
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);
        }
示例#13
0
        public string СпрШкалаКод;   // код налога в справочнике шкалы ставок
        /// <summary>
        ///  Проверить использутся ли данный вид расчета в даном налоге
        /// </summary>
        /// <param name="Rasch">Пороверяемый расчет </param>
        public bool ВходитВНалог(OLE Rasch)
        {
            switch (СпрШкалаКод)
            {
            case "ФЗППенс":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаПенсионныйФЗП2004")).ToBool());

            case "ФЗППенсЛет":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаПенсионныйФЗП2004")).ToBool());

            case "ФЗППенсИнв":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаПенсионныйФЗП2004")).ToBool());

            case "ФЗПСоцСтрах":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаСоцСтрахФЗП2004")).ToBool());

            case "ФЗПСоцСтрахИнв":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаСоцСтрахФЗП2004")).ToBool());

            case "ФЗПБезраб":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаБезработицаФЗП2004")).ToBool());

            case "ФЗПБезрабИнв":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаБезработицаФЗП2004")).ToBool());

            case "ФЗПСоцСтрахНесч":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.БазаСоцСтрахНесчФЗП2004")).ToBool());

            case "ФЗПРезервОтп":
                return(Rasch.Property("ВидРасч").Method("ВходитВГруппу", Rasch.EvalExpr("ГруппаРасчетов.ВключатьВСреднююДляОтпуска")).ToBool());

            case "ФЗПБезрабГПХ":
                return(Rasch.Property("ВидРасч").Property("CODE").ToString().Trim() == "ОплатаПоДоговору");
            }
            return(false);
        }
示例#14
0
        private bool FindOperation(ref OLE Oper)
        {
            if ((double)Oper.Method("SelectOpers", CommonVariables.ДатаПериода.End, CommonVariables.ДатаПериода.End) == 0)
            {
                return(false);
            }
            while ((double)Oper.Method("GetOper") == 1.0)
            {
                string s = (string)Oper.Property("Description");
                if (s.Trim() == OperationDescription)
                {
                    return(true);
                }
            }

            return(false);
        }
示例#15
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);
        }
示例#16
0
        public Debit(OLE Проводка, string СотрудникКод, string ПодразделениеКод, DateTime Period, bool ЭтоНачисленияНаОтпуск)
        {
            this.TemplateEntry = Проводка;
            string tAccount = Проводка.Property("Счет" + Marker + "а").Property("Code").ToString().Trim();

            if (tAccount == "")
            {
                throw new Exception("");
            }
            if (tAccount == "ВТ")
            {// Спецподстановка
                tAccount = СчётЗатрат(ПодразделениеКод);
                if (tAccount == "")
                {
                    tAccount = "91";
                    //throw new Exception("");
                }
            }
            this.Account = CommonVariables.BConnection.Global.EvalExpr("СчетПоКоду(\"" + tAccount + "\")");
            tAccount     = this.Account.Property("Code").ToString().Trim();
            if (tAccount == "")
            {
                tAccount     = "91";
                this.Account = CommonVariables.BConnection.Global.EvalExpr("СчетПоКоду(\"" + tAccount + "\")");
                //throw new Exception("");
            }

            // если начисление на отпуск то
            if (ЭтоНачисленияНаОтпуск && (Marker == "Дебет") && ЭтоСчетЗатрат(tAccount))
            {
                this.Account = CommonVariables.BConnection.Global.EvalExpr("СчетПоКоду(\"" + "471" + "\")");
                Subconto     = new OLE[this.Account.Method("КоличествоСубконто").ToInt()];
                Subconto[0]  = ВидДеятельности(ПодразделениеКод);
                Subconto[1]  = GetReferenceElementPUB("подразделения", ПодразделениеКод);
                Subconto[2]  = GetReferenceElementPUB("видызатрат", "0014"); //Отпускные
                return;
            }

            Subconto = new OLE[this.Account.Method("КоличествоСубконто").ToInt()];
            for (int i = 0; i < Subconto.Length; i++)
            {
                Subconto[i] = Analiz(this.Account.Method("ВидСубконто", i + 1).Method("Идентификатор").ToString().Trim().ToLower(), i, СотрудникКод, ПодразделениеКод, Period);
            }
        }
示例#17
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);
        }
示例#18
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 { }
                }
            }
        }
示例#19
0
        /// <summary>
        ///  Получить зарегистрированный элемент справочника "фирмы"
        /// </summary>
        /// <param name="handle">Ссылка на активную 1С7.7 </param>
        public static OLE GetFirm(OLE handle)
        {
            if (handle == null)
            {
                return(null);
            }
            OLE temp = handle.Global.CreateObject("Справочник.Фирмы");

            temp.Method("ВыбратьЭлементы");
            while (temp.Method("ПолучитьЭлемент").ToBool())
            {
                if (temp.Method("DeleteMark").ToBool())
                {
                    continue;
                }
                if (temp.Property("ЕДРПОУ").ToString().Trim() == conf.CommonAllConfig.ЕДРПОУ)
                {
                    return(temp.Method("CurrentItem"));
                }
            }
            System.Diagnostics.Trace.WriteLine("Программа не зарегистрирована для даной базы: " + handle.EvalExpr("SystemCaption()").ToString());
            temp.Dispose();
            return(null);
        }
示例#20
0
        private OLE GenDoc231()
        {
            OLE doc = FindDoc(V7B, "ЗатратыПроизводственногоХарактера", CommonVariables.ДатаПериода.End,
                              CommonVariables.ДатаПериода.End, OperationDescription);

            if (doc != null)
            {
                if (doc.Method("Проведен").ToBool())
                {
                    doc.Method("СделатьНеПроведенным");
                }
                doc.Method("УдалитьСтроки");
            }
            else
            {
                doc = V7B.CreateObject("Документ.ЗатратыПроизводственногоХарактера");
                doc.Method("New");
                V7B.Method("глУстановитьФирму", doc);
                doc.Property("ПроводитьПоЭлементамЗатрат", V7B.EvalExpr("?(ИспользоватьСчетаРасходов <> Класс9,1,0)"));
                doc.Property("ДатаДок", CommonVariables.ДатаПериода.End);
                doc.Property("Операция").Property("Description", OperationDescription);
            }
            doc.Property("Примечание", "Генерація проводок " + DateTime.Now);


            // Проверим на пригодность к записи
            bool entr_ok = true;

            do
            {
                try
                {
                    doc.Method("Записать");
                    entr_ok = true;
                }
                catch
                {
                    entr_ok = false;
                    doc.Property("НомерДок", int.Parse(doc.Property("НомерДок").ToString()) + 1);
                }
            } while (!entr_ok);
            return(doc);
        }
示例#21
0
        private OLE CreateOperation()
        {
            OLE Operation = V7B.CreateObject("Operation");

            if (FindOperation(ref Operation))
            {
                while (Operation.Method("SelectEntries").ToBool())
                {
                    Operation.Method("DeleteEntry");
                }
            }
            else
            {
                Operation.Method("New");
                Operation.Property("OperDate", CommonVariables.ДатаПериода.End);
                Operation.Property("Description", OperationDescription);
            }
            Operation.Property("Документ").Property("Фирма", CommonVariables.GetFirm(Operation) /*CommonVariables.BFirm.CurrentItem*/);
            Operation.Property("Документ").Property("Примечание", "Генерація проводок " + DateTime.Now);


            // Проверим на пригодность к записи
            bool entr_ok = true;

            do
            {
                try
                {
                    Operation.Method("Записать");
                    entr_ok = true;
                }
                catch
                {
                    entr_ok = false;
                    Operation.Property("Документ").Property("НомерДок", int.Parse(Operation.Property("Документ").Property("НомерДок").ToString()) + 1);
                }
            } while (!entr_ok);
            return(Operation);
        }
示例#22
0
        void Sinchro(OLE refmain, OLE refchild)
        {
            #region INSERT ELEMENTS
            List <MEMReferences> MEMRef;
            bool FullCod = (refmain.EvalExpr("ћетаданные.—правочник(\"" + refmain.Method("¬ид").ToString() + "\").—ерии одов").ToString().Trim().ToUpper() == ("¬ѕределахѕодчинени¤").ToUpper());
            if (FullCod)
            {
                MEMRef = MEMReferences.CopyOLERefToMEMRef(refmain, "FullCode", FullCod, true, true);
            }
            else
            {
                MEMRef = MEMReferences.CopyOLERefToMEMRef(refmain, "Code", FullCod, true, true);
            }

            // Count elements
            CommonVariables.ProgressBarInitialize(0, MEMRef.Count, 0);
            //refmain.Method("¬ыбратьЁлементы");
            foreach (MEMReferences MRef in MEMRef)
            {
                if (!(bool)refchild.Method("Ќайтиѕо–еквизиту", " ј”", MRef.INDEX, 0))
                {
                    IncInsertCounter();
                    refchild.Method("New");
                    refchild.Property("Description", MRef.DESCRIPTION);
                    refchild.Property(" ј”", MRef.INDEX);
                    refchild.Method("Write");
                    System.Diagnostics.Trace.WriteLine("¬ставлен елемент - " + MRef.INDEX + " " + MRef.DESCRIPTION);
                }
                else
                {
                    if ((bool)refchild.Method("DeleteMark"))
                    {
                        refchild.Method("ClearDeleteMark");
                        //refchild.Method("Write");
                    }
                }

                CommonVariables.ProgressBarInc();
            }
            #endregion
            #region DELEDE ELEMENTS
            // Count elements
            int refchildCount = 0;
            refchild.Method("¬ыбратьЁлементы");
            while (refchild.Method("ѕолучитьЁлемент").ToBool())
            {
                if ((bool)refchild.Method("DeleteMark"))
                {
                    continue;
                }
                refchildCount++;
            }

            CommonVariables.ProgressBarInitialize(0, refchildCount, 0);
            refchild.Method("¬ыбратьЁлементы");
            MEMRef.Sort();
            while (refchild.Method("ѕолучитьЁлемент").ToBool())
            {
                if ((bool)refchild.Method("DeleteMark"))
                {
                    continue;
                }
                CommonVariables.ProgressBarInc();
                MEMReferences mr = new MEMReferences();
                mr.INDEX = refchild.Property(" ј”").ToString().Trim();

                if (MEMRef.BinarySearch(mr) < 0)
                {
                    IncDeleteCounter();
                    refchild.Method("Delete", 0);
                    refchild.Method("Write");
                    System.Diagnostics.Trace.WriteLine("ѕомечен к удалению елемент - " +
                                                       refchild.Property("Code").ToString() + " " +
                                                       refchild.Property("Description").ToString());
                }
            }
            #endregion
        }
        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);
            }
        }
示例#24
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, НомерПроводки);
                //        }
            }
        }
示例#25
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);
                }
            }
        }
示例#26
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);
        }
示例#27
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, НомерПроводки);
                //        }
                //    } // по строкам документа
            }
        }
示例#28
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);
                    }
                }
            }
        }
示例#29
0
 private bool IsAutoSubconto(int NumberSubconto)
 {
     return(TemplateEntry.Property("АвтоСубконто" + Marker + NumberSubconto).ToBool());
 }