// Ищем документ // 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); }
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 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); } } }