В базе данных  есть таблица.
Это данные о строительных расходах для проекта жилого здания (ProjectId = 1).

```
Id;NumberItem;NodeCode;CostName;ISRComment;ContractorComment;UnitOfMeasure;ConsumptionCoefficient;BOCount;TotalCount;MatEquipmPrice;SmpPnpPrice;TotalPrice;MatEquipmCost;SmpPnpCost;TotalCost;ProjectId
1;1. Жилое здание;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;16251230.90;14893287.17;31144518.07;1
2;1.1;6;Затраты на строительство;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;16251230.90;14893287.17;31144518.07;1
3;1.1.1;6.2;СМР корпуса без отделки;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;16251230.90;14842708.53;31093939.43;1
4;1.1.1.1;6.2.1;СМР подземной части корпуса;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;143070.00;143070.00;1
5;1.1.1.1.1;6.2.1.8;Прочие затраты по СМР подземной части;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;143070.00;143070.00;1
6;1.1.1.1.1.1;6.2.1.8.1;Внутренние стены и перегородки подземной части;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;143070.00;143070.00;1
7;1.1.1.1.1.1.1;6.2.1.8.1.99;Прочие работы;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;143070.00;143070.00;1
8;1.1.1.1.1.1.1.1;6.2.1.8.1.99.2.1;Работы по затарке материалов от места складирования до рабочих мест в техподполье;NULL;применительно для затарки всех материалов на всех этажах до рабочих мест;т;1.00;NULL;190.00;0.00;753.00;753.00;0.00;143070.00;143070.00;1
9;1.1.1.2;6.2.2;СМР надземной части корпуса (без отделки);NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;16251230.90;14699638.53;30950869.43;1
10;1.1.1.2.1;6.2.2.4;Внутренние стены и перегородки;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;13677772.58;13112400.03;26790172.61;1
11;1.1.1.2.1.1;6.2.2.4.1;Устройство стен;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;9051539.46;7609241.80;16660781.26;1
12;1.1.1.2.1.1.1;6.2.2.4.1.2.1;Кладка стен из блоков ячеистого бетона без устройства перемычек, включая армирование, устройство примыканий;Выгружается из БО по объектам BIM-КЦ;С3;м3;1.00;NULL;1193.75;7410.40;6254.00;13664.40;8846165.00;7465712.50;16311877.50;1
13;1.1.1.2.1.1.1.1;NULL;Материалы для примыкания / уплотняющий жгут, клей на м3;NULL;NULL;комплект;1.00;NULL;1193.75;175.75;0.00;0.00;209801.56;NULL;NULL;1
14;1.1.1.2.1.1.1.2;NULL;Сетка базальтовая b=1000мм, ячейка 50х50, 50/50кН/м;NULL;NULL;пог. м;2.20;NULL;2626.25;88.80;0.00;0.00;233211.00;NULL;NULL;1
15;1.1.1.2.1.1.1.3;NULL;"Прочие материалы для кладки / из газобетона / 200 мм ";NULL;NULL;комплект;1.00;NULL;1193.75;326.80;0.00;0.00;390117.50;NULL;NULL;1
16;1.1.1.2.1.1.1.4;NULL;Клей для газобетона Путрок_/МС112 F;NULL;NULL;кг;25.00;NULL;29843.75;10.05;0.00;0.00;299929.69;NULL;NULL;1
17;1.1.1.2.1.1.1.5;NULL;Блок газобетонный D600 600х200х300мм;NULL;NULL;м3;1.03;NULL;1229.56;6200.00;0.00;0.00;7623290.60;NULL;NULL;1
18;1.1.1.2.1.1.1.6;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;12.00;NULL;14325.00;6.27;0.00;0.00;89817.75;NULL;NULL;1
19;1.1.1.2.1.1.2;6.2.2.4.1.4.1;Кладка стен из пазогребневых силикатных блоков без устройства перемычек, включая армирование, крепление к стенам, заделку примыканий, зачеканку швов;Выгружается из БО по объектам BIM-КЦ;С2, подземная часть;м3;1.00;NULL;7.80;8948.60;6254.00;15202.60;69799.08;48781.20;118580.28;1
20;1.1.1.2.1.1.2.1;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;14.00;NULL;109.20;6.27;0.00;0.00;684.68;NULL;NULL;1
21;1.1.1.2.1.1.2.2;NULL;Прочие материалы для кладки / из силикатных блоков / 250;NULL;NULL;комплект;1.00;NULL;7.80;349.65;0.00;0.00;2727.27;NULL;NULL;1
22;1.1.1.2.1.1.2.3;NULL;Клей монтажный Гипсовый, эксплуатация при t=-30...+70C, жизнеспособность раствора 30мин;NULL;NULL;кг;27.00;NULL;210.60;7.50;0.00;0.00;1579.50;NULL;NULL;1
23;1.1.1.2.1.1.2.4;NULL;Блок силикатный пазогребневый Полнотелый 250мм;NULL;NULL;м3;1.03;NULL;8.03;8066.67;0.00;0.00;64807.63;NULL;NULL;1
24;1.1.1.2.1.1.3;6.2.2.4.1.4.1;Кладка стен из пазогребневых силикатных блоков без устройства перемычек, включая армирование, крепление к стенам, заделку примыканий, зачеканку швов;Выгружается из БО по объектам BIM-КЦ;С2 пристройка;м3;1.00;NULL;15.15;8948.87;6254.00;15202.87;135575.38;94748.10;230323.48;1
25;1.1.1.2.1.1.3.1;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;14.00;NULL;212.10;6.27;0.00;0.00;1329.87;NULL;NULL;1
26;1.1.1.2.1.1.3.2;NULL;Прочие материалы для кладки / из силикатных блоков / 250;NULL;NULL;комплект;1.00;NULL;15.15;349.65;0.00;0.00;5297.20;NULL;NULL;1
27;1.1.1.2.1.1.3.3;NULL;Клей монтажный Гипсовый, эксплуатация при t=-30...+70C, жизнеспособность раствора 30мин;NULL;NULL;кг;27.00;NULL;409.05;7.50;0.00;0.00;3067.88;NULL;NULL;1
28;1.1.1.2.1.1.3.4;NULL;Блок силикатный пазогребневый Полнотелый 250мм;NULL;NULL;м3;1.03;NULL;15.61;8066.67;0.00;0.00;125880.39;NULL;NULL;1
29;1.1.1.2.1.2;6.2.2.4.2;Устройство перегородок;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;3687706.14;5168554.05;8856260.19;1
30;1.1.1.2.1.2.1;6.2.2.4.2.1;Устройство перегородок из кирпича и блоков;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;509322.00;509322.00;1
31;1.1.1.2.1.2.1.1;6.2.2.4.2.1.7.1;Монтаж, демонтаж, аренда строительных лесов;NULL;NULL;м2;1.00;NULL;1697.74;0.00;300.00;300.00;0.00;509322.00;509322.00;1
32;1.1.1.2.1.2.2;6.2.2.4.2.2;Устройство перегородок из пазогребневых плит;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;3687706.14;4659232.05;8346938.19;1
33;1.1.1.2.1.2.2.1;6.2.2.4.2.2.1.1;Устройство перегородок из ПГП без устройства перемычек, включая проклейку углов примыкания армирующей лентой, толщ. до 115 мм;Выгружается из БО по объектам BIM-КЦ;NULL;м2;1.00;NULL;59.20;975.09;1331.00;2306.09;57725.33;78795.20;136520.53;1
34;1.1.1.2.1.2.2.1.1;NULL;Клей для ПГП_/;NULL;NULL;кг;2.00;NULL;118.40;7.90;0.00;0.00;935.36;NULL;NULL;1
35;1.1.1.2.1.2.2.1.2;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;1.71;NULL;101.23;6.27;0.00;0.00;634.72;NULL;NULL;1
36;1.1.1.2.1.2.2.1.3;NULL;Силикатный пазогребневый блок / пустотелый / 498х115х248;NULL;NULL;м2;1.02;NULL;60.38;753.50;0.00;0.00;45499.34;NULL;NULL;1
37;1.1.1.2.1.2.2.1.4;NULL;Прочий материал для кладки перегородок из ПГП (скоба,шуруп, дюбель, лента армирующая, лента дихтунгсбанд);NULL;NULL;комплект;1.00;NULL;59.20;169.00;0.00;0.00;10004.80;NULL;NULL;1
38;1.1.1.2.1.2.2.1.5;NULL;Материалы для примыкания / мина вата, штукатурная смесь м2;NULL;NULL;комплект;1.00;NULL;59.20;11.00;0.00;0.00;651.20;NULL;NULL;1
39;1.1.1.2.1.2.2.2;6.2.2.4.2.2.1.1;Устройство перегородок из ПГП без устройства перемычек, включая проклейку углов примыкания армирующей лентой, толщ. до 115 мм;Выгружается из БО по объектам BIM-КЦ;NULL;м2;1.00;NULL;2525.59;1083.72;1331.00;2414.72;2737032.39;3361560.29;6098592.68;1
40;1.1.1.2.1.2.2.2.1;NULL;Клей для ПГП_/;NULL;NULL;кг;2.00;NULL;5051.18;7.90;0.00;0.00;39904.32;NULL;NULL;1
41;1.1.1.2.1.2.2.2.2;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;1.71;NULL;4318.76;6.27;0.00;0.00;27078.62;NULL;NULL;1
42;1.1.1.2.1.2.2.2.3;NULL;Прочий материал для кладки перегородок из ПГП (скоба,шуруп, дюбель, лента армирующая, лента дихтунгсбанд);NULL;NULL;комплект;1.00;NULL;2525.59;169.00;0.00;0.00;426824.71;NULL;NULL;1
43;1.1.1.2.1.2.2.2.4;NULL;Плита гипсовая пазогребневая Влагостойкая, полнотелая 667х500х80мм;NULL;NULL;м2;1.02;NULL;2576.10;860.00;0.00;0.00;2215447.72;NULL;NULL;1
44;1.1.1.2.1.2.2.2.5;NULL;Материалы для примыкания / мина вата, штукатурная смесь м2;NULL;NULL;комплект;1.00;NULL;2525.59;11.00;0.00;0.00;27781.49;NULL;NULL;1
45;1.1.1.2.1.2.2.3;6.2.2.4.2.2.1.1;Устройство перегородок из ПГП без устройства перемычек, включая проклейку углов примыкания армирующей лентой, толщ. до 115 мм;Выгружается из БО по объектам BIM-КЦ;С1, С23 подземная часть;м2;1.00;NULL;680.77;975.09;1331.00;2306.09;663812.02;906104.87;1569916.89;1
46;1.1.1.2.1.2.2.3.1;NULL;Клей для ПГП_/;NULL;NULL;кг;2.00;NULL;1361.54;7.90;0.00;0.00;10756.17;NULL;NULL;1
47;1.1.1.2.1.2.2.3.2;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;1.71;NULL;1164.12;6.27;0.00;0.00;7299.01;NULL;NULL;1
48;1.1.1.2.1.2.2.3.3;NULL;Силикатный пазогребневый блок / пустотелый / 498х115х248;NULL;NULL;м2;1.02;NULL;694.39;753.50;0.00;0.00;523219.10;NULL;NULL;1
49;1.1.1.2.1.2.2.3.4;NULL;Прочий материал для кладки перегородок из ПГП (скоба,шуруп, дюбель, лента армирующая, лента дихтунгсбанд);NULL;NULL;комплект;1.00;NULL;680.77;169.00;0.00;0.00;115050.13;NULL;NULL;1
50;1.1.1.2.1.2.2.3.5;NULL;Материалы для примыкания / мина вата, штукатурная смесь м2;NULL;NULL;комплект;1.00;NULL;680.77;11.00;0.00;0.00;7488.47;NULL;NULL;1
51;1.1.1.2.1.2.2.4;6.2.2.4.2.2.1.1;Устройство перегородок из ПГП без устройства перемычек, включая проклейку углов примыкания армирующей лентой, толщ. до 115 мм;Выгружается из БО по объектам BIM-КЦ;С1, С23 пристройка;м2;1.00;NULL;234.99;975.09;1331.00;2306.09;229136.40;312771.69;541908.09;1
52;1.1.1.2.1.2.2.4.1;NULL;Клей для ПГП_/;NULL;NULL;кг;2.00;NULL;469.98;7.90;0.00;0.00;3712.84;NULL;NULL;1
53;1.1.1.2.1.2.2.4.2;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;1.71;NULL;401.83;6.27;0.00;0.00;2519.49;NULL;NULL;1
54;1.1.1.2.1.2.2.4.3;NULL;Силикатный пазогребневый блок / пустотелый / 498х115х248;NULL;NULL;м2;1.02;NULL;239.69;753.50;0.00;0.00;180606.42;NULL;NULL;1
55;1.1.1.2.1.2.2.4.4;NULL;Прочий материал для кладки перегородок из ПГП (скоба,шуруп, дюбель, лента армирующая, лента дихтунгсбанд);NULL;NULL;комплект;1.00;NULL;234.99;169.00;0.00;0.00;39713.31;NULL;NULL;1
56;1.1.1.2.1.2.2.4.5;NULL;Материалы для примыкания / мина вата, штукатурная смесь м2;NULL;NULL;комплект;1.00;NULL;234.99;11.00;0.00;0.00;2584.89;NULL;NULL;1
57;1.1.1.2.1.3;6.2.2.4.3;Устройство перемычек и фахверков;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;938526.98;334604.18;1273131.16;1
58;1.1.1.2.1.3.1;6.2.2.4.3.2.1;Устройство перемычек металлических с огрунтовкой и окраской;Выгружается из БО по объектам BIM-КЦ;NULL;т;1.00;NULL;3.92;126982.21;47073.00;174055.21;497770.26;184526.16;682296.42;1
59;1.1.1.2.1.3.1.1;NULL;Анкерный стержень для перемычек;NULL;NULL;шт;1.00;NULL;933.00;150.10;0.00;0.00;140043.30;NULL;NULL;1
60;1.1.1.2.1.3.1.2;NULL;Уголок стальной для перемычек;NULL;NULL;т;1.03;NULL;4.16;83253.35;0.00;0.00;346417.19;NULL;NULL;1
61;1.1.1.2.1.3.1.3;NULL;Прочий материал для перемычек (клей, грунт) / для полосы или уголка;NULL;NULL;комплект;1.00;NULL;3.92;2885.15;0.00;0.00;11309.79;NULL;NULL;1
62;1.1.1.2.1.3.2;6.2.2.4.3.2.1;Устройство перемычек металлических с огрунтовкой и окраской;Выгружается из БО по объектам BIM-КЦ;подземная часть и пристройка;т;1.00;NULL;0.20;422104.20;47073.00;469177.20;84420.84;9414.60;93835.44;1
63;1.1.1.2.1.3.2.1;NULL;Анкерный стержень для перемычек;NULL;NULL;шт;1.00;NULL;441.00;150.10;0.00;0.00;66194.10;NULL;NULL;1
64;1.1.1.2.1.3.2.2;NULL;Уголок стальной для перемычек;NULL;NULL;т;1.03;NULL;0.21;83253.35;0.00;0.00;17649.71;NULL;NULL;1
65;1.1.1.2.1.3.2.3;NULL;Прочий материал для перемычек (клей, грунт) / для полосы или уголка;NULL;NULL;комплект;1.00;NULL;0.20;2885.15;0.00;0.00;577.03;NULL;NULL;1
66;1.1.1.2.1.3.3;6.2.2.4.3.3.1;Устройство металлоконструкций фахверков, стоек, рам, балок, опорных конструкций и усилений с учетом крепления, огрунтовки и окрашивания;NULL;подземная часть и пристройка;т;1.00;NULL;1.66;214660.17;84737.00;299397.17;356335.88;140663.42;496999.30;1
67;1.1.1.2.1.3.3.1;NULL;Металлоконструкции (труба, профиль стальной, прокат квадратный, прокат листовой, уголок, арматура и др.);NULL;NULL;т;1.00;NULL;1.66;214263.00;0.00;0.00;355676.58;NULL;NULL;1
68;1.1.1.2.1.3.3.2;NULL;Анкер распорный для высоких нагрузок_ / М10;NULL;NULL;шт;1.00;NULL;694.00;0.95;0.00;0.00;659.30;NULL;NULL;1
69;1.1.1.2.2;6.2.2.5;Наружные стены;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;2573458.32;1587238.50;4160696.82;1
70;1.1.1.2.2.1;6.2.2.5.1;Устройство наружных стен;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;1246445.85;1053298.68;2299744.53;1
71;1.1.1.2.2.1.1;6.2.2.5.1.1.1;Кладка стен из блоков ячеистого бетона без устройства перемычек, включая армирование, устройство примыканий;Выгружается из БО по объектам BIM-КЦ;NULL;м3;1.00;NULL;147.80;7410.40;6254.00;13664.40;1095257.12;924341.20;2019598.32;1
72;1.1.1.2.2.1.1.1;NULL;Материалы для примыкания / уплотняющий жгут, клей на м3;NULL;NULL;комплект;1.00;NULL;147.80;175.75;0.00;0.00;25975.85;NULL;NULL;1
73;1.1.1.2.2.1.1.2;NULL;Сетка базальтовая b=1000мм, ячейка 50х50, 50/50кН/м;NULL;NULL;пог. м;2.20;NULL;325.16;88.80;0.00;0.00;28874.21;NULL;NULL;1
74;1.1.1.2.2.1.1.3;NULL;"Прочие материалы для кладки / из газобетона / 200 мм ";NULL;NULL;комплект;1.00;NULL;147.80;326.80;0.00;0.00;48301.04;NULL;NULL;1
75;1.1.1.2.2.1.1.4;NULL;Клей для газобетона Путрок_/МС112 F;NULL;NULL;кг;25.00;NULL;3695.00;10.05;0.00;0.00;37134.75;NULL;NULL;1
76;1.1.1.2.2.1.1.5;NULL;Блок газобетонный D600 600х200х300мм;NULL;NULL;м3;1.03;NULL;152.23;6200.00;0.00;0.00;943850.80;NULL;NULL;1
77;1.1.1.2.2.1.1.6;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;12.00;NULL;1773.60;6.27;0.00;0.00;11120.47;NULL;NULL;1
78;1.1.1.2.2.1.2;6.2.2.5.1.1.1;Кладка стен из блоков ячеистого бетона без устройства перемычек, включая армирование, устройство примыканий;Выгружается из БО по объектам BIM-КЦ;С4;м3;1.00;NULL;20.62;7332.14;6254.00;13586.14;151188.73;128957.48;280146.21;1
79;1.1.1.2.2.1.2.1;NULL;Материалы для примыкания / уплотняющий жгут, клей на м3;NULL;NULL;комплект;1.00;NULL;20.62;175.75;0.00;0.00;3623.97;NULL;NULL;1
80;1.1.1.2.2.1.2.2;NULL;Сетка базальтовая b=1000мм, ячейка 50х50, 50/50кН/м;NULL;NULL;пог. м;2.20;NULL;45.36;88.80;0.00;0.00;4028.32;NULL;NULL;1
81;1.1.1.2.2.1.2.3;NULL;"Прочие материалы для кладки / из газобетона / 150 мм ";NULL;NULL;комплект;1.00;NULL;20.62;248.42;0.00;0.00;5122.42;NULL;NULL;1
82;1.1.1.2.2.1.2.4;NULL;Клей для газобетона Путрок_/МС112 F;NULL;NULL;кг;25.00;NULL;515.50;10.05;0.00;0.00;5180.78;NULL;NULL;1
83;1.1.1.2.2.1.2.5;NULL;Блок газобетонный D600 600х100х300мм;NULL;NULL;м3;1.03;NULL;21.24;6200.00;0.00;0.00;131681.80;NULL;NULL;1
84;1.1.1.2.2.1.2.6;NULL;"Смесь сухая цементно-песчаная ";NULL;NULL;кг;12.00;NULL;247.44;6.27;0.00;0.00;1551.45;NULL;NULL;1
85;1.1.1.2.2.2;6.2.2.5.2;Устройство перемычек и фахверков;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;1236730.72;488932.49;1725663.21;1
86;1.1.1.2.2.2.1;6.2.2.5.2.1.1;Устройство металлоконструкций фахверков, стоек, рам, балок, опорных конструкций и усилений с учетом крепления, огрунтовки и окрашивания;Выгружается из БО по объектам BIM-КЦ;NULL;т;1.00;NULL;5.77;214338.08;84737.00;299075.08;1236730.72;488932.49;1725663.21;1
87;1.1.1.2.2.2.1.1;NULL;Металлоконструкции (труба, профиль стальной, прокат квадратный, прокат листовой, уголок, арматура и др.);NULL;NULL;т;1.00;NULL;5.77;214263.00;0.00;0.00;1236297.51;NULL;NULL;1
88;1.1.1.2.2.2.1.2;NULL;Анкер распорный для высоких нагрузок_ / М10;NULL;NULL;шт;1.00;NULL;456.00;0.95;0.00;0.00;433.20;NULL;NULL;1
89;1.1.1.2.2.3;6.2.2.5.99;Прочие работы;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;90281.75;45007.33;135289.08;1
90;1.1.1.2.2.3.1;6.2.2.5.99.1.1;Укладка теплоизоляционных материалов в деформационый шов;NULL;подземная часть и пристройка;м3;1.00;NULL;4.60;6986.49;3483.00;10469.49;32137.85;16021.80;48159.65;1
91;1.1.1.2.2.3.1.1;NULL;Пенополистирол экструдированный_;NULL;NULL;м3;1.03;NULL;4.74;6783.00;0.00;0.00;32137.85;NULL;NULL;1
92;1.1.1.2.2.3.2;6.2.2.5.99.1.1;Укладка теплоизоляционных материалов в деформационый шов;NULL;NULL;м3;1.00;NULL;8.32;6986.77;3483.00;10469.77;58143.90;28985.53;87129.43;1
93;1.1.1.2.2.3.2.1;NULL;Пенополистирол экструдированный_;NULL;NULL;м3;1.03;NULL;8.57;6783.00;0.00;0.00;58143.88;NULL;NULL;1
94;1.1.2;6.3;Отделка, столярные работы, мебель и оборудование;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;50578.64;50578.64;1
95;1.1.2.1;6.3.1;Отделка нежилых помещений;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;50578.64;50578.64;1
96;1.1.2.1.1;6.3.1.3;Отделка кладовых;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;50578.64;50578.64;1
97;1.1.2.1.1.1;6.3.1.3.1;Полы;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;50578.64;50578.64;1
98;1.1.2.1.1.1.1;6.3.1.3.1.2;Устройство покрытия полов;NULL;NULL;NULL;NULL;NULL;NULL;NULL;0.00;0.00;0.00;50578.64;50578.64;1
99;1.1.2.1.1.1.1.1;6.3.1.3.1.2.2.1;Устройство монолитного железобетонного порога;NULL;кладовые и пристройка;м3;1.00;NULL;1.81;0.00;27944.00;27944.00;0.00;50578.64;50578.64;1
```
вот новая структура базы данных
```
public class CostCategory
{
    public int CostCategoryId { get; set; }
    public string NumberItem { get; set; }
    public string NodeCode { get; set; }
    public string CostName { get; set; }
    public int? ParentCostCategoryId { get; set; }
    public CostCategory ParentCostCategory { get; set; }
    public int ProjectId { get; set; }
    public Project Project { get; set; }
    public bool Type { get; set; } // 1 – Работа, 0 – Материал
    public string ISRComment { get; set; }
    public string ContractorComment { get; set; }
    // Навигационные свойства
    public ICollection<CostCategory> ChildCostCategories { get; set; }
    public Work Work { get; set; }
    public Material Material { get; set; }
}

public class UnitOfMeasure
{
    public int UnitOfMeasureId { get; set; }
    public string UnitName { get; set; }
    public ICollection<Work> Works { get; set; }
    public ICollection<Material> Materials { get; set; }
}

public class Work
{
    public int WorkId { get; set; }
    public int CostCategoryId { get; set; }
    public CostCategory CostCategory { get; set; }
    public int UnitOfMeasureId { get; set; }
    public UnitOfMeasure UnitOfMeasure { get; set; }
    public decimal ConsumptionCoefficient { get; set; }
    public decimal BOCount { get; set; }
    public decimal TotalCount { get; set; }
    public decimal MatEquipmPrice { get; set; }
    public decimal SmpPnpPrice { get; set; }
    public decimal TotalPrice { get; set; }
    public decimal MatEquipmCost { get; set; }
    public decimal SmpPnpCost { get; set; }
    public decimal TotalCost { get; set; }
}

public class Material
{
    public int MaterialId { get; set; }
    public int CostCategoryId { get; set; }
    public CostCategory CostCategory { get; set; }
    public int UnitOfMeasureId { get; set; }
    public UnitOfMeasure UnitOfMeasure { get; set; }
    public decimal ConsumptionCoefficient { get; set; }
    public decimal BOCount { get; set; }
    public decimal TotalCount { get; set; }
    public decimal Price { get; set; }
    public decimal Cost { get; set; }
}
```
напиши код сервиса для переноса данных в новую структуру, ниже указан пример подобного сервиса
```
// Services/ImportService.cs

using AutoMapper;
using BuildingFlow.Data.Contract;
using BuildingFlow.Data.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;

namespace BuildingFlow.Services.CostImportService
{
    public class ImportService
    {
        private readonly IUnitOfWork _unitOfWork;
        private readonly IMapper _mapper;
        private readonly ILogger<ImportService> _logger;

        public ImportService(IUnitOfWork unitOfWork, IMapper mapper, ILogger<ImportService> logger)
        {
            _unitOfWork = unitOfWork;
            _mapper = mapper;
            _logger = logger;
        }

        public async Task ImportCostItemsAsync()
        {
            await _unitOfWork.BeginTransactionAsync();
            try
            {
                var costItemsRepository = _unitOfWork.GetRepository<CostItem>();
                var costsRepository = _unitOfWork.GetRepository<Cost>();
                var projectsRepository = _unitOfWork.GetRepository<Project>();
                var costTypesRepository = _unitOfWork.GetRepository<CostType>();
                var unitsRepository = _unitOfWork.GetRepository<Unit>();
                var materialsRepository = _unitOfWork.GetRepository<Material>();
                var projectWorkStagesRepository = _unitOfWork.GetRepository<ProjectWorkStage>();
                //var worksRepository = _unitOfWork.GetRepository<Work>();

                // Получаем все записи из старой таблицы, отсортированные по уровню иерархии
                var costItems = await costItemsRepository.AsQueryable()
                    .OrderBy(c => c.HierarchyLevel)
                    .ToListAsync();

                // Словарь для сопоставления старых Id с новыми CostId
                var idMap = new Dictionary<int, int>();

                foreach (var costItem in costItems)
                {
                    // Пропускаем уже импортированные записи
                    if (costItem.IsMigrated)
                    {
                        _logger.LogInformation($"Запись Id {costItem.Id} уже импортирована. Пропуск.");
                        continue;
                    }

                    try
                    {
                        // 1. Обработка Project
                        Project project = null;
                        if (costItem.ProjectId != 0) // Проверка на валидный ProjectId
                        {
                            project = await projectsRepository.AsQueryable()
                                .FirstOrDefaultAsync(p => p.Id == costItem.ProjectId);

                            if (project == null)
                            {
                                // Создаем новый проект, если не найден
                                project = new Project
                                {
                                    Id = costItem.ProjectId,
                                    //Title = $"Project {costItem.ProjectId}" // Настройте логику именования
                                    ////// Заполните другие поля проекта, если есть
                                };
                                projectsRepository.Create(project);
                                await _unitOfWork.SaveChangesAsync();
                                _logger.LogInformation($"Создан новый проект: {project.Id}");
                            }
                        }
                        else
                        {
                            _logger.LogWarning($"Запись Id {costItem.Id} имеет неверный ProjectId.");
                            continue; // Пропускаем запись или можно обработать иначе
                        }

                        // 2. Обработка CostType
                        var costType = await costTypesRepository.AsQueryable()
                            .FirstOrDefaultAsync(ct => ct.TypeName == costItem.TypeCost);

                        if (costType == null)
                        {
                            costType = new CostType
                            {
                                TypeName = costItem.TypeCost
                            };
                            costTypesRepository.Create(costType);
                            await _unitOfWork.SaveChangesAsync();
                            _logger.LogInformation($"Создан новый тип затрат: {costType.TypeName}");
                        }

                        // 3. Обработка Unit
                        Unit unit = null;
                        if (!string.IsNullOrWhiteSpace(costItem.UnitOfMeasure))
                        {
                            unit = await unitsRepository.AsQueryable()
                                .FirstOrDefaultAsync(u => u.UnitName == costItem.UnitOfMeasure);

                            if (unit == null)
                            {
                                unit = new Unit
                                {
                                    UnitName = costItem.UnitOfMeasure,
                                    UnitDescription = "" // Заполните при необходимости
                                };
                                unitsRepository.Create(unit);
                                await _unitOfWork.SaveChangesAsync();
                                _logger.LogInformation($"Создана новая единица измерения: {unit.UnitName}");
                            }
                        }

                        // 4. Обработка ParentCost
                        int? parentCostId = null;
                        if (costItem.ParentId.HasValue)
                        {
                            if (idMap.TryGetValue(costItem.ParentId.Value, out int newParentCostId))
                            {
                                parentCostId = newParentCostId;
                            }
                            else
                            {
                                _logger.LogWarning($"ParentId {costItem.ParentId.Value} не найден для записи Id {costItem.Id}. Запись пропущена.");
                                continue; // Пропускаем запись или можно обработать иначе
                            }
                        }

                        // 5. Создание новой записи Cost
                        var cost = _mapper.Map<Cost>(costItem);
                        cost.ProjectId = project.Id;
                        cost.ParentCostId = parentCostId;
                        cost.CostTypeId = costType.CostTypeId;
                        cost.UnitId = unit?.UnitId;

                        costsRepository.Create(cost);
                        await _unitOfWork.SaveChangesAsync();

                        _logger.LogInformation($"Создана новая затрата: {cost.CostName} (NumberItem: {cost.NumberItem})");

                        // Обновление словаря
                        idMap[costItem.Id] = cost.CostId;

                        // 6. Создание записи Material или Work
                        if (costItem.TypeCost.Equals("Материал", StringComparison.OrdinalIgnoreCase))
                        {
                            var material = new Material
                            {
                                CostId = cost.CostId
                                // Добавьте дополнительные поля, если необходимо
                            };
                            materialsRepository.Create(material);
                            _logger.LogInformation($"Создан материал для затрат: {cost.CostName}");
                        }
                        else if (costItem.TypeCost.Equals("Работа", StringComparison.OrdinalIgnoreCase))
                        {
                            var work = new _Work
                            {
                                CostId = cost.CostId
                                // Добавьте дополнительные поля, если необходимо
                            };
                            worksRepository.Create(work);
                            _logger.LogInformation($"Создана работа для затрат: {cost.CostName}");
                        }

                        // 7. Установка флага миграции
                        costItem.IsMigrated = true;
                        //costItemsRepository.Update(costItem);

                        // Сохраняем изменения
                        await _unitOfWork.SaveChangesAsync();
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, $"Ошибка при обработке записи Id {costItem.Id}");
                        // Приезжая ошибка может прервать весь процесс из-за транзакции
                        throw;
                    }
                }

                // Завершение транзакции
                await _unitOfWork.CommitAsync();
                _logger.LogInformation("Миграция данных завершена успешно.");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при миграции данных. Произошёл откат транзакции.");
                await _unitOfWork.RollbackAsync();
                throw; // Перебрасываем ошибку выше, если необходимо
            }
        }
    }
}