Connect with us

Привет, что-то ищете?

The Times On Ru
  1. The Times On RU
  2. /
  3. Бизнес
  4. /
  5. Аналитики ЦБ повысили прогноз по курсу доллара, ключевой ставке и ..

Бизнес

Аналитики ЦБ повысили прогноз по курсу доллара, ключевой ставке и инфляции

Аналитики, опрошенные ЦБ, улучшили прогноз курса доллара на 2026 год на 0,4 рубля. — до 78,4 руб. Эксперты также пересмотрели в сторону повышения прогноз ключевой ставки – с 14,1% до 14,5%. Данные опроса, проведенного с 10 по 14 июля, опубликованы на портале регулятора.

Аналитики также повысили прогноз на 2027 год. По их оценкам, курс доллара составит 86,6 рубля. (вместо 86,2 руб.), а ключевая ставка — 12,2% (вместо 10,6%). При этом эксперты, наоборот, пересмотрели свои прогнозы на 2028-2029 годы в сторону понижения. Курс доллара должен составить 92,7 рубля. (а не 94,3 рубля, как предполагалось ранее), а в 2029 году — 95,8 рубля. (вместо 97,8 руб.). Эксперты ожидают, что ключевая ставка в 2028 году составит 10% (против 9%), а в 2029 году — 8,6% (вместо 8,1%).

Аналитики также повысили прогнозы по инфляции. В 2026 году она должна достичь 6,2% (против 5,3%), в 2027 году — 4,6% (против 4,4%), а в 2028 году — 4,1% (против 4%). Эксперты оставили прогноз на 2029 год без изменений (4%). Прогнозы роста ВВП в 2026-2027 годах снижены до 0,6% (вместо 0,7%) и 1,3% (вместо 1,5%). Ожидания на 2028 год (1,7%) и 2029 год (1,8%) не изменились.

Банк России ежемесячно проводит макроэкономический опрос аналитиков. В нем участвуют около 30 экспертов ведущих банков, инвестиционных и рейтинговых компаний, а также независимые экономисты.

Произошла ошибка при загрузке данных диаграммы индикатора.

