"Не работает метод справочника "НайтиПоНаименованию" Кусок кода: Наименование = "L'Oreal"; СпрПроизводители = СоздатьОбъект("Справочник.Производители"); Если СпрПроизводители.НайтиПоНаименованию(Наименование) = 1 Тогда ... КонецЕсли; Метод "НайтиПоНаименованию()" выдает ошибку, характерную для запросов, невозможных к выполнени, затем "Невосстановимую ошибку базы данных". 1С не выдерживает такого издевательства и сразу после этого молча выгружается из памяти."
(In reply to comment #0) > "Не работает метод справочника > "НайтиПоНаименованию" > > Кусок кода: > Наименование = "L'Oreal"; > СпрПроизводители = > СоздатьОбъект("Справочник.Производители"); > Если > СпрПроизводители.НайтиПоНаименованию(Наименование) > = 1 Тогда > ... > КонецЕсли; > > Метод "НайтиПоНаименованию()" выдает > ошибку, характерную для запросов, > невозможных к выполнени, затем > "Невосстановимую ошибку базы данных". > 1С не выдерживает такого издевательства и > сразу после этого молча > выгружается из памяти." > не воспроизвелась, метод работает корректно 1С7.7 конф. Бухгалтерия, сельта последней сборки
проблема не в методе, а в имени L'Oreal - тут есть апостроф, а после, вследствие его удвоения, транслятор неправильно воспринимает транслируемую строку и получаем ошибку. исходный запрос: set rowcount 1 select * from SC8193(NOLOCK INDEX=DESCR) where DESCR>='L''Oreal' and substring(DESCR,1,7)='L''Oreal' order by DESCR,ROW_ID set rowcount 0 необходимый результат: SELECT * FROM SC8193 WHERE DESCR>='L''Oreal' AND SUBSTR (DESCR, 1, 7)='L''Oreal' ORDER BY DESCR, ROW_ID LIMIT 1
Не забудьте вставить в тест запросов. Стас в курсе.
Есть подозрение, что по этой заявке -- http://rt.etersoft.ru/Ticket/Display.html?id=9426 падает по этой баге. По крайней мере я увидел у него в logах: set rowcount 1 select * from SC172(NOLOCK INDEX=PDESCR) where PARENTID=E' 2 ' and DESCR>='''' and substring(DESCR,1,1)='''' order by PARENTID,ISFOLDER, DESCR,ROW_ID set rowcount 0 Итак ='L''Oreal' Парсер интерпретирует как expr expr , где первый expr='L' второй 'Oreal' Попробывал сделать '' как токен Получилось, что 'LOreal''' преобразовывается а 'LOreal' || mchar('') '''LOreal' преобразовывается а mchar('') || 'LOreal' Но в 'L''Oreal' он видит все равно два expr, и соответственно не видит токен '' такое выражение преобразует в 'L''''Oreal' в 'L' || mchar('') || 'Oreal' Может из двух апострофов делать четыре. Как бы с этим разобраться пока не знаю.
Для 'L''Oreal' попробывал сделать WORDS WORDS получилось ('L'||mchar('''')||'Oreal') Но сломалось >>>>>>SELECT A b <<<<<<SELECT A||mchar('''')||b Должно быть SELECT A AS b; Вообще-то не писать AS не очень хорошо, но в bol написано [ [ AS ] column_alias ]. И похоже кто-то так и делает, потому что такой запрос есть в test.sql
Можно в начале при разборе строки менять '' двойной апостроф на другие символы. В трансляторе используется кодировка cp1251. Можно использовать символы 0x89 (Процент с двумя кружками) и 0x9A (ЛЬ вместе)
Сделал две функции Одна до парсинга меняет '' на 0x89 (Процент с двумя кружками) и 0x9A (ЛЬ вместе). Вторая после парсинга возвращает все обратно. Сделал, протестировал.