!ver = !!getdllsuffix()
--$p $!ver
if !ver eq '12.1SP4' or !ver eq 'E3D1.1' then
  !!using = |using namespace 'Aveva.Pdms.Presentation'|
elseif !ver eq 'E3D2.1' then
  !!using = |using namespace 'Aveva.Core.Presentation'|
endif
$!!using
import 'GridControl'
handle any
endhandle




--var !ep evar pmllib
--!ep = !ep.split()[1]

kill !!OSTECSPECFORM
setup form !!OSTECSPECFORM dialog resizable




member .forWordTable is array

member .soedKeyArr is array $* из файла BoltsSelection
member .soedValArr is array $* из файла BoltsSelection

member .ArtInfoArr is array $* из файла Artinfo
member .ArtInfoArrKeys is array $* из файла Artinfo


member .coversarr is array $* из файла Covers.xlsx

member .rasporkiArr is array $* из файла Rasporki.xlsx
member .SSBoltsARR is array $* из файла BoltSSSelection.xlsx


member .currentpopuprow is real


member .headings is array

member .GroupElref is array

--member .ColElem is array
member .elref is array
member .type is array
member .dtxr is array
member .dtxs is array
member .mtxx is array
member .kod is array
member .weig is array
--member .spref is array
member .cnt is array
member .ediz is array

title |Спецификация|
	bar
	button .bcebranname at x0 y0 |CE| call |!this.ce()|
	button .bToWord at |в Word| call |!this.doc()|
	button .bClearAid at |clear| call |!this.clearaid()|
	--button .bR at |Reload| call |kill !!ostecspecform show !!ostecspecform|
	toggle .tBOLTS  'Считать крепеж'
	-- at x1  y0  anchor left+top  tagwidth 13

	path d

	container .conTableDif nobox PmlNetControl 'TableD' anchor R + L + B + T  at x0 ymax   width 125 height 15        
	member .TableD is NETGRIDCONTROL

	--initcall '!this.InitCallBack()'
	--cancelcall'!this.CancelCallBack()'
exit

--

