Найти тему

Котировки в 1С. Получаем текущие цены ценных бумаг. Знакомимся с общими модулями.

Здравствуйте, дорогие читатели!

А Вы знаете, что Московская биржа по специально сформированному интернет-запросу предоставляет данные по ценным бумагам?! Полностью ознакомиться с документацией можно ознакомиться по ссылке.

Как пример, пройдите по ссылкам:

Вы получите текущие цены российских акций в двух разных форматах: JSON и XML. В принципе, для работы нам достаточно любого одного из них.

Есть мнение, что JSON постепенно заменяет формат XML. Так это или нет. Рисковать не будем. А будем работать с JSON.

Идея такова. 1С "лезет" на сайт Московкой биржи. "Дергает" оттуда цены и подставляет их в нужное нам место.

Все хорошо, но мы еще не знаем, а где же нам понадобятся в будущем данные цены. Даже не знаем будет это документ, отчет или справочник!

Предлагаю сделать код по получению цены общим для любых случаев.

Для этого в 1С придумали общие модули. Код, написанный в общем модуле, доступен из любого места 1С, что нам и надо.

Заходим в конфигуратор и в дереве конфигурации на вкладке Общие выделяем Общие модули и щелкаем по кнопке в виде белого плюса на зеленом кружке.

Справа откроются свойства добавленного общего модуля. Нам следует определиться со свойствами, в соответствии с текущими задачами:

  • «Глобальный». Данный флаг ставится, если модуль предназначен для хранения процедур и функций, которые должны вызываться без указания имени модуля. По использованию они не будут отличаться от стандартных функций платформы;
  • «Клиент». Зависит от настроек системы и регламентирует, могут ли процедуры модуля выполняться на стороне клиента;
  • «Сервер». Помечаются общие модули, в составе которых планируется помещать алгоритмы для выполнения на сервере;
  • «Внешнее соединение». Процедуры модуля с активацией этого свойства смогут выполняться через подключение внешнего источника;
  • «Вызов сервера». Отвечает за разрешения процедурам из модуля вызывать сервер, выполняясь на клиенте;
  • «Привилегированный». Активация этой настройки позволит при работе кода процедур модуля не проверять права доступа, что ускорит выполнение кода.
  • «Повторное использование». При многократном вызове одной процедуры система может использовать повторно рассчитанные ранее данные, не рассчитывая их заново.

В будущем, данные настройки можно будет изменить в любой момент.

Назовем общий модуль ОбщиеРасчеты и отметим, что данный модуль является привилегированным. Остальное оставим по-умолчанию:

-2

В сам же модуль добавим функцию:

Функция ПолучитьЦены() Экспорт
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Данные = Новый Массив;
HTTPСоединение = Новый HTTPСоединение("iss.moex.com");
Запрос = Новый HTTPЗапрос("/iss/engines/stock/markets/shares/boards/TQBR/securities.json?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST");
Попытка
Ответ = HTTPСоединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Для Каждого Элемент ИЗ Данные.marketdata.data Цикл
Стр = ТЗ.Добавить();
Стр.Название = Элемент[0];
Стр.Цена = Элемент[1];
КонецЦикла;
Элемент = Неопределено;
КонецЕсли;
Ответ = Неопределено;
Исключение;
КонецПопытки;
Данные = Неопределено;
HTTPСоединение = Неопределено;
Запрос = Неопределено;
Возврат ТЗ;
КонецФункции
-3

Поясню. Назвали мы функцию ПолучитьЦены. Обращение к ней выглядит так: А = ОбщиеРасчеты.ПолучитьЦены(); При этом переменная А станет таблицей значений и в нее запишутся текущие котировки Мосбиржи. Выглядеть это будет так:

-4

Как видим, на момент написания статьи, Мосбиржа возвращает 266 котировок. А еще мы видим, что названием является тикер ценной бумаги. И поиск будет происходить по тикеру.

Как производить поиск в Таблице значений? Разбрем такой код:

Цены = ОбщиеРасчеты.ПолучитьЦены();
НайденнаяСтрока = Цены.Найти("SBER", "Название");
Если НайденнаяСтрока <> Неопределено Тогда
Сообщить(НайденнаяСтрока.Цена);
Иначе
Сообщить("Цена не найдена")
КонецЕсли;

В переменную Цены загружаем цены. Переменная Цены - это таблица значений. У таблиц значений есть стандартный метод поиска Найти. Вот в переменную НайденнаяСтрока мы ищем в колонке Название строку SBER. Результатом будет либо Неопределено, если поиск будет неуспешен, либо необходимые нам данные, которые мы можем сообщить, вывести, записать...В общем все, что угодно.

Продолжим разбор нашей функции ПолучитьЦены().

Так как к данной функции мы будем обращаться из внешнего модуля, например, модуля документа Ребалансировка, то мы обязаны указать, что функция экспортная.

Чтение JSON возвращает массив данных. Поэтому мы заводим переменную Данные с типом массив. Так как работа с массивом менее удобна, то мы в цикле перебираем все элементы массива и записываем их в таблицу значений ТЗ.

ТЗ - это наш результат. Его то функция и будет возвращать. В самом начале мы создаем эту переменную и заполняем тип и названия ее колонок.

В Попытке мы пытаемся заполнить ТЗ данными из массива Данные. Результатом будет либо пустая ТЗ, либо заполненная.

После того как получаем итоговую ТЗ, остальные переменные нам становятся не нужны. Поэтому присваиваем им значение Неопределено.

Как же нам сопоставить номенклатуру Газпром с тикером GAZP?

Для того нам придется доделать справочник Номенклатура. а именно добавить реквизит Тикер.

Открываем 1С в режиме конфигуратора. Находим справочник Номенклатура. Добавляем реквизит, тип строка, длина 5, называем его Тикер:

-5

Запустите 1С в режиме Предприятие и дозаполните тикеры у Ваших номенклатур:

-6

Теперь к тикеру номенклатуры можно обратиться через Номенклатура.Тикер, что даст в данном случае строку "GAZP".

На сегодня все!
Поддержите канал подпиской, это поможет в его развитии!