Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 14:21

Помогите разобраться в коде!!!

Автор Vlad270, 20 янв 2011, 11:01

0 Пользователей и 1 гость просматривают эту тему.

Vlad270

есть дописанный модуль к 1с 7.7 бухгалтерия для автоматизации операций по ценным бумагам:
// ********************
//
                       
Процедура ОбработкаПроведения()
   
   //******************************************************************************************   
   // Проверка на корректность заполнения
   Если ПустоеЗначение(Договор) = 1 Тогда
      Предупреждение("Не заполнен договор. Документ не будет проведен!!!");
      СтатусВозврата(0);
      Возврат;
   КонецЕсли;           
   
   ЦБ = СоздатьОбъект("Регистр.ЦенныеБумаги");
   Если ДатаДок<ПолучитьДатуТА() Тогда
      ЦБ.ВременныйРасчет(1);   
      РассчитатьРегистрыПо(ДатаДок,)
   КонецЕсли;   
   
   
   СтрокаСтатуса = " ";
   ВыбратьСтроки();
   Пока ПолучитьСтроку() = 1 Цикл
      Если ПустоеЗначение(Эмитент) = 1 Тогда
         СтрокаСтатуса = СтрокаСтатуса+"В строке "+НомерСтроки+" не заполено поле 'ЭМИТЕНТ'!
         | ";
      КонецЕсли;
      Если ПустоеЗначение(ЦеннаяБумага) = 1 Тогда
         СтрокаСтатуса = СтрокаСтатуса+"В строке "+НомерСтроки+" не заполено поле 'ЦЕННАЯ БУМАГА'!
         | ";
      КонецЕсли;
      Если ПустоеЗначение(НомерСделки) = 1 Тогда
         СтрокаСтатуса = СтрокаСтатуса+"В строке "+НомерСтроки+" не заполено поле 'НОМЕР СДЕЛКИ'!
         | ";
      КонецЕсли;   
      Если Количество = 0 Тогда
         СтрокаСтатуса = СтрокаСтатуса+"В строке "+НомерСтроки+" не указано КОЛИЧЕСТВО!
         | ";
      КонецЕсли;
      Если Цена = 0 Тогда
         СтрокаСтатуса = СтрокаСтатуса+"В строке "+НомерСтроки+" не указана ЦЕНА!
         | ";
      КонецЕсли;   
      КолОстаток = 0;
      КолОстаток = ЦБ.СводныйОстаток(,,,Эмитент,ЦеннаяБумага,,,"Количество");
      Если КолОстаток < Количество Тогда
         СтрокаСтатуса = СтрокаСтатуса+"В строке "+НомерСтроки+" количество ("+Количество+") больше доступного остатка ("+КолОстаток+")
         | ";
      КонецЕсли;
      
   КонецЦикла;
   Если ПустоеЗначение(СокрЛП(СтрокаСтатуса)) = 0 Тогда
      СтрокаСтатуса = СтрокаСтатуса+"Документ не будет проведен!!!";
      Предупреждение(СтрокаСтатуса); 
      СтатусВозврата(0);
      Возврат;
   КонецЕсли;   
   //******************************************************************************************
   
   //Проведение документа
   Прод = Константа.ПродажаАкций;
   Покуп = Константа.ПокупкаАкций;
   НСДпр = СоздатьОбъект("Справочник.НомераСделок");
   ВыбратьСтроки(); 
   ННС = 1;
   ТЗН1 = создатьОбъект("ТаблицаЗначений");
   ТЗН2 = создатьОбъект("ТаблицаЗначений");
   Пока ПолучитьСтроку() = 1 Цикл
      Операция.НоваяПроводка();
      Операция.Дебет.Счет = СчетПоКоду("76.3");
      Операция.Дебет.Контрагенты = Брокер; 
      Операция.Дебет.Договоры = Договор;
      Операция.Кредит.Счет = СчетПоКоду("91.1");
      Операция.Кредит.ПрочиеДоходыИРасходы = Прод;
      Операция.Сумма = Сумма;
      Операция.НомерЖурнала = "ЦБ";
      Операция.СодержаниеПроводки = "Продажа "+количество+" акций "+Эмитент.Наименование;
      Операция.ПервичныйДокумент  = глПредставлениеПервичногоДокумента(Контекст); 
      
      Операция.НоваяПроводка();
      Операция.Кредит.Счет = СчетПоКоду("Н06.11");
      Операция.Кредит.ЦенныеБумаги = ЦеннаяБумага;
      Операция.Кредит.Контрагенты = Эмитент; 
      Операция.Кредит.Основание = Договор;   
      Операция.Сумма = Сумма;
      Операция.НомерЖурнала = "ЦБ";
      Операция.СодержаниеПроводки = "Продажа "+количество+" акций "+Эмитент.Наименование;
      Операция.ПервичныйДокумент  = глПредставлениеПервичногоДокумента(Контекст); 

      
      НСДпр.Новый();                     
      НСДпр.Наименование = СокрЛП(НомерСделки);
      НСДпр.ВидСделки = Перечисление.ПокупкаПродажа.Покупка;
      НСДпр.ДатаСделки = ДатаДок;
      НСДпр.Записать();

      
      //КолОстаток = Количество;
      
      Кол = Количество;
      
      //Сообщить("------Количество по строке: "+Кол);
      
      Запрос="";
      ТекстЗапроса="";
      Запрос=СоздатьОбъект("Запрос");
      Если ИтогиАктуальны()=0 Тогда
         ТекстЗапроса="
         |Период с ДатаДок по ДатаДок;";
      КонецЕсли;
      ТекстЗапроса=ТекстЗапроса+"
      |РегЭмитент=Регистр.ЦенныеБумаги.Эмитент;
      |РегТовар=Регистр.ЦенныеБумаги.Товар;
      |Партия = Регистр.ЦенныеБумаги.Партия;
      |РегПартия=Регистр.ЦенныеБумаги.НСПокупки;
      |КолКонОст=Регистр.ЦенныеБумаги.Количество;
      |РегСумма=Регистр.ЦенныеБумаги.СуммаПокупки;
      |НРегСумма=Регистр.ЦенныеБумаги.НСуммаПокупки;
      |Группировка РегПартия без упорядочивания;
      |Функция РегКолич=КонОст(КолКонОст);
      |Функция СумКонОст=КонОст(РегСумма);
      |Функция НСумКонОст=КонОст(НРегСумма);
      |Условие (РегЭмитент=Эмитент);
      |Условие (РегТовар=ЦеннаяБумага);";
      Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
         Сообщить("Документ не проведен");
         НеПроводитьДокумент();
         Возврат;
      КонецЕсли; 
      Запрос.Выгрузить(ТЗН1,3,0);
      Если ННС = 1 Тогда
          ТЗН1.Выгрузить(ТЗН2);
         ТЗН2.УдалитьСтроки();
         ННС = 2;
      КонецЕсли;     
      
      КС = ТЗН1.КоличествоСтрок();
      Пока КС>=1 Цикл
         Если Число(ТЗН1.ПолучитьЗначение(КС,"РегКолич")) = 0 Тогда
             ТЗН1.УдалитьСтроку(КС);
         КонецЕсли;
          КС = КС-1;
      КонецЦикла;
      
      ОбщееКоличествоПоСредней = 0;
      ОбщаяСуммаПоСредней = 0;
      КС = ТЗН1.КоличествоСтрок();
      Для НС = 1 по КС Цикл
         НСП = ТЗН1.ПолучитьЗначение(НС,"РегПартия");
         ПартияСписания = ТЗН1.ПолучитьЗначение(НС,"Партия");
         КолПоЗапросу = Число(ТЗН1.ПолучитьЗначение(НС,"РегКолич"));
         СуммаПоЗапросу = Число(ТЗН1.ПолучитьЗначение(НС,"СумКонОст")); 
         НСуммаПоЗапросу = Число(ТЗН1.ПолучитьЗначение(НС,"НСумКонОст"));
         ЦенаПокупки = СуммаПоЗапросу/КолПоЗапросу;
         НЦенаПокупки = НСуммаПоЗапросу/КолПоЗапросу;
         ОбщееКоличествоПоСредней = ОбщееКоличествоПоСредней+КолПоЗапросу;
         ОбщаяСуммаПоСредней = ОбщаяСуммаПоСредней+СуммаПоЗапросу;
         //ЦенаПокупки = Число(ТЗН1.ПолучитьЗначение(НС,"РегЦена"));
         //Сообщить("Цена покупки: "+ЦенаПокупки);
         НСТ = 0;
         //Ищем остаток по текщему паспорту сделки покупки
         Если ТЗН2.НайтиЗначение(НСП,НСТ,"РегПартия")>0 Тогда
            //Если есть партия частично списанная или полностью
            КолОстПартии = Число(ТЗН2.ПолучитьЗначение(НСТ,"РегКолич"));
            Если КолОстПартии = 0 Тогда
               //Сообщить("!!!Есть партия остаток распределен поностью");
                //партия списана полностью в предыдущей строке
               //берем следующую партию
               Продолжить;
            Иначе
               //Сообщить("!!!Есть партия остаток по Т2: "+КолОстПартии);
               //есть остаток по партии
               Если КолОстПартии > Кол Тогда
                  //Списываем всё Количество по строке и уменьшаем
                  //значение остатка в ТЗН2 на величину списания
                  Списывать = Кол;
                  СуммаПокупки = Окр(Списывать*ЦенаПокупки,2,1); 
                  НСуммаПокупки = Окр(Списывать*НЦенаПокупки,2,1);
                  НераспКоличество = 0;
                  КолОстПартии = КолОстПартии - Списывать;
                  ТЗН2.УстановитьЗначение(НСТ,"РегКолич",КолОстПартии);
                  //Сообщить("новый остаток по Т2: "+КолОстПартии);
               ИначеЕсли КолОстПартии < Кол Тогда
                  //Списываем Частично Количество по строке и устанавливаем
                  //значение остатка в ТЗН2 в 0
                  Списывать = КолОстПартии;           
                  СуммаПокупки = Окр(Списывать*ЦенаПокупки,2,1);   
                  НСуммаПокупки = Окр(Списывать*НЦенаПокупки,2,1);
                  НераспКоличество = Кол - КолОстПартии;
                  КолОстПартии = 0;
                  ТЗН2.УстановитьЗначение(НСТ,"РегКолич",КолОстПартии);
                  //Сообщить("новый остаток по Т2: "+КолОстПартии);
               ИначеЕсли КолОстПартии = Кол Тогда
                  //Списываем всё Количество по строке и устанавливаем
                  //значение остатка в ТЗН2 в 0
                  Списывать = Кол;             
                  СуммаПокупки = Окр(Списывать*ЦенаПокупки,2,1);
                  НСуммаПокупки = Окр(Списывать*НЦенаПокупки,2,1);
                  НераспКоличество = 0;
                  КолОстПартии = 0;
                  ТЗН2.УстановитьЗначение(НСТ,"РегКолич",КолОстПартии);
                  //Сообщить("новый остаток по Т2: "+КолОстПартии);
               КонецЕсли;
            КонецЕсли;
         Иначе
            //Нет партии
            КС2 = ТЗН2.КоличествоСтрок()+1;
            КолОстПартии = Число(ТЗН1.ПолучитьЗначение(НС,"РегКолич"));
            //Сообщить("!!!!Нет партии: "+КолОстПартии);
               Если КолОстПартии > Кол Тогда
                  //Списываем всё Количество по строке и вносим
                  //значение остатка в ТЗН2 уменьшенное на величину списания
                  Списывать = Кол;
                  СуммаПокупки = Окр(Списывать*ЦенаПокупки,2,1);
                  НСуммаПокупки = Окр(Списывать*НЦенаПокупки,2,1);
                  НераспКоличество = 0;
                  КолОстПартии = КолОстПартии - Списывать;
                  ТЗН2.НоваяСтрока(КС2);
                  ТЗН2.УстановитьЗначение(КС2,"РегКолич",КолОстПартии);
                  ТЗН2.УстановитьЗначение(КС2,"РегПартия",НСП);
                  //Сообщить("новая строка остаток по Т2: "+КолОстПартии);
               ИначеЕсли КолОстПартии < Кол Тогда
                  //Списываем Частично Количество по строке и устанавливаем
                  //значение остатка в ТЗН2 в 0
                  Списывать = КолОстПартии;           
                  СуммаПокупки = Окр(Списывать*ЦенаПокупки,2,1);
                  НСуммаПокупки = Окр(Списывать*НЦенаПокупки,2,1);
                  НераспКоличество = Кол - КолОстПартии;
                  КолОстПартии = 0; 
                  ТЗН2.НоваяСтрока(КС2);
                  ТЗН2.УстановитьЗначение(КС2,"РегКолич",КолОстПартии);
                  ТЗН2.УстановитьЗначение(КС2,"РегПартия",НСП);
                  //Сообщить("новая строка остаток по Т2: "+КолОстПартии);
               ИначеЕсли КолОстПартии = Кол Тогда
                  //Списываем всё Количество по строке и устанавливаем
                  //значение остатка в ТЗН2 в 0
                  Списывать = Кол;             
                  СуммаПокупки = Окр(Списывать*ЦенаПокупки,2,1); 
                  НСуммаПокупки = Окр(Списывать*НЦенаПокупки,2,1);
                  НераспКоличество = 0;
                  КолОстПартии = 0;
                  ТЗН2.НоваяСтрока(КС2);
                  ТЗН2.УстановитьЗначение(КС2,"РегКолич",КолОстПартии);
                  ТЗН2.УстановитьЗначение(КС2,"РегПартия",НСП);
                  //Сообщить("новая строка остаток по Т2: "+КолОстПартии);
               КонецЕсли;
         КонецЕсли;

            Операция.НоваяПроводка();
            Операция.Дебет.Счет = СчетПоКоду("Н07.14");
            Операция.Дебет.ЦенныеБумаги = ЦеннаяБумага;   
            Операция.Дебет.Контрагенты = Эмитент;   
            Операция.Дебет.Основание = Договор;   
            Операция.Кредит.Счет = СчетПоКоду("Н02.05");
            Операция.Кредит.ЦенныеБумаги = ЦеннаяБумага;   
            Операция.Кредит.Контрагенты = Эмитент;   
            Операция.Кредит.Основание = Договор;   
            Операция.Количество = Списывать;
            Операция.Сумма = НСуммаПокупки;
            Операция.НомерЖурнала = "ЦБ";
            Операция.СодержаниеПроводки = "Списание с/стоимости "+Списывать+" акций "+Эмитент.Наименование+" (ц."+ОКР(НСуммаПокупки/Списывать,2)+")";
            Операция.ПервичныйДокумент  = глПредставлениеПервичногоДокумента(Контекст); 
            
         
            Регистр.ЦенныеБумаги.ПривязыватьСтроку(НомерСтроки);
            Регистр.ЦенныеБумаги.Брокер = Брокер;
            Регистр.ЦенныеБумаги.Договор = Договор;
            Регистр.ЦенныеБумаги.Эмитент = Эмитент;
            Регистр.ЦенныеБумаги.Товар = ЦеннаяБумага;
            Регистр.ЦенныеБумаги.Партия = ПартияСписания;
            Регистр.ЦенныеБумаги.Количество = Списывать; 
            Регистр.ЦенныеБумаги.СуммаПокупки = СуммаПокупки; 
            Регистр.ЦенныеБумаги.НСуммаПокупки = НСуммаПокупки; 
            Регистр.ЦенныеБумаги.СуммаПродажи = Окр(Списывать*(Сумма/Количество),2,1);
            Регистр.ЦенныеБумаги.НСуммаПродажи = Окр(Списывать*(Сумма/Количество),2,1);
            Регистр.ЦенныеБумаги.ДатаПокупки = ПартияСписания.ДатаДок;
            Регистр.ЦенныеБумаги.ДатаПродажи = ДатаДок;
            Регистр.ЦенныеБумаги.НСПокупки =  НСП;
            Регистр.ЦенныеБумаги.НСПродажи =  НСДпр.ТекущийЭлемент();
            Регистр.ЦенныеБумаги.ПокупкаПродажа = Перечисление.ПокупкаПродажа.Продажа;
            Регистр.ЦенныеБумаги.ДвижениеРасходВыполнить();   
            
        Если НераспКоличество = 0 Тогда
         //Если распределили всё количество по строке
         
         //Списание по средней стоимости
            Операция.НоваяПроводка();
            Операция.Дебет.Счет = СчетПоКоду("91.2");
            Операция.Дебет.ПрочиеДоходыИРасходы = Покуп; 
            Операция.Дебет.Подразделения = Константа.ОсновноеПодразделение;
            Операция.Кредит.Счет = СчетПоКоду("58.1");
            Операция.Кредит.Контрагенты = Эмитент;
            Операция.Сумма = ОКР(Количество*ОбщаяСуммаПоСредней/ОбщееКоличествоПоСредней,2);
            Операция.НомерЖурнала = "ЦБ";
            Операция.СодержаниеПроводки = "Списание с/стоимости "+Количество+" акций "+Эмитент.Наименование+" (ц."+ОКР(ОбщаяСуммаПоСредней/ОбщееКоличествоПоСредней,2)+")";
            Операция.ПервичныйДокумент  = глПредставлениеПервичногоДокумента(Контекст); 
         //Списание по средней стоимости   
         
         
            Прервать;
      Иначе
         // продолжаем распределять остаток по строке
         Кол = НераспКоличество; 
         //Сообщить("-----------Осталось нерапределено: "+Кол);
        КонецЕсли;
      КонецЦикла;   
   КонецЦикла;
   Операция.Записать();
   //ТЗН1.Выгрузить(глПерем);
КонецПроцедуры


Процедура ОбработкаУдаленияПроведения()
   ВыбратьСтроки();
   НСД = СоздатьОбъект("Справочник.НомераСделок");
   Пока ПолучитьСтроку() = 1 Цикл
      НСД.ВыбратьЭлементыПоРеквизиту("ДатаСделки",ДатаДок,,0);
      Пока НСД.ПолучитьЭлемент() = 1 Цикл
          Если Найти(СокрЛП(НСД.Наименование),СокрЛП(НомерСделки))>0 Тогда
              НСД.Удалить(1);
            ПРЕРВАТЬ;
          КонецЕсли;
      КонецЦикла;
   КонецЦикла;
КонецПроцедуры                               

Процедура ПриЗаписи()
   глУстановитьМодификатор(Контекст);
КонецПроцедуры


Необходимо понять как вычисляется средняя себестоимость акции. А именно строка 148

prog1c7.7

//КонОст Суммы покупки делится на коност количества и в списании на 58.1
//на кредит  сумма идет округленная от деления:
ОКР(Количество*ОбщаяСуммаПоСредней/ОбщееКоличествоПоСредней,2)
//а что?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск