Имя: Пароль:
1C
 
Сравнение ВнешнегоИсточникаДанных с ТЗ
,
0 DenYuliya
 
16.12.22
14:10
Всем привет.
Есть ТЗ (результат запроса), есть объект 1С с типом "Внешний источник данных" (далее - ВИД), первый раз в глаза вижу такой, каюсь. Надо их сравнить, точнее отобрать строки из ВИД, где значения колонок в ВИД совпадают с аналогичными в ТЗ.
Проще всего это было бы сделать, конечно, в запросе. Но - нельзя же в одном запрос делать запрос к справочнику и ВИД.  
Как еще можно поискать, чтобы пооптимальнее? Или хотя бы ключевые слова поиска в гугле/СП:)
Спасибо!
1 p-soft
 
16.12.22
14:18
кто "нельзя же в одном запрос делать запрос к справочнику и ВИД" запретил? определяем состав полей и в запрос все..
2 DenYuliya
 
16.12.22
14:24
(1) это как? Мануал по работе с ВИД говорит, что нельзя, и при попытке выбрать - тоже ошибка.
3 p-soft
 
16.12.22
14:33
(2) может в последних релизах добавили. я сейчас специально в справку залез - в запросах присутствует объект таблица из вид
4 p-soft
 
16.12.22
14:33
(3) а впрочем, какая разница. ну выгрузите все в одну тз, сверните и считайте строки по шаблону..
5 Kassern
 
16.12.22
14:34
(2) "Мануал по работе с ВИД говорит, что нельзя" - скиньте ссылку, где такое говорится
6 H A D G E H O G s
 
16.12.22
14:51
(4) Достаточно просто напрячь мозг
7 H A D G E H O G s
 
16.12.22
14:52
(5) У вас пятничное замутнение? 2 разные базы, скорее всего. Или вообще 2 разных сервера СУБД
8 H A D G E H O G s
 
16.12.22
14:53
(0) Массив впихивай, по нему отбирай из ВИД. И потом сравнивай 2 ТЗ
9 Kassern
 
16.12.22
15:34
(7) Давно с видами не ковырялся, на одном проекте настроена синхронизация путевых листов через ВИД, который год работает.
10 Kassern
 
16.12.22
15:37
(8) Можно наверное через набор данных объект подсунуть таблицу из ВИД и далее уже в СКД соединить со своими данными.
11 DenYuliya
 
16.12.22
16:02
(5) к сожалению, ссылку что-то найти не могу, где это обсуждалось. При одновременном выборе в качестве источников в запросе справочника и ВИД выдается ошибка "Получение данных из нескольких источников данных недопустимо"
12 DenYuliya
 
16.12.22
16:02
(3) При одновременном выборе в качестве источников в запросе справочника и ВИД выдается ошибка "Получение данных из нескольких источников данных недопустимо"
13 H A D G E H O G s
 
16.12.22
16:02
(10) Это СКДшная ересь, не имеющая отношения к светлому и чистому изначальному запросу.
14 DenYuliya
 
16.12.22
16:06
(13) типа если ручками писать, то ошибки не будет? В консоли запросов такая же ошибка.
15 DenYuliya
 
16.12.22
16:10
(4)  "ну выгрузите все в одну тз" - из ВИД, через ВнешниеИсточникиДанных.НашВИД.Таблицы.НашаНеобъектнаяТаблицаВИД.СоздатьНаборЗаписей();  ?

