Соединение данных в таблицах прямых SQL запросов

1. alexfps79 29.10.24 17:24 Сейчас в теме
Здравствуйте, коллеги!

Я подключаюсь к базе SQL по ADO. База 1С самописная. Мне нужно из документа получить номенклатуру и поставщика. Номенклатура в табличной части находится, а поставщик в основной таблице:

Поставщик это поле FLD49, но тут добавляется суффикс, получается мне нужно делать inner join но по какому полю я не очень понимаю, см. продолжение ниже:

SEL ECT TOP (1000) [_IDRRef]
      ,[_Version]
      ,[_Marked]
      ,[_Date_Time]
      ,[_Number]
      ,[_Posted]
      ,[_Fld48RRef]
      ,[_Fld49RRef]
      ,[_Fld3027]
      ,[_Fld11121RRef]
      ,[_Fld11122]
      ,[_Fld11186]
      ,[_Fld2267]
  FROM [1c_SKLAD].[dbo].[_Document30]

Показать


Справочник "Поставщики" это _Reference25. Соединение нужно делать по полю _IDRRef = _Fld49RRef
SELECT TOP (1000) [_IDRRef]
      ,[_Version]
      ,[_Marked]
      ,[_PredefinedID]
      ,[_Code]
      ,[_Description]
      ,[_Fld1609]
      ,[_Fld1610]
      ,[_Fld1611]
      ,[_Fld1612]
      ,[_Fld1613]
      ,[_Fld1614]
     FR OM [1c_SKLAD].[dbo].[_Reference25]
Показать

Буду благодарен за подсказки и советы. Если брать выборку напрямую получается COM-объект ComAsArray из бинарных данных. Картинки прилагаю.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 29.10.24 18:33 Сейчас в теме
(1) Вроде же очевидно, что
SEL ECT
     T1.*,
     T2.*
FR OM
     [1c_SKLAD].[dbo].[_Document30] T1
          INNER JOIN [1c_SKLAD].[dbo].[_Reference25] T2
          ON T1._Fld49RRef = T2._IDRRef
3. booksfill 29.10.24 18:38 Сейчас в теме
Ну вы же все написали, или вопрос в чем-то еще?