define method .OSTECSPECFORM()
    !this.tbolts.val = true
	$!!using
    --using namespace 'Aveva.Pdms.Presentation'
	--using namespace 'Aveva.Core.Presentation'
    !this.TableD = object NETGRIDCONTROL()
	!this.conTableDif.control  = !this.TableD.handle()    
	
	!this.TableD.addEventHandler('onPopup', !this, 'popupMeth')
	--!this.TableD.addEventHandler('AfterSelectChange', !this, 'AfterSelectChangeCallback')
	--!this.TableD.addEventHandler('beforeCellUpdate', !this, 'update')
	--!this.TableD.addEventHandler('afterCellUpdate', !this, 'change')
	--!this.TableD.addEventhandler('OnDragDropMove', !this, 'tdOnDragDropMove')
	
	!this.TableD.HIDEGROUPBYBOX(true)
    !this.TableD.COLUMNEXCELFILTER(false)
    !this.TableD.fixedHeaders(false)
    !this.TableD.outlookGroupStyle(false)
    !this.TableD.headerSort(false)
    !this.TableD.columnSummaries(false)
    !this.TableD.singleRowSelection(false)    
    !this.TableD.setAlternateRowColor('WHITE')
	--!this.TableD.AllowDropInGrid(true) $* перетаскивание ячеек 
	--!this.TableD.setAlternateRowColor('tomato')
    !this.TableD.editableGrid(false)  
	--!this.TableD.SETEDITABLECOLUMN(7, true)
    --!this.TableD.clearGrid()
    --!this.TableD.setNameColumnImage()    
    --!this.TableD.splitGrid(false)
    
    --!this.TableD.BulkEditableGrid(true)
    --handle any
    --endhandle
    --!this.TableD.OutlookGroupStyle(true)
	--!this.mygrid.clear()

	--формирование заголовка
	!this.headings = array()
	!this.headings.append('N')
	!this.headings.append('TYPE')
	!this.headings.append('наименование')
	!this.headings.append('обозначение')
	!this.headings.append('мат.')
	!this.headings.append('код')
	!this.headings.append('масса ед.')
	!this.headings.append('L/Шт')
	!this.headings.append('ед.из.')
	--!this.headings.append('spref')

	--!this.mygrid.setHeadings(!this.headings)


	-- Define menu
	!popup = !this.newMenu('popupMeth')
	!popup.add('callback', 'пометить только их в 3D',  '!this.markselected()')
	--!popup.add('callback', 'перевыбрать',  '!this.changespref()')
	!this.conTableDif.popup   = !popup  

	var !path evar 'OSTdflts'
	!coversPath = !path & '\' & 'Covers.xlsx'
	--!this.coversARR = !!importexcelfile(!coversPath)
	!this.coversARR = !!ReadXlsx(!coversPath.replace('\\','\'))
	
	!rasporkiPath = !path & '\' & 'Rasporki.xlsx'
	!this.rasporkiARR = !!ReadXlsx(!rasporkiPath.replace('\\','\'))

	!SSBoltsPath = !path & '\' & 'BoltSSSelection.xlsx'
	!this.SSBoltsARR = !!ReadXlsx(!SSBoltsPath.replace('\\','\'))
	
	
	!ArtInfoPath = !path & '\' & 'ArtInfo.xlsx'
	--!this.ArtInfoARR = !!importexcelfile(!ArtInfoPath)
	!this.ArtInfoARR = !!ReadXlsx(!ArtInfoPath.replace('\\','\'))
	
	do !i indices !this.ArtInfoARR
	  !this.ArtInfoArrKeys[!i] = !this.ArtInfoARR[!i][1]
	enddo
	
	!BSPath = !path & '\' & 'BoltsSelection.xlsx'
	--!tmparr = !!importexcelfile(!BSpath)
	!tmparr = !!ReadXlsx(!BSpath.replace('\\','\'))
	--!this.BoltsSelectionARR
	do !rownum from 1 to !tmparr.size() $* цикл по строкам
	!row = !tmparr[!rownum]
	  !ser = !row[1]
	  !soedarr = !row[2].split('/')
	  do !soed values !soedarr  $* цикл по типам соединений LL/LA/LB
	    !opt = !row[3]
		
		!heigarr = !row[4].split('/')
	    do !heig values !heigarr $* цикл по высотам 50/80/100
		  !widarr =  !row[5].split('/')
	      do !wid values !widarr $* цикл по ширинам 50/100/150/200...
		    !art = array()
			!count = array()
		    !art[1] =  !row[6]
			!count[1] =  !row[7]
			!art[2] =  !row[8]
			!count[2] =  !row[9]
			!art[3] = !row[10]
			!count[3] =  !row[11]
			!artcount = array()
			!artcount.append(!art)
			!artcount.append(!count)
		    --$p $!soed $!opt $!heig $!wid $!art1 $!count1 $!art2 $!count2 $!art3 $!count3
			!this.soedKeyArr.append(!ser & '_' & !soed & '_' & !opt & '_' & !heig & '_' & !wid)
			!this.soedValArr.append(!artcount)
		  enddo $* wid
		enddo $* heig
	  enddo $* soed
	
	enddo
	
	--q var !this.soedKeyArr
	--q var !tmparr[2][!rownum]
	--q var !tmparr[2][2]
	

--[2][2]
	
	

endmethod


--функция рассчитывает весь крепеж для одного бранча
define method .getSoed(!bran is dbref) is array

!calcColumns = array()
do !i from 1 to 9
!calcColumns[!i] = array()
enddo

	--опции считывем прям из формы настроек
	--результат массив сочетаний коннектов и опции расчёта крепежа к этому коннекту
	!optstr = array()
	---------------------ЛН/ЛП--------------------------
	!optstr.append('L_LL;СЛУ')
	!optstr.append('L_LA;СПУ')
	!optstr.append('L_LB;БЕЗ')
	!optstr.append('L_LY;СЛУ')
	---------------------НЛО-----------------------
	!optstr.append('NLO_LL;СЛУ')
	!optstr.append('NLO_LA;СПУ')
	!optstr.append('NLO_LB;БЕЗ')
	-------------------ЛКР---------------------------
	!optstr.append('LKR_LL;СЛКР')
	!optstr.append('LKR_LA;СЛКР')
	!optstr.append('LKR_LB;БЕЗ')
	-------------------ПЛК--------------------------
	!optstr.append('PLK_LL;СБП')
	!optstr.append('PLK_LA;БЕЗ')
	!optstr.append('PLK_LB;БЕЗ')
	!optstr.append('PLK_LY;БЕЗ')
	---------------------УЛ-----------------------
	!optstr.append('UL_LL;СЛУ')
	!optstr.append('UL_LA;СЛУ')
	!optstr.append('UL_LB;БЕЗ')
	!optstr.append('UL_LY;СЛУ')
	---------------------ПЛ-----------------------
	!optstr.append('PL_LL;СПЛД') $* (две прямых секции)
	!optstr.append('PL_LA;СПЛД') $* (соединенте в стык  также как LL)
	!optstr.append('PL_LB;СПЛД') $* (нахлёст на повороте)
	!optstr.append('PL_LY;СПЛД') $* (торцевое ответвление типа OLET)
	!optstr.append('PL_LN;СПЛД') $* (нулевой бенд изгиб в вертикальной плоскости)
	-----------------------------------------------
	
	do !i from 1 to !optstr.size()
	  !optname[!i] = !optstr[!i].split(';')[1]
	  !optval[!i] = !optstr[!i].split(';')[2]
	enddo
	
  --идём от головы к хвосту и говорим что с чем коннектится
  --!mem = !bran.members
  if type of $!bran eq 'BRAN' then
    !mem = !bran.members
  else
    --var !mem collect all ctray for $!bran
	!mem  =!!collectallfor('ctray',||,CE)
  endif
  
  --q var !mem
  if !mem.size() le 1 then 
    return
  endif
  do !i from 2 to !mem.size()
    !prev = !mem[!i - 1]
    !curr = !mem[!i]
  
    !T1 = ccon of cate of gmref of catref of $!prev
	!T2 = ccon of cate of gmref of catref of $!curr
	
	if !t1 eq 'L' then
	  !Ctype = !T1 & !T2
	else
	  !Ctype = !T2 & !T1
	endif
	
	--имя категории в каталоге например OSTEC-CT-LN здесь LN краткий шифр серии
	--!ser = !!ce.name.part(name of cate of catref of $!prev,3,'-') 
	--$p $!prev
	!ser = !prev.catref.owner.owner.name.part(3,'-') 
	--$p $!ser $!ctype

	!opt = !ser & '_' & !ctype
	!ind = !optname.findfirst(!opt)
	--handle any
	--endhandle
	if unset(!ind) then
	  $p не удалось найти настройку(опцию) для расчёта крепежа $!opt в файле BoltsSelection.xlsx  ($!prev + $!curr )
	  skip
	endif
	--$p $!ind
	!opt = !optval[!ind]
	
	
	!h1 = rpro heig of $!prev
	!h2 = rpro heig of $!curr
	!h = max(!h1,!h2)
	
	!b = !prev.ppbore[2].real().value()
	--!b = replace (pl bore of $!prev, 'mm','' )
	
	--$p $!ctype $!h $!b $!opt
	--формируем key для выбора
	!key = !ser & '_' & !ctype & '_' & !opt & '_' & !h & '_' & !b
	--$p $!key
	!ind = !this.soedKeyArr.findfirst(!key)
	!TpmSoedArr = !this.soedValArr[!ind]
	handle any 
	  $p не удалось подобрать крепеж для сочетания $!key см файл BoltsSelection.xls
	  skip
	endhandle
	--q var !TpmSoedArr[1]
	
	do !ii indices !TpmSoedArr[1] $* цикл по массиву артикулов
	!art = !TpmSoedArr[1][!ii]
	!cnt = !TpmSoedArr[2][!ii]
	--q var !art
	--пропуск если атрикул пустой
	skip if  !art eq ''
	
	!ind = !this.ArtInfoArrKeys.findfirst(!art)
	!inforow = !this.ArtInfoArr[!ind]
	handle any
	  $p не удалось найти элемент в файле artInfo.xlsx по артикулу $!art
	  skip
	endhandle
--q var !inforow
	--$p art $!art cnt $!cnt
	--находим в artinfo
	--в artinfo 
	--[2] наименование
	--[3] код
	--[4] масса
	--[5] ед.изм
	--формируем массив для возврата
  
  !calcColumns[1].append('CALC') $* type
  !calcColumns[2].append(!inforow[2]) $* dtxr
  !calcColumns[3].append(!art) $* dtxs
  !calcColumns[4].append('') $*mtxx
  !calcColumns[5].append(!inforow[3]) $*kod
  !calcColumns[6].append(!inforow[4]) $* weid
  !calcColumns[7].append(!prev) $*elref
  !calcColumns[8].append(!cnt) $*cnt
  !calcColumns[9].append(!inforow[5]) $*ediz
	--тип;наименование;обеозначение;материал;код;масса;кол-во;ед.изм.
  --!calcColumns[1]
	enddo
	--q var !TpmSoedArr
	

	
  enddo
  return !calcColumns
endmethod



define method .doc()
  !formpath = !!pml.getPathName('ostecspecform.pmlfrm').replace('/ostecspecform.pmlfrm','').replace('/','\')
  --syscom 'start winword "$!formpath\OSTECSPECFORM.docx" &'
  --q var !formpath
    
    --ФОРМИРОВАНИЕ WORD отчёта
    !start	= true
	!merge	= true
	--!tmpl = '\\vnpmosc52\PDMS\PDMS_INTERFACES\12.1\SupportFiles\PMLLIB\VNP\projects\spectrexport\PaintTmpl.docx'
	--!tmpl = '\\vnpmosc52\PDMS\PDMS_INTERFACES\12.1\SupportFiles\PMLLIB\VNP\projects\OSTEC\OSTEC_SPEC_TMPL.docx'
	!tmpl = !formpath & '\OSTEC_SPEC_TMPL.docx'
	
	!docx	= 'd:\temp\ostecspec.docx'
	!tname	= |OSTEC_SPEC|
	!data	= !this.forWordTable
	--q var !data
	--!rtext = !SmetReplaceArr
	!rtext = array()
	
	 
	
	-- CsvToDocxTable.exe заполняет таблицы docx шаблона из csv файлов (использует Xceed.Words.NET.dll)	
	-- !start	открыть документ
	-- !merge	объединение ячеек
	-- !tmpl	docx шаблон
	-- !docx	документ для сохранения
	-- !tname	имя таблицы в docx шаблоне (Свойства таблицы - Замещающий текст - Заголовок)
	-- !data	двумерный массив данных
	-- !rtext	массив строк для замены "AAA" "BBB" "BBB" "123" текст для замены ("AAA" => "BBB" / "BBB" => "123") 
	!!DocxTable( !start, !merge, !tmpl, !docx, !tname, !data, !rtext )	

endmethod



define method .popupMeth(!passedArray is ARRAY)
--$p $!passedArray[0] $!passedArray[1] $!passedArray[2]
!this.currentpopuprow = real(!passedArray[2][1])

!this.conTableDif.popup = !this.popupMeth
  !this.conTableDif.showPopup(!passedArray[0], !passedArray[1])
endmethod








define method .clearaid() 
  unenhance all
  aid clear all 10001
endmethod

define method .markselected() $* из контекстного меню
  !tmpce = !!ce $* запомнили текущий
  aid clear all 10001
  unenhance all
  --!nn = !this.mygrid.val $*pickedfield
  !nn = !this.currentpopuprow

  --надо по индексу строки получить массив элементов
  !arr = !this.GroupElref[!nn] 
  do !i from 1 to !arr.size()
    --!arr[!i] = 
	$!arr[$!i]
    enhance ce col red
	if type of $!arr[$!i] eq 'FTUB' then
	--$p $!arr[$!i]
	!pA = p1pos of $!arr[$!i] wrt /*
	!pB = p2pos of $!arr[$!i] wrt /*
	!p1 = !pA.MidPoint(!pB)
	else
    !p1 = position of $!arr[$!i] wrt /*
	endif
    aid text NUM 10001 '$!nn' at e $!p1.east n $!p1.north u $!p1.up wrt /*
  enddo
  
  $!tmpce $* стали обратно на зпомненный CE
endmethod

define method .GridToXls()
!filename = 'd:\'& !this.ce.name.after('/').replace('/','_') &'.xls'
!this.tabled.SAVEGRIDTOEXCEL(!filename)
syscom '$!filename &'
endmethod

define method .addcover( !el is dbref, !inArt is string , !wida is string , !widb is string , !mat is string )

endmethod

define method .ce()
$!!using
  --using namespace 'Aveva.Core.Presentation'
  
  !this.elref.clear()
  !this.type.clear()
  !this.dtxr.clear()
  !this.dtxs.clear()
  !this.mtxx.clear()
  !this.kod.clear()
  !this.weig.clear()
  !this.cnt.clear()
  !this.ediz.clear()

    var !col collect all elconn for ce
  --собираем ихсоджные массивы
  --q var !col
  !i = 0
  do !x indices !col
  !i = !i + 1
  --if func of cate of gmref eq 'NULL' then
    --skip
  --endif
  
    !el = !col[!x].dbref()
    !this.elref[!i] = !el
    !this.type[!i] = !el.type
    !this.dtxr[!i] = !el.catref.prtref.dtxr
    !this.dtxs[!i] = !el.catref.prtref.dtxs
	!this.mtxx[!i] = !el.mtxx
	handle any
	!this.mtxx[!i] = 'ERR'
	endhandle
	--!this.kod[!i] = !el.spref.comment
	!this.kod[!i] = !el.catref.prtref.comment
    !this.weig[!i] =  rpro weig of $!el
    handle any
      !this.weig[!i] = 0
    endhandle
	if unset(!this.weig[!i]) then
	!this.weig[!i] = 0
	endif
    --if !el.type eq 'FTUB' then
      --!this.cnt[!i] = nint(!el.fitlen.value() / 10) / 100
  	  --!this.ediz[!i] = 'м'
    --else
	!COUN = rpro COUN of $!el
	handle any $* ситуация когда нету такого PROP он остаётся unset
	  !COUN = 1
	endhandle
	if unset(!COUN) then  $* ситуация когда нету DTSE вообще
	  !COUN = 1
	endif
    !this.cnt[!i] = !COUN
  	!this.ediz[!i] = 'шт'
    --endif


	
	
	
    --!str  = !this.elref[!i] & ';' & !this.type[!i] & ';' & !this.dtxr[!i] & ';' & !this.dtxs[!i] & ';' & !this.weig[!i] & ';' & !this.cnt[!i] & ';'
    --$p $!str
    --!this.spref[!i] = !el.spref
  enddo $* конце цикла по elcon
  
  
  --отдельный цикл подсчёта распорок
  do !i indices !col
  !el = !col[!i].dbref()
  
  --если нет RPRO RASP или не 1 то SKIP
  !rsp = rpro rasp of $!el
  handle any
    skip
  endhandle
  if !rsp neq 1 then
    skip
  endif
  
  
   	--подсчёт распорок
	--подготовка данных для выбора распорки
	--!WIDA = string( rpro wida of $!el )
	--handle any
	  --!WIDA = ''
	--endhandle
	!wid = string( rpro rspa of $!el )
	handle any
	!wid = '0'
	endhandle
	--базовый артикул без учёта типоразмера и метариала
	!art = after( desc of cate of catref of  prtref of spref of $!el,'#')
	
	--purp of cate of catref of  prtref of spref
	!mat = mtxx of $!el
	--$p baseart = $!art $!mat
	
	
	--данные готовы ищем в массиве из файла Rasporki.xls
	!findflag = false
    do !rsprow from 2 to !this.RasporkiARR.size()
	--q var !this.rasporkiARR[!rsprow]
    if !this.rasporkiARR[!rsprow][1] eq !Art and (!this.rasporkiARR[!rsprow][2] eq !wid or !this.rasporkiARR[!rsprow][2] eq '' ) and !this.rasporkiARR[!rsprow][3] eq !mat then
	
	!rasporkaART = !this.rasporkiARR[!rsprow][4]
	--$p найдена распорка $!rasporkaART по сочетанию '$!art' '$!wid' '$!mat'
	--считываем свойства по артикулу из artinfo.xlsx добавлем их в массив спецификации
	
	
	!ind = !this.ArtInfoArrKeys.findfirst(!rasporkaART)
	!inforow = !this.ArtInfoArr[!ind]
    --q var !inforow
	--в artinfo 
	--[2] наименование
	--[3] код
	--[4] масса
	--[5] ед.изм
	--[6] материал
	
	    !this.elref.append(!el)
        !this.type.append('RASP')
		!this.kod.append(!inforow[3]) $* код
        !this.dtxr.append(!inforow[2])
		!this.mtxx.append(!inforow[6])
        !this.dtxs.append(!rasporkaART)
        !this.weig.append(!inforow[4])
        !this.cnt.append(1)
        !this.ediz.append(!inforow[5])
  $(
  !calcColumns[1].append('CALC') $* type
  !calcColumns[2].append(!inforow[2]) $* dtxr
  !calcColumns[3].append(!art) $* dtxs
  !calcColumns[4].append('') $*mtxx
  !calcColumns[5].append(!inforow[3]) $*kod
  !calcColumns[6].append(!inforow[4]) $* weid
  !calcColumns[7].append(!prev) $*elref
  !calcColumns[8].append(!cnt) $*cnt
  !calcColumns[9].append(!inforow[5]) $*ediz
  $)
	
	--если совпали 1х 3 столбца то ищем подходящую по материалу
	$(
	  if !mat eq !this.coversARR[!cvrrow][ 5 + !ii * 3] then
	    !CoverArt = !this.coversARR[!cvrrow][4]
	    !kod = !this.coversARR[!cvrrow][ 5 + !ii * 3 + 1]
		!wei = real(!this.coversARR[!cvrrow][ 5 + !ii * 3 + 2].replace(',','.'))

        !this.elref.append(!el)
        !this.type.append('COVR')
		!this.kod.append(!kod)
        !this.dtxr.append('Крышка')
		!this.mtxx.append(!mat)
        !this.dtxs.append(!CoverArt)
        !this.weig.append(!wei)
        
        if !el.type eq 'FTUB' then
          !this.cnt.append( nint(!el.fitlen.value() / 10) / 100)
  	      !this.ediz.append('м')
        else
          !this.cnt.append(1)
  	      !this.ediz.append('шт')
        endif
	
	    --$p find $!CoverArt $!kod $!wei
		!findflag = true
		skip
	  endif
	  $)
	  !findflag = true
	  --если уже нашли то на следующие строки не переходим
      skip
	  
	
    endif $* конец. если найдена строка
  enddo $* конец цикла по строкам rasporki.xlsx
  if not !findflag then
    $p не удалось найти распорку в фале rasporki.xlsx для элемента  '$!art' '$!wid' '$!mat'
  endif
	
	
    
  --конец подсчёта распорок
  enddo
  
  
  
   --отдельный цикл подсчёта крепежа монтажной системы
   --q var !this.SSBoltsARR.size()
  do !i indices !col
  !el = !col[!i].dbref()

    --базовый артикул без учёта типоразмера и метариала
	!art = after( desc of cate of catref of  prtref of spref of $!el,'#')
	--purp of cate of catref of  prtref of spref
	--!mat = mtxx of $!el
	
	--$p $!art
	--данные готовы ищем в массиве из файла BoltsSSSelection.xls
	!findKrepflag = false
    do !bltrow from 2 to !this.SSBoltsARR.size()
	--q var !this.rasporkiARR[!rsprow]
	
	--$p $!this.SSBoltsARR[$!bltrow][1]  $!this.SSBoltsARR[$!bltrow][2] 
    if !this.SSBoltsARR[!bltrow][1] eq !Art and !this.SSBoltsARR[!bltrow][2] eq '+' then
	
	  !STRBoltARTs = !this.SSBoltsARR[!bltrow][4]
	  !boltcnt = !this.SSBoltsARR[!bltrow][3]
	  --$p найден крепеж $!STRBoltARTs для '$!art'
	  !findKrepflag = true
	  if !boltcnt eq '0' then
	    skip
	  endif
	  --считываем свойства по артикулу из artinfo.xlsx добавлем их в массив спецификации
	  !artsarr = !STRBoltARTs.split('+')
	  do !ii indices !artsarr
	    !krepart = !artsarr[!ii]
	    !ind = !this.ArtInfoArrKeys.findfirst(!krepART)
		handle any
			$p не удалось найти элемент в файле artInfo.xlsx по артикулу $!krepART
			skip
		endhandle
		
	    !inforow = !this.ArtInfoArr[!ind]
		handle any
			$p не удалось найти элемент в файле artInfo.xlsx по артикулу $!krepART
			skip
		endhandle
	  
	  
      --q var !inforow
	  --в artinfo 
	  --[2] наименование
	  --[3] код
	  --[4] масса
	  --[5] ед.изм
	  --[6] материал
	
	
      !this.elref.append(!el)
      !this.type.append('SSBOLT')
      !this.kod.append(!inforow[3]) $* код
      !this.dtxr.append(!inforow[2])
      !this.mtxx.append(!inforow[6])
      !this.dtxs.append(!krepART)
      !this.weig.append(!inforow[4])
      !this.cnt.append(!boltcnt)
      !this.ediz.append(!inforow[5])
	  
	  --!findflag = true
	  --если уже нашли то на следующие строки не переходим
      --skip
	  
	  enddo $* конец цикла по артикулам крепежа строке креп1+креп2+креп3
    endif $* конец. если найдена строка
  enddo $* конец цикла по строкам BoltsSSSelection.xls
  if not !findKrepflag then
    $p не удалось найти крепеж в файле BoltsSSSelection.xlsx для элемента  '$!art' '$!el'
  endif
	
    
  --конец подсчёта крепежа для опорной(монтажной) системы
  enddo
  
  
  
  
  
  
  if dbtype eq 'DESI' then
  var !col collect all bran mem with ( type neq 'TUBI' and func of cate of gmref of catref neq 'NULL' ) for ce
  
  var !colCW collect all ctray with ( func of cate of gmref of catref neq 'NULL' ) for ce
  !col.appendarray(!colCW)
  endif
  
  if dbtype eq 'CATA' then
  var !col collect all SPCO with ( gtype of catref neq 'TUBE' and func of cate of gmref of catref neq 'NULL' ) for ce
  endif
  
  --собираем ихсоджные массивы
  --q var !col
  do !x indices !col
  !i = !i + 1
  --if func of cate of gmref eq 'NULL' then
    --skip
  --endif
  
    !el = !col[!x].dbref()
    !this.elref[!i] = !el
    !this.type[!i] = !el.type
    !this.dtxr[!i] = !el.dtxr
    !this.dtxs[!i] = !el.dtxs
	!this.mtxx[!i] = !el.mtxx
	if !el.type eq 'CTRAY' then
	  !this.kod[!i] = !el.spref.prtref.comment
	else
	  !this.kod[!i] = !el.spref.comment
	endif
    !this.weig[!i] =  rpro weig of $!el
    handle any
      !this.weig[!i] = 0
    endhandle
    if !el.catref.gtype eq 'FTUB' then
      !this.cnt[!i] = nint(!el.fitlen.value() / 10) / 100
	  handle any
	    !this.cnt[!i] = nint(!el.height.value() / 10) / 100
	  endhandle
  	  !this.ediz[!i] = 'м'
	elseif (func of cate of gmref of catref of $!el eq 'FTUB') then
	  !this.cnt[!i] = nint ( ( rpro FITL of $!el ) / 1000 * 100 )  / 100
	  !this.ediz[!i] = 'м'
	  
	  if type of $!el eq 'CTRAY' then
	    !this.type[!i] = 'CTRAY'
	  else
	    !this.type[!i] = 'FTUB'
	  endif
	  
    else
	
	  !COUN = rpro COUN of $!el
	    handle any $* ситуация когда нету такого PROP он остаётся unset
	      !COUN = 1
	    endhandle
	  if unset(!COUN) then  $* ситуация когда нету DTSE вообще
	    !COUN = 1
	  endif
	
      !this.cnt[!i] = !COUN
  	  !this.ediz[!i] = 'шт'
    endif


	
	
	
    --!str  = !this.elref[!i] & ';' & !this.type[!i] & ';' & !this.dtxr[!i] & ';' & !this.dtxs[!i] & ';' & !this.weig[!i] & ';' & !this.cnt[!i] & ';'
    --$p $!str
    --!this.spref[!i] = !el.spref
  
  enddo
  
  
  --отдельный цикл подсчёта крышек  
  do !i indices !col
  !el = !col[!i].dbref()
  
  --если нет RPRO COVR или не 1 то SKIP
  !cvr = rpro covr of $!el
  handle any
    skip
  endhandle
  --если крышки нет это Design то проскакиваем (в парагоне принудительный подсчёт крышек)
  if (!cvr neq 1) and dbtype eq 'DESI' then
    skip
  endif
  
  
  	--подсчёт крышек
	--подготовка данных для выбора крышки
	!WIDA = string( rpro wida of $!el )
	handle any
	  !WIDA = ''
	endhandle
	!WIDB = string( rpro widb of $!el )
	handle any
	  !WIDB = ''
	endhandle
	!HEIG = string( rpro heig of $!el )
	handle any
	  !heig = ''
	endhandle
	!art = after( desc of cate of catref of $!el,'#')
	
	!mat = mtxx of $!el
	
	
	--данные готовы ищем в массиве из файла Cover.xls
	!findflag = false
    do !cvrrow from 1 to !this.coversARR.size()
	--$p '$!this.coversARR[$!cvrrow][1]' '$!this.coversARR[$!cvrrow][2]' '$!this.coversARR[$!cvrrow][3]' '$!this.coversARR[$!cvrrow][4]'
    if !this.coversARR[!cvrrow][1] eq !Art and !this.coversARR[!cvrrow][2] eq !wida and ( !this.coversARR[!cvrrow][3] eq !widb or !this.coversARR[!cvrrow][3] eq '' ) and ( !this.coversARR[!cvrrow][4] eq !heig or !this.coversARR[!cvrrow][4] eq '' ) then
	
	--если совпали 1х 3 столбца то ищем подходящую по материалу
	do !ii from 0 to 3
	  if !mat eq !this.coversARR[!cvrrow][ 5 + !ii * 4] then $( Материал ZS в 1й(+0) $)
	    !CoverArt = !this.coversARR[!cvrrow][5 + !ii * 4 + 1] $( артикул во 2й(+1) $)
	    !kod = !this.coversARR[!cvrrow][ 5 + !ii * 4 + 2]
		!wei = real(!this.coversARR[!cvrrow][ 5 + !ii * 4 + 3].replace(',','.'))

		--пропускаем если 000000 (при этом не ругаемся что ничего не найдено. всё найдено но в спеку ничего не попадёт)
		if !kod eq '000000' then
			!findflag = true
			skip
		endif																																														   
        !this.elref.append(!el)
        !this.type.append('COVR')
		!this.kod.append(!kod)
        !this.dtxr.append('Крышка')
		!this.mtxx.append(!mat)
        !this.dtxs.append(!CoverArt)
        !this.weig.append(!wei)
        
        if !el.catref.gtype eq 'FTUB' then
		  if !el.owner.type eq 'BRAN' then
            !this.cnt.append( nint(!el.fitlen.value() / 10) / 100)
		  else
		    !this.cnt.append( nint(!el.height.value() / 10) / 100)
		  endif
  	      !this.ediz.append('м')
		  --'SHSNLO' никогда не применися в CABLING SYSTEM (это секция шарнирная с 2х сторон)--
		elseif !el.owner.type eq 'BRAN' and !el.spref.tans eq 'SHSNLO' then
		  !len = !el.ppos[1].distance(!el.ppos[2])
		  
		  !this.cnt.append(nint(!len.value() / 10) / 100)
		  !this.ediz.append('м')
        else 
          !this.cnt.append(1)
  	      !this.ediz.append('шт')
        endif
	
	    --$p find $!CoverArt $!kod $!wei
		!findflag = true
		skip
	  endif
	  
	  --если уже нашли то на следующие строки не переходим
	  if !findflag then
	    skip
	  endif
	enddo $* поиск под этот материал
    endif
  enddo $* конец цикла по строкам Covers.xls
  if not !findflag then
    $p не удалось найти крышку в фале covers.xls для элемента '$!art' '$!wida' '$!widb' '$!heig' '$!mat'
  endif
	
	
    
  --конец подсчёта крышек
  enddo
  
  
  
  
  
  
  if !this.tBOLTS.val then
  --вызываем метод подсчёта крепежа по каждому бранчу
  var !col collect all bran  for ce
  var !cwbran collect all cwbran for ce
  !col.appendarray(!cwbran)
  --q var !col
  do !i indices !col
  !calcColumns = !this.getsoed(!col[!i].dbref())
  
  !this.type.appendarray(!calcColumns[1])
  !this.dtxr.appendarray(!calcColumns[2])
  !this.dtxs.appendarray(!calcColumns[3])
  !this.mtxx.appendarray(!calcColumns[4])
  !this.kod.appendarray(!calcColumns[5])
  !this.weig.appendarray(!calcColumns[6])
  !this.elref.appendarray(!calcColumns[7])
  !this.cnt.appendarray(!calcColumns[8])
  !this.ediz.appendarray(!calcColumns[9])
  enddo
  
  endif
  --делаем фиктивную колонку поставщика
  !zavod = array()
  do !XX from 1 to !this.type.size()
    !zavod[!XX] = 'OSTEC'
  enddo
  
  
	--запихиваем в группировщик
	
	
  !obj = object pmltable()
  !obj.Add( |type|, !this.type )
  !obj.Add( |dtxr|, !this.dtxr )
  !obj.Add( |dtxs|, !this.dtxs )
  !obj.Add( |mtxx|, !this.mtxx )
  !obj.Add( |zavod|,  !zavod)
  !obj.Add( |kod|, !this.kod )
  !obj.Add( |weig|, !this.weig )
  !obj.Add( |elref|, !this.elref )
  !obj.Add( |cnt|, !this.cnt )
  !obj.Add( |ediz|, !this.ediz )
  --!obj.Add( |spref|, !spref )
     
     
  !obj.SortBy( |type| )
  !obj.SortBy( |dtxr| )
  !obj.SortBy( |dtxs| )
  !obj.SortBy( |mtxx| )
  !obj.SortBy( |zavod| )
  !obj.SortBy( |kod| )
  !obj.SortBy( |weig| )
  !obj.SortBy( |ediz| )
     
  !obj.CTypeIsGrup( |type| )
  !obj.CTypeIsGrup( |dtxr| )
  !obj.CTypeIsGrup( |dtxs| )
  !obj.CTypeIsGrup( |mtxx| )
  !obj.CTypeIsGrup( |zavod| )
  !obj.CTypeIsGrup( |kod| )
  !obj.CTypeIsGrup( |weig| )
  !obj.CTypeIsGrup( |ediz| )
  
  !obj.CTypeIsSumm( |cnt| )
  !obj.CTypeIsArry( |elref| )
     
  !obj.Run()

  --получаем результат
  !resultTable = !obj.getTable( split('row numbers;type;dtxr;dtxs;mtxx;kod;weig;cnt;ediz',';') )
  !this.forWordTable = !obj.getTable( split('row numbers;dtxr;dtxs;kod;zavod;ediz;cnt;weig',';') )
  
  !this.GroupElref = !obj.getColumn(|elref|)
  !ndsd = object NETDATASOURCE('Изменения', !this.headings, !resultTable )  
  !this.TableD.bindToDataSource(!ndsd)
  !this.TableD.AUTOFITCOLUMNS()
  --результат заливаев в GRID
endmethod





