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); } }
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); }
public decimal Procent(DateTime onDate) { OLE СпрШкала = V7Z.CreateObject("Справочник.ШкалаСтавок"); if (!СпрШкала.Method("НайтиПоКоду", СпрШкалаКод).ToBool()) { throw new Exception("Ошибка позиционирования по коду ШкалаСтавок."); } return((decimal)СпрШкала.Property("Ставка").Method("Получить", onDate)); }
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)); }
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)); //Период } } } } }
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); }
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); }
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); }
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, НомерПроводки); // } // } // по строкам документа } }
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, НомерПроводки); // } } }