В терминах платформы 1С Предприятие любое совершенное или планируемое действие фиксируется в системе с помощью специального объекта метаданных «Документ». Каждый «Документ» содержит в себе информацию, которая изменяет информацию в специальных вспомогательных объектах «Регистрах сведений» и «Регистрах накоплений». Для того, чтобы преобразовать табличноориентированную информацию выдаваемую QUIK и документоориентированную информацию платформы 1С Предприятие нам понадобятся документы «Покупка инструментов» и «Продажа инструментов". Они создаются системой автоматически на основании полученных из QUIK данных. При этом документы при своем проведении (специальной процедуре фиксации изменений) совершают движения по регистрам накопления «Наличие инструментов», «Продажи инструментов», «Наличие финансов". Фактически это написанные на русском языке правила.
1 Процедура проведения документа «Покупка инструментов»
Процедура ОбработкаПроведения(Отказ, Режим)
//Если не подтвеждено отчетом брокера
Если ЭтотОбъект.ПодтвержденоОтчетомБрокера=Ложь Тогда
ОбработкаПроведения_ОперативныеДанные(Отказ, Режим);
//Если подтверждено отчетом брокера
ИначеЕсли ЭтотОбъект.ПодтвержденоОтчетомБрокера=Истина Тогда
ОбработкаПроведения_ПодтвержденноеБрокером(Отказ, Режим);
КонецЕсли;
Код_бумаги=БиржевойИнструмент.Код_бумаги;
ЗаписьЖурналаРегистрации("ИнформационнаяБаза.ПроведениеДокумента",УровеньЖурналаРегистрации.Информация, , ,"Проведен документ " + Строка(ЭтотОбъект));
КонецПроцедуры
Процедура ОбработкаПроведения_ОперативныеДанные(Отказ, Режим)
Если Количество>0 и Исполнено>0 Тогда
//Новый алгоритм
// регистр НаличиеИнструментов Приход
Если ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаАктивна или ЭтотОбъект.Статус=перечисления.СтатусыДокументов.Черновик Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.КоличествоОжидается = Количество-Исполнено;
Движение.СтоимостьОжидается = (Количество-Исполнено)/Количество*Стоимость;
Движение.СуммаКомиссииОжидается =(Количество-Исполнено)/Количество*СуммаКомиссии;
Движение.Количество = Исполнено;
Движение.Стоимость = Исполнено/Количество*Стоимость;
Движение.СуммаКомиссии = Исполнено/Количество*СуммаКомиссии;
ИначеЕсли ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаСнята Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = Исполнено;
Движение.Стоимость = Исполнено/Количество*Стоимость;
Движение.СуммаКомиссии = Исполнено/Количество*СуммаКомиссии;
ИначеЕсли ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = Исполнено;
Движение.Стоимость = Исполнено/Количество*Стоимость;
Движение.СуммаКомиссии = Исполнено/Количество*СуммаКомиссии;
//Дата последней покупки
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПокупки<Дата Тогда
ИнструментОбъект.ДатаПоследнейПокупки=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Иначе
Движения.НаличиеИнструментов.Записывать = Истина;
КонецЕсли;
//Финансы
Движения.НаличиеФинасов.Записывать=Истина;
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Расход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=Стоимость+СуммаКомиссии;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Расход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=Исполнено/Количество*Стоимость+Исполнено/Количество*СуммаКомиссии;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаСнята Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Расход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма= Исполнено/Количество*Стоимость+Исполнено/Количество*СуммаКомиссии;
КонецЕсли;
Иначе
//Старый алгоритм проведения
// регистр НаличиеИнструментов Приход
Если ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаАктивна или ЭтотОбъект.Статус=перечисления.СтатусыДокументов.Черновик Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.КоличествоОжидается = Количество;
Движение.СтоимостьОжидается = Стоимость;
Движение.СуммаКомиссииОжидается = СуммаКомиссии;
ИначеЕсли ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = Количество;
Движение.Стоимость = Стоимость;
Движение.СуммаКомиссии = СуммаКомиссии;
//Дата последней покупки
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПокупки<Дата Тогда
ИнструментОбъект.ДатаПоследнейПокупки=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Иначе
Движения.НаличиеИнструментов.Записывать = Истина;
КонецЕсли;
//Финансы
Движения.НаличиеФинасов.Записывать=Истина;
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена или ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Расход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=Стоимость+СуммаКомиссии;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения_ПодтвержденноеБрокером(Отказ, Режим)
Если ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаАктивна или ЭтотОбъект.Статус=перечисления.СтатусыДокументов.Черновик Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.КоличествоОжидается = КоличествоПоОтчетуБрокера;
Движение.СтоимостьОжидается = СтоимостьПоОтчетуБрокера;
Движение.СуммаКомиссииОжидается = СуммаКомиссииБиржиПоОтчетуБрокера+СуммаКомиссииБрокераПоОтчетуБрокера;
ИначеЕсли ЭтотОбъект.Статус=перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движения.НаличиеИнструментов.Записывать = Истина;
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = КоличествоПоОтчетуБрокера;
Движение.Стоимость = СтоимостьПоОтчетуБрокера;
Движение.СуммаКомиссии = СуммаКомиссииБиржиПоОтчетуБрокера+СуммаКомиссииБрокераПоОтчетуБрокера;
//Дата последней покупки
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПокупки<Дата Тогда
ИнструментОбъект.ДатаПоследнейПокупки=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Иначе
Движения.НаличиеИнструментов.Записывать = Истина;
КонецЕсли;
//Финансы
Движения.НаличиеФинасов.Записывать=Истина;
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена или ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Расход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=СтоимостьПоОтчетуБрокера+СуммаКомиссииБиржиПоОтчетуБрокера+СуммаКомиссииБрокераПоОтчетуБрокера;
КонецЕсли;
КонецПроцедуры
2 Процедура проведения документа «Продажа инструментов»
Процедура ОбработкаПроведения(Отказ, Режим)
//Не подтверждено отчетом брокера
Если ЭтотОбъект.ПодтвержденоОтчетомБрокера=Ложь Тогда
ОбработкаПроведения_ОперативныеДанные(Отказ, Режим);
//Подтверждено отчетом брокера
ИначеЕсли ЭтотОбъект.ПодтвержденоОтчетомБрокера=Истина Тогда
ОбработкаПроведения_ПодтвержденныеБрокеромДанные(Отказ, Режим);
КонецЕсли;
Код_бумаги=БиржевойИнструмент.Код_бумаги;
ЗаписьЖурналаРегистрации("ИнформационнаяБаза.ПроведениеДокумента",УровеньЖурналаРегистрации.Информация, , ,"Проведен документ " + Строка(ЭтотОбъект));
КонецПроцедуры
Процедура ОбработкаПроведения_ОперативныеДанные(Отказ, Режим)
Если Количество>0 и Исполнено>0 Тогда
//Новый алгоритм
// регистр НаличиеИнструментов Расход
Движения.НаличиеИнструментов.Записывать = Истина;
Движения.НаличиеИнструментов.Записать();
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
| ПродажаИнструментов.БиржевойИнструмент КАК БиржевойИнструмент,
| СУММА(ВЫБОР
| КОГДА ПродажаИнструментов.Исполнено = 0
| ТОГДА ПродажаИнструментов.Количество
| ИНАЧЕ ПродажаИнструментов.Исполнено
| КОНЕЦ) КАК КоличествоДок,
| СУММА(ВЫБОР
| КОГДА ПродажаИнструментов.Исполнено = 0
| ТОГДА ПродажаИнструментов.Стоимость
| ИНАЧЕ ПродажаИнструментов.Исполнено / ПродажаИнструментов.Количество * ПродажаИнструментов.Стоимость
| КОНЕЦ) КАК СтоимостьДок,
| СУММА(ВЫБОР
| КОГДА ПродажаИнструментов.Исполнено = 0
| ТОГДА ПродажаИнструментов.Стоимость
| ИНАЧЕ ПродажаИнструментов.Исполнено / ПродажаИнструментов.Количество * ПродажаИнструментов.СуммаКомиссии
| КОНЕЦ) КАК СуммаКомиссииДок,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.СтоимостьОстаток, 0)) КАК СтоимостьОстаток,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.СуммаКомиссииОстаток, 0)) КАК СуммаКомиссииОстаток
|ИЗ
| Документ.ПродажаИнструментов КАК ПродажаИнструментов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НаличиеИнструментов.Остатки(&МоментВремениОстаков, БиржевойИнструмент = &БиржевойИнструмент) КАК НаличиеИнструментовОстатки
| ПО ПродажаИнструментов.БиржевойИнструмент = НаличиеИнструментовОстатки.БиржевойИнструмент
|ГДЕ
| ПродажаИнструментов.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаИнструментов.БиржевойИнструмент" ;
запрос.УстановитьПараметр("Ссылка",Ссылка);
запрос.УстановитьПараметр("МоментВремениОстаков",Новый Граница(ЭтотОбъект.МоментВремени(),ВидГраницы.Исключая));
запрос.УстановитьПараметр("БиржевойИнструмент",БиржевойИнструмент);
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.НаличиеИнструментов");
ЭлементБлокировки.УстановитьЗначение("БиржевойИнструмент", БиржевойИнструмент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Выборка=Запрос.Выполнить().Выбрать();
Движения.НаличиеИнструментов.Записывать = Истина;
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоДок>Выборка.КоличествоОстаток Тогда
СообщениеПользователю=Новый СообщениеПользователю;
СообщениеПользователю.Текст="Попытка продать больше чем есть";
СообщениеПользователю.Сообщить();
Отказ=Истина;
КонецЕсли;
Если Выборка.КоличествоДок=Выборка.КоличествоОстаток и Выборка.КоличествоОстаток>0 Тогда
СтоимостьСписать=Выборка.СтоимостьОстаток;
СуммаКомиссииОстатокСписать=Выборка.СуммаКомиссииОстаток;
Иначе
СтоимостьСписать=Выборка.КоличествоДок/Выборка.КоличествоОстаток*Выборка.СтоимостьОстаток;
СуммаКомиссииОстатокСписать=Выборка.КоличествоДок/Выборка.КоличествоОстаток*Выборка.СуммаКомиссииОстаток;
КонецЕсли;
//Наличие
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна или ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.Черновик Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.КоличествоОжидается = Количество-Исполнено;
Движение.СтоимостьОжидается = Выборка.СтоимостьОстаток-СтоимостьСписать;
Движение.СуммаКомиссииОжидается = Выборка.СуммаКомиссииОстаток- СуммаКомиссииОстатокСписать;
Движение.Количество = Исполнено;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаКомиссии =СуммаКомиссииОстатокСписать;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаСнята Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = Исполнено;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаКомиссии = СуммаКомиссииОстатокСписать;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = Исполнено;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаКомиссии = СуммаКомиссииОстатокСписать;
Иначе
Движения.НаличиеИнструментов.Записывать = Истина;
КонецЕсли;
//Продажи
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движения.ПродажиИнструментов.Записывать=Истина;
Движение = Движения.ПродажиИнструментов.Добавить();
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.СтратегияПокупки = СтратегияПокупки;
Движение.Количество = Исполнено;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаПродажи = Выборка.СтоимостьДок;
Движение.Комиссия = Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать;
//Дата последней продажи
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПродажи<Дата Тогда
ИнструментОбъект.ДатаПоследнейПродажи=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна Тогда
Движения.ПродажиИнструментов.Записывать=Истина;
Движение = Движения.ПродажиИнструментов.Добавить();
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.СтратегияПокупки = СтратегияПокупки;
Движение.КоличествоОжидается = Количество-Исполнено;
Движение.СтоимостьОжидается = Выборка.СтоимостьОстаток-СтоимостьСписать;
Движение.СуммаПродажиОжидается = Стоимость-Выборка.СтоимостьДок;
Движение.КомиссияОжидается = СуммаКомиссии+Выборка.СуммаКомиссииОстаток-(Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать);
Движение.Количество = Исполнено;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаПродажи =Выборка.СтоимостьДок;
Движение.Комиссия =Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать;
//Дата последней продажи
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПродажи<Дата Тогда
ИнструментОбъект.ДатаПоследнейПродажи=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаСнята Тогда
Движения.ПродажиИнструментов.Записывать=Истина;
Движение = Движения.ПродажиИнструментов.Добавить();
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.СтратегияПокупки = СтратегияПокупки;
Движение.Количество = Исполнено;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаПродажи = Выборка.СтоимостьДок;
Движение.Комиссия = Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать;
//Дата последней продажи
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПродажи<Дата Тогда
ИнструментОбъект.ДатаПоследнейПродажи=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Иначе
Движения.ПродажиИнструментов.Записывать=Истина;
КонецЕсли;
КонецЦикла;
//Финансы
Движения.НаличиеФинасов.Записывать=Истина;
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Приход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=(Исполнено/Количество)*(Стоимость-СуммаКомиссии);
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаСнята Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Приход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=Исполнено/Количество*Стоимость-Исполнено/Количество*СуммаКомиссии;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна и Исполнено>0 Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Приход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=Исполнено/Количество*Стоимость-Исполнено/Количество*СуммаКомиссии;
КонецЕсли;
Иначе
///////////////
/////////////
/////////////
//Старый алгоритм
// регистр НаличиеИнструментов Расход
Движения.НаличиеИнструментов.Записывать = Истина;
Движения.НаличиеИнструментов.Записать();
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
| ПродажаИнструментов.БиржевойИнструмент КАК БиржевойИнструмент,
| СУММА(ПродажаИнструментов.Количество) КАК КоличествоДок,
| СУММА(ПродажаИнструментов.Стоимость) КАК СтоимостьДок,
| СУММА(ПродажаИнструментов.СуммаКомиссии) КАК СуммаКомиссииДок,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.СтоимостьОстаток, 0)) КАК СтоимостьОстаток,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.СуммаКомиссииОстаток, 0)) КАК СуммаКомиссииОстаток
|ИЗ
| Документ.ПродажаИнструментов КАК ПродажаИнструментов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НаличиеИнструментов.Остатки(&МоментВремениОстаков, БиржевойИнструмент = &БиржевойИнструмент) КАК НаличиеИнструментовОстатки
| ПО ПродажаИнструментов.БиржевойИнструмент = НаличиеИнструментовОстатки.БиржевойИнструмент
|ГДЕ
| ПродажаИнструментов.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаИнструментов.БиржевойИнструмент" ;
запрос.УстановитьПараметр("Ссылка",Ссылка);
запрос.УстановитьПараметр("МоментВремениОстаков",Новый Граница(ЭтотОбъект.МоментВремени(),ВидГраницы.Исключая));
запрос.УстановитьПараметр("БиржевойИнструмент",БиржевойИнструмент);
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.НаличиеИнструментов");
ЭлементБлокировки.УстановитьЗначение("БиржевойИнструмент", БиржевойИнструмент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Выборка=Запрос.Выполнить().Выбрать();
Движения.НаличиеИнструментов.Записывать = Истина;
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоДок>Выборка.КоличествоОстаток Тогда
СообщениеПользователю=Новый СообщениеПользователю;
СообщениеПользователю.Текст="Попытка продать больше чем есть";
СообщениеПользователю.Сообщить();
Отказ=Истина;
КонецЕсли;
Если Выборка.КоличествоДок=Выборка.КоличествоОстаток и Выборка.КоличествоОстаток>0 Тогда
СтоимостьСписать=Выборка.СтоимостьОстаток;
СуммаКомиссииОстатокСписать=Выборка.СуммаКомиссииОстаток;
Иначе
СтоимостьСписать=Выборка.КоличествоДок/Выборка.КоличествоОстаток*Выборка.СтоимостьОстаток;
СуммаКомиссииОстатокСписать=Выборка.КоличествоДок/Выборка.КоличествоОстаток*Выборка.СуммаКомиссииОстаток;
КонецЕсли;
//Наличие
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна или ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.Черновик Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.КоличествоОжидается = Количество;
Движение.СтоимостьОжидается = СтоимостьСписать;
Движение.СуммаКомиссииОжидается = СуммаКомиссииОстатокСписать;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = Количество;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаКомиссии = СуммаКомиссииОстатокСписать;
Иначе
Движения.НаличиеИнструментов.Записывать = Истина;
КонецЕсли;
//Продажи
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движения.ПродажиИнструментов.Записывать=Истина;
Движение = Движения.ПродажиИнструментов.Добавить();
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.СтратегияПокупки = СтратегияПокупки;
Движение.Количество = Количество;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаПродажи = Выборка.СтоимостьДок;
Движение.Комиссия = Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать;
//Дата последней продажи
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПродажи<Дата Тогда
ИнструментОбъект.ДатаПоследнейПродажи=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна Тогда
Движения.ПродажиИнструментов.Записывать=Истина;
Движение = Движения.ПродажиИнструментов.Добавить();
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.СтратегияПокупки = СтратегияПокупки;
Движение.КоличествоОжидается = Количество;
Движение.СтоимостьОжидается = СтоимостьСписать;
Движение.СуммаПродажиОжидается = Выборка.СтоимостьДок;
Движение.КомиссияОжидается = Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать;
//Дата последней продажи
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПродажи<Дата Тогда
ИнструментОбъект.ДатаПоследнейПродажи=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Иначе
Движения.ПродажиИнструментов.Записывать=Истина;
КонецЕсли;
КонецЦикла;
//Финансы
Движения.НаличиеФинасов.Записывать=Истина;
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Приход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=Стоимость-СуммаКомиссии;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения_ПодтвержденныеБрокеромДанные(Отказ, Режим)
// регистр НаличиеИнструментов Расход
Движения.НаличиеИнструментов.Записывать = Истина;
Движения.НаличиеИнструментов.Записать();
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
| ПродажаИнструментов.БиржевойИнструмент КАК БиржевойИнструмент,
| СУММА(ПродажаИнструментов.КоличествоПоОтчетуБрокера) КАК КоличествоДок,
| СУММА(ПродажаИнструментов.СтоимостьПоОтчетуБрокера) КАК СтоимостьДок,
| СУММА(ПродажаИнструментов.СуммаКомиссииБрокераПоОтчетуБрокера + ПродажаИнструментов.СуммаКомиссииБиржиПоОтчетуБрокера) КАК СуммаКомиссииДок,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.СтоимостьОстаток, 0)) КАК СтоимостьОстаток,
| СУММА(ЕСТЬNULL(НаличиеИнструментовОстатки.СуммаКомиссииОстаток, 0)) КАК СуммаКомиссииОстаток
|ИЗ
| Документ.ПродажаИнструментов КАК ПродажаИнструментов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НаличиеИнструментов.Остатки(&МоментВремениОстаков, БиржевойИнструмент = &БиржевойИнструмент) КАК НаличиеИнструментовОстатки
| ПО ПродажаИнструментов.БиржевойИнструмент = НаличиеИнструментовОстатки.БиржевойИнструмент
|ГДЕ
| ПродажаИнструментов.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПродажаИнструментов.БиржевойИнструмент" ;
запрос.УстановитьПараметр("Ссылка",Ссылка);
запрос.УстановитьПараметр("МоментВремениОстаков",Новый Граница(ЭтотОбъект.МоментВремени(),ВидГраницы.Исключая));
запрос.УстановитьПараметр("БиржевойИнструмент",БиржевойИнструмент);
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.НаличиеИнструментов");
ЭлементБлокировки.УстановитьЗначение("БиржевойИнструмент", БиржевойИнструмент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Выборка=Запрос.Выполнить().Выбрать();
Движения.НаличиеИнструментов.Записывать = Истина;
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоДок>Выборка.КоличествоОстаток Тогда
СообщениеПользователю=Новый СообщениеПользователю;
СообщениеПользователю.Текст="Попытка продать больше, чем есть";
СообщениеПользователю.Сообщить();
Отказ=Истина;
КонецЕсли;
Если Выборка.КоличествоДок=Выборка.КоличествоОстаток и Выборка.КоличествоОстаток>0 Тогда
СтоимостьСписать=Выборка.СтоимостьОстаток;
СуммаКомиссииОстатокСписать=Выборка.СуммаКомиссииОстаток;
Иначе
СтоимостьСписать=Выборка.КоличествоДок/Выборка.КоличествоОстаток*Выборка.СтоимостьОстаток;
СуммаКомиссииОстатокСписать=Выборка.КоличествоДок/Выборка.КоличествоОстаток*Выборка.СуммаКомиссииОстаток;
КонецЕсли;
//Наличие
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаАктивна или ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.Черновик Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.КоличествоОжидается = КоличествоПоОтчетуБрокера;
Движение.СтоимостьОжидается = СтоимостьСписать;
Движение.СуммаКомиссииОжидается = СуммаКомиссииОстатокСписать;
ИначеЕсли ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движение = Движения.НаличиеИнструментов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.Количество = КоличествоПоОтчетуБрокера;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаКомиссии = СуммаКомиссииОстатокСписать;
Иначе
Движения.НаличиеИнструментов.Записывать = Истина;
КонецЕсли;
//Продажи
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
Движения.ПродажиИнструментов.Записывать=Истина;
Движение = Движения.ПродажиИнструментов.Добавить();
Движение.Период = Дата;
Движение.БиржевойИнструмент = БиржевойИнструмент;
Движение.СтратегияПокупки = СтратегияПокупки;
Движение.Количество = КоличествоПоОтчетуБрокера;
Движение.Стоимость = СтоимостьСписать;
Движение.СуммаПродажи = Выборка.СтоимостьДок;
Движение.Комиссия = Выборка.СуммаКомиссииДок+СуммаКомиссииОстатокСписать;
//Дата последней продажи
ИнструментОбъект=БиржевойИнструмент.получитьОбъект();
Если ИнструментОбъект.ДатаПоследнейПродажи<Дата Тогда
ИнструментОбъект.ДатаПоследнейПродажи=Дата;
Попытка
ИнструментОбъект.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Иначе
Движения.ПродажиИнструментов.Записывать=Истина;
КонецЕсли;
КонецЦикла;
//Финансы
Движения.НаличиеФинасов.Записывать=Истина;
Если ЭтотОбъект.Статус=Перечисления.СтатусыДокументов.ЗаявкаВыполнена Тогда
ДвижениеФ=Движения.НаличиеФинасов.Добавить();
ДвижениеФ.ВидДвижения=ВидДвиженияНакопления.Приход;
ДвижениеФ.Период=Дата;
ДвижениеФ.Сумма=СтоимостьПоОтчетуБрокера-СуммаКомиссииБиржиПоОтчетуБрокера-СуммаКомиссииБрокераПоОтчетуБрокера;
КонецЕсли;
КонецПроцедуры
Примеры кода можно скачать по ссылке
Комментарии (4)
ZEV1416
06.01.2025 11:08Вот если бы можно было текст опубликовать как текст... Или Вы думаете, если кому-то это понадобится, он не сможет открыть эти картинки в FineReaderе и скопировать оттуда текст?
TradeSpeculator Автор
06.01.2025 11:08Исправил на текст.
Добавил ссылку по которой можно скачать примеры кода
https://disk.yandex.ru/d/nm2ZTNl8MoOyXw
Прошу обратить внимание, что программисты 1С никогда группами не дизлайкают программистов языков низших уровней, потому как сами зачастую владеют этими языками.
iliabvf
Асинизатора вызывайте, спасайте Хабр
TradeSpeculator Автор
Вообще то это пример решения задачи как на экзамене 1С Специалист по платформе. Это стоит очень дорого.