internal static FiscalArticle Substract(FiscalReceipt FR, FiscalArticle A, FiscalArticle B)
 {
     var Result = A.Clone(FR);
       Result.Quantity.Value = A.Quantity.Value - B.Quantity.Value;
       Result.PriceWithoutDiscount.Value = A.Price;
       Result.DiscountForPriceCurrent.Value = 0;
       Result.AmountWithoutDiscount.Value = A.Amount - B.Amount;
       Result.DiscountForAmount.Value = 0;
       Result.Bonuses.Value = A.Bonuses.Value - B.Bonuses.Value;
       return Result;
 }
        public FiscalArticle Clone(FiscalReceipt fiscal)
        {
            BinaryFormatter BF = new BinaryFormatter();
              MemoryStream MS = new MemoryStream();
              BF.Serialize(MS, this);
              MS.Seek(0, SeekOrigin.Begin);

              FiscalArticle Result = (FiscalArticle)BF.Deserialize(MS);
              MS.Close();
              //Result.Limits = this.Limits;
              Result.Fiscal = fiscal;
              return Result;
        }
        /// <summary>Заменяет параметры чека this, использующиеся для вычислений, на параметры чека FiscalForCombine</summary>
        internal bool Combine(FiscalReceipt FiscalForCombine)
        {
            try
              {
            if (FiscalForCombine != null)
            {
              FiscalReceipt Fiscal = FiscalForCombine.Clone(FiscalForCombine.RSPackage); // клонируем фискальный чек, т.к. мы будем менять в нём платежи

              if (Fiscal.Flags.Received) Flags = new DVFiscalReceiptFlags(Fiscal.Flags.Value);
              if (Fiscal.AmountWithoutDiscount.Received) AmountWithoutDiscount = new DVInt64(Fiscal.AmountWithoutDiscount.Value);
              if (Fiscal.DiscountForAmount.Received) DiscountForAmount = new DVInt64(Fiscal.DiscountForAmount.Value);
              Payments.Combine(Fiscal.Payments);
              Fiscal.Payments = Payments.Clone(Fiscal); // записываем новые платежи (это нужно для поиска позиций в чеке)

              // теперь объединяем артикулы: пробегаем по всем артикулам переданного чека
              int index = 0;
              foreach (FiscalArticle fa in Fiscal.Articles)
              {
            FiscalArticle Analog = null;
            try
            {
              if (fa.GoodsCode.Length != 0 && fa.PaymentType.Value != PaymentTypes.Unknown) // если переданы код и тип оплаты - ищем товар
                Analog = FindArticle(fa); // ищем позицию-аналог
            }
            catch (ArticlePaymentTypeException)
            {
              // игнорируем ошибку, которая может возникнуть при определении PaymentType
            };

            if (Analog == null && index < Articles.Count) // если код или тип оплаты не переданы - получаем аналог по индексу
              Analog = Articles[index];

            if (Analog != null) Analog.Combine(fa); //  если что-то нашли, то объединяем позиции

            index++;
              }

            }
              }
              catch (Exception e) // может произойти при получении типа оплаты позиции фискального чека
              {
            ErrorMessage.Add("Ошибка совмещения фискальных чеков: " + e.Message);
              }

              return ErrorMessage.IsEmpty;
        }
 public FiscalArticle(FiscalReceipt Fiscal)
 {
     this.Fiscal = Fiscal;
 }
        /// <summary>Result = A-B</summary>
        public static FiscalReceipt Substract(RSPackageInfo RSP, FiscalReceipt A, FiscalReceipt B)
        {
            var Result = A.Clone(RSP);
              Result.AmountWithoutDiscount.Value = A.Amount - B.Amount;
              Result.DiscountForAmount.Value = 0;
              Result.Payments = FiscalPayments.Substract(Result, A.Payments, B.Payments);
              for (int i = 0; i < A.Articles.Count; i++)
            for (int j = 0; j < B.Articles.Count; j++)
              if (A.Articles[i].IsAnalog(B.Articles[j]))
            Result.Articles[i] = FiscalArticle.Substract(Result, A.Articles[i], B.Articles[j]); // это пройдёт, т.к. Result - клон A
              return Result;

              //throw new Exception("FiscalReceipt Substract is not implemented now");
            /*      FiscalReceipt Result = Param2.Clone(), Param = Param1.Clone();
              /*Result.Amount = Result.AmountDiscount;
              Result.Discount = 0;
              Param.Amount = Param.AmountDiscount;
              Param.Discount = 0;*/
              /*Result.AmountWithoutDiscount -= Param.AmountWithoutDiscount;
              //Result.Discount = Param1.Discount;
              Result.Payments.ChangeAmount(Result.Payments.Amount - Param.Payments.Amount);

              foreach (FiscalArticle Article1 in Param.Articles)
            foreach (FiscalArticle Article2 in Result.Articles)
              if (Article1.GoodsCode == Article2.GoodsCode)
              {
            Article2.Quantity -= Article1.Quantity;
            Article2.AmountWithoutDiscount -= Article1.AmountWithoutDiscount;
            Article2.DiscountForAmount = Article1.DiscountForAmount;
            //Article2.Bonuses -= Article1.Bonuses;
            // Rounded потому что из-за Казахстана
            Article2.Bonuses = Article2.BonusesRounded - Article1.BonusesRounded;
              }

              return Result;*/
        }