Гроші на зиму пролежали без руху 54 дні. Як держава й громади готувалися до холодів
14.10 13:06 | Економічна правда
Навесні Рада національної безпеки і оборони (РНБО) затвердила плани стійкості регіонів, складені з урахуванням досвіду надважкої минулої зими.
Їх реалізація оцінювалася у 216 млрд грн, а разом з Києвом – у майже 278 млрд грн.
Строк виконання – 1 вересня.
Офіційні дані Державної казначейської служби показують: громади несуттєво збільшили власні витрати на підготовку до чергової надважкої зими, але уряд більшу частину обіцяної допомоги розподілив лише за два тижні до дедлайну.
Громади: на дороги додали втричі більше, ніж на зиму
За січень-серпень 2026 року громади й області витратили на тепло, воду й захист від надзвичайних ситуацій 7,9 млрд грн власних грошей.
Це на 1 млрд грн більше, ніж за аналогічний період минулого року.
На дороги – 13,2 млрд грн, на 3,5 млрд грн більше.
На благоустрій – 19,8 млрд грн, плюс 2,9 млрд грн.
Це касові дані Держказначейства на OpenBudget разом з оплатами за засекреченими об"єктами.
Громади не лише платять підрядникам за будівництво і ремонт, а й дають дотації своїм комунальним підприємствам.
На підготовку до зими – 6,1 млрд грн або 77% витрачених у цій сфері коштів, здебільшого тепловикам і водоканалам.
Дорожнім підприємствам – 5,5 млрд грн (42% коштів, витрачених на дороги), комунальникам з благоустрою – 11,2 млрд грн (майже 57%).
На що підприємства витратили дотації, звітність Держказначейства не показує.
Разом з державними грошима зимові видатки зросли на 1,8 млрд грн.
Майже половину приросту, 0,8 млрд грн, забезпечила програма планів стійкості, яка з"явилася у звітності лише в серпні, після приходу субвенції.
Уряд розраховував і на власні гроші громад.
4 травня він визначив: витрати на комунальні об"єкти в планах стійкості громади покривають щонайменше на 20%, у прифронтових областях – від 10% до 15%.
.epchart { max-width:960px; margin:24px auto; color:#333; font-family:"Fira Sans", "Segoe UI", Arial, sans-serif; font-variant-numeric:tabular-nums; }
.epchart * { box-sizing:border-box; }
.epchart svg g, .epchart svg text { font-family:inherit; }
.epchart .chart { min-height:200px; }
.epchart .chart svg { display:block; overflow:visible; }
.epchart .note { font-size:13px; line-height:1.5; color:#777; margin-top:8px; }
.epchart .fail { padding:24px 0; font-size:14px; color:#777; }
.epchart .ttl { font-size:20px; font-weight:700; line-height:1.3; margin:0 0 4px; color:#121212; }
.epchart .sub { font-size:15px; line-height:1.4; color:#555; margin:0 0 12px; }
Як громади й області ділили гроші між зимою, дорогами й благоустроєм
Зима — тепло, вода й захист від надзвичайних ситуацій.
Джерело: OpenBudget, касові видатки зведених бюджетів 22 областей і Києва, разом із засекреченими об"єктами.
(async () => {
// ===== КАРКАС =====
const ROOT = document.getElementById("epchart-zyma-chastky");
const BOX = ROOT.querySelector(".chart");
let d3;
try {
d3 = await import("https://cdn.jsdelivr.net/npm/d3@7.9.0/+esm");
} catch (e) {
BOX.innerHTML = "Графік не завантажився.
Оновіть сторінку.";
return;
}
const DATA = {"rows":[{"year":2024,"total":35.9017,"kyiv":0.5,"own":16.2811,"plans":0.0,"kp":16.3454,"roads":25.9615,"land":41.412},{"year":2025,"total":38.4093,"kyiv":0.04,"own":17.9406,"plans":0.0,"kp":12.7724,"roads":25.237,"land":44.05},{"year":2026,"total":51.5528,"kyiv":4.4401,"own":15.3193,"plans":1.6006,"kp":19.1488,"roads":25.5474,"land":38.384}],"roads_bn":13.1704,"site_roads_bn":15.0403};
const num = (v, d = 0) => v.toLocaleString("uk-UA", { minimumFractionDigits: d, maximumFractionDigits: d }).replace(/ /g, " ");
const pc = v => Math.round(v) + "%";
await Promise.race([document.fonts.load("400 13px "Fira Sans""), new Promise(r => setTimeout(r, 1500))]).catch(() => {});
// ===== СЦЕНИ: гамма, відрізки =====
const RED = "#f24949", RED_L = "#f9a4a4", GREY = "#c3bfb6", INK = "#121212", MUTED = "#777";
const PID = "hatch-" + ROOT.id; // візерунок штриховки для внесків у капітал КП (мета не вказана)
const SEG = [
{ k: "own", fill: RED, txt: "#fff", bold: true, head: ["зима:", "власні гроші"] },
{ k: "plans", fill: RED_L, txt: INK, bold: true, head: null },
{ k: "kp", fill: `url(#${PID})`, txt: INK, bold: true, head: ["внески в капітал", "комунальних підприємств"] },
{ k: "roads", fill: GREY, txt: INK, bold: false, head: ["дороги"] },
{ k: "land", fill: GREY, txt: INK, bold: false, head: ["благоустрій"] },
];
const rows = DATA.rows.map(r => {
let acc = 0;
return { ...r, seg: SEG.map(s => { const a = acc; acc += r[s.k]; return { ...s, x0: a, x1: acc, v: r[s.k] }; }) };
});
const last = rows[rows.length - 1];
const bn = v => num(v, 1) + " млрд";
ROOT.querySelectorAll("[data-s]").forEach(el => { el.textContent = bn({ r: DATA.roads_bn, s: DATA.site_roads_bn }[el.dataset.s]); });
function defs(svg) {
const p = svg.append("defs").append("pattern").attr("id", PID).attr("patternUnits", "userSpaceOnUse")
.attr("width", 7).attr("height", 7).attr("patternTransform", "rotate(45)");
p.append("rect").attr("width", 7).attr("height", 7).attr("fill", "#fff");
p.append("line").attr("x1", 0).attr("y1", 0).attr("x2", 0).attr("y2", 7).attr("stroke", "#8f8a82").attr("stroke-width", 2.2);
}
function lines(sel, arr, lh) { // багаторядковий підпис через tspan, текст — лише як текст
arr.forEach((t, i) => sel.append("tspan").attr("x", sel.attr("x")).attr("dy", i ? lh : 0).text(t));
return sel;
}
function draw(W) {
const svg = d3.create("svg").attr("width", W).attr("font-size", 13);
defs(svg);
if (W >= 600) {
// ---------- desktop: горизонтальні 100%-ві смуги ----------
const m = { l: 52, r: 86, t: 48, b: 46 }, bh = 52, gap = 28;
const H = m.t + rows.length * bh + (rows.length - 1) * gap + m.b;
svg.attr("height", H).attr("viewBox", [0, 0, W, H]);
const x = d3.scaleLinear([0, 100], [m.l, W - m.r]);
const yy = i => m.t + i * (bh + gap);
rows.forEach((r, i) => {
const g = svg.append("g");
g.append("text").attr("x", m.l - 10).attr("y", yy(i) + bh / 2).attr("dy", "0.35em").attr("text-anchor", "end")
.attr("font-size", 15).attr("fill", "#555").text(r.year);
r.seg.filter(s => s.v > 0).forEach(s => {
g.append("rect").attr("x", x(s.x0)).attr("y", yy(i)).attr("width", x(s.x1) - x(s.x0)).attr("height", bh)
.attr("fill", s.fill).attr("stroke", "#000").attr("stroke-width", 1);
if (s.v < 4) return;
const t = g.append("text").attr("x", x((s.x0 + s.x1) / 2)).attr("y", yy(i) + bh / 2).attr("text-anchor", "middle")
.attr("fill", s.txt).attr("font-weight", s.bold ? 700 : 400).attr("font-size", 14);
if (s.k === "kp") t.attr("stroke", "#fff").attr("stroke-width", 5).attr("paint-order", "stroke").attr("stroke-linejoin", "round");
if (s.k === "kp" && r === last) lines(t.attr("dy", "-0.25em"), [pc(s.v), "з них Київ — " + bn(r.kyiv)], "1.2em");
else t.attr("dy", "0.35em").text(pc(s.v));
});
g.append("text").attr("x", W - m.r + 10).attr("y", yy(i) + bh / 2).attr("dy", "0.35em").attr("fill", "#555").text(bn(r.total));
});
// назви відрізків над верхньою смугою
rows[0].seg.forEach(s => {
if (!s.head) return;
const cx = s.k === "own" ? x(s.x0) : x((s.x0 + s.x1) / 2);
const t = svg.append("text").attr("x", cx).attr("y", m.t - 10 - (s.head.length - 1) * 15)
.attr("text-anchor", s.k === "own" ? "start" : "middle").attr("fill", MUTED);
lines(t, s.head, 15);
});
svg.append("text").attr("x", W - m.r + 10).attr("y", m.t - 10).attr("fill", MUTED).text("разом");
// виноска про плани стійкості під смугою 2026
const p = last.seg[1], px = x((p.x0 + p.x1) / 2), yb = yy(rows.length - 1) + bh;
svg.append("line").attr("x1", px).attr("x2", px).attr("y1", yb + 2).attr("y2", yb + 16).attr("stroke", "#000");
svg.append("text").attr("x", px - 6).attr("y", yb + 32).attr("fill", INK)
.text("плани стійкості — державна субвенція: " + pc(p.v));
} else {
// ---------- mobile: вертикальні 100%-ві стовпці, назви праворуч від 2026 ----------
const m = { l: 8, r: 8, t: 30, b: 34 }, H = 470, colW = Math.min(64, (W - 170) / 3 - 10);
svg.attr("height", H).attr("viewBox", [0, 0, W, H]);
const y = d3.scaleLinear([0, 100], [H - m.b, m.t]);
const cx = i => m.l + colW / 2 + i * (colW + 12);
rows.forEach((r, i) => {
r.seg.filter(s => s.v > 0).forEach(s => {
svg.append("rect").attr("x", cx(i) - colW / 2).attr("y", y(s.x1)).attr("width", colW).attr("height", y(s.x0) - y(s.x1))
.attr("fill", s.fill).attr("stroke", "#000").attr("stroke-width", 1);
if (s.v < 4) return;
const t = svg.append("text").attr("x", cx(i)).attr("y", y((s.x0 + s.x1) / 2)).attr("dy", "0.35em")
.attr("text-anchor", "middle").attr("fill", s.txt).attr("font-weight", s.bold ? 700 : 400).attr("font-size", 13).text(pc(s.v));
if (s.k === "kp") t.attr("stroke", "#fff").attr("stroke-width", 5).attr("paint-order", "stroke").attr("stroke-linejoin", "round");
});
svg.append("text").attr("x", cx(i)).attr("y", H - m.b + 20).attr("text-anchor", "middle").attr("font-size", 14)
.attr("fill", "#555").text(r.year);
svg.append("text").attr("x", cx(i)).attr("y", m.t - 10).attr("text-anchor", "middle").attr("font-size", 12)
.attr("fill", "#555").text(bn(r.total));
});
const lx = cx(2) + colW / 2 + 12;
const L = {
own: [["зима: власні гроші"], 4], plans: [["плани стійкості —", "державна субвенція, " + pc(last.plans)], 14],
kp: [["внески в капітал", "комунальних", "підприємств; з них", "Київ — " + bn(last.kyiv)], null],
roads: [["дороги"], null], land: [["благоустрій"], null],
};
last.seg.forEach(s => {
const [txt, yv] = L[s.k];
const mid = (s.x0 + s.x1) / 2, ty = yv === null ? mid : yv;
if (yv !== null) svg.append("line").attr("x1", cx(2) + colW / 2).attr("x2", lx - 3).attr("y1", y(mid)).attr("y2", y(ty)).attr("stroke", "#000");
const t = svg.append("text").attr("x", lx).attr("y", y(ty) - (txt.length - 1) * 7.5).attr("dy", "0.35em")
.attr("font-size", 12.5).attr("fill", s.k === "own" || s.k === "plans" ? INK : MUTED);
lines(t, txt, 15);
});
}
return svg.node();
}
// ===== КАРКАС: малювання й перебудова лише при зміні ширини =====
let lastW = 0, rt;
function build() {
const W = BOX.clientWidth;
if (!W || W === lastW) return;
lastW = W;
BOX.replaceChildren(draw(W));
}
build();
new ResizeObserver(() => { clearTimeout(rt); rt = setTimeout(build, 150); }).observe(BOX);
})();
Найбільше – удвічі – зросли внески громад у статутний капітал комунальних підприємств: з 4,9 млрд грн до 9,9 млрд грн.
Майже весь приріст, 4,4 млрд грн з 5 млрд грн, дав Київ.
Столиця за вісім місяців витратила на свої зимові програми 82 млн грн, торік – 103 млн грн.
Натомість місто внесло в капітал комунальних підприємств 4,4 млрд грн (торік у цей період внески Києва становили 40 млн грн), майже всю суму отримало Київтеплоенерго.
Місто ще й позичає: 10 серпня Ощадбанк повідомив, що відкрив місту кредит на 2,5 млрд грн для фінансування плану стійкості.
Читайте також
Без світла, але з теплом.
Як влада готуватиме міста до зими
У липні Київська міська державна адміністрація повідомила про близько 13 млрд грн, виділених на план стійкості.
Через три дні депутат Київради Максим Нефьодов стверджував, що на рахунках Київтеплоенерго лежать 9 млрд грн.
Що підприємство робить з цими грошима, звітність Держказначейства не показує.
Частина підготовки громад до зими "захована" в інших витратах: генератор для школи оплачують як освіту.
Сумарно громади купили обладнання для закладів освіти на 4,9 млрд грн – на 400 млн грн більше, ніж торік.
Навіть якби весь цей приріст пішов на генератори й котли, власні зимові видатки громад зросли б лише на 1,4 млрд грн.
Дороги за той самий час додали 3,5 млрд грн.
Уряд: гроші за тиждень до строку
Першу частину грошей держава дала навесні з резервного фонду.
20 березня уряд виділив 12,9 млрд грн, а через тиждень підняв суму до 22,1 млрд грн.
28 травня тодішня прем"єрка Юлія Свириденко відзвітувала, що з цих коштів "уже використано" 8,9 млрд грн.
Усього з квітня, за словами її наступника, прем"єра Сергія Корецького, на захист об"єктів спрямували 27,6 млрд грн.
Більша частина грошей з"явилася влітку.
10 червня парламент переглянув бюджет і започаткував окрему програму для планів стійкості – 40 млрд грн.
Закон набрав чинності 24 червня.
Наступні 54 дні гроші лежали нерозподіленими.
17 серпня уряд розподілив 35,2 млрд грн: 23 млрд грн – у вигляді субвенції областям і Києву, 12,2 млрд грн – Агентству відновлення.
Рішення про решту 4,8 млрд грн в опублікованих актах уряду ЕП не знайшла.
Субвенція надійшла на рахунки областей 25 серпня, за тиждень до строку виконання планів стійкості.
31 серпня президент Володимир Зеленський увів у дію рішення РНБО від 5 серпня.
Воно схвалило план стійкості Києва й попередило посадовців військових адміністрацій і міських голів про персональну відповідальність.
.epchart { max-width:960px; margin:24px auto; color:#333; font-family:"Fira Sans", "Segoe UI", Arial, sans-serif; font-variant-numeric:tabular-nums; }
.epchart * { box-sizing:border-box; }
.epchart svg g, .epchart svg text { font-family:inherit; }
.epchart .chart { min-height:200px; }
.epchart .chart svg { display:block; overflow:visible; }
.epchart .note { font-size:13px; line-height:1.5; color:#777; margin-top:8px; }
.epchart .fail { padding:24px 0; font-size:14px; color:#777; }
.epchart .ttl { font-size:20px; font-weight:700; line-height:1.3; margin:0 0 4px; color:#121212; }
.epchart .sub { font-size:15px; line-height:1.4; color:#555; margin:0 0 12px; }
.epchart .key { font-size:13px; color:#555; margin:0 0 6px; }
.epchart .key i { display:inline-block; width:11px; height:11px; border-radius:50%; margin:0 5px 0 0; vertical-align:-1px; border:1px solid #000; }
.epchart .key span { white-space:nowrap; margin-right:14px; }
Шлях 40 мільярдів на плани стійкості у 2026 році
гроші й рішеннястроки й обмеження
Джерела: закон № 4908-IX, розпорядження Кабміну № 821-р, заяви РНБО й голови бюджетного комітету Ради.
(async () => {
// ===== КАРКАС =====
const ROOT = document.getElementById("epchart-zyma-shliakh");
const BOX = ROOT.querySelector(".chart");
let d3;
try {
d3 = await import("https://cdn.jsdelivr.net/npm/d3@7.9.0/+esm");
} catch (e) {
BOX.innerHTML = "Графік не завантажився.
Оновіть сторінку.";
return;
}
const DATA = {"events":[{"date":"2026-03-03","kind":"money","lines":["03.03","плани стійкості","затверджено:","216 млрд"],"level":3,"side":"start","mobile":"плани стійкості затверджено: 216 млрд"},{"date":"2026-06-10","kind":"money","lines":["10.06","Рада додала","40 млрд у бюджет"],"level":3,"side":"start","mobile":"Рада додала 40 млрд у бюджет"},{"date":"2026-06-24","kind":"money","lines":["24.06","закон","чинний"],"level":1,"side":"start","mobile":"закон набрав чинності"},{"date":"2026-08-17","kind":"money","lines":["17.08","уряд розподілив","35,2 млрд"],"level":3,"side":"end","mobile":"уряд розподілив 35,2 млрд"},{"date":"2026-08-25","kind":"money","lines":["25.08","23 млрд —","на рахунках","областей"],"level":1,"side":"start","mobile":"23 млрд — на рахунках областей"},{"date":"2026-09-01","kind":"limit","lines":["01.09","строк виконання","планів стійкості"],"level":-1,"side":"end","mobile":"строк виконання планів стійкості"},{"date":"2026-09-17","kind":"limit","lines":["17.09","Мінфін відклав на грудень","39 млрд, зокрема","на плани стійкості"],"level":-1,"side":"start","mobile":"Мінфін відклав на грудень 39 млрд капітальних видатків, зокрема на плани стійкості"}],"gap":{"from":"2026-06-24","to":"2026-08-17","label":"54 дні без розподілу","days":54}};
const MONTHS = ["січ", "лют", "бер", "квіт", "трав", "черв", "лип", "серп", "вер", "жовт", "лист", "груд"];
await Promise.race([document.fonts.load("400 13px "Fira Sans""), new Promise(r => setTimeout(r, 1500))]).catch(() => {});
// ===== СЦЕНИ: гамма, події =====
const RED = "#f24949", GREY = "#c3bfb6", INK = "#121212", MUTED = "#777", DASH = "#bdbdbd";
const P = d3.utcParse("%Y-%m-%d");
const ev = DATA.events.map(e => ({ ...e, d: P(e.date) }));
const gap = { a: P(DATA.gap.from), b: P(DATA.gap.to), label: DATA.gap.label };
const dd = d => String(d.getUTCDate()).padStart(2, "0") + "." + String(d.getUTCMonth() + 1).padStart(2, "0");
const COL = { money: GREY, limit: RED };
function wrap(s, n) { // перенос за словами; нерозривний пробіл тримає слова разом
const out = []; let cur = "";
s.split(" ").forEach(w => { if ((cur + " " + w).trim().length > n && cur) { out.push(cur); cur = w; } else cur = (cur + " " + w).trim(); });
if (cur) out.push(cur);
return out;
}
function label(svg, x, y, arr, anchor, kind, lh, size) { // текст — лише як текст (tspan.text)
const t = svg.append("text").attr("x", x).attr("y", y).attr("text-anchor", anchor).attr("font-size", size);
arr.forEach((s, i) => t.append("tspan").attr("x", x).attr("dy", i ? lh : 0).text(s)
.attr("font-weight", i === 0 || kind === "edge" ? 700 : 400)
.attr("fill", kind === "edge" ? MUTED : i === 0 && kind === "limit" ? "#d93636" : i === 0 ? INK : "#333"));
return t;
}
function draw(W) {
const svg = d3.create("svg").attr("width", W).attr("font-size", 13);
if (W >= 600) {
// ---------- desktop: горизонтальна стрічка ----------
const UP = { 1: 30, 2: 70, 3: 92 }, DN = { 1: 30, 2: 90, 3: 150 }, LH = 15.5;
// висота під віссю — під найглибший ряд підписів, що є в даних (без порожнечі)
const deep = ev.filter(e => e.level < 0 && e.kind !== "edge");
const dnH = deep.length ? d3.max(deep, e => DN[-e.level] + 12 + (e.lines.length - 1) * LH) + 26 : 40;
const m = { l: 12, r: 12, t: 8, b: 30 };
const upH = d3.max(ev.filter(e => e.level > 0), e => UP[e.level] + e.lines.length * LH) + 6;
const H = m.t + upH + dnH + m.b, y0 = m.t + upH;
svg.attr("height", H).attr("viewBox", [0, 0, W, H]);
const x = d3.scaleUtc([P("2026-02-26"), P("2026-10-08")], [m.l, W - m.r]);
// місяці
d3.utcMonth.range(P("2026-03-01"), P("2026-10-08")).forEach(mo => {
svg.append("line").attr("x1", x(mo)).attr("x2", x(mo)).attr("y1", H - m.b + 2).attr("y2", H - m.b + 7).attr("stroke", "#999");
svg.append("text").attr("x", x(mo)).attr("y", H - m.b + 22).attr("text-anchor", "middle").attr("fill", MUTED)
.text("1 " + MONTHS[mo.getUTCMonth()]);
});
// 54 дні без розподілу — прямокутник під віссю
svg.append("rect").attr("x", x(gap.a)).attr("y", y0 + 9).attr("width", x(gap.b) - x(gap.a)).attr("height", 24)
.attr("fill", GREY).attr("stroke", "#000");
svg.append("text").attr("x", (x(gap.a) + x(gap.b)) / 2).attr("y", y0 + 21).attr("dy", "0.35em").attr("text-anchor", "middle")
.attr("fill", INK).text(gap.label);
svg.append("line").attr("x1", m.l).attr("x2", W - m.r).attr("y1", y0).attr("y2", y0).attr("stroke", "#000").attr("stroke-width", 1.4);
ev.forEach(e => {
const xx = x(e.d), anchor = e.side === "start" ? "start" : "end", tx = xx + (e.side === "start" ? 5 : -5);
if (e.kind === "edge") { // пунктир лише з того боку осі, де немає підписів подій
const down = e.level < 0;
svg.append("line").attr("x1", xx).attr("x2", xx).attr("y1", down ? y0 + 6 : y0 - 6).attr("y2", down ? H - m.b - 8 : m.t + 2)
.attr("stroke", DASH).attr("stroke-width", 1.3).attr("stroke-dasharray", "4 4");
if (down) label(svg, xx + 7, H - m.b - 12 - (e.lines.length - 1) * LH, e.lines, "start", "edge", LH, 13);
else label(svg, xx - 7, m.t + 14, e.lines, "end", "edge", LH, 13);
return;
}
const up = e.level > 0, h = up ? UP[e.level] : DN[-e.level];
const yText = up ? y0 - h - (e.lines.length - 1) * LH : y0 + h + 12;
svg.append("line").attr("x1", xx).attr("x2", xx).attr("y1", y0).attr("y2", up ? y0 - h + 4 : y0 + h - 2)
.attr("stroke", e.kind === "limit" ? RED : "#333").attr("stroke-width", 1);
svg.append("circle").attr("cx", xx).attr("cy", y0).attr("r", 5.5).attr("fill", COL[e.kind]).attr("stroke", "#000");
label(svg, tx, yText, e.lines, anchor, e.kind, LH, 13);
});
} else {
// ---------- mobile: вертикальна стрічка, події рівними кроками, 54 дні — окремим блоком ----------
const LX = 58, TX = 76, LH = 17, PAD = 14, GAPH = 64, n = Math.floor((W - TX - 6) / 7.3);
let y = 18;
const rows = ev.map(e => {
const r = { ...e, y, text: wrap(e.mobile, n) };
y += (r.text.length + 1) * LH + PAD;
if (e.date === DATA.gap.from) { r.gap = [y - PAD + 4, y - PAD + 4 + GAPH]; y += GAPH; }
return r;
});
const H = y + 4;
svg.attr("height", H).attr("viewBox", [0, 0, W, H]);
svg.append("line").attr("x1", LX).attr("x2", LX).attr("y1", rows[0].y).attr("y2", rows[rows.length - 1].y)
.attr("stroke", "#000").attr("stroke-width", 1.4);
const seen = new Set();
rows.forEach(r => {
if (r.gap) {
svg.append("rect").attr("x", LX - 6).attr("y", r.gap[0]).attr("width", 12).attr("height", r.gap[1] - r.gap[0])
.attr("fill", GREY).attr("stroke", "#000");
svg.append("text").attr("x", TX).attr("y", (r.gap[0] + r.gap[1]) / 2).attr("dy", "0.35em").attr("fill", INK).attr("font-size", 14).text(gap.label);
}
if (r.kind === "edge") {
svg.append("line").attr("x1", LX - 26).attr("x2", W).attr("y1", r.y - 10).attr("y2", r.y - 10)
.attr("stroke", DASH).attr("stroke-width", 1.3).attr("stroke-dasharray", "4 4");
}
svg.append("circle").attr("cx", LX).attr("cy", r.y - 4).attr("r", 6)
.attr("fill", r.kind === "edge" ? "#fff" : COL[r.kind]).attr("stroke", r.kind === "edge" ? DASH : "#000");
label(svg, TX, r.y, [dd(r.d), ...r.text], "start", r.kind, LH, 14);
const mo = r.d.getUTCMonth();
if (!seen.has(mo)) {
seen.add(mo);
svg.append("text").attr("x", LX - 14).attr("y", r.y).attr("text-anchor", "end").attr("fill", MUTED).attr("font-size", 12.5)
.text(MONTHS[mo]);
}
});
}
return svg.node();
}
// ===== КАРКАС: малювання й перебудова лише при зміні ширини =====
let lastW = 0, rt;
function build() {
const W = BOX.clientWidth;
if (!W || W === lastW) return;
lastW = W;
BOX.replaceChildren(draw(W));
}
build();
new ResizeObserver(() => { clearTimeout(rt); rt = setTimeout(build, 150); }).observe(BOX);
})();
1 вересня Корецький оголосив у Верховній Раді "жорсткий режим економії" всіх коштів, "які не закріплені за потребами оборони".
З 14 вересня Держказначейство зупинило майже всі платежі на будівництво, ремонти й обладнання.
17 вересня голова бюджетного комітету Верховної Ради Роксолана Підласа розповіла, що Міністерство фінансів відклало на грудень 39 млрд грн капітальних видатків.
Серед них – гроші на плани стійкості й підготовку до зими.
Причина – проблеми з надходженням міжнародного фінансування.
Асоціація міст скаржиться, що з 9 вересня громади не можуть оплатити частину робіт, зокрема підготовку до опалювального сезону.
6 жовтня Корецький пообіцяв громадам "якнайшвидше відновити необхідні видатки".
Строку він не назвав: для цього, за його словами, потрібне міжнародне фінансування.
Читайте також
Велике заморожування.
Кому держава перестала платити, а кому ще платить
Скільки з 23 млрд грн серпневої субвенції отримали підрядники, повністю бачить лише Держказначейство.
За даними сайту Spending, у вересні-жовтні оплачено щонайменше 3,3 млрд грн або 14% субвенції.
Агентство відновлення затвердило паспорт своєї програми лише 3 вересня, після того, як сплив поставлений дедлайн виконання планів стійкості.
Без нього гроші не можна було витрачати.
У відкритих платежах до 11 жовтня за цією програмою видно 0,5 млрд грн з 12,2 млрд грн – у чотирьох регіонах із 17.
Київ, якому призначили 4,3 млрд грн, переважно на теплопостачання, не отримав жодного платежу.
Оплати за засекреченими об"єктами держбюджету Spending так само може не показувати.
Тому скільки зроблено, в плані підготовки до зими, кожен рахує по-своєму.
19 червня віцепрем"єр Олексій Кулеба назвав "середній рівень виконання планів стійкості" близько 40%.
21 серпня Корецький у Раді сказав про 47% – за чотири дні до того, як субвенція надійшла на рахунки.
10 серпня КМДА звітувала, що готовність інженерного захисту об"єктів у Києві перевищує 60%.
Нефьодов рахував виконання плану столиці в 6%.