"Сверните и считайте строки по шаблону" - получается, это надо проделывать будет каждый раз (в цикле) для каждой из строк ТЗ (результат запроса из справочника)? Неоптимально как-то... Схлопнуть 2 таблицы по общему реквизиту в запросе было бы красивее(
16 DenYuliya
 
16.12.22
16:11
(8), (10) вообще не понимаю, как это делается(.
17 p-soft
 
16.12.22
16:14
(16) отдохните, еще попробуйте. программирование - это сложно. я вот 20 лет пишу, а все равно бывает туплю(
18 DenYuliya
 
16.12.22
16:15
(7) "2 разные базы, скорее всего. Или вообще 2 разных сервера СУБД" вы о источниках данных в ВИД (вид как объект 1С)? Выгружены из некой сторонней программы, не 1С, из  *.bak, более подробно не могу сказать.
19 DenYuliya
 
16.12.22
16:16
(17) очень ценный совет. Плохо, когда не знал, да еще и забыл.
20 p-soft
 
16.12.22
16:17
(19) знания - придут, я про упорство.
21 H A D G E H O G s
 
16.12.22
16:18
(15) Есть ТЗ (результат запроса) - назовем ее ТаблицаИзЗапроса

МассивПоиска=ТаблицаИзЗапроса.ВыгрузитьКолонку("КолонкаСвязиСВид");

ЗапросКВИД.УстановитьПараметр("МассивПоиска",МассивПоиска);

ТаблицаИзВИД=Запрос.Выполнить().Выгрузить();


Вот и 2 таблицы ТаблицаИзЗапроса и ТаблицаИзВИД.

Соединяем их mergejoin и будет одна таблица.
22 DenYuliya
 
16.12.22
16:18
(17) выгрузить целиком всю таблицу в массив, потом массив передать в запрос, и с ним уже соединять справочник? Об этом речь?
23 H A D G E H O G s
 
16.12.22
16:19
ТаблицаИзВИД=Запрос.Выполнить().Выгрузить();
читать как
ТаблицаИзВИД=ЗапросКВИД.Выполнить().Выгрузить();
24 H A D G E H O G s
 
16.12.22
16:19
МассивПоиска еще сверните перед помещением в параметр ЗапросаКВИД если предполагаются дубли
25 DenYuliya
 
16.12.22
16:20
(23) а, так к ВИД по отдельности можно делать запрос? Это отлично! Спасибо, попробую так сделать.
26 mikecool
 
16.12.22
16:23
(16) данные ВИД загони во врем таблицу, потом ее соединяй со своими
27 H A D G E H O G s
 
16.12.22
16:25
(26) Excel, который может быть источником ВИД смотрит на тебя как-то недовольно, свирепо и в то же время грустно и с недоумением.
28 H A D G E H O G s
 
16.12.22
16:26
(25) По отдельности - можно.
29 DenYuliya
 
16.12.22
17:15
(27) не, там не Excel - источник ВИД. Это бэкап некой сторонней программы учета на скуле.
30 Kassern
 
16.12.22
17:20
(13) Ну почему сразу ересь? Только что протестил, норм отрабатывает, через набор-объект получил нужные таблицы из ВИД, а дальше любишь их со своими таблицами из базы и все красиво выводишь с возможностями СКД.
31 Kassern
 
16.12.22
17:25
(30) +можно и без набора-объект вопрос решить, для каждой таблицы ВИД сделать свой набор данных - запрос. Далее все это дело связать и все будет отрабатывать
32 Kassern
 
16.12.22
17:25
Ограничение лишь в разрезе одного набора подключение ВИД к прочим таблицам.
33 mikecool
 
16.12.22
17:30
(27) также, как и на запросы через драйвер odbc
34 Kassern
 
16.12.22
17:31
(32) Вот мини пример сделанный на коленке:
https://disk.yandex.ru/i/7hEXBJHQMQB5AA Перечень таблиц
https://disk.yandex.ru/i/7khbngumQiD0Xg Связи наборов
35 DenYuliya
 
16.12.22
17:40
(5) кстати, ссылку на мануал я нашла. https://helpf.pro/faq83/view/1223.html
36 DenYuliya
 
16.12.22
17:40
(34) спасибо большое, сейчас посмотрю
37 DenYuliya
 
16.12.22
17:41
(30) что за "набор-объект"? Это для таблиц ВИД с типом данных таблиц "Объектные данные"?
38 Kassern
 
16.12.22
17:55
(37) https://disk.yandex.ru/i/HpQjfFmMOKSD6Q
Тут это не важно, объект, или запрос. Тут важно, чтобы ВИД был в отдельном наборе.
39 DenYuliya
 
16.12.22
18:18
(24) кстати, насчет "свернуть массивы, если есть дубли". Я вспомнила про еще одно условие. Есть ТабЗначИзСправочника и ТабЗначИзВИД. Так вот в ТабЗначИзВИД МОГУТ БЫТЬ дубли по ключевому полю (идентификатору). И это нормально. В этом случае есть определенный алгоритм отбора, какую из нескольких записей брать, путем проверки других реквизитов.

При таком раскладе просто "схлопнуть" не получится же? Или засунуть в запрос 2 ТЗ (помнится, как-то это можно сделать, и не особо сложно), а потом уже там их объединять? Или как-то сначала проверить... Хотелось бы "цикла в цикле" избежать.
40 H A D G E H O G s
 
16.12.22
18:20
(39) "Хотелось бы "цикла в цикле" избежать."

Я же написал - mergejoin
41 DenYuliya
 
16.12.22
21:12
(27) кстати да, а чем плох вариант (26)? Выгрузить запросом в ТЗ из ВОД, как в (28). Загрузить эту ТЗ в новый запрос, как ВТ. И ее соединить со справочником. Норм вариант?
(40) стыдоба, но я не поняла. Что имеется под "mergejoin" в контексте данного вопроса? Соединение запросом?
42 DenYuliya
 
16.12.22
21:18
(40) это подобно примеру тут https://infostart.ru/public/326983/ в пункте "3.5. Слияние" ?
43 H A D G E H O G s
 
16.12.22
21:44
(42) Да
44 H A D G E H O G s
 
16.12.22
21:46
(41) "кстати да, а чем плох вариант (26)"

Данные ВИД надо предварительно отобрать по массиву. Вдруг этих данных в ВИД будет миллион, а в таблице - сотня. Вот выгрузишь эту сотню в массив и отберешь по нему ВИД.
45 DenYuliya
 
16.12.22
22:46
(44) о божечки, я, похоже, запуталась сама уже((((. Да, все так и есть. В ТЗ1 может быть сотня, а в ТЗ_Вид (которая из ВИД выгружена) может быть миллион.
Я сейчас пытаюсь пойти по пути "запихнуть ТЗ1 и ТЗ_ВИД в запрос и там уже их соединением схлопнуть, чтобы все строки из ТЗ_ВИД, совпадающие по ID с ТЗ1 - присоединились". Плохой вариант, да? Может реально проще забыть про запрос и в цикле это все обойти?
46 DenYuliya
 
16.12.22
22:49
к (45) об этом и шла речь в (21), видимо. Про "забыть про запрос и в цикле это все обойти"
47 DenYuliya
 
16.12.22
23:10
(34) сейчас будет тупой вопрос. А СКД вне объекта "Отчет" я не могу запустить что ли? В модуле формы обработки я не могу (или что то делаю не так) сделать через набор-объект, у меня же там просто конструктор запроса, не СКД.
48 DenYuliya
 
16.12.22
23:20
Ну теперь я вообще уперлась в какую-то странную скульную ошибку. Причем она возникает, если я беру, к примеру, за месяц. А за конкретный день - все нормально. Я так понимаю, это что-то с языком "скуль/кириллица" связано? А что с этим делать, никто не знает, случайно?
49 DenYuliya
 
16.12.22
23:21
К (48), не вставилось почему-то в сообщение:

Ошибка ODBC. SQLSTATE: 42000
Номер ошибки: 468
Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot resolve the collation conflict between "Slovak_CI_AS" and "SQL_Latin1_General_CP1_CS_AS" in the equal to operation.

{ВнешняяОбработка.ЗагрузкаИз_DBO__Breed.Форма.Форма.Форма(136)}:РезультатЗапросаК_ВИД = ЗапросК_ВИД.Выполнить().Выгрузить();
{ВнешняяОбработка.ЗагрузкаИз_DBO__Breed.Форма.Форма.Форма(14)}:ТабДанныеИзВид =  ПолучитьДанныеИзВИД(МассивПоиска); //ТЗ из ВИД
{ВнешняяОбработка.ЗагрузкаИз_DBO__Breed.Форма.Форма.Форма(4)}:ЗагрузитьНаСервере();

по причине:
Ошибка выполнения запроса
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 42000
Номер ошибки: 468
Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot resolve the collation conflict between "Slovak_CI_AS" and "SQL_Latin1_General_CP1_CS_AS" in the equal to operation.
50 DenYuliya
 
16.12.22
23:44
к (49).
В общем, история такая: это проблема в кодировке внешней базы данных. Программа, из которой выгружались данные - из Словакии, крутилась на словацкой локали. Эта ошибка -это конфликт локалей.Короче это специфика этого внешнего источника данных и ничего с ней сделать нельзя, кроме как не использовать запрос. Приплыли(.
Основная теорема систематики: Новые системы плодят новые проблемы.