“B-Chronograph”. Инфляция и ключевая ставка Интерактивный инструмент «Коммерсантъ-Хронограф» собирает тематический контекст индикатор из архива «Коммерсанта» и формирует краткие описания с с использованием технологий искусственного интеллекта (ИИ). Автоматическое резюме может содержать неточности — для полноты читайте оригинал статьи по кнопке «Еще». Виджет AI обогащает график связанными событиями. Нажмите на сплошной значок подпишитесь, чтобы посмотреть описание и перейдите в архив.  Ключевая скорость<диапазон class="flag-text flag-text__nflaton"> Годовая инфляция  На тему вышла публикация «Коммерсанта»  /  <диапазон> по теме (functon(){(асинхронная функция() { const wdgetElement = getTargetElement(document.currentScrpt, ‘.moex_wdget’); const tabsElement = wdgetElement.querySelector(‘.moex_tabs’); const spnnerElement = wdgetElement.querySelector(‘.moex_wdget_loader’); const errorElement = wdgetElement.querySelector(‘.moex_wdget_error’); const selectElement = tabsElement.querySelector(‘.moex_chart__select’); constchartRateElement = tabsElement.querySelector(‘.moex_chart__rate’); constchartDateElement = tabsElement.querySelector(‘.moex_chart__date’); const noteIconElement = tabsElement.querySelector(‘.moex_tabs__note-con’); const noteElement = tabsElement.querySelector(‘.moex_tabs__note’); const noteCloseElement = tabsElement.querySelector(‘.moex_tabs__note .close’); const nfoPannelElement = wdgetElement.querySelector(‘.moex_nfo-pannel’); const nfoPannelContentElement = wdgetElement.querySelector(‘.moex_nfo-pannel__content-wrapper’); const nfoPannelShadeElement = wdgetElement.querySelector(‘.pannel-shade’); const nfoPannelShowMoreElement = nfoPannelShadeElement.querySelector(‘.show-more’); const nfoPannelShowLessElement = nfoPannelElement.querySelector(‘.show-less’); const tmestamp = новая дата().getTme(); пусть maxTme = ноль; пусть LastActivePont = null; пусть currSubcategory = null; пусть currIntervalId = 6; пусть категории = []; пусть графДанные = []; пустьchartData = []; пусть документы = []; пусть resCatalog = []; пустьchartDataDocs = []; пусть тире = []; пусть GraphDataInflaton = []; пусть GraphDataKeyRate = []; пустьchartDataInflaton = []; пустьchartDataKeyRate = []; пусть диаграмма = ноль; константные имена месяцев = { 1: { коротко: «Ян», полное: ‘Январь’ }, 2: { коротко: «февраль», полное: ‘Февраль’ }, 3:{ коротко: «мар», полное: ‘Март’ }, 4:{ коротко: «Апрель», полное: ‘Апрель’ }, 5: { короткое: «Май», полное: ‘Май’ }, 6:{ коротко: «июнь», полное: ‘Июнь’ }, 7:{ короткое: «Июль», полное: ‘Июль’ }, 8:{ коротко: «Август», полное: ‘Август’ }, 9:{ коротко: «сентябрь», полное: ‘Сентябрь’ }, 10:{ коротко: «Октябрь», полное: ‘Октябрь’ }, 11: { коротко: «Ноябрь», полное: ‘Ноябрь’ }, 12:{ коротко: ‘декабрь’, полное: ‘Декабрь’ }, }; const curIntervals = [6, 8, 9, 10] константные интервалы = { 4: «3 месяца», 5: «6 месяцев», 6: «1 год», 7: «С начала года», 8: «3 года», 9: «5 лет», 10: «Все время» }; functon getTargetElement (элемент, селектор) { пусть предыдущая = element.prevousElementSblng; пока (предыдущий) { f (prev.matches(селектор)) return prev; е (prev.matches(‘.ncut’)) { return prev.querySelector(селектор); } предыдущая = предыдущая.prevousElementSblng; } вернуть ноль; } const loadScrpt = (url) => { вернуть новое обещание((разрешить, отклонить) =>{ f (wndow.Hghcharts?.StockChart) { вернуть решение (wndow.Hghcharts); } let scrpt = document.querySelector(‘scrpt[src*=»hghstock»]’); f (истина || !scrpt) { scrpt = document.createElement(‘scrpt’); scrpt.src = URL; scrpt.async = правда; document.head.appendChld(сценарий); } константа lmt = 10; пусть повторит = 0; const ntervalID = setInterval(() => { f (wndow.Hghcharts?.StockChart) { ClearInterval (ID интервала); разрешить (wndow.Hghcharts); } else f (++retry >= lmt) { ClearInterval (ID интервала); ignore(new Error(‘Превышен лимит времени загрузки Hghcharts’)); } }, 500); }); }; constclearElement = (элемент) =>{ whle(element.frstChld) { element.removeChld(element.frstChld); } }; const showErrorMsg = () => { spnnerElement.remove(); tabsElement.classLst.add(‘hde’); errorElement.classLst.remove(‘hde’); }; const showNote = () =>{ noteElement.classLst.remove(‘hde’); } const closeNote = () => { noteElement.classLst.add(‘hde’); } const ntCategory = () => { const CategoryId = 2 //wdgetElement.dataset.categoryId; const subcategoryId = 3 //wdgetElement.dataset.subcategoryId; const currCategory = categores.fnd((cat) => cat.Id == CategoryId); currSubcategory = currCategory.Indces.fnd((sub) => sub.Id == subcategoryId); }; //переключаем временные интервалы const updateTabSelect = () => { curIntervals.forEach((dx) =>{ const optonElement = document.createElement(‘opton’); optonElement.value = dx; optonElement.textContent = ntervals[dx] optonElement.selected = dx === currIntervalId selectElement.append(optonElement); }); }; const updateChartRate = (значение, индекс) => { const currentDate = новая дата() пусть выбранная дата = ноль пусть keyRate = ноль пусть нфлатон = ноль е (!значение) { currentDate.setHours(0, 0, 0, 0) выбраннаяДата = текущаяДата.getTme() пусть selectedDoc =chart.seres[2].ponts.fnd(flag =>flag.state === ‘выбрать’) е (!selectedDoc) { selectedDoc =chart.seres[2].ponts[chart.seres[2].ponts.length — 1] } } еще { выбраннаяДата = значение[0] } keyRate =chartDataKeyRate.fnd(tem => tem[0] === selectedDate) nflaton =chartDataInflaton.fnd(tem =>tem[0] === selectedDate) //f (!ndex) { //let selectedDoc =chart.seres[2].ponts.fnd(flag => flag.state === ‘select’) //f (!selectedDoc) { //выбранныйДок = диаграмма.seres[2].ponts[chart.seres[2].ponts.length — 1] //} //const selectedDate =chartDataKeyRate.reduce((аккумулятор, currentValue) => { //пусть currentDate = новая дата(currentValue[0]) //currentDate.setHours(0, 0, 0, 0) //f (currentDate.getTme() tem[0] === selectedDate) //nflaton =chartDataInflaton.fnd(tem =>tem[0] === выбранная дата) //} еще { //keyRate =chartDataKeyRate[ndex] //nflaton = диаграммаDataInflaton[ndex] //} chartRateElement.nnerHTML = »; е (keyRate) { const keyRateEl = document.createElement(‘span’); keyRateEl.className = ‘-ключевая ставка’; keyRateEl.textContent = `${formatStrng(formatNumber(keyRate[1]))}${currSubcategory?.CurrencySymbol}` chartRateElement.append(keyRateEl) } ж (нфлатон) { const nflatonEl = document.createElement(‘span’); nflatonEl.className = ‘-nflaton’; nflatonEl.textContent = ` ${formatStrng(formatNumber(nflaton[1]))}${currSubcategory?.CurrencySymbol}` chartRateElement.append(nflatonEl) } chartDateElement.textContent = `${formatDateTme(selectedDate)[1]}`; }; const updateInterval = (value = currSubcategory.IntervalTypes[0]) =>{ закрытьИнфоПаннел() ОчиститьИнфоПаннел() currIntervalId = + значение; }; constclearInfoPannel = () =>{ let oldData = nfoPannelElement.querySelectorAll(‘.moex_nfo-pannel__docs-wrapper’); oldData.forEach(old => old.remove()); } const closeInfoPannel = () => { nfoPannelElement.classLst.add(‘hde’); } const num_word = (значение, слова) => { значение = Math.abs(значение) % 100; вар число = значение % 10; f (значение > 10 && значение < 20) вернуть слова[2]; f (num > 1 && num < 5) вернуть слова[1]; f (num == 1) вернуть слова [0]; вернуть слова[2]; } const showInfoPannel = (понт) =>{ ОчиститьИнфоПаннел() ж (!!понт) { nfoPannelElement.classLst.remove(‘открыто’) nfoPannelShowMoreElement.classLst.remove(‘hde’) nfoPannelShowLessElement.classLst.add(‘hde’) } const sOpened = nfoPannelElement.classLst.contans(‘opened’); const docPubDate = pont?.optons?.pubDate || LastActivePont?.pubDate; let docSummary = docs.flter((doc) => doc.pubDate === docPubDate); const docSummaryLength = docSummary.length; f (docSummary && docSummaryLength > 0) { f (docSummaryLength >2 && !sOpened) { nfoPannelShadeElement.classLst.remove(‘hde’); docSummary = docSummary.slce(0, 2); } еще { docSummaryLength 7 ? { год: ‘число’ } : { месяц: ‘длинный’ }); headerDateEl.textContent = имя месяца.charAt(0).toUpperCase() + имя месяца.slce(1); const ttleDateEl = nfoPannelContentElement.querySelector(‘.ttle’); ttleDateEl.textContent = `${docSummaryLength} ${num_word(docSummaryLength, [ ‘material’, ‘material’, ‘materials’ ])}` docSummary.forEach((d) => { const doc = resCatalog.fnd(tem =>d.Id === tem.Id) const pubDate = новая дата (doc.pubDate) const pannelContentEl = document.createElement(‘dv’); pannelContentEl.className = ‘moex_nfo-pannel__docs-wrapper’; const pannelDateEl = document.createElement(‘span’); pannelDateEl.className = ‘дата’; pannelDateEl.textContent = pubDate.toLocaleDateStrng(‘ru-RU’, { месяц: ‘число’, день: ‘число’ }); const pannelTextEl = document.createElement(‘span’); PanelTextEl.className = ‘текст’; pannelTextEl.textContent = doc.summary; const pannelMoreEl = document.createElement(‘a’); pannelMoreEl.className = ‘больше’; pannelMoreEl.textContent = ‘Еще’; pannelMoreEl.setAttrbute(‘href’, `/doc/${doc.docId}?from=chronograph_keyrate`); pannelContentEl.append(pannelDateEl); pannelContentEl.append(pannelTextEl); pannelContentEl.append(pannelMoreEl); nfoPannelContentElement.append(pannelContentEl); }) nfoPannelElement.classLst.remove(‘hde’); } } const fetchIndcesData = async() =>{ попробуй { const ответ = awat fetch(‘/ndces/graphcatalog’); е (!response.ok) { throw new Error(`Status ${response.status}`); } категории = awat response.json(); } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения индексных данных: ${error.message}`); } }; const fetchCatalogData = async () =>{ попробуй { //получим данные каталога материалов const CatalogId = wdgetElement.dataset.docsAp; const ответ = awat fetch(`https://wt.kommersant.ru/ap/v1/catalog/get?catalogId=${catalogId}&start=0&lmt=1000`); е (!response.ok) { throw new Error(`Status ${response.status}`); } resCatalog = (awat response.json())?.data || []; } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения данных: ${error.message}`); } }; const fetchGraphData = async() =>{ попробуй { const keyRate = awat fetch(`/ndces/graphvalues?ndex=3&nterval=${currIntervalId}`) е (!keyRate.ok) { throw new Error(‘Я не могу загрузить данные для диаграммы’); } graphDataKeyRate = awat keyRate.json(); } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения данных диаграммы: ${error.message}`); } попробуй { const nflaton = awat fetch(`/ndces/graphvalues?ndex=29&nterval=${currIntervalId}`) е (!nflaton.ok) { throw new Error(‘Я не могу загрузить данные для диаграммы’); } graphDataInflaton = awat nflaton.json(); } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения данных диаграммы: ${error.message}`); } }; const formatStrng = (значение) => { возвращаемое значение.toStrng().replace(‘.’, ‘,’); //просмотр 1.23 }; const formatNumber = (значение) => { return Math.trunc(+value * 100)/100; //просмотр 1.23 }; const getMnY = () => { const maxY =chartDataInflaton.reduce((max, current) => { return Math.max(макс, ток[1]); }, 0); const mnY =chartDataInflaton.reduce((mn, current) => { return Math.mn(mn, current[1]); }, МаксY); const newMn = mnY — Math.trunc((maxY — mnY)/3) вернуть новыйMn >0 ? newMn: 0; } const formatDateTmeDoc = (dateValue) =>{ const currDateObject = новая дата (dateValue); const dayOfMonth = currDateObject.getDate().toStrng().padStart(2, ‘0’); константный месяц = ​​currDateObject.getMonth() + 1; const год = currDateObject.getFullYear(); переключатель (currIntervalId) { //день — 6 месяцев случай 1: случай 2: случай 3: случай 4: случай 5: return `${dayOfMonth} ${monthNames[month].full} ${year}`; //1 год, с начала года случай 6: случай 7: return `${monthNames[month].full} ${year}`; //3 года — постоянно случай 8: случай 9: случай 10: вернуть `${year}`; } }; const formatDateTme = (dateValue, pos) =>{ const currDateObject = новая дата (dateValue); const dayOfMonth = currDateObject.getDate().toStrng().padStart(2, ‘0’); константный месяц = ​​currDateObject.getMonth() + 1; const год = currDateObject.getFullYear(); constyearShort = год.toStrng().substrng(2); const tme = currDateObject.toLocaleStrng(‘ru-RU’, { час: ‘2-дгт’, минута: ‘2-dgt’ }); переключатель (currIntervalId) { //день случай 1: return [`${tme}`, `${dayOfMonth} ${monthNames[month].short} ${tme}`]; //неделя случай 2: return [`${dayOfMonth} ${monthNames[month].short} ${tme}`, `${dayOfMonth} ${monthNames[month].short} ${tme}`]; //месяц, 3 месяца случай 3: случай 4: return [`${dayOfMonth} ${monthNames[month].short}`, `${dayOfMonth} ${monthNames[month].short}`]; //6 месяцев случай 5: return [`${monthNames[month].full}`, `${dayOfMonth} ${monthNames[month].short} ${year}`]; //1 год, с начала года случай 6: случай 7: f (pos !== undefned &&chartDataInflaton[pos]) { const currentYear = (new Date(chartDataInflaton[pos][0])).getFullYear(); const prevYear = позиция >0 ? (новая дата(chartDataInflaton[pos — 1][0])).getFullYear() : 0; f (pos === 0 || currentYear !== prevYear) { return [`${monthNames[month].short}’${yearShort}`, `${dayOfMonth} ${monthNames[month].short} ${year}`]; } } return [`${monthNames[month].short}`, `${dayOfMonth} ${monthNames[month].short} ${year}`]; //3 года, 5 лет случай 8: случай 9: return [`${year}`, `${monthNames[month].full} ${year}`]; //все время случай 10: return [`’${yearShort}`, `${monthNames[month].full} ${year}`]; } }; const connectGraphData = async () => { awat fetchGraphData(); диаграммаDataInflaton = []; graphDataInflaton.forEach(([дата, значение]) =>{ chartDataInflaton.push([новая дата(дата).getTme(), parseFloat(значение)]) }); пустьchartDataKeyRateTmp = []; graphDataKeyRate.forEach(([дата, значение]) =>{ chartDataKeyRateTmp.push([новая дата(дата).getTme(), parseFloat(значение)]) }); //ТОДО: сортировка диаграммаDataKeyRate = []; chartDataInflaton.forEach(([дата, значение]) => { пусть ближайшее = ноль chartDataKeyRateTmp.forEach((tem) => { f (tem[0] < дата) { ближайший = темп } е (дата === tem[0]) { chartDataKeyRate.push([дата, tem[1]]) ближайший = ноль } ж (тем[0] >дата && !!ближайший) { chartDataKeyRate.push([дата, ближайший[1]]) ближайший = ноль } }) }) const maxInflaton =chartDataInflaton[chartDataInflaton.length — 1][0] chartDataKeyRateTmp.forEach((tem) => { f (tem[0] >maxInflaton) { chartDataKeyRate.push([tem[0], tem[1]]) } }) const mnTme =chartDataInflaton[0][0] maxTme = Math.max(Date.now(),chartDataKeyRate[chartDataKeyRate.length — 1][0]) документы = resCatalog.map((doc) => { пусть docDate = новая дата (doc.pubDate) docDate.setHours(0, 0, 0, 0) f (currIntervalId === 6 || currIntervalId === 7) { docDate.setDate(1) } else f (currIntervalId >7) { docDate.setMonth(1, 1) } вернуть { … док, truePubDate: новая дата(doc.pubDate).getTme(), pubDate: docDate.getTme() } }) ChartDataDocs = []; docs.forEach((запись) =>{ const docTme = запись.truePubDate const docPubDate = запись.pubDate f (docTme > mnTme && docTme < maxTme && Record.IsShow) { const ужеExsstsId =chartDataDocs.fndIndex(d =>d.pubDate === docPubDate) е (ужеExsstsId === -1) { chartDataDocs.push({ х: докТме, pubDate: docPubDate, shape: ‘url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag-desk-logo.svg)’, }); } еще { chartDataDocs[alreadyExsstsId].shape = ‘url(https://m2.kommersant.ru/ContentFlex/mages/logos/flags-desk-logo.svg)’ chartDataDocs[alreadyExsstsId].x = Math.mn(docTme,chartDataDocs[alreadyExsstsId].x) } } }); тире = [] chartDataDocs.forEach((doc) => { тире.push({ цвет: ‘#DDD’, ширина: 1, значение: doc.x, zИндекс: 2, DashStyle: ‘Тире’, }) }) }; const renderGraph = () =>{ диаграмма = Hghcharts.chart(`moex_graph-${tmestamp}`, { диаграмма: { стиль: { FontFamly: ‘Нерт’, }, события: { нагрузка: функция() { spnnerElement.remove(); tabsElement.classLst.remove(‘hde’); }, } }, немного: { текст: незащищенный }, кредиты: { включено: ложь }, легенда: { включено: ложь }, инструментp: { включено: ложь, кроссхарс: правда, поделился: правда }, цвета: [‘#498ABB’, ‘#F17E9B’], хАкс: { введите: ‘dateme’, сюжетные линии: тире, Макс: maxTme, startOnTck: false, //Не округлять границы до тиков ендОнТкк: ложь }, yAxs: { немного: { текст: неопределенный, }, ярлыки: { выравнивание: ‘слева’, х: 0, резервное пространство: правда, стиль: { Размер шрифта: ’14px’, шрифтВес: ‘400’, цвет: ‘#333’, textOverflow: не определено, }, }, grdLneColor: ‘#eee’, }, сюжетОптонс: { серия: { маркер: { включено: ложь, EnableThreshold: неопределенный, fllColor: ‘#3E9AE2’, lneColor: ‘#3E9AE2’, длина: 1, радиус: 3, }, пон: { события: { mouseOver: functon() { updateChartRate([ths.key, ths.y], ths.ndex); }, }, }, события: { mouseOut: functon() { updateChartRate(); }, }, говорится: { актуально: { непрозрачность: 1 } }, }, флаги: { разрешитьПонтселект: правда, события: { clck: функция (событие) { chart.seres[2].ponts.forEach((pont, dx) =>{ const sAGroup = pont.shape.ncludes(«флаги») const mage = `url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag${sAGroup ? ‘s’ : »}-desk-logo.svg)` pont.optons.shape = маг; pont.shape = маг; понт.обновление() }) const saPontGroup = event.pont.shape.ncludes(«флаги») const pontImage = `url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag${sAPontGroup ? ‘s’ : »}-desk-logo-actve.svg)` event.pont.optons.shape = pontImage; event.pont.shape = pontImage; событие.понт.обновление() LastActivePont = event.pont showInfoPannel(event.pont) }, }, } }, ответ: { правила: [{ кондтон: { МаксШдс: 600 }, диаграммаОптонс: { хАкс: { ярлыки: { стиль: { Размер шрифта: ’10px’, }, }, }, yAxs: { ярлыки: { стиль: { Размер шрифта: ’10px’, }, }, } } }] }, серия: [ { тип: ‘lne’, цвет: ‘#F17E9B’, данные: диаграммаDataInflaton, }, { тип: ‘lne’, цвет: ‘#AFC1F2’, данные: диаграммаDataKeyRate, }, { тип: ‘флаги’, ттл: », данные: диаграммаDataDocs, }, ], }); LastActivePont =chart.seres[2].ponts[chartDataDocs.length — 1] showInfoPannel (lastActvePont) chart.seres[2].ponts[chartDataDocs.length — 1].select(true, true) const sAGroup = LastActvePont.shape.ncludes(«флаги») const mage = `url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag${sAGroup ? ‘s’ : »}-desk-logo-actve.svg)` LastActivePont.optons.shape = маг; LastActivePont.shape = маг; последнийActivePont.update() }; const updateGraph = async () => { awat ConnectGraphData(); requestAnmatonFrame(() => { диаграмма.уничтожить(); рендерГраф(); updateChartRate(); }); }; const ntHghcharts = async () => { попробуй { awat loadScrpt(‘https://m2.kommersant.ru/ContentFlex/js/custom/lbs/hghchats/hghstock-v12.4.0.js’); } поймать (ошибка) { показатьErrorMsg(); console.log(ошибка) throw new Error(‘Ошибка загрузки hghcharts.js’); } }; const ntGraph = асинхронный () =>{ awat ntHghcharts(); awat ConnectGraphData(); обновлениеTabSelect(); Hghcharts.setOptons({ язык: { numercSymbols: [‘тысяча’] } }); requestAnmatonFrame(() =>{ рендерГраф(); updateChartRate(); }); }; const updateAttrbute = () => { constgraphElement = wdgetElement.querySelector(‘.moex_graph’); graphElement.setAttrbute(‘d’, `moex_graph-${tmestamp}`); selectElement.setAttrbute(‘d’, `moex_nterval-${tmestamp}`); }; const ntWdget = async () => { обновлениеАттрбуте(); awat fetchIndcesData(); awat fetchCatalogData(); нтКатегория(); нтГраф(); selectElement.addEventLstener(‘change’, (e) => { updateInterval(e.target.value); обновлениеГрафик(); }); noteIconElement.addEventLstener(‘clck’, (e) =>{ noteElement.classLst.contans(‘hde’) ? шоуПримечание(): закрытьПримечание() }); noteCloseElement.addEventLstener(‘clck’, (e) => { закрытьПримечание() }); nfoPannelShowMoreElement.addEventLstener(‘clck’, (e) => { nfoPannelElement.classLst.add(‘открыто’) nfoPannelShowMoreElement.classLst.add(‘hde’) nfoPannelShowLessElement.classLst.remove(‘hde’) шоуИнфоПаннел() }); nfoPannelShowLessElement.addEventLstener(‘clck’, (e) =>{ nfoPannelElement.classLst.remove(‘открыто’) nfoPannelShowMoreElement.classLst.remove(‘hde’) nfoPannelShowLessElement.classLst.add(‘hde’) tabsElement.scrollIntoVew({ поведение: «гладкое», блок: ‘старт’ }); шоуИнфоПаннел() }); }; нтВджет(); })();})()

Произошла ошибка при загрузке данных диаграммы индикатора.

“B-Chronograph”. Курс доллара США к рублю Интерактивный инструмент «Коммерсантъ-Хронограф» собирает тематический контекст индикатор из архива «Коммерсанта» и формирует краткие описания с с использованием технологий искусственного интеллекта (ИИ). Автоматическое резюме может содержать неточности — для полноты читайте оригинал статьи по кнопке «Еще». Виджет AI обогащает график связанными событиями. Нажмите на сплошной значок подпишитесь, чтобы посмотреть описание и перейдите в архив. Коммерсантъ опубликовал публикацию на тему Данные: ЦБ РФ.  /  <диапазон> по теме (functon(){(асинхронная функция() { const wdgetElement = getTargetElement(document.currentScrpt, ‘.moex_wdget’); const tabsElement = wdgetElement.querySelector(‘.moex_tabs’); const spnnerElement = wdgetElement.querySelector(‘.moex_wdget_loader’); const errorElement = wdgetElement.querySelector(‘.moex_wdget_error’); const selectElement = tabsElement.querySelector(‘.moex_chart__select’); constchartRateElement = tabsElement.querySelector(‘.moex_chart__rate’); constchartDateElement = tabsElement.querySelector(‘.moex_chart__date’); const noteIconElement = tabsElement.querySelector(‘.moex_tabs__note-con’); const noteElement = tabsElement.querySelector(‘.moex_tabs__note’); const noteCloseElement = tabsElement.querySelector(‘.moex_tabs__note .close’); const nfoPannelElement = wdgetElement.querySelector(‘.moex_nfo-pannel’); const nfoPannelContentElement = wdgetElement.querySelector(‘.moex_nfo-pannel__content-wrapper’); const nfoPannelShadeElement = wdgetElement.querySelector(‘.pannel-shade’); const nfoPannelShowMoreElement = nfoPannelShadeElement.querySelector(‘.show-more’); const nfoPannelShowLessElement = nfoPannelElement.querySelector(‘.show-less’); const tmestamp = новая дата().getTme(); пусть LastActivePont = null; пусть currSubcategory = null; пусть currIntervalId = 6; пусть категории = []; пусть графДанные = []; пустьchartData = []; пусть документы = []; пусть resCatalog = []; пустьchartDataDocs = []; пусть тире = []; пусть GraphDataGold = []; пустьchartDataGold = []; пусть диаграмма = ноль; константные имена месяцев = { 1: { коротко: «Ян», полное: ‘Январь’ }, 2: { коротко: «февраль», полное: ‘Февраль’ }, 3:{ коротко: «мар», полное: ‘Март’ }, 4:{ коротко: «Апрель», полное: ‘Апрель’ }, 5: { короткое: «Май», полное: ‘Май’ }, 6:{ коротко: «июнь», полное: ‘Июнь’ }, 7:{ короткое: «Июль», полное: ‘Июль’ }, 8:{ коротко: «Август», полное: ‘Август’ }, 9:{ коротко: «сентябрь», полное: ‘Сентябрь’ }, 10:{ коротко: «Октябрь», полное: ‘Октябрь’ }, 11: { коротко: «Ноябрь», полное: ‘Ноябрь’ }, 12:{ коротко: ‘декабрь’, полное: ‘Декабрь’ }, }; const curIntervals = [4, 5, 6, 7, 8, 9, 10] константные интервалы = { 4: «3 месяца», 5: «6 месяцев», 6: «1 год», 7: «С начала года», 8: «3 года», 9: «5 лет», 10: «Все время» }; functon getTargetElement (элемент, селектор) { пусть предыдущая = element.prevousElementSblng; пока (предыдущий) { f (prev.matches(селектор)) return prev; е (prev.matches(‘.ncut’)) { return prev.querySelector(селектор); } предыдущая = предыдущая.prevousElementSblng; } вернуть ноль; } const loadScrpt = (url) => { вернуть новое обещание((разрешить, отклонить) =>{ f (wndow.Hghcharts?.StockChart) { вернуть решение (wndow.Hghcharts); } let scrpt = document.querySelector(‘scrpt[src*=»hghstock»]’); f (истина || !scrpt) { scrpt = document.createElement(‘scrpt’); scrpt.src = URL; scrpt.async = правда; document.head.appendChld(сценарий); } константа lmt = 10; пусть повторит = 0; const ntervalID = setInterval(() => { f (wndow.Hghcharts?.StockChart) { ClearInterval (ID интервала); разрешить (wndow.Hghcharts); } else f (++повторить >= лмт) { ClearInterval (ID интервала); ignore(new Error(‘Превышен лимит времени загрузки Hghcharts’)); } }, 500); }); }; constclearElement = (элемент) =>{ whle(element.frstChld) { element.removeChld(element.frstChld); } }; const showErrorMsg = () => { spnnerElement.remove(); tabsElement.classLst.add(‘hde’); errorElement.classLst.remove(‘hde’); }; const showNote = () => { noteElement.classLst.remove(‘hde’); } const closeNote = () => { noteElement.classLst.add(‘hde’); } const ntCategory = () => { const CategoryId = wdgetElement.dataset.categoryId; const subcategoryId = wdgetElement.dataset.graphAp; const currCategory = categores.fnd((cat) => cat.Id == CategoryId); currSubcategory = currCategory.Indces.fnd((sub) => sub.Id == subcategoryId); }; //переключаем временные интервалы const updateTabSelect = () =>{ curIntervals.forEach((dx) =>{ const optonElement = document.createElement(‘opton’); optonElement.value = dx; optonElement.textContent = ntervals[dx] optonElement.selected = dx === currIntervalId selectElement.append(optonElement); }); }; const updateChartRate = (значение, индекс) => { пусть goldRate = ноль е (!индекс) { let selectedDoc =chart.seres[1].ponts.fnd(flag => flag.state === ‘select’) е (!selectedDoc) { selectedDoc =chart.seres[1].ponts[chart.seres[1].ponts.length — 1] } const selectedDate =chartDataGold.reduce((аккумулятор, currentValue) =>{ пусть currentDate = новая дата (currentValue[0]) currentDate.setHours(0, 0, 0, 0) f (currentDate.getTme() tem[0] === selectedDate) } еще { goldRate = диаграммаDataGold[ndex] } chartRateElement.nnerHTML = »; const goldRateEl = document.createElement(‘span’); goldRateEl.textContent = `${formatStrng(formatNumber(goldRate[1]))} ${currSubcategory?.CurrencySymbol}` chartRateElement.append(goldRateEl) chartDateElement.textContent = `${formatDateTme(goldRate[0])[1]}`; }; const updateInterval = (value = currSubcategory.IntervalTypes[0]) => { закрытьИнфоПаннел() ОчиститьИнфоПаннел() currIntervalId = + значение; }; constclearInfoPannel = () => { let oldData = nfoPannelElement.querySelectorAll(‘.moex_nfo-pannel__docs-wrapper’); oldData.forEach(старый =>старый.удалить()); } const closeInfoPannel = () =>{ nfoPannelElement.classLst.add(‘hde’); } const num_word = (значение, слова) => { значение = Math.abs(значение) % 100; вар число = значение % 10; f (значение > 10 && значение < 20) вернуть слова[2]; f (num > 1 && num < 5) вернуть слова[1]; f (num == 1) вернуть слова [0]; вернуть слова[2]; } const showInfoPannel = (понт) =>{ ОчиститьИнфоПаннел() ж (!!понт) { nfoPannelElement.classLst.remove(‘открыто’) nfoPannelShowMoreElement.classLst.remove(‘hde’) nfoPannelShowLessElement.classLst.add(‘hde’) } const sOpened = nfoPannelElement.classLst.contans(‘opened’); const docPubDate = pont?.optons?.pubDate || LastActivePont?.pubDate; const analytcsName = wdgetElement.dataset.analytcsName; let docSummary = docs.flter((doc) => doc.pubDate === docPubDate); const docSummaryLength = docSummary.length; f (docSummary && docSummaryLength > 0) { f (docSummaryLength > 2 && !sOpened) { nfoPannelShadeElement.classLst.remove(‘hde’); docSummary = docSummary.slce(0, 2); } еще { docSummaryLength 7 ? { год: ‘число’ } : { месяц: ‘длинный’ }); f (currIntervalId < 6 && docSummary.length >1) { const startPerod = новая дата(docSummary[0].truePubDate).toLocaleDateStrng(‘ru-RU’, { месяц: ‘число’, день: ‘число’ }); const endPerod = новая дата(docSummary[docSummary.length — 1].truePubDate).toLocaleDateStrng(‘ru-RU’, { месяц: ‘число’, день: ‘число’ }); headerDateEl.textContent = `${startPerod} – ${endPerod}` } еще { headerDateEl.textContent = имя месяца.charAt(0).toUpperCase() + имя месяца.slce(1); } const ttleDateEl = nfoPannelContentElement.querySelector(‘.ttle’); ttleDateEl.textContent = `${docSummaryLength} ${num_word(docSummaryLength, [ ‘material’, ‘material’, ‘materials’ ])}` docSummary.forEach((d) => { const doc = resCatalog.fnd(tem =>d.Id === tem.Id) const pubDate = новая дата (doc.pubDate) const pannelContentEl = document.createElement(‘dv’); pannelContentEl.className = ‘moex_nfo-pannel__docs-wrapper’; const pannelDateEl = document.createElement(‘span’); pannelDateEl.className = ‘дата’; pannelDateEl.textContent = pubDate.toLocaleDateStrng(‘ru-RU’, { месяц: ‘число’, день: ‘число’ }); const pannelTextEl = document.createElement(‘span’); PanelTextEl.className = ‘текст’; pannelTextEl.textContent = doc.summary; const pannelMoreEl = document.createElement(‘a’); pannelMoreEl.className = ‘больше’; pannelMoreEl.textContent = ‘Еще’; pannelMoreEl.setAttrbute(‘href’, `/doc/${doc.docId}?from=chronograph_${analytcsName}`); pannelContentEl.append(pannelDateEl); pannelContentEl.append(pannelTextEl); pannelContentEl.append(pannelMoreEl); nfoPannelContentElement.append(pannelContentEl); }) nfoPannelElement.classLst.remove(‘hde’); } } const fetchIndcesData = async() => { попробуй { const ответ = awat fetch(‘/ndces/graphcatalog’); е (!response.ok) { throw new Error(`Status ${response.status}`); } категории = awat response.json(); } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения индексных данных: ${error.message}`); } }; const fetchCatalogData = async () =>{ попробуй { //получим данные каталога материалов const CatalogId = wdgetElement.dataset.docsAp; const ответ = awat fetch(`https://wt.kommersant.ru/ap/v1/catalog/get?catalogId=${catalogId}&start=0&lmt=1000`); е (!response.ok) { throw new Error(`Status ${response.status}`); } resCatalog = (awat response.json())?.data || []; resCatalog.sort((docA, docB) => новая дата(docA.pubDate).getTme() — новая дата(docB.pubDate).getTme()) } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения данных: ${error.message}`); } }; const fetchGraphData = async() =>{ попробуй { //получаем данные диаграммы constgraphId = wdgetElement.dataset.graphAp const cost = awat fetch(`/ndces/graphvalues?ndex=${graphId}&nterval=${currIntervalId}`) е (!cost.ok) { throw new Error(‘Я не могу загрузить данные для диаграммы’); } graphDataGold = awat Cost.json(); } поймать (ошибка) { показатьErrorMsg(); throw new Error(`Ошибка получения данных диаграммы: ${error.message}`); } }; const formatStrng = (значение) => { возвращаемое значение.toStrng().replace(‘.’, ‘,’); //просмотр 1.23 }; const formatNumber = (значение) => { return Math.trunc(+value * 100)/100; //просмотр 1.23 }; const getMnY = () => { const maxY =chartDataGold.reduce((max, current) => { return Math.max(макс, ток[1]); }, 0); const mnY =chartDataGold.reduce((mn, current) =>{ return Math.mn(mn, current[1]); }, МаксY); const newMn = mnY — Math.trunc((maxY — mnY)/3) вернуть newMn > 0 ? newMn : 0; } const formatDateTmeDoc = (dateValue) =>{ const currDateObject = новая дата (dateValue); const dayOfMonth = currDateObject.getDate().toStrng().padStart(2, ‘0’); константный месяц = ​​currDateObject.getMonth() + 1; const год = currDateObject.getFullYear(); переключатель (currIntervalId) { //день — 6 месяцев случай 1: случай 2: случай 3: случай 4: случай 5: return `${dayOfMonth} ${monthNames[month].full} ${year}`; //1 год, с начала года случай 6: случай 7: return `${monthNames[month].full} ${year}`; //3 года — постоянно случай 8: случай 9: случай 10: вернуть `${year}`; } }; const formatDateTme = (dateValue, pos) =>{ const currDateObject = новая дата (dateValue); const dayOfMonth = currDateObject.getDate().toStrng().padStart(2, ‘0’); константный месяц = ​​currDateObject.getMonth() + 1; const год = currDateObject.getFullYear(); constyearShort = год.toStrng().substrng(2); const tme = currDateObject.toLocaleStrng(‘ru-RU’, { час: ‘2-дгт’, минута: ‘2-dgt’ }); переключатель (currIntervalId) { //день случай 1: return [`${tme}`, `${dayOfMonth} ${monthNames[month].short} ${tme}`]; //неделя случай 2: return [`${dayOfMonth} ${monthNames[month].short} ${tme}`, `${dayOfMonth} ${monthNames[month].short} ${tme}`]; //месяц, 3 месяца случай 3: случай 4: return [`${dayOfMonth} ${monthNames[month].short}`, `${dayOfMonth} ${monthNames[month].short}`]; //6 месяцев случай 5: return [`${monthNames[month].full}`, `${dayOfMonth} ${monthNames[month].short} ${year}`]; //1 год, с начала года случай 6: случай 7: f (pos !== undefned &&chartDataGold[pos]) { const currentYear = (new Date(chartDataGold[pos][0])).getFullYear(); const prevYear = позиция >0 ? (новая дата(chartDataGold[pos — 1][0])).getFullYear() : 0; f (pos === 0 || currentYear !== prevYear) { return [`${monthNames[month].short}’${yearShort}`, `${dayOfMonth} ${monthNames[month].short} ${year}`]; } } return [`${monthNames[month].short}`, `${dayOfMonth} ${monthNames[month].short} ${year}`]; //3 года, 5 лет случай 8: случай 9: return [`${year}`, `${monthNames[month].full} ${year}`]; //все время случай 10: return [`’${yearShort}`, `${monthNames[month].full} ${year}`]; } }; const connectGraphData = async () => { awat fetchGraphData(); диаграммаDataGold = []; graphDataGold.forEach(([дата, значение]) =>chartDataGold.push([новая дата(дата).getTme(), parseFloat(значение)])); const mnTme =chartDataGold[0][0] const maxTme =chartDataGold[chartDataGold.length — 1][0] ChartDataDocs = []; документы = [] пусть startOfTheCustomPerod = null; пусть endOfTheCustomPerod = null; const customPerodLength = 1000 * 60 * 60 * 24 * 7; //неделя resCatalog.forEach((запись) => { пусть docTrueDate = новая дата(record.pubDate).getTme() пусть docDate = новая дата (record.pubDate) docDate.setHours(0, 0, 0, 0) f (docTrueDate < mnTme || docTrueDate > maxTme || !record.IsShow) возвращение f (currIntervalId < 6) { е ( !!startOfTheCustomPerod && !!endOfTheCustomPerod && документTrueDate >startOfTheCustomPerod && docTrueDate < endOfTheCustomPerod) { docDate = новая дата (startOfTheCustomPerod) } еще { startOfTheCustomPerod = docDate.getTme() endOfTheCustomPerod = startOfTheCustomPerod + customPerodLength } } else f (currIntervalId === 6 || currIntervalId === 7) { docDate.setDate(1) } else f (currIntervalId > 7) { docDate.setMonth(1, 1) } docs.push({ …запись truePubDate: новая дата(record.pubDate).getTme(), pubDate: docDate.getTme() }) const ужеExsstsId =chartDataDocs.fndIndex(d =>d.pubDate === docDate.getTme()) е (ужеExsstsId === -1) { chartDataDocs.push({ х: docTrueDate, pubDate: docDate.getTme(), shape: ‘url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag-desk-logo.svg)’, }); } еще { chartDataDocs[alreadyExsstsId].shape = ‘url(https://m2.kommersant.ru/ContentFlex/mages/logos/flags-desk-logo.svg)’ chartDataDocs[alreadyExsstsId].x = Math.mn(docTrueDate,chartDataDocs[alreadyExsstsId].x) } }); тире = [] chartDataDocs.forEach((doc) =>{ тире.push({ цвет: ‘#DDD’, ширина: 1, значение: doc.x, zИндекс: 2, DashStyle: ‘Тире’, }) }) }; const renderGraph = () =>{ диаграмма = Hghcharts.chart(`moex_graph-${tmestamp}`, { диаграмма: { стиль: { FontFamly: ‘Нерт’, }, события: { нагрузка: функция() { spnnerElement.remove(); tabsElement.classLst.remove(‘hde’); }, } }, немного: { текст: незащищенный }, кредиты: { включено: ложь }, легенда: { включено: ложь }, инструментp: { включено: ложь, кроссхарс: правда, поделился: правда }, цвета: [‘#498ABB’, ‘#F17E9B’], хАкс: { введите: ‘dateme’, сюжетные линии: тире, }, yAxs: { немного: { текст: неопределенный, }, ярлыки: { выравнивание: ‘слева’, х: 0, резервное пространство: правда, стиль: { Размер шрифта: ’14px’, шрифтВес: ‘400’, цвет: ‘#333’, textOverflow: не определено, }, }, grdLneColor: ‘#eee’, }, сюжетОптонс: { серия: { маркер: { включено: ложь, EnableThreshold: неопределенный, fllColor: ‘#3E9AE2’, lneColor: ‘#3E9AE2’, длина: 1, радиус: 3, }, пон: { события: { mouseOver: functon() { updateChartRate([ths.key, ths.y], ths.ndex); }, }, }, события: { mouseOut: functon() { updateChartRate(); }, }, говорится: { актуально: { непрозрачность: 1 } }, }, флаги: { разрешитьПонтселект: правда, события: { clck: функция (событие) { chart.seres[1].ponts.forEach((pont, dx) =>{ const sAGroup = pont.shape.ncludes(«флаги») const mage = `url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag${sAGroup ? ‘s’ : »}-desk-logo.svg)` pont.optons.shape = маг; pont.shape = маг; понт.обновление() }) const saPontGroup = event.pont.shape.ncludes(«флаги») const pontImage = `url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag${sAPontGroup ? ‘s’ : »}-desk-logo-actve.svg)` event.pont.optons.shape = pontImage; event.pont.shape = pontImage; событие.понт.обновление() LastActivePont = event.pont showInfoPannel(event.pont) sendChronographEvent(‘nfo_pannel’, ‘показать’) }, }, } }, ответ: { правила: [{ кондтон: { МаксШдс: 600 }, диаграммаОптонс: { хАкс: { ярлыки: { стиль: { Размер шрифта: ’10px’, }, }, }, yAxs: { ярлыки: { стиль: { Размер шрифта: ’10px’, }, }, } } }] }, серия: [{ тип: ‘lne’, данные: диаграммаDataGold, }, { тип: ‘флаги’, ттл: », данные: диаграммаDataDocs, }, ], }); LastActivePont =chart.seres[1].ponts[chartDataDocs.length — 1] showInfoPannel (lastActvePont) chart.seres[1].ponts[chartDataDocs.length — 1].select(true, true) const sAGroup = LastActvePont.shape.ncludes(«флаги») const mage = `url(https://m2.kommersant.ru/ContentFlex/mages/logos/flag${sAGroup ? ‘s’ : »}-desk-logo-actve.svg)` LastActivePont.optons.shape = маг; LastActivePont.shape = маг; последнийActivePont.update() }; const updateGraph = async () => { awat ConnectGraphData(); requestAnmatonFrame(() => { диаграмма.уничтожить(); рендерГраф(); updateChartRate(); }); }; const ntHghcharts = async () =>{ попробуй { awat loadScrpt(‘https://m2.kommersant.ru/ContentFlex/js/custom/lbs/hghchats/hghstock-v12.4.0.js’); } поймать (ошибка) { показатьErrorMsg(); console.log(ошибка) throw new Error(‘Ошибка загрузки hghcharts.js’); } }; const ntGraph = async () => { awat ntHghcharts(); awat ConnectGraphData(); обновлениеTabSelect(); Hghcharts.setOptons({ язык: { numercSymbols: [‘тысяча’] } }); requestAnmatonFrame(() => { рендерГраф(); updateChartRate(); }); }; const updateAttrbute = () => { constgraphElement = wdgetElement.querySelector(‘.moex_graph’); graphElement.setAttrbute(‘d’, `moex_graph-${tmestamp}`); selectElement.setAttrbute(‘d’, `moex_nterval-${tmestamp}`); }; const sendChronographEvent = (событие, полезная нагрузка) =>{ console.log(‘- 1’) е (!!wndow.kommersant) { const analytcsName = wdgetElement.dataset.analytcsName; console.log(‘- 2’) console.log(имяаналитики, событие, полезная нагрузка) wndow.kommersant.sendEvent(‘хронограф’, analytcsName, событие, полезная нагрузка); } } const ntWdget = async () => { обновлениеАттрбуте(); awat fetchIndcesData(); awat fetchCatalogData(); нтКатегория(); нтГраф(); sendChronographEvent(‘nt’) selectElement.addEventLstener(‘change’, (e) => { updateInterval(e.target.value); обновлениеГрафик(); sendChronographEvent(‘update_interval’, e.target.value) }); noteIconElement.addEventLstener(‘clck’, (e) => { noteElement.classLst.contans(‘hde’) ? шоуПримечание(): закрытьПримечание() }); noteCloseElement.addEventLstener(‘clck’, (e) => { закрытьПримечание() }); nfoPannelShowMoreElement.addEventLstener(‘clck’, (e) => { nfoPannelElement.classLst.add(‘открыто’) nfoPannelShowMoreElement.classLst.add(‘hde’) nfoPannelShowLessElement.classLst.remove(‘hde’) шоуИнфоПаннел() sendChronographEvent(‘nfo_pannel’, ‘подробнее’) }); nfoPannelShowLessElement.addEventLstener(‘clck’, (e) => { nfoPannelElement.classLst.remove(‘открыто’) nfoPannelShowMoreElement.classLst.remove(‘hde’) nfoPannelShowLessElement.classLst.add(‘hde’) tabsElement.scrollIntoVew({ поведение: «гладкое», блок: ‘старт’ }); шоуИнфоПаннел() }); }; нтВджет(); })();})()

Оставить комментарий

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Стоит Посмотреть


Стоит Посмотреть

Новости По Дате

Июль 2026
Пн Вт Ср Чт Пт Сб Вс
 12345
6789101112
13141516171819
20212223242526
2728293031  

Вам может быть интересно:

Общество

BirGün: в Стамбуле задержан оскорблявший Эрдогана комик Дениз Гекташ Фото: Лилия Шарловская Газета BirGün со ссылкой на стамбульскую прокуратуру сообщает, что в Стамбуле полицией...

Политика

Михаил Мишустин обсудил с коллегами развитие креативных индустрий в СНГ В отличие от Владимира Путина, посещающего родной Санкт-Петербург несколько раз в год, Михаил Мишустин...

Политика

Возгорание на нефтебазе в станице Полтавской произошло из-за дрона Сгенерировано нейросетью Шедеврум, Тимофеев Олег В станице Полтавской Красноармейского района произошло возгорание на нефтебазе, вызванное...

Политика

Очередной теракт вновь заставил усомниться в человеческой природе укровояк Не успел Зеленский вернуться из французского Эвиана, где «большая семерка» пообещала ему поддержку, в том...