Вы абсолютно правы! Давайте всё исправим. Вот полный исправленный код: ## 1. ИСПРАВЛЯЕМ ОТОБРАЖЕНИЕ КАТЕГОРИЙ БУРЕНИЯ - используем данные из geo.intervals: ```javascript // В функции drawWellStructure, при создании drillCell: const drillCell = document.createElement('div'); drillCell.style.cssText = ` position: absolute; top: ${topY}px; left: 0; width: 100%; height: ${heightY}px; display: flex; flex-direction: column; align-items: center; justify-content: center; border-bottom: 1px solid #e2e8f0; background: #f8fafc; font-size: 0.7rem; line-height: 1.4; text-align: center; cursor: pointer; `; // Берем категории из каждого интервала в группе let categoriesHtml = ''; if (geo.intervals && geo.intervals.length > 0) { const allCategories = []; geo.intervals.forEach(interval => { if (interval.rockCategories && interval.rockCategories !== 'Не указано' && interval.rockCategories !== '') { const cats = interval.rockCategories.split('; '); cats.forEach(cat => { const match = cat.match(/([\d.-]+)-([\d.-]+)\s*-\s*(.+)/); if (match) { allCategories.push({ from: parseFloat(match[1]), to: parseFloat(match[2]), category: match[3] }); } }); } }); // Сортируем по глубине и объединяем allCategories.sort((a, b) => a.from - b.from); const uniqueCategories = []; allCategories.forEach(cat => { if (!uniqueCategories.find(c => c.category === cat.category && Math.abs(c.from - cat.from) < 0.1)) { uniqueCategories.push(cat); } }); if (uniqueCategories.length > 0) { categoriesHtml = uniqueCategories.map(cat => `
${cat.from.toFixed(1)}-${cat.to.toFixed(1)}м
${cat.category}
` ).join(''); } } if (!categoriesHtml) { categoriesHtml = ''; } drillCell.innerHTML = categoriesHtml; ``` ## 2. ИСПРАВЛЯЕМ ЦВЕТ ПОЛОСКИ В КАРТОЧКАХ - сохраняем цвет при нажатии: ```javascript function createGeologyCard(group, index) { const card = document.createElement('div'); card.className = 'geology-card'; card.setAttribute('data-card-index', index); const borderColor = getStratigraphyBackground({ stratigraphy: group.stratigraphy, originalStratigraphy: group.originalStratigraphy }); card.style.cssText = ` padding: 12px; margin-bottom: 10px; background: white; border-radius: 6px; border-left: 4px solid ${borderColor}; box-shadow: 0 1px 3px rgba(0,0,0,0.1); cursor: pointer; transition: all 0.2s ease; `; // Заголовок let intervalTitle = `${group.from.toFixed(1)} - ${group.to.toFixed(1)} м`; if (group.stratigraphy && group.stratigraphy !== 'Не указано') { intervalTitle += ` • ${group.stratigraphy}`; } if (group.lithology && group.lithology !== 'Не указано') { intervalTitle += ` • ${group.lithology}`; } card.innerHTML = `
${intervalTitle}
${group.totalThickness.toFixed(1)} м
`; // Составляющие интервалы if (group.intervals && group.intervals.length > 1) { card.innerHTML += `
Составляющие интервалы (${group.intervals.length}):
${group.intervals.map(interval => `
${interval.from.toFixed(1)}-${interval.to.toFixed(1)} м ${interval.thickness.toFixed(1)} м
${interval.description ? `
${interval.description}
` : ''}
`).join('')}
`; } else if (group.intervals && group.intervals[0] && group.intervals[0].description) { card.innerHTML += `
${group.intervals[0].description}
`; } // Клик по карточке - сохраняем цвет полоски card.onclick = (e) => { e.stopPropagation(); // Снимаем выделение со всех карточек document.querySelectorAll('.geology-card').forEach(c => { c.style.background = 'white'; c.style.borderLeft = `4px solid ${c.originalBorderColor || '#e9ecef'}`; }); // Выделяем текущую карточку, сохраняем её цвет card.style.background = '#fff7ed'; card.style.borderLeft = `4px solid ${borderColor}`; card.originalBorderColor = borderColor; // Выделяем блок в колонке if (window.geologyBlocks && window.geologyBlocks[index]) { window.geologyBlocks.forEach(block => { block.style.border = '1px solid rgba(0,0,0,0.25)'; block.style.boxShadow = 'none'; }); window.geologyBlocks[index].style.border = '2px solid #b91c1c'; window.geologyBlocks[index].style.boxShadow = '0 0 0 2px rgba(185,28,28,0.25)'; window.geologyBlocks[index].scrollIntoView({ behavior: 'smooth', block: 'center' }); } }; // Инициализируем оригинальный цвет card.originalBorderColor = borderColor; return card; } ``` ## 3. УБИРАЕМ ЛИШНИЙ СКРОЛЛ И ФИКСИРУЕМ ШАПКУ: ```javascript // В функции drawWellStructure, исправляем body: const body = document.createElement('div'); body.style.cssText = ` display: flex; position: relative; overflow-y: auto; max-height: 60vh; `; // Убираем лишний скролл у graphicsScrollContainer graphicsScrollContainer.style.cssText = ` flex: 1; overflow: auto; padding: 10px; `; // В columnContainer убираем overflow hidden у внутренних элементов columnContainer.style.cssText = ` position: relative; width: 100%; min-width: 550px; background: white; border: 1px solid #cbd5e1; border-radius: 4px; `; ``` ## 4. ДОБАВЛЯЕМ CSS ДЛЯ ФИКСАЦИИ ШАПКИ ПРИ СКРОЛЛЕ: ```css /* В стили добавить */ #graphicsScrollContainer { scrollbar-width: thin; } #graphicsScrollContainer .table-header, #graphicsScrollContainer .column-header { position: sticky; top: 0; z-index: 100; background: #e2e8f0; } ``` ## 5. ИСПРАВЛЯЕМ ПАРСИНГ КАТЕГОРИЙ БУРЕНИЯ ПРИ ОБЪЕДИНЕНИИ ИНТЕРВАЛОВ: ```javascript function createMergedGeologyFromDocumentation(docType = 'primary') { let documentation; switch (docType) { case 'primary': documentation = xmlData.primaryDocumentation; break; case 'final': documentation = xmlData.finalDocumentation; break; case 'gis': documentation = xmlData.gisDocumentation; break; default: documentation = xmlData.primaryDocumentation; } if (!documentation || documentation.length === 0) return []; if (!mergeGeologyIntervals) { return documentation.map((interval, index) => { const originalStratigraphy = interval.originalStratigraphy || interval.stratigraphy || 'Не указано'; const convertedStratigraphy = interval.stratigraphy || convertStratigraphyText(originalStratigraphy); return { from: interval.from, to: interval.to, lithology: interval.lithology, lithologyId: interval.lithologyId, lcode: interval.lcode, stratigraphy: convertedStratigraphy, originalStratigraphy: originalStratigraphy, rockCategories: interval.rockCategories, intervals: [{ from: interval.from, to: interval.to, description: interval.description, numberPP: interval.numberPP, thickness: interval.thickness, rockCategories: interval.rockCategories }], totalThickness: interval.thickness }; }); } // Объединяем интервалы const groupedIntervals = []; let currentGroup = null; documentation.forEach((interval) => { const originalStratigraphy = interval.originalStratigraphy || interval.stratigraphy || 'Не указано'; const convertedStratigraphy = interval.stratigraphy || convertStratigraphyText(originalStratigraphy); const sameLithology = currentGroup && currentGroup.lithology === interval.lithology && currentGroup.lithologyId === interval.lithologyId; const sameStratigraphy = currentGroup && currentGroup.originalStratigraphy === originalStratigraphy; const shouldMerge = sameLithology && sameStratigraphy; if (!currentGroup || !shouldMerge) { if (currentGroup) { groupedIntervals.push(currentGroup); } currentGroup = { from: interval.from, to: interval.to, lithology: interval.lithology, lithologyId: interval.lithologyId, lcode: interval.lcode, stratigraphy: convertedStratigraphy, originalStratigraphy: originalStratigraphy, rockCategories: interval.rockCategories, intervals: [{ from: interval.from, to: interval.to, description: interval.description, numberPP: interval.numberPP, thickness: interval.thickness, rockCategories: interval.rockCategories }], totalThickness: interval.thickness }; } else { currentGroup.to = interval.to; currentGroup.totalThickness += interval.thickness; currentGroup.intervals.push({ from: interval.from, to: interval.to, description: interval.description, numberPP: interval.numberPP, thickness: interval.thickness, rockCategories: interval.rockCategories }); // Объединяем rockCategories if (interval.rockCategories && interval.rockCategories !== 'Не указано') { if (!currentGroup.rockCategories) currentGroup.rockCategories = ''; currentGroup.rockCategories += '; ' + interval.rockCategories; } } }); if (currentGroup) { groupedIntervals.push(currentGroup); } return groupedIntervals; } ``` Теперь: - ✅ Категории бурения должны отображаться из данных интервалов - ✅ Цвет полоски в карточках сохраняется при клике - ✅ Убран лишний вертикальный скролл - ✅ Шапка фиксируется при прокрутке - ✅ Объединение интервалов сохраняет категории бурения