Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Почему $Перечисление.Булево.Да это char(23) а не char(9)  ? (число прочтений - 4300 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
14. Октября 2014 :: 05:57
Печать  
Простой тест
Код
Выбрать все
Процедура Сформировать()
	a1 = Перечисление.Булево.Да;
	ТекстЗапроса = "select $Перечисление.Булево.Да 'Значение_id' , 'Да' 'Название'
	|union all
	|select  $Перечисление.Булево.Нет, 'Нет'
	|";
	Тз1 = гл_Запрос_Остатки.ВыполнитьИнструкцию(ТекстЗапроса);
	Тз1.Выбратьстроки();
	Пока Тз1.ПолучитьСтроку() = 1 Цикл
		Дл1 = СтрДлина(Тз1.Значение_id);
		Сообщить("'" + Тз1.Значение_id + "'=" + Тз1.Название + " длина = " + Дл1);
	КонецЦикла;
КонецПроцедуры
 



Результат выполнения

'    3D                 '=Да длина = 23
'    3E                 '=Нет длина = 23


и реально или нет это исправить ?
или может есть какой либо модификатор  для значений перечислений генерирующий char(9)  ?

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #1 - 14. Октября 2014 :: 06:20
Печать  
у меня норм
СтрДлина(глРС.ВыполнитьСкалярный("select $Перечисление.Булево.Да")) = 9
и
ВыполнитьИнструкцию("select '!'+$Перечисление.Булево.Да+'!'")
возвращает !    3D   !
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #2 - 14. Октября 2014 :: 06:36
Печать  
(trad) Спасибо за ответ.

может это зависит от версии 1с++ (проверял на 3.2.3.1)   ?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #3 - 14. Октября 2014 :: 06:48
Печать  
3.2.4.3
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #4 - 14. Октября 2014 :: 06:49
Печать  
Отладка(1)
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #5 - 14. Октября 2014 :: 07:03
Печать  
Когда РежимRPC(0) то отладка(1) дает

select '    3D   ' 'Значение_id' , 'Да' 'Название'
union all
select  '    3E   ', 'Нет'

т.е.  все работает правильно

Когда РежимRPC(1) то отладка(1) дает
{call sp_executesql(N'select @_CP_0 ''Значение_id'' , ''Да'' ''Название''
union all
select  @_CP_1, ''Нет''
', N'@_CP_0 char(23),@_CP_1 char(23)'
,'    3D   ','    3E   ')}

и вот тут то и происходят неправильные преобразования в char(23)
но не знаю кто генерит код в этом случае 1с++  или уже само 1с.exe



  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #6 - 14. Октября 2014 :: 07:31
Печать  
Вот что дает еще один тест
Код
Выбрать все
Процедура Сформировать3()
	a1 = Перечисление.Булево.Да;
	ТекстЗапроса = "select id
	|from $Справочник.ДлиныКп Спр1
	|where
	|$Спр1.мер1 = $Перечисление.Булево.Да
	|";
	гл_Запрос_Остатки.Отладка(1);
	Тз1 = гл_Запрос_Остатки.ВыполнитьИнструкцию(ТекстЗапроса);
	гл_Запрос_Остатки.Отладка(0);

	Сообщить("
	|запрос 2
	|");
	ТекстЗапроса = "select id
	|from $Справочник.ДлиныКп Спр1
	|where
	|$Спр1.мер1 = :Зн_Да
	|";
	гл_Запрос_Остатки.УстановитьТекстовыйПараметр("Зн_Да", a1);
	гл_Запрос_Остатки.Отладка(1);
	Тз1 = гл_Запрос_Остатки.ВыполнитьИнструкцию(ТекстЗапроса);
	гл_Запрос_Остатки.Отладка(0);

КонецПроцедуры

 




Результат работы
Цитата:
{call sp_executesql(N'select id
from sc1370 Спр1
where
Спр1.sp1387 = @_CP_0
', N'@_CP_0 char(23)'
,'    3D   ')}

запрос 2

{call sp_executesql(N'select id
from sc1370 Спр1
where
Спр1.sp1387 = @Зн_Да0
', N'@Зн_Да0 char(9)'
,'    3D   ')}


А по идее должен быть один результат.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #7 - 14. Октября 2014 :: 08:13
Печать  
да, занятный глюк
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #8 - 14. Октября 2014 :: 08:29
Печать  
trad писал(а) 14. Октября 2014 :: 08:13:
да, занятный глюк

а чей глюк 1c.exe  или 1с++   ?


  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #9 - 14. Октября 2014 :: 10:32
Печать  
1с++
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #10 - 14. Октября 2014 :: 11:19
Печать  
trad писал(а) 14. Октября 2014 :: 10:32:
1с++

ну тогда можно надеяться ( или нельзя ) этот баг исправить ?

наверно это редко встречающаяся ситуация и важна она для очень
оптимальных запросов ...


  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #11 - 15. Октября 2014 :: 05:53
Печать  
я бы не стал надеяться
к тому же, для очень-очень оптимального запроса можно и не полениться значение перечисления загнать через параметр
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему $Перечисление.Булево.Да это char(23) а не char(9)  ?
Ответ #12 - 15. Октября 2014 :: 05:59
Печать  
trad писал(а) 15. Октября 2014 :: 05:53:
я бы не стал надеяться
к тому же, для очень-очень оптимального запроса можно и не полениться значение перечисления загнать через параметр

Спасибо , понятно.
Заганять через параметр для оптимального запроса
тоже есть небольшой минус - это время 1с для установки параметра
второй минус то что код через $Перечисление более читаемый.
тогда получается можно писать перечисления в виде текстовых sql констант а в коментариях все расписывать.


Ну как бы может subj поможет еще кому либо
что есть такая особенность 1c++
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать