// 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 = " "; }
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); }
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)); }
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 { } } } }
public void Add(OLE Rasch, decimal rez, List <НалогНаФОП> NalogsFOP) { string PodrCod = Rasch.Property("Объект").Property("Подразделение").Property("Code").ToString().Trim(); // Вводим поддержку подразделений из назначения if (!OLE.IsEmtyValue(Rasch.Property("Назначение"))) { PodrCod = Rasch.Property("Назначение").Property("МестоРаботы").Property("Владелец").Property("Code").ToString().Trim(); } FOPDivision Division; if (FOPDivision.ContainsKey(PodrCod)) { Division = FOPDivision[PodrCod]; } else { Division = new FOPDivision(); FOPDivision.Add(PodrCod, Division); } Division.Add(Rasch, rez, NalogsFOP); }
public аспределения(OLE obj) { OLE V7Z = obj.Global; FRaspr = new List <аспределение>(); FRaspr.Sort(); // заполняет список спРаспределения документами Распределения за указанный период string ТекстЗапр = "Период с '" + ДатаПериода.Begin.ToShortDateString() + "' по '" + ДатаПериода.End.ToShortDateString() + "';" + "Обрабатывать НеПомеченныеНаУдаление;" + "Рас = Документ.РаспределениеОсновныхНачислений.ТекущийДокумент;" + "Фир = Документ.РаспределениеОсновныхНачислений.Фирма;" + "Сот = Документ.РаспределениеОсновныхНачислений.Сотрудник;" + "Наз = Документ.РаспределениеОсновныхНачислений.Назначение;" + "Под = Документ.РаспределениеОсновныхНачислений.Подразделение;" + "Кат = Документ.РаспределениеОсновныхНачислений.Категория;" + "Группировка Рас без упорядочивания;" + "Условие(Фир.Code = \"" + CommonVariables.GetFirm(obj).Property("CODE").ToString().Trim() /*ZFirm.Code*/ + "\");"; OLE зРаспределения = V7Z.CreateObject("Запрос"); if (!(bool)зРаспределения.Method("Выполнить", ТекстЗапр)) { throw new Exception("ОШИБКА!!! Не выполнился запрос по распределениям основных начислений!"); } while ((double)зРаспределения.Method("Группировка", "Рас") == 1.0) { // в список нужно добавить либо назначение, либо сотрудника, либо подразделение, либо категорию OLE ЧтоДобавляем = null; if (!OLE.IsEmtyValue(зРаспределения.Property("Кат"))) { ЧтоДобавляем = зРаспределения.Property("Кат"); // priore 3 } if (!OLE.IsEmtyValue(зРаспределения.Property("Под"))) { ЧтоДобавляем = зРаспределения.Property("Под"); // priore 2 } if (!OLE.IsEmtyValue(зРаспределения.Property("Сот"))) { ЧтоДобавляем = зРаспределения.Property("Сот"); // priore 1 } if (!OLE.IsEmtyValue(зРаспределения.Property("Наз"))) { ЧтоДобавляем = зРаспределения.Property("Наз"); // priore 0 } if (ЧтоДобавляем == null) { System.Diagnostics.Trace.WriteLine("В документе " + (string)зРаспределения.Property("Рас") + " не указано ни назначение, ни сотрудник, ни подразделение, ни категория! Документ не учитывается при формировании проводок!"); continue; } аспределение r = new аспределение(); r.DocNumber = V7Z.Method("ЗначениеВСтрокуВнутр", ЧтоДобавляем).ToString(); r.Doc = ЧтоДобавляем; int Инд = Items.BinarySearch(r); if (Инд >= 0) { // информация о распределении для данного объекта уже есть System.Diagnostics.Trace.WriteLine("Документ РаспределениеОсновныхНачислений " + (string)зРаспределения.Property("Рас").Property("НомерДок") + " дублирует информацию о " + (string)ЧтоДобавляем + ", внесенную документом " + Items[Инд].DocNumber); continue; } Items.Add(r); } }
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); } } } }
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, НомерПроводки); // } // } // по строкам документа } }
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); } } }
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, НомерПроводки); // } } }