Я подключаюсь к базе 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 из бинарных данных. Картинки прилагаю.
Берете документ, находите по какому полю он связан с табличной частью, лень искать, сами разберетесь, пусть это будет мнэээ "Полуэкт" _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.
(3) я имел ввиду следующее: выборка.fields("_Fld49RRef").value это comAsArray а как получить значение справочника в привычном виде? , в операторе сообщить(строка(выборка.fields("_Fld49RRef").value) выдает соmAsArray
Вам не надо вот этого, даже, если преобразовать ссылку в строку вы получите набор "непонятных" символов.
Тяните поле, где, например, лежит код или наименование. Как соединить таблицы пример привел.
Вы бы лучше задачу сформулировали, т.к. в представленном виде оно полностью бесполезно, ну, кроме замедления получения данных из-за необходимости инициализации COM объекта.
Если имеется в виду обмен данными, при котором одна из баз напрямую тянет данные из таблиц базы данных, то это плохая идея. Если другая база/программа ни разу не 1С и у вас нет возможности пользоваться РИБ, например, поднимите web сервис (не плохой вариант даже если др. база тоже 1С) и отдавайте данные в формате JSON.
(7) Добрый день! Мне нжно из самописной конфигурации взять документ "Заказ поставщику" и загрузить в бухгалтерской базе "Счет на оплату". Веб-сервер мне не поднять, права ограничены на сервер.
Буду пробовать через V8 = Новый COMОбъект("V83.ComConnector",); видится быстрее всего
(12) Можно и так, можно через odata, можно просто выгрузить в файл в формате json/xml и загрузить.
Тут как бы проблема понять, что уже загрузили, что надо удалить, как один реквизит преобразовать в другой, надо ли вместе с заказом выгружать/загружать связанные данные и т.п.
Почему бы не настроить обмен через КД2?
Включаете заказ поставщику в план обмена, настраиваете правила конвертации для одностороннего обмена (туториалов пошаговых полно), создаете регламент (если у вас БСП подсистема "обмен данными" не встроена - встройте) - собственно все.
Более того, если у вас заказ поставщику более-менее стандартный, то и образец правил конвертации найдете.
(5) 1С умеет самостоятельно отдавать данные , предварительно обработанные и подготовленные, через веб/хттп. Тем более база самописная - значит кто такие программисты 1С и где их взять вопросов не возникнет.
А не это вот - сырые данные напрямую из таблиц.
разве, что тащите хранилища значений или строки неограниченной длины. Проще говоря BLOB and CBLOB.
Бинарные данные у него получаются потому что 1С хранит ссылки как binary(16), товарищ специалист. Как раз они-то через ADO в COMSafeArray и превращаются.
Бинарные данные у него получаются потому что 1С хранит ссылки как binary(16), товарищ специалист
Спасибо. Вы открыли новые горизонты, без вас посмотреть как хранятся ссылки я бы никогда не смог.
Ибо, как это там? А, "понятия не имею" и "не знаю".
А теперь, когда ЧСВ перестало чесаться, немного поморщите мозг и подумайте, как можно было догадаться из первоначального вопроса, что человек зачем-то будет тянуть ссылку в 1С.
Подсказка: никак, не смотря даже на упоминание про ComAsArray.
И чем в таком случае неверен ответ про другие типы данных, их хоть какой-то смысл был тянуть.
Это вообще массив любых данных, отображаемый на COM-объект. Бинарные данные могут быть представлены в виде массива байт. Обычные данные полей - в виде массива этих полей. Если что-то там, да хоть Полуэкт, является полем простого типа, то вполне себе можно заюзать что-то типа ОбъектССэйфКомАрраем.Полуэкт, и получить что-то простое.
(18) Если данные получаете методом GetRows(), то поля типа binary будут сразу выгружены в массив байтов. Для ComSafeArray, логика не сильно изменится. Массив – это массив байтов, полученный из поля binary(16)
ByteToHex – это массив, который, конечно же, должен быть как-то закеширован. Это массив из 256 элементов: от "00" до "ff". Заполняется следующим образом:
ByteToHex = Новый Массив(256);
Символы16 = "0123456789abcdef";
Для Сч = 0 По 255 Цикл
ByteToHex[Сч] = Сред(Символы16, Цел(Сч / 16) + 1, 1) + Сред(Символы16, Сч % 16 + 1, 1)
КонецЦикла;
С точки зрения быстродействия, думаю, тут "копейки": происходит 32 обращения к элементу массива по индексу и конкатенация 16 элементов в строку.
(21) Добрый день! Скажите, пожалуйста, когда имеет смысл конструкция Выборка.BOF (это же сокращение Beggining of file)? А какя разница в конструкциях Выборка.Open(Команда); и Выборка = Команда.Execute();??
(22) BOF не пользовался, пользовался EOF, чтобы понять, что recordset не пустой. По ADO есть справка BOF Выборка – это, я так понимаю объект Recordset Его можно получить напрямую из Connection через метод Execute
А какя разница в конструкциях Выборка.Open(Команда); и Выборка = Команда.Execute()
Уточните в справке по методу Open - я затрудняюсь ответить.