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, НомерПроводки); // } // } // по строкам документа } }