Здравствуйте, дорогие читатели!
В предыдущей статье мы с Вами дополнили нашу конфигурацию для учета инвестиций функцией, которая позволяет загружать текущие котировки из Internet, а не заносить их вручную. Кроме того, в связи с тем, что поиск котировок происходит по тикерам, а не по юридическим названиям, мы дополнили наш справочник ценных бумаг тикерами.
В сегодняшнем уроке я покажу как применять на практике данный инструмент.
Предыстория.
Что видит инвестор, заходя в торговый инструмент? В 90% случаев это будет список торгующихся ценных бумаг, а рядом информация о текущей цене, а также о том растет ли цена в данный момент или падает.
Утрировано и сильно упрощая, далее происходит следующее. На основании информации о росте цены инвестор принимает решение о покупке или продаже своих активов. Подразумевается, если цена упала, то бумагу надо брать, если выросла - продавать.
Так вот, информация об изменении цен, как правило предоставляется за торговые сутки. Что явно не достаточно для полноценного анализа и принятия решения.
Допустим ваша цель - начать торговать бумагами при изменении цены на 10% от начальной. И 10% можно так и не дождаться, если смотреть на изменение только одной торговой сессии. Такое бывает достаточно редко.
Давайте создадим инструмент на 1С, который покажет на сколько изменились котировки по выбранным инвестором активам. Причем общим списком - для удобного сравнения и независимо от прошедшего времени,от даты прослеживания на текущий момент.
Проще говоря, Инвестор выбирает нужные ему бумаги. Запоминает их цену. А по прошествии некоторого времени: суток, двух, недели, месяца, года...нажимает кнопочку и программа показывает как же изменились цены за это время.
К сожалению, удобного и легкого для изучения инструмента, который будет нажимать кнопочку за инвестора, в 1С нет. Это тема не данного урока. Нажимать пока придется самому.
И так... Открываем 1С в режиме конфигуратора. Создаем новый документ. Назовем его Динамика и добавляем в подсистему Документы:
Переходим на вкладку Данные. Добавляем реквизит Комментарий, тип строка, длина 50:
Добавляем табличную часть Данные:
У табличной части добавляем реквизиты:
- Номенклатура. Тип справочник Номенклатура
- Начальная. Тип число, длина 10, точность 5
- Текущая. Тип число, длина 10, точность 5
- Отклонение. Тип число, длина 10, точность 5
- Процент. Тип число, длина 10, точность 5
В связи с тем, что подразумеваются дополнительные кнопки, форма у документа будет не стандартной. Нужно создать свою. Сделать это просто. Перейдите на вкладку Формы и нажмите кнопку добавления:
Готово!
Мы видим конструктор формы:
Нас все устраивает, но нужно добавить две кнопки. По первой кнопке будет происходить заполнение колонки Начальная. Там будет храниться начальная цена актива. По второй кнопке будет рассчитываться вся остальная часть таблицы.
Кнопки - это команды. Поэтому, в верхней правой части находим вкладку Команды и заходим туда.
Добавляем 2 команды:
- ЗаполнитьЦены
- Расчет
Теперь мышкой перетаскиваем созданные команды в левую часть на командную панель:
Автоматически в нижней части появятся нужные нам кнопки.
Напишем код, который будет рассчитывать нашу таблицу. Для этого переходим на вкладку Модуль:
Вставляем следующий код:
Процедура Рассчитать()
Для Каждого Стр Из Объект.Данные Цикл
Стр.Отклонение = Стр.Текущая - Стр.Начальная;
Стр.Процент = ?(Стр.Начальная = 0, 0, Стр.Текущая * 100 / Стр.Начальная);
КонецЦикла;
Объект.Данные.Сортировать("Процент");
КонецПроцедуры
Данная процедура пройдет по всем строчкам таблицы. Отнимет от текущей цены начальную и запишет результат в колонку Отклонение. Аналогичным способом высчитает колонку Процент, однако, тут есть шанс получения деления на 0, чего делать нельзя, поэтому при записи колонки Процент, проверяется а не равна ли нулю начальная цена, если да то процент будет 0, а иначе Текущая * 100 / Начальная.
По окончании расчетов процедура отсортирует результат по возрастанию в колонке Процент.
Теперь нам надо заполнить колонки Текущая и Начальная. Заполнять их будем автоматически, скачивая цены из Internet. Вот и подошли к тому, ради чего затевался наш пример.
Вернитесь на вкладку формы:
Щелкните правой кнопкой мыши на кнопке Заполнить цены. в выпадающем списке найдите Действие команды:
Щелкните туда. 1С предложит создать новую процедуру. Нам нужен третий вариант:
Вас автоматически перебросит в модуль, где появятся новые строки:
Мы будем работать в серверной части. Вставим туда код:
Цены = ОбщиеРасчеты.ПолучитьЦены();
Для Каждого Стр Из Объект.Данные Цикл
НайденнаяСтрока = Цены.Найти(Стр.Номенклатура.Тикер, "Название");
Если НайденнаяСтрока <> Неопределено Тогда
Стр.Начальная = НайденнаяСтрока.Цена;
Иначе
Стр.Начальная = 0;
КонецЕсли;
КонецЦикла;
Вернемся на вкладку формы. Найдем вторую кнопку. И так же как и с первой определим действие для команды:
Как и в первом случае выбираем 3 вариант создания:
В серверной процедуре вставляем похожий код:
Цены = ОбщиеРасчеты.ПолучитьЦены();
Для Каждого Стр Из Объект.Данные Цикл
НайденнаяСтрока = Цены.Найти(Стр.Номенклатура.Тикер, "Название");
Если НайденнаяСтрока <> Неопределено Тогда
Стр.Текущая = НайденнаяСтрока.Цена;
Иначе
Стр.Текущая = 0;
КонецЕсли;
КонецЦикла;
Рассчитать();
Отличие в 2 вещах. Мы поменяли название колонки с Начальной на Текущую, а также добавили в конце процедуру Рассчитать.
И действительно, при первичном заполнении рассчитывать еще нечего. А вот уже после того как колонки Начальная и Текущая заполнены, можно заняться расчетами оставшихся двух колонок.
Запустите конфигурацию в отладке и проверьте ее работу . Создайте документ Динамика:
Добавьте несколько Номенклатур:
Нажмите кнопку Заполнить цены:
Нажмите кнопку Расчет:
Видим рабочую конфигурацию. Но хотелось бы еще иметь возможность ручного ввода.
Вообще, руками мы можем вносить правки в любое время, а вот расчета при этом не происходит.
Вернемся в конфигуратор на форму документа. Щелкните на колонке Начальная правой кнопкой. Выберите Свойства. Опуститесь в самый низ свойств. Найдите событие При изменении. Нажмите кнопку открытия:
Выбираем, как и прежде, третий вариант:
В серверной процедуре ДанныеНачальнаяПриИзмененииНаСервере() вызываем процедуру расчета: Рассчитать();
Такое же проделаем с колонкой Текущая, но немного другим способом. Щелкаем правой кнопкой - события - при изменении:
Нам также необходимо добавить в только что созданную серверную процедуру ДанныеТекущаяПриИзмененииНаСервере() вызов процедуры расчета:
Сохраняем наши изменения в конфигурации и проверяем работу. Попробуйте вручную изменить цены в колонках Текущая и Начальная.
Последнее, что нужно сделать, это запретить ручное изменение колонок Отклонение и Процент.
Вернитесь на конструктор формы. Правой кнопкой мыши на колонке Отклонение вызовите свойства поля. Установите галочку на свойстве Только просмотр:
Аналогичное проделайте с полем Процент. Теперь изменить эти поля нельзя. Только вычислить!
На сегодня все!
Поддержите канал подпиской, это поможет в его развитии!