В MS Sql для определения идентификаторов с разделителями используются квадратные скобки: http://msdn2.microsoft.com/ru-ru/library/ms175874.aspx В Postgres для этих целей используются двойные кавычки: http://resurection.ru/doc/postgres/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS Поскольку 1С++ для типизации к типам данных 1С активно использует квадратные скобки Текст = " |SELECT | Спр.ID as [Элемент $Справочник.Номенклатура] |FROM | $Справочник.Номенклатура as Спр |"; для обеспечения работоспособности запросов 1С++ необходима трансляция кавадратных скобок на двойные кавычки.
Обработка добавлена. Квадратные скобки заменяются на кавычки, все что между ними преобразуется в нижний регистр, поскольку PostgreSQL чувствителен к регистру имен, заключенных в кавычки. Для проверки скачайте selta.dll с ftp из папки 1.0.3.test
1. C приведением в нижний регистр типизация в 1C++ не работает конструкция: SELECT Конт.ID as [Конт $Справочник.Контрагенты] FROM sc172 AS Конт WHERE Конт.ISFOLDER=2 предобазуется в: SELECT Конт.ID as "конт $справочник.контрагенты" FROM sc172 AS Конт WHERE Конт.ISFOLDER=2 отрабатывает, но в выведенной таблице 1С чушь. запрос: SELECT Конт.ID as "Конт $Справочник.Контрагенты" FROM sc172 AS Конт WHERE Конт.ISFOLDER=2 в Postgres отрабатывает нормально и должен выдавать корректый результат. 2. Не хватает длины идентификатора и postgres его "режет". В MSSQL, начиная с 7й версии, длина идентификатора увеличена до 128 символов. В документации postgres указано что длина идентификатора может быть увеличена при компиляции. http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html Странно только, что сейчас postgres режет до 33 символов, в по-умолчанию должно быть 63. Из за русских букв? Для более полной поддержки не только 1С++, а вообще эмуляции MSSQL необходима перекомпиляция postgres. (может отдельный баг заведете?).
по п.1. Виноват, в MSSQL с 1С++ работает и конструкция в нижнем регистре "SELECT Конт.ID as [конт $справочник.контрагенты]. Однако, все равно, много разработок под 1С++ регистрочувствительны, т.е. приведение в нижний регистр в них работать не будет. Попытаюсь разобраться с типизацией в 1С++, на настоящий момент в выложенном запросе вместо контрагентов почему-то выводятся физ-лица.
Я могу убрать приведение к нижнему регистру, но это будет чревато: записи [Name] и [name] в MS SQL Server равнозначны, а в PostgreSQL - нет, важен регистр, к сожалению. Если разработчики 1С++ будут соблюдать регистр, то все будет ОК. Но ошибка, как я предполагаю, вовсе не в этом, а из-за обрезания имен. 33 символа вместо 64 - да, скорее всего из-за русских символов, кодировка UTF-8 всетаки используется. Сейчас я повешаю багу про увеличение этого параметра и постарась решить. Данную багу закроем только после того, как проведем тесты с новыми сборками Постгри.
Бес попутал. Странная вещь: На MSSQL два запроса без сортировки 1С`овский и 1C++ выводят одинаковую последовательность значений. Под postgres последовательности оказались разные и как назло первые записи в выборке postgres были визуально похожи на другой справочник... Вообщем типизация работает корректно. Но приведение в нижний регистр конструкций [Контрагент $Справочник.Контрагенты] будет приводить к ошибкам в универсальных обработках, например при сравнении кода колонки полученного командой 1С ПолучитьПараметрыКолонки с аналогичным полученным через метаданные: "контрагент"<>"Контрагент". > Если разработчики 1С++ будут соблюдать регистр, то все будет ОК. В большинстве случаев соблюдают. Кроме того эти конструкции используются для идентификации конечных колонок запроса и не участвуют в фильтрах т.е. проблем быть не должно.
Закоментировал пока что преобразование в нижний регистр. Будут проблемы - будем думать. Новую версию dll выложил на ftp в папку 1.0.3.test