|
![]() |
#1 |
Участник
|
Цитата:
![]() Суть для тех, кто не знаком с 1С: предыстория: = в 1С нет объекта запрос, есть только текстовая строка (типа строки для работы с произвольными запросами Statement.executeQuery в Аксапте) = 1Сники привыкли составлять запрос, складывая строки (как в ax3.0 \Classes\SysDataImport\recIdSimpleSqlSelect) = в результате для генерации более-менее сложных запросов в 1С делаются многостраничные портянки кода, которые очень тяжело поддерживать. что предлагается в типовой конфигурации: = конструктором создавать непрерывный текст-болванку, который содержит "какие-нибудь" документы/объекты = а потом заменять подстроки в получившейся строке, чтобы получить правильное название документа/объекта = ...без статического синтаксического контроля. = ...без учета наличия кавычек-апострофов внутри строки запроса Цитата:
Такую методологию во всю пропагандируют приближённые к 1С. Скоро сама 1С в стандарт это запишет.
Технология! Угу, приблизилась... А как же ![]() ============== Привычный 1Сникам стиль создания запросов на примере \Classes\SysDataImport\recIdSimpleSqlSelect (так реально делается почти по всему коду во всех конфигурациях 1С. в ax3.0 всего 115 методов в которых используется класс Statement для работы с произвольным текстом запроса. В основном это системные классы) X++: void recIdSimpleSqlSelect( Connection con, Common common, SysDictTable dictTable, recId recId ) { str sql; int i, conLength; fieldId tmpFieldId; Statement stmt; SqlSystem sqlSystem = new SqlSystem(); ResultSet set; sql = 'SELECT '; conlength = conLen(recordRefs[dictTable.id()]); for (i=1; i<=conlength; i++) { tmpFieldId = conPeek(recordRefs[dictTable.id()], i); if (i>1) sql += ', '; sql += dictTable.fieldName(tmpFieldId,DbBackend::Sql,0,FieldNameGenerationMode::FieldList); } sql+=' FROM ' + dictTable.name(DbBackend::Sql); sql+=' WHERE '; if (dictTable.dataPrCompany()) sql += SysDictTable::dataareaIdNameSQL(FieldNameGenerationMode::WhereClause)+' = '+sqlSystem.sqlLiteral(curExt())+' AND '; sql += SysDictTable::recIdNameSQL()+' = '+int2str(recId); try { stmt = con.createStatement(); set = stmt.executeQuery(sql); ... (даже не могу найти аналогов в Аксапте) X++: sqlString = strfmt(@"SELECT TABLE_NAME FROM SomeRealObjectName WHERE ...."); sqlString = strReplace('SomeRealObjectName','RealObjectName'); X++: sqlString = strfmt(@"SELECT TABLE_NAME FROM %1 WHERE ..."); sqlSystem.sqlLiteral(strfmt('%1',RealObjectName), false, true)); |
|
|
За это сообщение автора поблагодарили: Сисой (4). |
Теги |
1c, платформа, сравнение систем |
|
|