Ну где-то так:
X++:
static void BAH029(Args _args)
{
InventTrans inventTrans;
InventDim inventDim;
InventSum inventSum;
TmpPalletItemQty tmpTable;
// считать ячейки для номенклатур из файла
void importFromFile(FilenameOpen _fileName)
{
#avifiles
#define.ItemIdCol(0)
#define.WMSLocationIdCol(1)
#define.FirstRow(1) //подразумевается, что в табличке есть строка заголовка. Если нет, поставить 0
CCADOConnection cn = new CCADOConnection();
CCADOCommand command = new CCADOCommand();
CCADORecordSet recordSet = new CCADORecordSet();
ComExcelDocument_RU comExcel;
str sheetName;
SysOperationProgress progressFile;
counter itemCount;
;
comExcel = new ComExcelDocument_RU();
comExcel.open(_fileName, false);
sheetName = comExcel.getActiveSheetName_AC();
comExcel.closeDocument();
comExcel.finalize();
cn.open(strfmt('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%1;Extended Properties="Excel 12.0;HDR=YES;IMEX=1";', _fileName));
command.activeConnection(cn);
command.commandText(strfmt('SELECT count(*) FROM [%1$]', sheetName));
recordSet = command.execute();
progressFile = SysOperationProgress::newGeneral(#aviUpdate,
strfmt("Импорт данных из файла %1", _fileName),
recordSet.fields().itemIdx(0).value());
command.commandText(strfmt('SELECT * FROM [%1$]', sheetName));
recordSet = command.execute();
ttsbegin;
while (!recordSet.EOF())
{
progressFile.incCount();
itemCount++;
if (itemCount >= #FirstRow)
{
tmpTable.clear();
tmpTable.ItemId = recordSet.fields().itemIdx(#ItemIdCol).value();
tmpTable.WMSLocationId = recordSet.fields().itemIdx(#WMSLocationIdCol).value();
tmpTable.insert();
progressFile.setText(strfmt("Код %1", tmpTable.ItemId));
}
recordSet.moveNext_AC();
}
ttscommit;
cn.close();
progressFile.kill();
info(strfmt("Импорт файла завершен. Обработано строк: %1", itemCount));
}
importFromFile("D:\\номенклатуры.xlsx");
ttsbegin;
while select inventSum
where inventSum.PhysicalInvent
&& inventSum.ItemId == "Ставка за обработку" //тест для одной номенклатуры
{
while select forupdate inventTrans
where inventSum.ItemId == inventTrans.ItemId &&
inventSum.InventDimId == inventTrans.inventDimId
{
select firstonly tmpTable
where tmpTable.ItemId == inventTrans.ItemId;
if (tmpTable) //если номенклатуры не было в файле, то ничего не меняем.
{
inventDim = InventDim::find(inventTrans.inventDimId);
inventDim.wMSLocationId = tmpTable.WMSLocationId; //считанная из файла ячейка для данной номенклатуры
inventDim = InventDim::findOrCreate(InventDim);
inventTrans.inventDimId = inventDim.inventDimId;
inventTrans.update(); // по умолчанию dropInventOnHand= NoYes::No, значит пересчитает InventSum и нам ее пересчитывать не нужно
}
}
}
ttscommit;
}
там есть методы с суффиксом _AC, это кажись какие-то наши доработки. Ну не суть, думаю, что считать данные из файла сами сможете.