Имя: Пароль:
1C
1С v8
Access подключенный к 1С базе
0 sda553
 
19.03.12
17:15
Началась разработка с безумной идеей, связать ms access с базой 1С по таким то и таким то данным. Вначале мне показалось все просто. Подумаешь, делаешь несколько query в access которые прилинкованы к sql базе 1С и наслаждешься. Однако трудности возникли почти сразу:

Допустим, хочу я в комбобоксе на форме аксеса выбрать номенклатуру какую то. Делаю в аксесе query вида типа:
select _IDRRef, _Code, _Descr
from
_Reference1234 --там типа справочник номенклатуры
where true....--тут какие то условия отбирающие 10 номенклатур.

Естественно я в комбобоксе настраиваю свойства, чтобы он показывал колонки _Code и _Descr (код и наименование) но при выборе, в качестве value был бы _IDRRef (логично, не по наименованию же их в памяти хранить и использовать).

Началось с того что combobox отлично дает выбрать номенклатуру, но в качестве value (_IDRRef) аксес показывает строку "binary" и все тут, хоть ты тресни. До байтов этого binary я добраться не могу, или как то предобразовать их в массив байтов.

Пока кривое решение, типа из комбобокса беру номер строки которую выбрали, потом беру рекордсет который в этом комбобоксе и отсчитываю этот номер строки и оттуда получаю поле _IDRRef как массив байтов.

Пробовал заменить на select cast(_IDRRef as varchar(16)), _Code, _Descr
вообще какую то "погоду" возвращает

Я конечно понимаю, что я почти везде первопроходец, но может кто нибудь уже "вязал" аксес с 1С-ной базой? Как выкрутились с этими varbinary которые в 1с-ной базе в качестве ссылок везде?
1 774816
 
19.03.12
17:42
конвертируй в INT
CAST(_IDRRef AS INT) AS ID
2 МихаилМ
 
19.03.12
17:46
select 0+ _IDRRef
3 sda553
 
19.03.12
17:53
(1) Сча попробуем
4 sda553
 
19.03.12
17:55
(1) Какое то подозрительно маленькое число возвращает, должно ведь быть байтов 16 в таком целом, видимо INT такого не тянет
5 sda553
 
19.03.12
17:56
(2) То же самое, слишком маленькое целое
6 МихаилМ
 
19.03.12
17:57
есть вероятность , что без nolock

курсор заблокирует всю таблицу
7 sda553
 
19.03.12
17:57
Скажите а можно в sql как то это поле в BASE64 строку преобразовать в запросе?
8 sda553
 
19.03.12
17:58
(6) Нет, это выставляется в свойствах query
9 sda553
 
19.03.12
17:59
Вернее в свойствах комбобокса в которам в качестве data source задан этот query
10 МихаилМ
 
19.03.12
18:03
(9)
лучше не нарываться
11 sda553
 
20.03.12
07:51
ап, нет тут аксес спецов?
12 КМ155
 
20.03.12
07:55
(11) Adp - зло
13 Мимохожий Однако
 
20.03.12
07:59
Из 1С в Акцесс попробуй.
14 fantomask
 
20.03.12
08:43
ТОже в свое время мучался с такой проблемой, но в конце концов, сконвертировал все Таблицы access в XLS и загрузил в 1С. Так как это нужно было делать единожды.
15 sda553
 
20.03.12
11:16
(14) У меня в обратную сторону подключение
16 sda553
 
20.03.12
11:45
Ну вообщем кому интересно, я сделал stored function для преобразования 1С-ных UID в строку вида '0x97CAC8DDA6AFB42A45BB01C70B7648B3' и соответственно заменил запрос на

select sp_hexadec_to_string(_IDRRef), _Code, _Descr
from
_Reference1234
17 МихаилМ
 
20.03.12
11:51
(16)
С одной стороны - молодец
с другой -
скоро Вас выселят в копию базы.

Ну зачем Вам видеть представления гуидов.
надеюсь, Вы их отображаете по правилам 1с.

иначе могут вазникнеть неувязочки.
18 sda553
 
20.03.12
12:02
(17) Представления Гуидов никто не видит.
Комбобокс аксесса ссылается на query список вида
ТоварКод/ТоварНаименование/УИД

'001'/'Зеленая коробка'/'0x97CAC8DDA6AFB42A45BB01C70B7648B3'
'001'/'Красная коробка'/'0xb86ab59487144b69484ce36c3adaad92'

В комбобоксе показываются только первые две колонки, третья имеет нулевую ширину (так обычно в аксесе делают), а значение комбобокса привязано к третьей.

Т.е. пользователь раскрывает комбобокс, выбирает зеленую коробку, видит эту зеленую коробку, а программа видит, что combobox1.value = '0x97CAC8DDA6AFB42A45BB01C70B7648B3'

Далее эта строчка легко подставляется используя VBA в дальнейшие sql запросы вида
where _IDRref = " & combobox1.value

и можно делать в аксесе что надо по этим товарам.

Пользователи не видят ИДшников, как в 1С так и в аксесе, они только для внутреннего использования
19 sda553
 
20.03.12
12:04
Ну и в довесок функция преобразования binary в varchar

ALTER FUNCTION [dbo].[sp_hexadecimal]
(
   -- Add the parameters for the function here
   @binvalue varbinary(16)
)
RETURNS varchar(34)
AS
BEGIN
   -- Declare the return variable here
   DECLARE @charvalue varchar(34)
  declare i int
  declare @length int
  declare @hexstring char(16)

  select @charvalue = '0x'
  select i = 1
  select @length = 16
  select @hexstring = '0123456789abcdef'

  while (i <= @length)
  begin

    declare @tempint int
    declare @firstint int
    declare @secondint int

    select @tempint = convert(int, substring(@binvalue,i,1))
    select @firstint = floor(@tempint/16)
    select @secondint = @tempint - (@firstint*16)

    select @charvalue = @charvalue +
      substring(@hexstring, @firstint+1, 1) +
      substring(@hexstring, @secondint+1, 1)

    select i = i + 1

  end


   -- Return the result of the function
   RETURN @charvalue
   

END
20 МихаилМ
 
20.03.12
12:19
(19)
спасибо за код.

подскажу алтернативу встроенную в мс скл

master.dbo.fn_varbintohexstr
21 sda553
 
20.03.12
12:21
(20) ух ты, и правда
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой