Merge pull request 'fix-front' (#64) from fix-front into test

Reviewed-on: #64
This commit is contained in:
PotapovaA 2026-06-22 20:34:14 +03:00
commit 2fcaea1d8b
25 changed files with 20804 additions and 22278 deletions

View File

@ -12,11 +12,28 @@ const ContainerForText = styled.span`
white-space: pre-wrap;
`;
// Стилизованный компонент для плашки блокировки
const LockBadge = styled.div`
position: absolute;
top: 2px;
right: 2px;
background: rgba(0, 0, 0, 0.7);
color: white;
font-size: 9px;
padding: 1px 4px;
border-radius: 3px;
pointer-events: none;
z-index: 10;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
letter-spacing: 0.3px;
backdrop-filter: blur(4px);
border: 1px solid rgba(255, 255, 255, 0.1);
`;
// Функция для подсветки текста
const highlightText = (text, searchQuery) => {
if (!searchQuery || !text) return text;
// Экранируем спецсимволы в поисковом запросе
const escapedQuery = searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const regex = new RegExp(`(${escapedQuery})`, 'gi');
@ -49,7 +66,6 @@ const formatNumber = (value) => {
const num = Number(value);
if (isNaN(num)) return String(value);
// Форматируем число с 1 знаком после запятой и разделением по 3 цифры
return num.toLocaleString('ru-RU', {
minimumFractionDigits: 1,
maximumFractionDigits: 1,
@ -58,21 +74,34 @@ const formatNumber = (value) => {
};
const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundColor, color, isEditable }) => {
const { lockedCells } = useRealtime();
const cellKey = `${row.id}_${column.id}`;
const isLocked = lockedCells.includes(cellKey);
const cellValue = cell.getValue();
let textValue = String(cellValue || '');
// Проверяем, является ли значение числом, и форматируем его
const isNumeric = !isNaN(Number(cellValue)) && cellValue !== null && cellValue !== undefined && cellValue !== '';
if (isNumeric) {
textValue = formatNumber(cellValue);
}
// Подсвечиваем текст с учетом поискового запроса
const highlightedContent = useMemo(() => {
return highlightText(textValue, globalFilter);
}, [textValue, globalFilter]);
const lockedStyles = !isEditable ? {
// Базовые стили для заблокированной ячейки
const lockedStyles = isLocked ? {
border: '2px solid #e0e0e0',
backgroundColor: '#f5f5f5',
color: '#999999',
cursor: 'not-allowed',
opacity: 0.85,
} : {};
// Если isEditable false, добавляем дополнительные стили
const editableStyles = !isEditable ? {
border: '2px solid #d3d3d3',
color: '#525252',
cursor: 'not-allowed',
@ -95,13 +124,19 @@ const Cell = React.memo(({ cell, row, column, onClick, globalFilter, backgroundC
bottom: 0,
border: '2px solid transparent',
padding: '8px',
backgroundColor: backgroundColor,
color: color,
...lockedStyles
backgroundColor: isLocked ? '#f5f5f5' : backgroundColor,
color: isLocked ? '#999999' : color,
...lockedStyles,
...editableStyles,
}}
onClick={onClick}
onClick={isLocked ? undefined : onClick}
>
<ContainerForText>{highlightedContent}</ContainerForText>
{isLocked && (
<LockBadge>
🔒
</LockBadge>
)}
</div>
);
});

View File

@ -25,13 +25,14 @@ import { toast } from 'react-toastify';
import { CircularProgress } from '@mui/material';
const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
const { data, setData, isLoading: isTableLoading } = useRealtimeData(formId, sheetName, direction);
const { data, setData, isLoading: isTableLoading, editingCells: dataEditingCells } = useRealtimeData(formId, sheetName, direction);
const [globalFilter, setGlobalFilter] = useState('');
const [showColumnFilters, setShowColumnFilters] = useState(false);
const [selectedColumn, setSelectedColumn] = useState();
const [rowSelection, setRowSelection] = useState({});
const [isLoadingData, setIsLoadingData] = useState(false);
const [isPending, startTransition] = useTransition();
const [editingCell, setEditingCell] = useState(null);
const handleGlobalFilterChange = (value) => {
startTransition(() => {
@ -42,13 +43,14 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
const {
isConnected,
isAuthenticated,
subscribeToCellUpdates,
subscribeToErrors,
subscribeToAuthSuccess,
error: wsError,
updateCell: contextUpdateCell,
addRow: contextAddRow,
deleteRow: contextDeleteRow,
startEditing: contextStartEditing,
endEditing: contextEndEditing,
} = useRealtime();
const {
@ -63,18 +65,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
handleToggleColumnVisibility,
} = useColumnSettings(`${formId}_${formType}_${sheetName}_${direction}`);
useEffect(() => {
// Принудительно обновляем состояние закрепленных колонок
// если так не сделать при скролле будут пропадать закрепленные колонки
if (columnPinning && Object.keys(columnPinning).length > 0) {
const timer = setTimeout(() => {
setColumnPinning(prev => ({ ...prev }));
}, 10);
return () => clearTimeout(timer);
}
}, [columnPinning, setColumnPinning]);
const { headerPortalRef, containerRef } = useHeaderPortal();
const { sizeMult, setSizeMult, tableScaleStyle, tableWrapperStyle } =
@ -98,7 +88,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
const handleUpdateCell = useCallback(async (row, column, value) => {
return await contextUpdateCell(row, column, value);
}, [contextUpdateCell, setData]);
}, [contextUpdateCell]);
const handleClickRowCell = useCallback((rowId) => {
setRowSelection((prev) => ({
@ -127,9 +117,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
}
}, [columnsConfig, handleUpdateCell]);
const tableMeta = useMemo(() => ({
updateCell: handleUpdateCell,
}), [handleUpdateCell]);
const tableMeta = useRef({ updateCell: handleUpdateCell }).current;
// Конфигурация таблицы
const tableConfig = useMemo(
@ -144,6 +132,14 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
scrollPaddingStart: 0,
scrollPaddingEnd: 0,
},
onEditingCellChange: (cell) => {
if (cell) {
if (editingCell) return;
contextStartEditing?.(cell.row, cell.column);
} else {
contextEndEditing?.(editingCell.row, editingCell.column);
}
},
columnVirtualizerOptions: ({ table }) => ({
overscan: 5,
measureElement: (el) => {
@ -163,6 +159,7 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
globalFilter,
showColumnFilters,
rowSelection,
editingCell,
},
initialState: {
expanded: true,
@ -214,11 +211,43 @@ const RealtimeTable = ({ formType, formId, sheetName, direction }) => {
const table = useMaterialReactTable(tableConfig);
useEffect(() => {
if (!dataEditingCells || !dataEditingCells.line_id) {
setEditingCell(null);
return;
}
if (editingCell) return;
const rowId = dataEditingCells.line_id;
const columnId = dataEditingCells.column;
try {
const row = table.getRow(rowId);
const column = table.getColumn(columnId);
const cell = row?.getVisibleCells().find(c => c.column.id === columnId);
if (cell) {
setEditingCell(cell);
}
} catch (error) {
console.error(error);
toast.error('Ошибка редактирования ячейки');
}
}, [dataEditingCells, table]);
useEffect(() => {
if (table && data && columns.length !== 0) {
setIsLoadingData(true)
}
}, [data, columns, table])
useEffect(() => {
// Принудительно обновляем состояние закрепленных колонок
// если так не сделать при скролле будут пропадать закрепленные колонки
if (columnPinning && Object.keys(columnPinning).length > 0) {
const timer = setTimeout(() => {
setColumnPinning(prev => ({ ...prev }));
}, 10);
return () => clearTimeout(timer);
}
}, [table]);
const handleAddRow = useCallback(() => {
const allRows = table.getRowModel().rows;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,328 +1,369 @@
import {
greenColumn,
whiteColumn,
orangeColumn,
yellowColumn,
redColumn,
blueColumn,
} from "../columnColors";
export const config = {
config: {
colors: {
n_pp_n_pp: {
color_type: whiteColumn,
accessorKey: "n_pp_n_pp",
import {
greenColumn,
whiteColumn,
orangeColumn,
yellowColumn,
redColumn,
blueColumn,
} from '../columnColors';
export const config = {
"config":{
"colors":{
"section_no":{
"color_type":whiteColumn,
"accessorKey":"section_no"
},
id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury: {
color_type: whiteColumn,
accessorKey:
"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury",
"expense_item_code":{
"color_type":whiteColumn,
"accessorKey":"expense_item_code"
},
naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov: {
color_type: whiteColumn,
accessorKey:
"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov",
"name":{
"color_type":whiteColumn,
"accessorKey":"name"
},
normiruemaya_edinitsa_normiruemaya_edinitsa: {
color_type: whiteColumn,
accessorKey: "normiruemaya_edinitsa_normiruemaya_edinitsa",
"unit":{
"color_type":whiteColumn,
"accessorKey":"unit"
},
limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds: {
color_type: whiteColumn,
accessorKey: "limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds",
"limit_with_vat":{
"color_type":whiteColumn,
"accessorKey":"limit_with_vat"
},
limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds: {
color_type: whiteColumn,
accessorKey: "limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds",
"limit_without_vat":{
"color_type":whiteColumn,
"accessorKey":"limit_without_vat"
},
i_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "i_kvartal_2026_g_kolichestvov_sht",
"i_kvartal_2026_g_kolichestvov_sht":{
"color_type":whiteColumn,
"accessorKey":"i_kvartal_2026_g_kolichestvov_sht"
},
i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"qty_q1":{
"color_type":whiteColumn,
"accessorKey":"qty_q1"
},
ii_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "ii_kvartal_2026_g_kolichestvov_sht",
"amount_q1":{
"color_type":whiteColumn,
"accessorKey":"amount_q1"
},
ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh":{
"color_type":whiteColumn,
"accessorKey":"ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh"
},
iii_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "iii_kvartal_2026_g_kolichestvov_sht",
"qty_q2":{
"color_type":whiteColumn,
"accessorKey":"qty_q2"
},
iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"amount_q2":{
"color_type":whiteColumn,
"accessorKey":"amount_q2"
},
iv_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "iv_kvartal_2026_g_kolichestvov_sht",
},
iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"iv_kvartal_2026_g_kolichestvov_sht":{
"color_type":whiteColumn,
"accessorKey":"iv_kvartal_2026_g_kolichestvov_sht"
},
"qty_q3":{
"color_type":whiteColumn,
"accessorKey":"qty_q3"
}
},
columns: [
"columns":[
{
header: "N п/п",
accessorKey: "n_pp",
columns: [
"header":"N п/п",
"accessorKey":"n_pp",
"columns":[
{
header: "N п/п",
accessorKey: "n_pp_n_pp",
size: 150,
filterFn: "contains",
},
"header":"",
"accessorKey":"section_no",
"columnLetter":"B",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "ID статьи / группы номенклатуры",
accessorKey: "id_stati_gruppy_nomenklatury",
columns: [
"header":"ID статьи / группы номенклатуры",
"accessorKey":"id_stati_gruppy_nomenklatury",
"columns":[
{
header: "ID статьи / группы номенклатуры",
accessorKey:
"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury",
size: 150,
filterFn: "contains",
},
"header":"",
"accessorKey":"expense_item_code",
"columnLetter":"C",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Наименование статей расходов",
accessorKey: "naimenovanie_statey_raskhodov",
columns: [
"header":"Наименование статей расходов",
"accessorKey":"naimenovanie_statey_raskhodov",
"columns":[
{
header: "Наименование статей расходов",
accessorKey:
"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov",
size: 150,
filterFn: "contains",
},
"header":"",
"accessorKey":"name",
"columnLetter":"D",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Нормируемая единица",
accessorKey: "normiruemaya_edinitsa",
columns: [
"header":"Нормируемая единица",
"accessorKey":"normiruemaya_edinitsa",
"columns":[
{
header: "Нормируемая единица",
accessorKey: "normiruemaya_edinitsa_normiruemaya_edinitsa",
size: 150,
filterFn: "contains",
},
"header":"",
"accessorKey":"unit",
"columnLetter":"E",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Лимит, в руб.(с учетом НДС)",
accessorKey: "limit_v_rubs_uchetom_nds",
columns: [
"header":"Лимит, в руб.(с учетом НДС)",
"accessorKey":"limit_v_rubs_uchetom_nds",
"columns":[
{
header: "Лимит, в руб.(с учетом НДС)",
accessorKey: "limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds",
size: 150,
filterFn: "contains",
},
"header":"",
"accessorKey":"limit_with_vat",
"columnLetter":"F",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Лимит, в руб.(без учета НДС)",
accessorKey: "limit_v_rubbez_ucheta_nds",
columns: [
"header":"Лимит, в руб.(без учета НДС)",
"accessorKey":"limit_v_rubbez_ucheta_nds",
"columns":[
{
header: "Лимит, в руб.(без учета НДС)",
accessorKey: "limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds",
size: 150,
filterFn: "contains",
},
"header":"Лимит, в руб.(без учета НДС)",
"accessorKey":"limit_without_vat",
"columnLetter":"G",
"size":290,
"filterFn":"contains"
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "I квартал 2026 г.",
accessorKey: "i_kvartal_2026_g",
columns: [
"header":"I квартал 2026 г.",
"accessorKey":"i_kvartal_2026_g",
"columns":[
{
header: "Количество,в шт.",
accessorKey: "i_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"header":"Количество,в шт.",
"accessorKey":"i_kvartal_2026_g_kolichestvov_sht",
"columnLetter":"H",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Расходы в смету, в рублях",
accessorKey: "i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
},
"header":"Расходы в смету, в рублях",
"accessorKey":"qty_q1",
"columnLetter":"I",
"size":260,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "II квартал 2026 г.",
accessorKey: "ii_kvartal_2026_g",
columns: [
"header":"II квартал 2026 г.",
"accessorKey":"ii_kvartal_2026_g",
"columns":[
{
header: "Количество,в шт.",
accessorKey: "ii_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"header":"Количество,в шт.",
"accessorKey":"amount_q1",
"columnLetter":"J",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Расходы в смету, в рублях",
accessorKey: "ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
},
"header":"Расходы в смету, в рублях",
"accessorKey":"ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"columnLetter":"K",
"size":260,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "III квартал 2026 г.",
accessorKey: "iii_kvartal_2026_g",
columns: [
"header":"III квартал 2026 г.",
"accessorKey":"iii_kvartal_2026_g",
"columns":[
{
header: "Количество,в шт.",
accessorKey: "iii_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"header":"Количество,в шт.",
"accessorKey":"qty_q2",
"columnLetter":"L",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Расходы в смету, в рублях",
accessorKey: "iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
},
"header":"Расходы в смету, в рублях",
"accessorKey":"amount_q2",
"columnLetter":"M",
"size":260,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "IV квартал 2026 г.",
accessorKey: "iv_kvartal_2026_g",
columns: [
"header":"IV квартал 2026 г.",
"accessorKey":"iv_kvartal_2026_g",
"columns":[
{
header: "Количество,в шт.",
accessorKey: "iv_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
"header":"Количество,в шт.",
"accessorKey":"iv_kvartal_2026_g_kolichestvov_sht",
"columnLetter":"N",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
},
{
header: "Расходы в смету, в рублях",
accessorKey: "iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
},
"header":"Расходы в смету, в рублях",
"accessorKey":"qty_q3",
"columnLetter":"O",
"size":260,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
],
muiTableHeadCellProps: {
sx: {
backgroundColor: "#A5A5A5",
color: "#000000",
},
},
},
],
},
};
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5",
"color":"#000000"
}
}
}
]
}
}

View File

@ -10,49 +10,49 @@
export const config = {
"config":{
"colors":{
"pp_pp_pp_pp":{
"pp_pp_pp_field":{
"color_type":whiteColumn,
"accessorKey":"pp_pp_pp_pp"
"accessorKey":"pp_pp_pp_field"
},
"adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta":{
"address":{
"color_type":whiteColumn,
"accessorKey":"adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta"
"accessorKey":"address"
},
"obekt_obekt_obekt_neobkhodimo_vybrat_iz_spiska":{
"object_type":{
"color_type":whiteColumn,
"accessorKey":"obekt_obekt_obekt_neobkhodimo_vybrat_iz_spiska"
"accessorKey":"object_type"
},
"arenduemaya_ploschad_arenduemaya_ploschad_arenduemaya_ploschad_v_kvm":{
"rented_area":{
"color_type":whiteColumn,
"accessorKey":"arenduemaya_ploschad_arenduemaya_ploschad_arenduemaya_ploschad_v_kvm"
"accessorKey":"rented_area"
},
"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod":{
"contract_end_date":{
"color_type":whiteColumn,
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod"
"accessorKey":"contract_end_date"
},
"nomer_dogovora_nomer_dogovora_nomer_dogovora_field":{
"contract_number":{
"color_type":whiteColumn,
"accessorKey":"nomer_dogovora_nomer_dogovora_nomer_dogovora_field"
"accessorKey":"contract_number"
},
"planiruemaya_summa_raskhodov_na_2026_god_i_kvartal_i_kvartal_field":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_i_kvartal_i_kvartal_field"
},
"planiruemaya_summa_raskhodov_na_2026_god_ii_kvartal_ii_kvartal_field":{
"plan.q1":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_ii_kvartal_ii_kvartal_field"
"accessorKey":"plan.q1"
},
"planiruemaya_summa_raskhodov_na_2026_god_iii_kvartal_iii_kvartal_field":{
"plan.q2":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iii_kvartal_iii_kvartal_field"
"accessorKey":"plan.q2"
},
"planiruemaya_summa_raskhodov_na_2026_god_iv_kvartal_iv_kvartal_field":{
"plan.q3":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iv_kvartal_iv_kvartal_field"
"accessorKey":"plan.q3"
},
"kommentariy_kommentariy_kommentariy_kommentariy":{
"plan.q4":{
"color_type":whiteColumn,
"accessorKey":"kommentariy_kommentariy_kommentariy_kommentariy"
"accessorKey":"plan.q4"
},
"fakticheskie_raskhody_za_i_kv_2026_goda_yanvar_yanvar_v_tys_rubley":{
"color_type":whiteColumn,
@ -66,61 +66,61 @@
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_mart_mart_v_tys_rubley"
},
"fakticheskie_raskhody_za_i_kv_2026_goda_itog_i_kv_itog_i_kv_v_tys_rubley":{
"fact_q1.jan":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_itog_i_kv_itog_i_kv_v_tys_rubley"
"accessorKey":"fact_q1.jan"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_aprel_aprel_v_tys_rubley":{
"fact_q1.feb":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_aprel_aprel_v_tys_rubley"
"accessorKey":"fact_q1.feb"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_may_may_v_tys_rubley":{
"fact_q1.mar":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_may_may_v_tys_rubley"
"accessorKey":"fact_q1.mar"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_iyun_iyun_v_tys_rubley":{
"fact_q1.total":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_iyun_iyun_v_tys_rubley"
"accessorKey":"fact_q1.total"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_itog_ii_kv_itog_ii_kv_v_tys_rubley":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_itog_ii_kv_itog_ii_kv_v_tys_rubley"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_iyul_iyul_v_tys_rubley":{
"fact_q2.apr":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_iyul_iyul_v_tys_rubley"
"accessorKey":"fact_q2.apr"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_avgust_avgust_v_tys_rubley":{
"fact_q2.may":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_avgust_avgust_v_tys_rubley"
"accessorKey":"fact_q2.may"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_sentyabr_sentyabr_v_tys_rubley":{
"fact_q2.jun":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_sentyabr_sentyabr_v_tys_rubley"
"accessorKey":"fact_q2.jun"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_itog_iii_kv_itog_iii_kv_v_tys_rubley":{
"fact_q2.total":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_itog_iii_kv_itog_iii_kv_v_tys_rubley"
"accessorKey":"fact_q2.total"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_oktyabr_oktyabr_v_tys_rubley":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_oktyabr_oktyabr_v_tys_rubley"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_noyabr_noyabr_v_tys_rubley":{
"fact_q3.jul":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_noyabr_noyabr_v_tys_rubley"
"accessorKey":"fact_q3.jul"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_dekabr_dekabr_v_tys_rubley":{
"fact_q3.aug":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_dekabr_dekabr_v_tys_rubley"
"accessorKey":"fact_q3.aug"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_spod_spod_v_tys_rubley":{
"fact_q3.sep":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_spod_spod_v_tys_rubley"
"accessorKey":"fact_q3.sep"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_itog_iv_kv_itog_iv_kv_v_tys_rubley":{
"fact_q3.total":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_itog_iv_kv_itog_iv_kv_v_tys_rubley"
"accessorKey":"fact_q3.total"
}
},
"columns":[
@ -137,10 +137,17 @@
"accessorKey":"pp_pp_pp",
"columns":[
{
"header":"№ п/п",
"accessorKey":"pp_pp_pp_pp",
"header":"",
"accessorKey":"pp_pp_pp_field",
"columnLetter":"C",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#DDDDDD",
"color":"#000000"
}
}
}
]
}
@ -168,8 +175,9 @@
"columns":[
{
"header":"(заполняется авто из табл. \"INFO\" в зависимости от выбранного объекта)",
"accessorKey":"adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta",
"size":150,
"accessorKey":"address",
"columnLetter":"D",
"size":700,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -204,8 +212,9 @@
"columns":[
{
"header":"(необходимо выбрать из списка)",
"accessorKey":"obekt_obekt_obekt_neobkhodimo_vybrat_iz_spiska",
"size":150,
"accessorKey":"object_type",
"columnLetter":"I",
"size":300,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -240,7 +249,8 @@
"columns":[
{
"header":"в кв.м.",
"accessorKey":"arenduemaya_ploschad_arenduemaya_ploschad_arenduemaya_ploschad_v_kvm",
"accessorKey":"rented_area",
"columnLetter":"J",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -276,8 +286,9 @@
"columns":[
{
"header":"в формате \"месяц.год\"",
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod",
"size":150,
"accessorKey":"contract_end_date",
"columnLetter":"L",
"size":210,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -312,7 +323,8 @@
"columns":[
{
"header":"",
"accessorKey":"nomer_dogovora_nomer_dogovora_nomer_dogovora_field",
"accessorKey":"contract_number",
"columnLetter":"N",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -349,6 +361,7 @@
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_i_kvartal_i_kvartal_field",
"columnLetter":"O",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -378,7 +391,8 @@
"columns":[
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_ii_kvartal_ii_kvartal_field",
"accessorKey":"plan.q1",
"columnLetter":"P",
"size":150,
"filterFn":"contains"
}
@ -402,7 +416,8 @@
"columns":[
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iii_kvartal_iii_kvartal_field",
"accessorKey":"plan.q2",
"columnLetter":"Q",
"size":150,
"filterFn":"contains"
}
@ -426,7 +441,8 @@
"columns":[
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iv_kvartal_iv_kvartal_field",
"accessorKey":"plan.q3",
"columnLetter":"R",
"size":150,
"filterFn":"contains"
}
@ -461,10 +477,17 @@
"accessorKey":"kommentariy_kommentariy_kommentariy",
"columns":[
{
"header":"Комментарий",
"accessorKey":"kommentariy_kommentariy_kommentariy_kommentariy",
"header":"",
"accessorKey":"plan.q4",
"columnLetter":"S",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#DDDDDD",
"color":"#000000"
}
}
}
]
}
@ -493,6 +516,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_yanvar_yanvar_v_tys_rubley",
"columnLetter":"W",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -523,6 +547,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_fevral_fevral_v_tys_rubley",
"columnLetter":"X",
"size":150,
"filterFn":"contains"
}
@ -547,6 +572,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_mart_mart_v_tys_rubley",
"columnLetter":"Y",
"size":150,
"filterFn":"contains"
}
@ -570,7 +596,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_itog_i_kv_itog_i_kv_v_tys_rubley",
"accessorKey":"fact_q1.jan",
"columnLetter":"Z",
"size":150,
"filterFn":"contains"
}
@ -606,7 +633,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_aprel_aprel_v_tys_rubley",
"accessorKey":"fact_q1.feb",
"columnLetter":"AA",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -636,7 +664,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_may_may_v_tys_rubley",
"accessorKey":"fact_q1.mar",
"columnLetter":"AB",
"size":150,
"filterFn":"contains"
}
@ -660,7 +689,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_iyun_iyun_v_tys_rubley",
"accessorKey":"fact_q1.total",
"columnLetter":"AC",
"size":150,
"filterFn":"contains"
}
@ -685,6 +715,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_itog_ii_kv_itog_ii_kv_v_tys_rubley",
"columnLetter":"AD",
"size":150,
"filterFn":"contains"
}
@ -720,7 +751,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_iyul_iyul_v_tys_rubley",
"accessorKey":"fact_q2.apr",
"columnLetter":"AE",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -750,7 +782,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_avgust_avgust_v_tys_rubley",
"accessorKey":"fact_q2.may",
"columnLetter":"AF",
"size":150,
"filterFn":"contains"
}
@ -774,7 +807,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_sentyabr_sentyabr_v_tys_rubley",
"accessorKey":"fact_q2.jun",
"columnLetter":"AG",
"size":150,
"filterFn":"contains"
}
@ -798,7 +832,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_itog_iii_kv_itog_iii_kv_v_tys_rubley",
"accessorKey":"fact_q2.total",
"columnLetter":"AH",
"size":150,
"filterFn":"contains"
}
@ -835,6 +870,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_oktyabr_oktyabr_v_tys_rubley",
"columnLetter":"AI",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -864,7 +900,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_noyabr_noyabr_v_tys_rubley",
"accessorKey":"fact_q3.jul",
"columnLetter":"AJ",
"size":150,
"filterFn":"contains"
}
@ -888,7 +925,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_dekabr_dekabr_v_tys_rubley",
"accessorKey":"fact_q3.aug",
"columnLetter":"AK",
"size":150,
"filterFn":"contains"
}
@ -912,7 +950,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_spod_spod_v_tys_rubley",
"accessorKey":"fact_q3.sep",
"columnLetter":"AL",
"size":150,
"filterFn":"contains"
}
@ -936,7 +975,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_itog_iv_kv_itog_iv_kv_v_tys_rubley",
"accessorKey":"fact_q3.total",
"columnLetter":"AM",
"size":150,
"filterFn":"contains"
}

View File

@ -10,45 +10,45 @@
export const config = {
"config":{
"colors":{
"pp_pp_pp_pp":{
"pp_pp_pp_field":{
"color_type":whiteColumn,
"accessorKey":"pp_pp_pp_pp"
"accessorKey":"pp_pp_pp_field"
},
"adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta":{
"address":{
"color_type":whiteColumn,
"accessorKey":"adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta"
"accessorKey":"address"
},
"obekt_obekt_obekt_neobkhodimo_vybrat_iz_spiska":{
"object_type":{
"color_type":whiteColumn,
"accessorKey":"obekt_obekt_obekt_neobkhodimo_vybrat_iz_spiska"
"accessorKey":"object_type"
},
"nomer_dogovora_nomer_dogovora_nomer_dogovora_field":{
"contract_number":{
"color_type":whiteColumn,
"accessorKey":"nomer_dogovora_nomer_dogovora_nomer_dogovora_field"
"accessorKey":"contract_number"
},
"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod":{
"contract_end_date":{
"color_type":whiteColumn,
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod"
"accessorKey":"contract_end_date"
},
"planiruemaya_summa_raskhodov_na_2026_god_i_kvartal_i_kvartal_field":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_i_kvartal_i_kvartal_field"
},
"planiruemaya_summa_raskhodov_na_2026_god_ii_kvartal_ii_kvartal_field":{
"plan.q1":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_ii_kvartal_ii_kvartal_field"
"accessorKey":"plan.q1"
},
"planiruemaya_summa_raskhodov_na_2026_god_iii_kvartal_iii_kvartal_field":{
"plan.q2":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iii_kvartal_iii_kvartal_field"
"accessorKey":"plan.q2"
},
"planiruemaya_summa_raskhodov_na_2026_god_iv_kvartal_iv_kvartal_field":{
"plan.q3":{
"color_type":whiteColumn,
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iv_kvartal_iv_kvartal_field"
"accessorKey":"plan.q3"
},
"kommentariy_kommentariy_kommentariy_kommentariy":{
"plan.q4":{
"color_type":whiteColumn,
"accessorKey":"kommentariy_kommentariy_kommentariy_kommentariy"
"accessorKey":"plan.q4"
},
"fakticheskie_raskhody_za_i_kv_2026_goda_yanvar_yanvar_v_tys_rubley":{
"color_type":whiteColumn,
@ -62,61 +62,61 @@
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_mart_mart_v_tys_rubley"
},
"fakticheskie_raskhody_za_i_kv_2026_goda_itog_i_kv_itog_i_kv_v_tys_rubley":{
"fact_q1.jan":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_itog_i_kv_itog_i_kv_v_tys_rubley"
"accessorKey":"fact_q1.jan"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_aprel_aprel_v_tys_rubley":{
"fact_q1.feb":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_aprel_aprel_v_tys_rubley"
"accessorKey":"fact_q1.feb"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_may_may_v_tys_rubley":{
"fact_q1.mar":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_may_may_v_tys_rubley"
"accessorKey":"fact_q1.mar"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_iyun_iyun_v_tys_rubley":{
"fact_q1.total":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_iyun_iyun_v_tys_rubley"
"accessorKey":"fact_q1.total"
},
"fakticheskie_raskhody_za_ii_kv_2026_goda_itog_ii_kv_itog_ii_kv_v_tys_rubley":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_itog_ii_kv_itog_ii_kv_v_tys_rubley"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_iyul_iyul_v_tys_rubley":{
"fact_q2.apr":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_iyul_iyul_v_tys_rubley"
"accessorKey":"fact_q2.apr"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_avgust_avgust_v_tys_rubley":{
"fact_q2.may":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_avgust_avgust_v_tys_rubley"
"accessorKey":"fact_q2.may"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_sentyabr_sentyabr_v_tys_rubley":{
"fact_q2.jun":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_sentyabr_sentyabr_v_tys_rubley"
"accessorKey":"fact_q2.jun"
},
"fakticheskie_raskhody_za_iii_kv_2026_goda_itog_iii_kv_itog_iii_kv_v_tys_rubley":{
"fact_q2.total":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_itog_iii_kv_itog_iii_kv_v_tys_rubley"
"accessorKey":"fact_q2.total"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_oktyabr_oktyabr_v_tys_rubley":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_oktyabr_oktyabr_v_tys_rubley"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_noyabr_noyabr_v_tys_rubley":{
"fact_q3.jul":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_noyabr_noyabr_v_tys_rubley"
"accessorKey":"fact_q3.jul"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_dekabr_dekabr_v_tys_rubley":{
"fact_q3.aug":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_dekabr_dekabr_v_tys_rubley"
"accessorKey":"fact_q3.aug"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_spod_spod_v_tys_rubley":{
"fact_q3.sep":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_spod_spod_v_tys_rubley"
"accessorKey":"fact_q3.sep"
},
"fakticheskie_raskhody_za_iv_kv_2026_goda_itog_iv_kv_itog_iv_kv_v_tys_rubley":{
"fact_q3.total":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_itog_iv_kv_itog_iv_kv_v_tys_rubley"
"accessorKey":"fact_q3.total"
}
},
"columns":[
@ -133,10 +133,17 @@
"accessorKey":"pp_pp_pp",
"columns":[
{
"header":"№ п/п",
"accessorKey":"pp_pp_pp_pp",
"header":"",
"accessorKey":"pp_pp_pp_field",
"columnLetter":"B",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#DDDDDD",
"color":"#000000"
}
}
}
]
}
@ -164,8 +171,9 @@
"columns":[
{
"header":"(заполняется авто из табл. \"INFO\" в зависимости от выбранного объекта)",
"accessorKey":"adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta",
"size":150,
"accessorKey":"address",
"columnLetter":"C",
"size":700,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -200,8 +208,9 @@
"columns":[
{
"header":"(необходимо выбрать из списка)",
"accessorKey":"obekt_obekt_obekt_neobkhodimo_vybrat_iz_spiska",
"size":150,
"accessorKey":"object_type",
"columnLetter":"H",
"size":300,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -236,7 +245,8 @@
"columns":[
{
"header":"",
"accessorKey":"nomer_dogovora_nomer_dogovora_nomer_dogovora_field",
"accessorKey":"contract_number",
"columnLetter":"I",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -272,8 +282,9 @@
"columns":[
{
"header":"в формате \"месяц.год\"",
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod",
"size":150,
"accessorKey":"contract_end_date",
"columnLetter":"J",
"size":210,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -309,6 +320,7 @@
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_i_kvartal_i_kvartal_field",
"columnLetter":"M",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -338,7 +350,8 @@
"columns":[
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_ii_kvartal_ii_kvartal_field",
"accessorKey":"plan.q1",
"columnLetter":"N",
"size":150,
"filterFn":"contains"
}
@ -362,7 +375,8 @@
"columns":[
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iii_kvartal_iii_kvartal_field",
"accessorKey":"plan.q2",
"columnLetter":"O",
"size":150,
"filterFn":"contains"
}
@ -386,7 +400,8 @@
"columns":[
{
"header":"",
"accessorKey":"planiruemaya_summa_raskhodov_na_2026_god_iv_kvartal_iv_kvartal_field",
"accessorKey":"plan.q3",
"columnLetter":"P",
"size":150,
"filterFn":"contains"
}
@ -421,10 +436,17 @@
"accessorKey":"kommentariy_kommentariy_kommentariy",
"columns":[
{
"header":"Комментарий",
"accessorKey":"kommentariy_kommentariy_kommentariy_kommentariy",
"header":"",
"accessorKey":"plan.q4",
"columnLetter":"Q",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#DDDDDD",
"color":"#000000"
}
}
}
]
}
@ -453,6 +475,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_yanvar_yanvar_v_tys_rubley",
"columnLetter":"U",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -483,6 +506,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_fevral_fevral_v_tys_rubley",
"columnLetter":"V",
"size":150,
"filterFn":"contains"
}
@ -507,6 +531,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_mart_mart_v_tys_rubley",
"columnLetter":"W",
"size":150,
"filterFn":"contains"
}
@ -530,7 +555,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_i_kv_2026_goda_itog_i_kv_itog_i_kv_v_tys_rubley",
"accessorKey":"fact_q1.jan",
"columnLetter":"X",
"size":150,
"filterFn":"contains"
}
@ -566,7 +592,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_aprel_aprel_v_tys_rubley",
"accessorKey":"fact_q1.feb",
"columnLetter":"Y",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -596,7 +623,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_may_may_v_tys_rubley",
"accessorKey":"fact_q1.mar",
"columnLetter":"Z",
"size":150,
"filterFn":"contains"
}
@ -620,7 +648,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_iyun_iyun_v_tys_rubley",
"accessorKey":"fact_q1.total",
"columnLetter":"AA",
"size":150,
"filterFn":"contains"
}
@ -645,6 +674,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_ii_kv_2026_goda_itog_ii_kv_itog_ii_kv_v_tys_rubley",
"columnLetter":"AB",
"size":150,
"filterFn":"contains"
}
@ -680,7 +710,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_iyul_iyul_v_tys_rubley",
"accessorKey":"fact_q2.apr",
"columnLetter":"AC",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -710,7 +741,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_avgust_avgust_v_tys_rubley",
"accessorKey":"fact_q2.may",
"columnLetter":"AD",
"size":150,
"filterFn":"contains"
}
@ -734,7 +766,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_sentyabr_sentyabr_v_tys_rubley",
"accessorKey":"fact_q2.jun",
"columnLetter":"AE",
"size":150,
"filterFn":"contains"
}
@ -758,7 +791,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iii_kv_2026_goda_itog_iii_kv_itog_iii_kv_v_tys_rubley",
"accessorKey":"fact_q2.total",
"columnLetter":"AF",
"size":150,
"filterFn":"contains"
}
@ -795,6 +829,7 @@
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_oktyabr_oktyabr_v_tys_rubley",
"columnLetter":"AG",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -824,7 +859,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_noyabr_noyabr_v_tys_rubley",
"accessorKey":"fact_q3.jul",
"columnLetter":"AH",
"size":150,
"filterFn":"contains"
}
@ -848,7 +884,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_dekabr_dekabr_v_tys_rubley",
"accessorKey":"fact_q3.aug",
"columnLetter":"AI",
"size":150,
"filterFn":"contains"
}
@ -872,7 +909,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_spod_spod_v_tys_rubley",
"accessorKey":"fact_q3.sep",
"columnLetter":"AJ",
"size":150,
"filterFn":"contains"
}
@ -896,7 +934,8 @@
"columns":[
{
"header":"в тыс. рублей",
"accessorKey":"fakticheskie_raskhody_za_iv_kv_2026_goda_itog_iv_kv_itog_iv_kv_v_tys_rubley",
"accessorKey":"fact_q3.total",
"columnLetter":"AK",
"size":150,
"filterFn":"contains"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,89 +14,89 @@
"color_type":whiteColumn,
"accessorKey":"field_eslilevsimvb1713b17eslid170stsepitc17_d17c17_field"
},
"kod_razdela_kod_razdela_kod_razdela":{
"color_type":whiteColumn,
"accessorKey":"kod_razdela_kod_razdela_kod_razdela"
},
"id_stati_id_stati_id_stati":{
"color_type":whiteColumn,
"accessorKey":"id_stati_id_stati_id_stati"
},
"id_gruppy_nomenklatury_id_gruppy_nomenklatury_id_gruppy_nomenklatury":{
"color_type":whiteColumn,
"accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury_id_gruppy_nomenklatury"
},
"naimenovanie_oborudovaniya_naimenovanie_oborudovaniya_naimenovanie_oborudovaniya":{
"color_type":whiteColumn,
"accessorKey":"naimenovanie_oborudovaniya_naimenovanie_oborudovaniya_naimenovanie_oborudovaniya"
},
"60401_60404_vkhodyaschiy_ostatok_kol_vo_sht":{
"section_code":{
"color_type":orangeColumn,
"accessorKey":"60401_60404_vkhodyaschiy_ostatok_kol_vo_sht"
"accessorKey":"section_code"
},
"60401_60404_vkhodyaschiy_ostatok_summa_tys_rub":{
"item_id":{
"color_type":orangeColumn,
"accessorKey":"60401_60404_vkhodyaschiy_ostatok_summa_tys_rub"
"accessorKey":"item_id"
},
"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht":{
"field_id_gruppy_nomenklatury_field":{
"color_type":orangeColumn,
"accessorKey":"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht"
"accessorKey":"field_id_gruppy_nomenklatury_field"
},
"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub":{
"equipment_name":{
"color_type":orangeColumn,
"accessorKey":"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub"
"accessorKey":"equipment_name"
},
"60401_60404_vybytie_v_otchetnom_mesyatse_kol_vo_sht":{
"b_604.opening_qty":{
"color_type":orangeColumn,
"accessorKey":"60401_60404_vybytie_v_otchetnom_mesyatse_kol_vo_sht"
"accessorKey":"b_604.opening_qty"
},
"60401_60404_vybytie_v_otchetnom_mesyatse_summa_tys_rub":{
"b_604.opening_amt":{
"color_type":orangeColumn,
"accessorKey":"60401_60404_vybytie_v_otchetnom_mesyatse_summa_tys_rub"
"accessorKey":"b_604.opening_amt"
},
"60415_vkhodyaschiy_ostatok_kol_vo_sht":{
"b_604.acquired_qty":{
"color_type":orangeColumn,
"accessorKey":"60415_vkhodyaschiy_ostatok_kol_vo_sht"
"accessorKey":"b_604.acquired_qty"
},
"60415_vkhodyaschiy_ostatok_summa_tys_rub":{
"b_604.acquired_amt":{
"color_type":orangeColumn,
"accessorKey":"60415_vkhodyaschiy_ostatok_summa_tys_rub"
"accessorKey":"b_604.acquired_amt"
},
"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht":{
"b_604.disposed_qty":{
"color_type":orangeColumn,
"accessorKey":"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht"
"accessorKey":"b_604.disposed_qty"
},
"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub":{
"b_604.disposed_amt":{
"color_type":orangeColumn,
"accessorKey":"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub"
"accessorKey":"b_604.disposed_amt"
},
"60415_pereneseno_na_bschet_604_kol_vo_sht":{
"b_60415.opening_qty":{
"color_type":orangeColumn,
"accessorKey":"60415_pereneseno_na_bschet_604_kol_vo_sht"
"accessorKey":"b_60415.opening_qty"
},
"60415_pereneseno_na_bschet_604_summa_tys_rub":{
"b_60415.opening_amt":{
"color_type":orangeColumn,
"accessorKey":"60415_pereneseno_na_bschet_604_summa_tys_rub"
"accessorKey":"b_60415.opening_amt"
},
"itogo_fakticheski_priobreteno_v_otchetnom_mesyatse_tys_rub":{
"b_60415.acquired_qty":{
"color_type":orangeColumn,
"accessorKey":"itogo_fakticheski_priobreteno_v_otchetnom_mesyatse_tys_rub"
"accessorKey":"b_60415.acquired_qty"
},
"itogo_sredstva_tolko_po_balansuiz_go_so_znakom_tys_rub":{
"b_60415.acquired_amt":{
"color_type":orangeColumn,
"accessorKey":"itogo_sredstva_tolko_po_balansuiz_go_so_znakom_tys_rub"
"accessorKey":"b_60415.acquired_amt"
},
"itogo_vybytie_v_otchetnom_mesyatse_tys_rub":{
"b_60415.transferred_qty":{
"color_type":orangeColumn,
"accessorKey":"itogo_vybytie_v_otchetnom_mesyatse_tys_rub"
"accessorKey":"b_60415.transferred_qty"
},
"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_kol_vo_sht":{
"b_60415.transferred_amt":{
"color_type":orangeColumn,
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_kol_vo_sht"
"accessorKey":"b_60415.transferred_amt"
},
"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_summa_tys_rub":{
"totals.acquired_total":{
"color_type":orangeColumn,
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_summa_tys_rub"
"accessorKey":"totals.acquired_total"
},
"totals.go_balance_only":{
"color_type":orangeColumn,
"accessorKey":"totals.go_balance_only"
},
"totals.disposed_total":{
"color_type":orangeColumn,
"accessorKey":"totals.disposed_total"
},
"totals.balance_qty":{
"color_type":orangeColumn,
"accessorKey":"totals.balance_qty"
},
"totals.balance_amt":{
"color_type":orangeColumn,
"accessorKey":"totals.balance_amt"
}
},
"columns":[
@ -105,114 +105,119 @@
"accessorKey":"field",
"columns":[
{
"header":" ",
"header":"=ЕСЛИ(ЛЕВСИМВ(B17;1)="3";B17;ЕСЛИ(D17<>0;СЦЕПИТЬ(C17;"_";D17);C17))",
"accessorKey":"field_eslilevsimvb1713b17eslid170stsepitc17_d17c17",
"columns":[
{
"header":"",
"accessorKey":"field_eslilevsimvb1713b17eslid170stsepitc17_d17c17_field",
"columnLetter":"A",
"size":150,
"filterFn":"contains"
}
]
}
]
},
{
"header":"Код раздела",
"accessorKey":"kod_razdela",
"columns":[
},
{
"header":"Код раздела",
"accessorKey":"kod_razdela_kod_razdela",
"accessorKey":"field_kod_razdela",
"columns":[
{
"header":"Код раздела",
"accessorKey":"kod_razdela_kod_razdela_kod_razdela",
"header":"",
"accessorKey":"section_code",
"columnLetter":"B",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
}
]
}
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
},
{
"header":"ID статьи",
"accessorKey":"id_stati",
"columns":[
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
},
{
"header":"ID статьи",
"accessorKey":"id_stati_id_stati",
"accessorKey":"field_id_stati",
"columns":[
{
"header":"ID статьи",
"accessorKey":"id_stati_id_stati_id_stati",
"header":"",
"accessorKey":"item_id",
"columnLetter":"C",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
}
]
}
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
},
{
"header":"ID группы номенклатуры",
"accessorKey":"id_gruppy_nomenklatury",
"columns":[
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
},
{
"header":"ID группы номенклатуры",
"accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury",
"accessorKey":"field_id_gruppy_nomenklatury",
"columns":[
{
"header":"ID группы номенклатуры",
"accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury_id_gruppy_nomenklatury",
"header":"",
"accessorKey":"field_id_gruppy_nomenklatury_field",
"columnLetter":"D",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
}
]
}
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
},
{
"header":"Наименование оборудования",
"accessorKey":"naimenovanie_oborudovaniya",
"columns":[
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
},
{
"header":"Наименование оборудования",
"accessorKey":"naimenovanie_oborudovaniya_naimenovanie_oborudovaniya",
"accessorKey":"field_naimenovanie_oborudovaniya",
"columns":[
{
"header":"Наименование оборудования",
"accessorKey":"naimenovanie_oborudovaniya_naimenovanie_oborudovaniya_naimenovanie_oborudovaniya",
"header":"",
"accessorKey":"equipment_name",
"columnLetter":"E",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
}
]
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
}
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
]
},
{
"header":"60401, 60404",
@ -224,7 +229,8 @@
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"60401_60404_vkhodyaschiy_ostatok_kol_vo_sht",
"accessorKey":"b_604.opening_qty",
"columnLetter":"F",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -236,8 +242,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"60401_60404_vkhodyaschiy_ostatok_summa_tys_rub",
"size":150,
"accessorKey":"b_604.opening_amt",
"columnLetter":"G",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -260,7 +267,8 @@
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht",
"accessorKey":"b_604.acquired_qty",
"columnLetter":"H",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -272,8 +280,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub",
"size":150,
"accessorKey":"b_604.acquired_amt",
"columnLetter":"I",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -296,7 +305,8 @@
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"60401_60404_vybytie_v_otchetnom_mesyatse_kol_vo_sht",
"accessorKey":"b_604.disposed_qty",
"columnLetter":"J",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -308,8 +318,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"60401_60404_vybytie_v_otchetnom_mesyatse_summa_tys_rub",
"size":150,
"accessorKey":"b_604.disposed_amt",
"columnLetter":"K",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -344,7 +355,8 @@
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"60415_vkhodyaschiy_ostatok_kol_vo_sht",
"accessorKey":"b_60415.opening_qty",
"columnLetter":"L",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -356,8 +368,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"60415_vkhodyaschiy_ostatok_summa_tys_rub",
"size":150,
"accessorKey":"b_60415.opening_amt",
"columnLetter":"M",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -380,7 +393,8 @@
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht",
"accessorKey":"b_60415.acquired_qty",
"columnLetter":"N",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -392,8 +406,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub",
"size":150,
"accessorKey":"b_60415.acquired_amt",
"columnLetter":"O",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -416,7 +431,8 @@
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"60415_pereneseno_na_bschet_604_kol_vo_sht",
"accessorKey":"b_60415.transferred_qty",
"columnLetter":"P",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -428,8 +444,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"60415_pereneseno_na_bschet_604_summa_tys_rub",
"size":150,
"accessorKey":"b_60415.transferred_amt",
"columnLetter":"Q",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -464,7 +481,8 @@
"columns":[
{
"header":"тыс. руб.",
"accessorKey":"itogo_fakticheski_priobreteno_v_otchetnom_mesyatse_tys_rub",
"accessorKey":"totals.acquired_total",
"columnLetter":"R",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -488,12 +506,13 @@
"columns":[
{
"header":"тыс. руб.",
"accessorKey":"itogo_sredstva_tolko_po_balansuiz_go_so_znakom_tys_rub",
"accessorKey":"totals.go_balance_only",
"columnLetter":"S",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FFFFFF",
"backgroundColor":"#FF0000",
"color":"#000000"
}
}
@ -501,7 +520,7 @@
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FFFFFF",
"backgroundColor":"#FF0000",
"color":"#000000"
}
}
@ -512,7 +531,8 @@
"columns":[
{
"header":"тыс. руб.",
"accessorKey":"itogo_vybytie_v_otchetnom_mesyatse_tys_rub",
"accessorKey":"totals.disposed_total",
"columnLetter":"T",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -543,12 +563,13 @@
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu",
"columns":[
{
"header":"ИТОГО основные средства на балансе на отчетную дату",
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu",
"header":"",
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_field",
"columns":[
{
"header":"Кол-во (шт.)",
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_kol_vo_sht",
"accessorKey":"totals.balance_qty",
"columnLetter":"U",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
@ -560,8 +581,9 @@
},
{
"header":"Сумма (тыс. руб.)",
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_summa_tys_rub",
"size":150,
"accessorKey":"totals.balance_amt",
"columnLetter":"V",
"size":170,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
@ -570,7 +592,13 @@
}
}
}
]
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F",
"color":"#000000"
}
}
}
],
"muiTableHeadCellProps":{

View File

@ -10,81 +10,81 @@
export const config = {
"config":{
"colors":{
"field_pp_pp_pp":{
"section_code":{
"color_type":whiteColumn,
"accessorKey":"field_pp_pp_pp"
"accessorKey":"section_code"
},
"field_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat":{
"name":{
"color_type":whiteColumn,
"accessorKey":"field_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat"
"accessorKey":"name"
},
"field_raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal":{
"plan.support.q1":{
"color_type":whiteColumn,
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal"
"accessorKey":"plan.support.q1"
},
"field_raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal":{
"plan.support.q2":{
"color_type":whiteColumn,
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal"
"accessorKey":"plan.support.q2"
},
"field_raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal":{
"plan.support.q3":{
"color_type":whiteColumn,
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal"
"accessorKey":"plan.support.q3"
},
"field_raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal":{
"plan.support.q4":{
"color_type":whiteColumn,
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal"
"accessorKey":"plan.support.q4"
},
"field_utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal":{
"color_type":whiteColumn,
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal"
},
"field_utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal":{
"approved.support.q1":{
"color_type":whiteColumn,
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal"
"accessorKey":"approved.support.q1"
},
"field_utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal":{
"approved.support.q2":{
"color_type":whiteColumn,
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal"
"accessorKey":"approved.support.q2"
},
"field_utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal":{
"approved.support.q3":{
"color_type":whiteColumn,
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal"
"accessorKey":"approved.support.q3"
},
"field_fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal":{
"approved.support.year":{
"color_type":whiteColumn,
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal"
"accessorKey":"approved.support.year"
},
"field_fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal"
},
"field_fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal":{
"fact.support.q1":{
"color_type":whiteColumn,
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal"
"accessorKey":"fact.support.q1"
},
"field_fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal":{
"fact.support.q2":{
"color_type":whiteColumn,
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal"
"accessorKey":"fact.support.q2"
},
"field_skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal":{
"fact.support.q4":{
"color_type":whiteColumn,
"accessorKey":"field_skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal"
"accessorKey":"fact.support.q4"
},
"field_skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal":{
"fact.support.year":{
"color_type":whiteColumn,
"accessorKey":"field_skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal"
"accessorKey":"fact.support.year"
},
"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka":{
"plan.support.year":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka"
"accessorKey":"plan.support.year"
},
"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka":{
"approved.support.q4":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka"
"accessorKey":"approved.support.q4"
},
"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka":{
"fact.support.q3":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka"
"accessorKey":"fact.support.q3"
},
"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal":{
"color_type":whiteColumn,
@ -101,16 +101,23 @@
"accessorKey":"field_pp",
"columns":[
{
"header":"№ п/п",
"accessorKey":"field_pp_pp",
"header":"",
"accessorKey":"field_pp_field",
"columns":[
{
"header":"№ п/п",
"accessorKey":"field_pp_pp_pp",
"header":"",
"accessorKey":"section_code",
"columnLetter":"B",
"size":150,
"filterFn":"contains"
}
]
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#BFBFBF",
"color":"#000000"
}
}
}
],
"muiTableHeadCellProps":{
@ -125,16 +132,23 @@
"accessorKey":"field_perechen_raskhodov_i_zatrat",
"columns":[
{
"header":"Перечень расходов и затрат",
"accessorKey":"field_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
"header":"",
"accessorKey":"field_perechen_raskhodov_i_zatrat_field",
"columns":[
{
"header":"Перечень расходов и затрат",
"accessorKey":"field_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
"header":"",
"accessorKey":"name",
"columnLetter":"C",
"size":150,
"filterFn":"contains"
}
]
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#BFBFBF",
"color":"#000000"
}
}
}
],
"muiTableHeadCellProps":{
@ -154,7 +168,8 @@
"columns":[
{
"header":"I квартал",
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal",
"accessorKey":"plan.support.q1",
"columnLetter":"D",
"size":150,
"filterFn":"contains"
}
@ -172,7 +187,8 @@
"columns":[
{
"header":"II квартал",
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal",
"accessorKey":"plan.support.q2",
"columnLetter":"E",
"size":150,
"filterFn":"contains"
}
@ -190,7 +206,8 @@
"columns":[
{
"header":"III квартал",
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal",
"accessorKey":"plan.support.q3",
"columnLetter":"F",
"size":150,
"filterFn":"contains"
}
@ -208,7 +225,8 @@
"columns":[
{
"header":"IV квартал",
"accessorKey":"field_raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal",
"accessorKey":"plan.support.q4",
"columnLetter":"G",
"size":150,
"filterFn":"contains"
}
@ -239,6 +257,7 @@
{
"header":"I квартал",
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal",
"columnLetter":"I",
"size":150,
"filterFn":"contains"
}
@ -256,7 +275,8 @@
"columns":[
{
"header":"II квартал",
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal",
"accessorKey":"approved.support.q1",
"columnLetter":"J",
"size":150,
"filterFn":"contains"
}
@ -274,7 +294,8 @@
"columns":[
{
"header":"III квартал",
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal",
"accessorKey":"approved.support.q2",
"columnLetter":"K",
"size":150,
"filterFn":"contains"
}
@ -292,7 +313,8 @@
"columns":[
{
"header":"IV квартал",
"accessorKey":"field_utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal",
"accessorKey":"approved.support.q3",
"columnLetter":"L",
"size":150,
"filterFn":"contains"
}
@ -322,7 +344,8 @@
"columns":[
{
"header":"I квартал",
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal",
"accessorKey":"approved.support.year",
"columnLetter":"N",
"size":150,
"filterFn":"contains"
}
@ -341,6 +364,7 @@
{
"header":"II квартал",
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal",
"columnLetter":"O",
"size":150,
"filterFn":"contains"
}
@ -358,7 +382,8 @@
"columns":[
{
"header":"III квартал",
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal",
"accessorKey":"fact.support.q1",
"columnLetter":"P",
"size":150,
"filterFn":"contains"
}
@ -376,7 +401,8 @@
"columns":[
{
"header":"IV квартал",
"accessorKey":"field_fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal",
"accessorKey":"fact.support.q2",
"columnLetter":"Q",
"size":150,
"filterFn":"contains"
}
@ -406,7 +432,8 @@
"columns":[
{
"header":"II квартал",
"accessorKey":"field_skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal",
"accessorKey":"fact.support.q4",
"columnLetter":"S",
"size":150,
"filterFn":"contains"
}
@ -424,7 +451,8 @@
"columns":[
{
"header":"III квартал",
"accessorKey":"field_skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal",
"accessorKey":"fact.support.year",
"columnLetter":"T",
"size":150,
"filterFn":"contains"
}
@ -466,7 +494,8 @@
"columns":[
{
"header":"ИТОГОПоддержка",
"accessorKey":"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka",
"accessorKey":"plan.support.year",
"columnLetter":"H",
"size":150,
"filterFn":"contains"
}
@ -490,7 +519,8 @@
"columns":[
{
"header":"ИТОГОПоддержка",
"accessorKey":"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka",
"accessorKey":"approved.support.q4",
"columnLetter":"M",
"size":150,
"filterFn":"contains"
}
@ -514,7 +544,8 @@
"columns":[
{
"header":"ИТОГОПоддержка",
"accessorKey":"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka",
"accessorKey":"fact.support.q3",
"columnLetter":"R",
"size":150,
"filterFn":"contains"
}
@ -539,6 +570,7 @@
{
"header":"IV квартал",
"accessorKey":"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal",
"columnLetter":"U",
"size":150,
"filterFn":"contains"
}

View File

@ -7,7 +7,6 @@ import React, {
useEffect,
} from "react";
import { useWebSocket } from "../hooks/useWebSocket";
import { useCellLocks } from "../hooks/useCellLocks";
import { toast } from "react-toastify";
const RealtimeContext = createContext(null);
@ -28,7 +27,9 @@ export const RealtimeProvider = ({
userId,
}) => {
// Формируем URL (кастомные секреты на фронте пока недоступны, делаем через REACT_APP_ROOT_PATH)
const wsUrl = `${(process.env.REACT_APP_API_URL || process.env.REACT_APP_API_URL || process.env.REACT_APP_ROOT_PATH || "ws://localhost:8000").replace(/^http/, "ws")}/api/v1/ws/form/${formId}/sheet/${sheetName}${direction ? `?direction=${direction}` : ""}`; console.log()
const wsUrl = `${(process.env.REACT_APP_API_URL || process.env.REACT_APP_API_URL || process.env.REACT_APP_ROOT_PATH || "ws://localhost:8000").replace(/^http/, "ws")}/api/v1/ws/form/${formId}/sheet/${sheetName}${direction ? `?direction=${direction}` : ""}`;
//для ячеек которые редактируются другими пользователями
const [lockedCells, setLockedCells] = useState([]);
const handleMessage = useCallback((data) => {
// Обработка ошибок
if (data.error) {
@ -38,8 +39,21 @@ export const RealtimeProvider = ({
}
switch (data.event) {
case "cell_edit_start":
console.log("Cell edit started:", data);
if (onCellEditStartRef.current) {
onCellEditStartRef.current(data);
}
break;
case "cell_edit_end":
console.log("Cell edit ended:", data);
if ( onCellEditEndRef.current) {
onCellEditEndRef.current(data);
}
break;
case "cell_updated":
console.log(onCellUpdateRef.current);
if (data.result && onCellUpdateRef.current) {
const updatedCells = Array.isArray(data.result)
? data.result
@ -69,19 +83,14 @@ export const RealtimeProvider = ({
wsUrl,
handleMessage,
);
const {
isCellLocked,
tryLockCell,
unlockCell,
getCellLockInfo,
releaseAllLocks,
} = useCellLocks(null);
const onCellUpdateRef = useRef(null);
const onRowAddRef = useRef(null);
const onRowDeleteRef = useRef(null);
const onErrorRef = useRef(null);
const onAuthSuccessRef = useRef(null);
const onCellEditStartRef = useRef(null);
const onCellEditEndRef = useRef(null);
const authAttemptedRef = useRef(false);
const reconnectTimerRef = useRef(null);
@ -134,6 +143,70 @@ export const RealtimeProvider = ({
}
}, [isConnected]);
// Функция для начала редактирования ячейки
const startEditing = useCallback(
async (row, column) => {
const columnId = column.id;
const rowId = row.id;
if (!isConnected) {
onErrorRef.current?.("WebSocket не подключен");
return false;
}
const lineId = row.id || null;
const colId = columnId.slice(5); // убираем префикс "data."
const message = {
event: "cell_edit_start",
data: {
line_id: lineId,
column: colId,
},
};
const sent = sendMessage(message);
if (!sent) {
return false;
}
return true;
},
[isConnected, sendMessage],
);
// Функция для завершения редактирования ячейки
const endEditing = useCallback(
async (row, column) => {
const columnId = column.id;
const rowId = row.id;
if (!isConnected) {
onErrorRef.current?.("WebSocket не подключен");
return false;
}
const lineId = row.id || null;
const colId = columnId.slice(5);
const message = {
event: "cell_edit_end",
data: {
line_id: lineId,
column: colId,
},
};
const sent = sendMessage(message);
if (!sent) {
return false;
}
return true;
},
[isConnected, sendMessage],
);
const updateCell = useCallback(
async (row, column, value) => {
const columnId = column.id;
@ -180,7 +253,7 @@ export const RealtimeProvider = ({
};
return sendMessage(message);
},
[isConnected, sendMessage],
[isConnected, sendMessage, sheetName, formId, direction],
);
const deleteRow = useCallback(
@ -200,7 +273,7 @@ export const RealtimeProvider = ({
return sendMessage(message);
},
[isConnected, sendMessage],
[isConnected, sendMessage, sheetName, formId, direction],
);
const subscribeToCellUpdates = useCallback((callback) => {
@ -238,6 +311,20 @@ export const RealtimeProvider = ({
};
}, []);
const subscribeToCellEditStart = useCallback((callback) => {
onCellEditStartRef.current = callback;
return () => {
onCellEditStartRef.current = null;
};
}, []);
const subscribeToCellEditEnd = useCallback((callback) => {
onCellEditEndRef.current = callback;
return () => {
onCellEditEndRef.current = null;
};
}, []);
const retryLogin = useCallback(() => {
if (isConnected) {
authAttemptedRef.current = false;
@ -250,23 +337,25 @@ export const RealtimeProvider = ({
value={{
isConnected,
error: lastError,
startEditing,
endEditing,
updateCell,
addRow,
deleteRow,
isCellLocked: (rowId, columnId) =>
isCellLocked(rowId, columnId, userId),
getCellLockInfo: (rowId, columnId) => getCellLockInfo(rowId, columnId),
tryLockCell: (rowId, columnId) => tryLockCell(rowId, columnId, userId),
subscribeToCellUpdates,
subscribeToRowAdds,
subscribeToRowDeletes,
subscribeToErrors,
subscribeToAuthSuccess,
subscribeToCellEditStart,
subscribeToCellEditEnd,
subscribeToCellUpdates,
retryLogin,
lockedCells,
setLockedCells,
releaseAllLocks: () => releaseAllLocks(userId),
}}
>
{children}
</RealtimeContext.Provider>
);
};
};

View File

@ -1,122 +0,0 @@
import { useState, useCallback, useRef, useEffect } from 'react';
export const useCellLocks = (userId, lockTimeout = 30000) => {
const [lockedCells, setLockedCells] = useState(new Map());
const lockTimersRef = useRef(new Map());
const getCellKey = (rowId, columnId) => `${rowId}_${columnId}`;
const lockCell = useCallback((rowId, columnId, lockingUserId) => {
const cellKey = getCellKey(rowId, columnId);
setLockedCells(prev => {
const newLocks = new Map(prev);
const existingLock = newLocks.get(cellKey);
if (existingLock && existingLock.userId !== lockingUserId) {
return prev; // Cell already locked by another user
}
newLocks.set(cellKey, {
userId: lockingUserId,
lockedAt: Date.now(),
rowId,
columnId
});
return newLocks;
});
return true;
}, []);
const unlockCell = useCallback((rowId, columnId, unlockingUserId) => {
const cellKey = getCellKey(rowId, columnId);
setLockedCells(prev => {
const newLocks = new Map(prev);
const lock = newLocks.get(cellKey);
if (lock && lock.userId === unlockingUserId) {
newLocks.delete(cellKey);
}
return newLocks;
});
// Clear timer if exists
if (lockTimersRef.current.has(cellKey)) {
clearTimeout(lockTimersRef.current.get(cellKey));
lockTimersRef.current.delete(cellKey);
}
}, []);
const tryLockCell = useCallback((rowId, columnId, currentUserId) => {
const cellKey = getCellKey(rowId, columnId);
const existingLock = lockedCells.get(cellKey);
if (existingLock && existingLock.userId !== currentUserId) {
return false; // Cell is locked by another user
}
if (!existingLock) {
lockCell(rowId, columnId, currentUserId);
// Auto-unlock after timeout
const timer = setTimeout(() => {
unlockCell(rowId, columnId, currentUserId);
}, lockTimeout);
lockTimersRef.current.set(cellKey, timer);
}
return true;
}, [lockedCells, lockCell, unlockCell, lockTimeout]);
const releaseAllLocks = useCallback((userId) => {
setLockedCells(prev => {
const newLocks = new Map(prev);
for (const [key, lock] of newLocks.entries()) {
if (lock.userId === userId) {
newLocks.delete(key);
if (lockTimersRef.current.has(key)) {
clearTimeout(lockTimersRef.current.get(key));
lockTimersRef.current.delete(key);
}
}
}
return newLocks;
});
}, []);
const isCellLocked = useCallback((rowId, columnId, currentUserId) => {
const cellKey = getCellKey(rowId, columnId);
const lock = lockedCells.get(cellKey);
return lock && lock.userId !== currentUserId;
}, [lockedCells]);
const getCellLockInfo = useCallback((rowId, columnId) => {
const cellKey = getCellKey(rowId, columnId);
return lockedCells.get(cellKey);
}, [lockedCells]);
useEffect(() => {
return () => {
// Clear all timers on unmount
for (const timer of lockTimersRef.current.values()) {
clearTimeout(timer);
}
lockTimersRef.current.clear();
};
}, []);
return {
lockedCells,
lockCell,
unlockCell,
tryLockCell,
isCellLocked,
getCellLockInfo,
releaseAllLocks
};
};

View File

@ -8,6 +8,7 @@ const useRealtimeData = (formId, sheetName, direction) => {
const [isConnected, setIsConnected] = useState(false);
const [error, setError] = useState(null);
const [isLoading, setIsLoading] = useState(true);
const [editingCells, setEditingCells] = useState({});
const dataRef = useRef(data);
const {
@ -17,9 +18,11 @@ const useRealtimeData = (formId, sheetName, direction) => {
subscribeToRowAdds,
subscribeToRowDeletes,
subscribeToErrors,
subscribeToCellEditStart,
subscribeToCellEditEnd,
setLockedCells,
} = useRealtime();
// Ваша существующая функция форматирования
const formatedToSubRows = useCallback((depth, oldData) => {
if (depth === 0) return oldData;
@ -204,6 +207,32 @@ const useRealtimeData = (formId, sheetName, direction) => {
});
});
// Обработчик начала редактирования ячейки
const unsubscribeCellEditStart = subscribeToCellEditStart((data) => {
const dataCell = data.data;
dataCell.column = "data." + dataCell.column;
if (data.is_self) {
setEditingCells(data.data);
return;
}
const { line_id, column } = dataCell;
const cellKey = `${line_id}_${column}`;
// Сохраняем информацию о том, кто начал редактирование
setLockedCells((prev) => [...prev, cellKey]);
});
// Обработчик завершения редактирования ячейки
const unsubscribeCellEditEnd = subscribeToCellEditEnd((data) => {
setEditingCells(null);
const dataCell = data.data;
dataCell.column = "data." + dataCell.column;
const { line_id, column } = dataCell;
const cellKey = `${line_id}_${column}`;
setLockedCells((prev) => prev.filter((c) => c !== cellKey));
});
const unsubscribeErrors = subscribeToErrors((err) => {
console.error("WebSocket error:", err);
setError(err);
@ -215,6 +244,8 @@ const useRealtimeData = (formId, sheetName, direction) => {
unsubscribeRowAdds();
unsubscribeRowDeletes();
unsubscribeErrors();
unsubscribeCellEditStart();
unsubscribeCellEditEnd();
};
}, [
wsConnected,
@ -222,6 +253,8 @@ const useRealtimeData = (formId, sheetName, direction) => {
subscribeToRowAdds,
subscribeToRowDeletes,
subscribeToErrors,
subscribeToCellEditStart,
subscribeToCellEditEnd,
formatedToSubRows,
]);
@ -247,10 +280,10 @@ const useRealtimeData = (formId, sheetName, direction) => {
return {
data,
setData,
// setData: updateData,
isConnected,
isLoading,
error,
editingCells,
};
};

View File

@ -97,22 +97,13 @@ export const getTableColumns = ({
EditCell,
columnsConfig,
onCellUpdateError,
onCellNumberClick
onCellNumberClick,
}) => {
const columnColors = { ...columnsConfig.colors };
const columns = [...columnsConfig.columns];
const processColumns = (columns, EditCell, Cell) => {
columns.forEach((col) => {
if (col.header.length > 15) {
col.size = 250;
}
if(col.header.length >= 20){
col.size = 350;
}
if(col.header.length >= 30){
col.size = 400;
}
col.Cell = ({ cell, table, column, row }) => (
<Cell
row={row}

View File

@ -26,6 +26,7 @@ import { formatDate } from '../../utils/formatDate';
import { IconWithContent } from './IconWithContent';
import { Chip } from '../styles/StyledChip';
import { ExportButton } from '../common/Buttons/ButtonsActions';
import { FROM_TYPE_TRANSLATE } from '../../constants';
const TaskCard = styled.div`
width: 26.8rem;
@ -99,15 +100,9 @@ export const TaskCardComponent = ({
const [isEditModalOpen, setEditModalOpen] = useState(false);
const [editedTitle, setEditedTitle] = useState('');
const [currentTitle, setCurrentTitle] = useState(form_type_code ||'');
const [currentTitle, setCurrentTitle] = useState(FROM_TYPE_TRANSLATE[form_type_code] ||'');
const [isChecked, setIsChecked] = useState(false);
const initialTitle = form_type_code ||'';
useEffect(() => {
setCurrentTitle(initialTitle);
}, [initialTitle]);
useEffect(() => {
setIsChecked(false);
}, [exportMode]);
@ -202,7 +197,7 @@ export const TaskCardComponent = ({
{!isForm && !exportMode && (
<ExportButton onClick={handleExportTask} />
)}
<Edit onClick={handleOpenEdit} />
{/* <Edit onClick={handleOpenEdit} /> */}
</Stack>
</CardHeader>

View File

@ -36,6 +36,7 @@ export const EDIT_ACCESS_RUSSIAN = {
};
export const FORM_TYPE_OPTIONS = ['FORM_1', 'FORM_2', 'FORM_3', 'FORM_4'];
export const FROM_TYPE_TRANSLATE = { 'FORM_1': 'Смета ССП', 'FORM_2': 'Смета РФ', 'FORM_3': 'Программа развитие ПРРС', 'FORM_4': 'Проектная деятельность' };
export const ORG_UNIT_TYPE_OPTIONS = [
{ value: 'ssp', label: 'ССП' },

View File

@ -22,13 +22,13 @@ import { ModalCreateProject } from './ModalCreateProject';
import { ExportWithTextButton } from '../../components/common/Buttons/ButtonsActions';
import { exportSingleForm } from '../../utils/exportForm';
import TablesList from '../../components/common/TableList/TableList';
import { SHEET_NAME } from '../../constants';
import { FROM_TYPE_TRANSLATE, SHEET_NAME } from '../../constants';
const TaskInfo = ({ task }) => {
const portalContent = (
<TaskInfoContainer>
<BackButton to="/tasks" />
<NameTask>{task.form_type_code}</NameTask>
<NameTask>{FROM_TYPE_TRANSLATE[task.form_type_code] || ''}</NameTask>
</TaskInfoContainer>
);