Берете документ, находите по какому полю он связан с табличной частью, лень искать, сами разберетесь, пусть это будет мнэээ "Полуэкт" _IDRRefDOC. Далее элементарно, псевдокод (если надо именно 100 док-ов, то с предварительным их отбором во временную таблицу (SEL ECT TOP 100*
INTO #tmpTestTable
FROM [1c_SKLAD].[dbo].[_Document30])

SELECT  TOP 100 100 A.*, B.*, C.* FR OM [1c_SKLAD].[dbo].[_Document30] AS A
LEFT JOIN [1c_SKLAD].[dbo].[_Reference25] AS B
ON B._IDRRef = A._Fld49RRef 
INNER JOIN [1c_SKLAD].[dbo].[_YOUR_TABLE_WITH_GOODS] AS C
ON C._IDRRefDOC = A.[_IDRRef]


Зачем оно вам надо через ADO понятия не имею.
На всякий случай, где вы там бинарные данные в выборке нашли не знаю, разве, что тащите хранилища значений или строки неограниченной длины. Проще говоря BLOB and CBLOB.
4. alexfps79 29.10.24 23:04 Сейчас в теме
(3) я имел ввиду следующее: выборка.fields("_Fld49RRef").value это comAsArray а как получить значение справочника в привычном виде? , в операторе сообщить(строка(выборка.fields("_Fld49RRef").value) выдает соmAsArray
7. booksfill 30.10.24 09:28 Сейчас в теме
(4)
сообщить(строка(выборка.fields("_Fld49RRef").value) выдает соmAsArray

Вам не надо вот этого, даже, если преобразовать ссылку в строку вы получите набор "непонятных" символов.
Тяните поле, где, например, лежит код или наименование. Как соединить таблицы пример привел.

Вы бы лучше задачу сформулировали, т.к. в представленном виде оно полностью бесполезно, ну, кроме замедления получения данных из-за необходимости инициализации COM объекта.

Если имеется в виду обмен данными, при котором одна из баз напрямую тянет данные из таблиц базы данных, то это плохая идея. Если другая база/программа ни разу не 1С и у вас нет возможности пользоваться РИБ, например, поднимите web сервис (не плохой вариант даже если др. база тоже 1С) и отдавайте данные в формате JSON.
9. user1863362 30.10.24 11:14 Сейчас в теме
(7)
замедления получения данных из-за необходимости инициализации COM объекта.
Замеров, конечно, товарищ специалист нам не предоставит.
12. alexfps79 30.10.24 12:22 Сейчас в теме
(7) Добрый день! Мне нжно из самописной конфигурации взять документ "Заказ поставщику" и загрузить в бухгалтерской базе "Счет на оплату". Веб-сервер мне не поднять, права ограничены на сервер.
Буду пробовать через V8 = Новый COMОбъект("V83.ComConnector",); видится быстрее всего
13. booksfill 30.10.24 13:22 Сейчас в теме
(12) Можно и так, можно через odata, можно просто выгрузить в файл в формате json/xml и загрузить.
Тут как бы проблема понять, что уже загрузили, что надо удалить, как один реквизит преобразовать в другой, надо ли вместе с заказом выгружать/загружать связанные данные и т.п.

Почему бы не настроить обмен через КД2?
Включаете заказ поставщику в план обмена, настраиваете правила конвертации для одностороннего обмена (туториалов пошаговых полно), создаете регламент (если у вас БСП подсистема "обмен данными" не встроена - встройте) - собственно все.
Более того, если у вас заказ поставщику более-менее стандартный, то и образец правил конвертации найдете.
5. alexfps79 29.10.24 23:05 Сейчас в теме
(3) а если не через ADO, конвертация данных?
6. Oldsad 30.10.24 02:57 Сейчас в теме
(5) 1С умеет самостоятельно отдавать данные , предварительно обработанные и подготовленные, через веб/хттп. Тем более база самописная - значит кто такие программисты 1С и где их взять вопросов не возникнет.
А не это вот - сырые данные напрямую из таблиц.
8. user1863362 30.10.24 11:13 Сейчас в теме
(3)
понятия не имею.

не знаю

разве, что тащите хранилища значений или строки неограниченной длины. Проще говоря BLOB and CBLOB.

Бинарные данные у него получаются потому что 1С хранит ссылки как binary(16), товарищ специалист. Как раз они-то через ADO в COMSafeArray и превращаются.
10. booksfill 30.10.24 11:37 Сейчас в теме
(8)
Бинарные данные у него получаются потому что 1С хранит ссылки как binary(16), товарищ специалист


Спасибо. Вы открыли новые горизонты, без вас посмотреть как хранятся ссылки я бы никогда не смог.
Ибо, как это там? А, "понятия не имею" и "не знаю".

А теперь, когда ЧСВ перестало чесаться, немного поморщите мозг и подумайте, как можно было догадаться из первоначального вопроса, что человек зачем-то будет тянуть ссылку в 1С.
Подсказка: никак, не смотря даже на упоминание про ComAsArray.
И чем в таком случае неверен ответ про другие типы данных, их хоть какой-то смысл был тянуть.
11. user1863362 30.10.24 12:20 Сейчас в теме
(10) Лень искать, сам разберешся, пусть это будет мнэээ "Полуэкт"
14. starik-2005 3090 30.10.24 14:01 Сейчас в теме
(8)
COMSafeArray
Это вообще массив любых данных, отображаемый на COM-объект. Бинарные данные могут быть представлены в виде массива байт. Обычные данные полей - в виде массива этих полей. Если что-то там, да хоть Полуэкт, является полем простого типа, то вполне себе можно заюзать что-то типа ОбъектССэйфКомАрраем.Полуэкт, и получить что-то простое.
15. SlavaKron 30.10.24 14:38 Сейчас в теме
Если гонимся за быстродействием, то ADO будет быстрее. Массив из 16 чисел легко конвертируется в УникальныйИдентификатор.
16. alexfps79 01.11.24 09:35 Сейчас в теме
(15) Здравствуйте!
ЭТо создать хранимую процедуру и поместить в текст запроса?

CRE ATE   function [dbo].[sp_getid] (@id binary(16)) 
	returns char(36) 
    	as 
	begin 
	declare @unidentifier char(36) 
	declare @charvalue char(36) 
	select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
		select @charvalue = 
		right(@unidentifier, 8) 
		+ substring(@unidentifier,24,5) 
		+ substring(@unidentifier,19,5) 
		+ '-' 
		+ substring(@unidentifier,7,2) 
		+ substring(@unidentifier,5,2) 
		+ '-' 
		+ substring(@unidentifier,3,2) 
		+ left(@unidentifier,2) 
		+ substring(@unidentifier,12,2) 
		+ substring(@unidentifier,10,2) 
		+ substring(@unidentifier,17,2) 
		+ substring(@unidentifier,15,2) 
	
		return ( @charvalue ) 
		end; 
Показать
17. SlavaKron 01.11.24 10:29 Сейчас в теме
(16) Я имел в виду встроенный язык 1С. Но если у вас работает процедура, то почему бы и нет.
18. alexfps79 01.11.24 10:47 Сейчас в теме
(17) А как получить ГУИД на встроенном языке?
19. SlavaKron 01.11.24 11:11 Сейчас в теме
(18) Если данные получаете методом GetRows(), то поля типа binary будут сразу выгружены в массив байтов. Для ComSafeArray, логика не сильно изменится. Массив – это массив байтов, полученный из поля binary(16)
СтрокаУИД =
	ByteToHex[Массив[12]] +
	ByteToHex[Массив[13]] +
	ByteToHex[Массив[14]] +
	ByteToHex[Массив[15]] +
	"-" +
	ByteToHex[Массив[10]] +
	ByteToHex[Массив[11]] +
	"-" +
	ByteToHex[Массив[8]] +
	ByteToHex[Массив[9]] +
	"-" +
	ByteToHex[Массив[0]] +
	ByteToHex[Массив[1]] +
	"-" +
	ByteToHex[Массив[2]] +
	ByteToHex[Массив[3]] +
	ByteToHex[Массив[4]] +
	ByteToHex[Массив[5]] +
	ByteToHex[Массив[6]] +
	ByteToHex[Массив[7]];
Показать
ByteToHex – это массив, который, конечно же, должен быть как-то закеширован. Это массив из 256 элементов: от "00" до "ff". Заполняется следующим образом:
ByteToHex = Новый Массив(256);
Символы16 = "0123456789abcdef";
Для Сч = 0 По 255 Цикл
	ByteToHex[Сч] = Сред(Символы16, Цел(Сч / 16) + 1, 1) + Сред(Символы16, Сч % 16 + 1, 1)
КонецЦикла;
С точки зрения быстродействия, думаю, тут "копейки": происходит 32 обращения к элементу массива по индексу и конкатенация 16 элементов в строку.
alexfps79; +1 Ответить
20. alexfps79 01.11.24 11:19 Сейчас в теме
(19) Скажите, пожалуйста, порядок индексов важен при сложении?

СтрокаУИД =
ByteToHex[Массив[12]] +
	ByteToHex[Массив[13]] +
	ByteToHex[Массив[14]] +
	ByteToHex[Массив[15]] +
	"-" +
	ByteToHex[Массив[10]] +
	ByteToHex[Массив[11]] +
	"-" +...
Показать
21. SlavaKron 01.11.24 11:22 Сейчас в теме
(20) Конечно. Тут указан порядок, соответствующий УИД ссылки в 1С.
22. alexfps79 02.11.24 16:15 Сейчас в теме
(21) Добрый день! Скажите, пожалуйста, когда имеет смысл конструкция Выборка.BOF (это же сокращение Beggining of file)? А какя разница в конструкциях Выборка.Open(Команда); и Выборка = Команда.Execute();??

Заранее благодарю за ответы.
23. SlavaKron 02.11.24 16:42 Сейчас в теме
(22) BOF не пользовался, пользовался EOF, чтобы понять, что recordset не пустой. По ADO есть справка BOF
Выборка – это, я так понимаю объект Recordset Его можно получить напрямую из Connection через метод Execute
А какя разница в конструкциях Выборка.Open(Команда); и Выборка = Команда.Execute()
Уточните в справке по методу Open - я затрудняюсь ответить.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот