|
v7: Получить список движений по регистру черным запросом | ☑ | ||
---|---|---|---|---|
0
Злопчинский
02.07.15
✎
19:00
|
Есть куча однотипных доков.
Каждый док делает несколько движений по одному и тому же регистру. Как (чорным) запросом получить тупой перечень движений с указанием всех измерений, ресурсов, реквизитов...? туплю отчаянно |
|||
1
Злопчинский
02.07.15
✎
19:02
|
Согласен даже на прямой запрос...
|
|||
2
Garykom
гуру
02.07.15
✎
19:12
|
Приход() Расход()
|
|||
3
vcv
02.07.15
✎
19:23
|
Прямой запрос в лёгкую. А "черный" не даст гарантированного результата. Он в обязательном порядке группирует строки. максимум, добавить группировки по документу и номеру строки документа. Но и это не гарантия, если есть несколько движений одного документа по одной строке документа с одинаковым набором измерений и реквизитов.
|
|||
4
Злопчинский
02.07.15
✎
19:28
|
(3) а подключиться по тиму сейчас и помочь?
|
|||
5
Garykom
гуру
02.07.15
✎
19:29
|
(3) да (2) сложит движения одного документа для одинаковых № строк, но вот не пофиг?
|
|||
6
Злопчинский
02.07.15
✎
19:30
|
(3) за денежку ясен пень
|
|||
7
13Дима13
02.07.15
✎
19:32
|
(0) что значит "черным запросом"?
|
|||
8
Garykom
гуру
02.07.15
✎
19:32
|
(6) да в обычный запрос вставь функции КолПриход=Приход(Кол) и КолРасход=Расход(Кол) и проверь
|
|||
9
Злопчинский
02.07.15
✎
19:34
|
(8) без указания всех группировок -- свернет в строку
|
|||
10
Garykom
гуру
02.07.15
✎
19:36
|
(9) так укажи нужные Документа и № строки
|
|||
11
Злопчинский
02.07.15
✎
19:37
|
(10) у документа нет строк. реквизиты которые формируют двитжения в регистр - только в шапке
|
|||
12
Garykom
гуру
02.07.15
✎
19:38
|
(11) тем более, какая разница какие были разные движения один фиг сумма одна
|
|||
13
ДенисЧ
02.07.15
✎
19:42
|
select *
FROM $Регистр.МойРегистр WHERE IDDOC = МойИд |
|||
14
Злопчинский
02.07.15
✎
19:42
|
(12) это тебе так кажется. документ формирует два движения - в плюс и в минус с разным набором измерений
|
|||
15
vcv
02.07.15
✎
19:43
|
(4) Что-что не понял... Точнее не ожидал от старого 1сника...
Если тупо открыть конструктор запроса, добавить в запрос все измерения, ресурсы, реквизиты, ТекущийДокумент, НомерСтроки; сделать группировки по всем измерениям, ТекущийДокумент, НомерСтроки; добавить функции Приход и Расход по всем ресурсам... Что тогда не устраивает? Да, часть строк может свернуться. Но это критично? Если да, то только прямой запрос. |
|||
16
Злопчинский
02.07.15
✎
19:43
|
(15) эээ такой путья знаю, мне он не нравится. и да - сверка может быть, и она недопустима
|
|||
17
Злопчинский
02.07.15
✎
19:44
|
(13) вот бы лучше не издевался а онлайном помог...
|
|||
18
Duke1C
02.07.15
✎
19:45
|
ВыбратьДвижения(<ДатаНачала>,<ДатаКонца>,<ГрафаОтбора>) не?
|
|||
19
vcv
02.07.15
✎
19:45
|
А можно не запросом, а Рег.ВыбратьДвиженияДокумента(док) и в цикле с ними чего-нибудь уже делать.
|
|||
20
Злопчинский
02.07.15
✎
19:46
|
не, так не интересно - так я умею, я ж хочу прямым запросом, заодно и посмотреть как это сделано
|
|||
21
vcv
02.07.15
✎
19:47
|
У меня в конфе есть такая функция, может сгодится в качестве рыбы:
Функция глПолучитьТаблицуДвиженийДокумента(Конт, ВидРег, СворачиватьТаблицу=1, ВключаяСторнирующиеДвижения=1,ИнвертироватьРесурсы=0,ЗаполнятьЗначениеПоиска=0) Экспорт Перем метаРегистр, КоличествоИзмерений, КоличествоРесурсов, КоличествоРеквизитов; Перем НомерИзмерения, НомерРесурса, НомерРеквизита; Перем ИдентификаторИзмерения, ИдентификаторРесурса, ИдентификаторРеквизита, ЗначениеИзмерения, ЗначениеРесурса, ЗначениеРеквизита; Перем НомерСтрокиТаблицы, СтрокаИзмерений, СтрокаРесурсов; Перем ТекстЗапроса, Запрос; метаРегистр = Метаданные.Регистр(ВидРег); КоличествоИзмерений = метаРегистр.Измерение(); КоличествоРесурсов = метаРегистр.Ресурс(); КоличествоРеквизитов = метаРегистр.Реквизит(); Запрос = СоздатьОбъект("ODBCRecordSet"); ТекстЗапроса = ""; СтрокаИзмерений = ""; Для НомерИзмерения = 1 По КоличествоИзмерений Цикл метаИзмерение = метаРегистр.Измерение(НомерИзмерения); ИдентификаторИзмерения = метаИзмерение.Идентификатор; СтрокаИзмерений = СтрокаИзмерений + ?(СтрокаИзмерений="","",",") + ИдентификаторИзмерения; ТекстЗапроса = ТекстЗапроса + РазделительСтрок + ", $Рег." + ИдентификаторИзмерения+" ["+СокрЛП(ИдентификаторИзмерения+" "+ТипВидЗначения(метаИзмерение.Тип,метаИзмерение.Вид))+"]"; КонецЦикла; Если СворачиватьТаблицу = 0 Тогда метаРеквизит = метаРегистр.Реквизит("Сторно"); Если метаРеквизит.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + РазделительСтрок + ", $Рег.Сторно [Сторно]"; КонецЕсли; Для НомерРеквизита = 1 По КоличествоРеквизитов Цикл метаРеквизит = метаРегистр.Реквизит(НомерРеквизита); ИдентификаторРеквизита = метаРеквизит.Идентификатор; Если метаРеквизит.Тип = "Дата" Тогда ТекстЗапроса = ТекстЗапроса + РазделительСтрок + ", NullIf($Рег."+ИдентификаторРеквизита+", '17530101') ["+СокрЛП(ИдентификаторРеквизита+" "+ТипВидЗначения(метаРеквизит.Тип,метаРеквизит.Вид))+"]"; ИначеЕсли ИдентификаторРеквизита <> "Сторно" Тогда ТекстЗапроса = ТекстЗапроса + РазделительСтрок + ", $Рег." + ИдентификаторРеквизита+" ["+СокрЛП(ИдентификаторРеквизита+" "+ТипВидЗначения(метаРеквизит.Тип,метаРеквизит.Вид))+"]"; КонецЕсли; КонецЦикла; КонецЕсли; СтрокаРесурсов = ""; Для НомерРесурса = 1 По КоличествоРесурсов Цикл метаРесурс = метаРегистр.Ресурс(НомерРесурса); ИдентификаторРесурса = метаРесурс.Идентификатор; СтрокаРесурсов = СтрокаРесурсов + ?(СтрокаРесурсов="","",",") + ИдентификаторРесурса; Если ИнвертироватьРесурсы = 1 Тогда ТекстЗапроса = ТекстЗапроса + РазделительСтрок + ", CASE Рег.DEBKRED WHEN 0 THEN -$Рег." + ИдентификаторРесурса+" ELSE $Рег." + ИдентификаторРесурса+" END [" +ИдентификаторРесурса+"]"; Иначе ТекстЗапроса = ТекстЗапроса + РазделительСтрок + ", CASE Рег.DEBKRED WHEN 0 THEN $Рег." + ИдентификаторРесурса+" ELSE -$Рег." + ИдентификаторРесурса+" END [" +ИдентификаторРесурса+"]"; КонецЕсли; КонецЦикла; ТекстЗапроса = "SELECT |Рег.LINENO_ НомерСтрокиДокумента |, CASE Рег.DEBKRED WHEN 0 THEN 1 ELSE 0 END Приход |, CASE Рег.DEBKRED WHEN 0 THEN 0 ELSE 1 END Расход |"+ТекстЗапроса + " |FROM $Регистр."+ВидРег+" as Рег WITH (NOLOCK) |WHERE Рег.IDDoc = :ВыбДок"; Если ВключаяСторнирующиеДвижения = 0 Тогда Если метаРегистр.Реквизит("Сторно").Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + " AND $Рег.Сторно=0"; КонецЕсли; ИначеЕсли ВключаяСторнирующиеДвижения < 0 Тогда Если метаРегистр.Реквизит("Сторно").Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + " AND $Рег.Сторно=1"; КонецЕсли; КонецЕсли; Запрос.УстановитьТекстовыйПараметр("ВыбДок", глMDW.ЗначениеВСтрокуБД(Конт.ТекущийДокумент())); РезультатЗапроса = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); Если ЗаполнятьЗначениеПоиска = 1 Тогда РезультатЗапроса.НоваяКолонка("ЗначениеПоиска","Строка"); РезультатЗапроса.ВыбратьСтроки(); Пока РезультатЗапроса.ПолучитьСтроку() = 1 Цикл ЗначениеПоиска = ""; Для НомерИзмерения = 1 По КоличествоИзмерений Цикл ИдентификаторИзмерения = метаРегистр.Измерение(НомерИзмерения).Идентификатор; ЗначениеИзмерения = РезультатЗапроса.ПолучитьЗначение(РезультатЗапроса.НомерСтроки, ИдентификаторИзмерения); ЗначениеПоиска = ЗначениеПоиска + ЗначениеВСтрокуВнутр(ЗначениеИзмерения); КонецЦикла; РезультатЗапроса.ЗначениеПоиска = ЗначениеПоиска; КонецЦикла; КонецЕсли; Если СворачиватьТаблицу <> 0 Тогда РезультатЗапроса.Свернуть(?(ЗаполнятьЗначениеПоиска=0,СтрокаИзмерений,"ЗначениеПоиска,"+СтрокаИзмерений),СтрокаРесурсов); КонецЕсли; Если глТрассировкаВызоваФункций = 1 Тогда глСообщениеТрассировкиВызоваФункций(,"глПолучитьТаблицуДвиженийДокумента",СписокЗначений(ВидРег,СворачиватьТаблицу,ВключаяСторнирующиеДвижения),РезультатЗапроса); КонецЕсли; Возврат РезультатЗапроса; КонецФункции // глПолучитьТаблицуДвиженийДокумента |
|||
22
Злопчинский
02.07.15
✎
19:52
|
(21) КОГДА_НИБУДЬ - точно сгодится!
|
|||
23
ДенисЧ
02.07.15
✎
20:00
|
(17) Я не издеваюсь, я тебе запрос рабочий дал...
|
|||
24
Злопчинский
02.07.15
✎
20:03
|
(23) Издеваешься, точно!
запрос я примерно понял ;-) 1. как его в 1Sqlite засунуть? 2. периодом ограничить? есть глВКлайт = СоздатьОбъект("SQLiteBase"); |
|||
25
Злопчинский
02.07.15
✎
20:04
|
к справочнику выборку я простенькие делал запросы сам - здесь также?
|
|||
26
ДенисЧ
02.07.15
✎
20:04
|
(24) Зачем тебе период, если у тебя есть IDDOC?
Ты что, издеваешься? Или у тебя тоже аккаунт увели? |
|||
27
vcv
02.07.15
✎
20:05
|
(23) Обвязку забыл. Для тех, кто прямые не писал :)
Что-то типа: глMDW = СоздатьОбъект("MetaDataWork"); Запрос = СоздатьОбъект("ODBCRecordSet"); Запрос.УстановитьТекстовыйПараметр("ВыбДок", глMDW.ЗначениеВСтрокуБД(Конт.ТекущийДокумент())); РезультатЗапроса = Запрос.ВыполнитьИнструкцию("select * FROM $Регистр.МойРегистр WHERE IDDOC = ВыбДок"); |
|||
28
vcv
02.07.15
✎
20:05
|
(24) Про sqlite ничего не скажу, у меня база SQL и запросы через 1с++
|
|||
29
Злопчинский
02.07.15
✎
20:11
|
(26) эээ, я ж ваще в прямых совсем
мну надо типа WHERE ДокументРегистратор.Владелец = ВыбДок а ДокументРегистратор.Владелец - документ неопределенного вида |
|||
30
Злопчинский
02.07.15
✎
20:11
|
(28) для модапльности подправлен драйвер?
|
|||
31
vcv
02.07.15
✎
20:20
|
(30) "секретный релиз" с не_помню_какими еще патчами. Давно делался, уже и не помню. Но проблем с модальным режимом нет.
|
|||
32
Злопчинский
02.07.15
✎
20:32
|
блин.. придется все самому...
;-) |
|||
33
Злопчинский
02.07.15
✎
21:09
|
(27) ууу, блин.. База данных не установлена
|
|||
34
Djelf
03.07.15
✎
00:34
|
(0) Сделай группировку по rowid
Отображение ДБФ-таблиц 1С в базу данных SQLite Кроме того, для каждой таблицы SQLite позволяет использовать предопределенное поле rowid, которое используется для идентификации записи. Модуль dbeng возвращает в этом поле номер записи в дбф-файле. |
|||
35
Djelf
03.07.15
✎
00:38
|
И вообще группировки не надо...
Просто убери все агрегатные функции и ничего не свернется |
|||
36
Злопчинский
03.07.15
✎
00:48
|
(35) что-то для меня это все как я баран на новые ворота. понимаю что вроде просто - ну для тех кто знает - но для меня - тупняк полный.
|
|||
37
Злопчинский
03.07.15
✎
00:48
|
..перегруз и недосып
|
|||
38
Djelf
03.07.15
✎
00:53
|
Да, у тебя недосып мощный!
SELECT * FROM Регистр_ОстаткиТМЦ AS РегОст WHERE РегОст.date BETWEEN :НачДата AND :КонДата или WHERE РегОст.IDDOC=' 15RW4 ' ничего не сворачивается sum() то зачем если ты ничего свертывать не хочешь? |
|||
39
Злопчинский
03.07.15
✎
00:58
|
(38) 1. нифига, мне надо выборку движений ограничить - из документа-регистратора движений регистра взять реквизит "Владелец" (ссылка на Документ неопределенного типа) - выбрать движения только для этого "Владельца"
|
|||
40
Злопчинский
03.07.15
✎
01:00
|
(38) 2. я ж тупняк.
как запрос впихнуть в 1SQLite вот сюда: глВКлайт = СоздатьОбъект("SQLiteBase"); я ваще в основах хромаю. даже не хромаю а встать не могу... подсоединился бы кто и рассказал бы блин... на месте по факту на примере. |
|||
41
Злопчинский
03.07.15
✎
01:06
|
совсем тупо.
нужен аналог черного типа запроса |Период с '01.07.2015'; |ДокументВладелец= Регистр.Остатки.ТекущийДокумент.хОперация.Владелец; //владелец - документ неопределенного типа |Состояние = Регистр.Остатки.ТекущийДокумент.хОперация.Состояние; //перечисление |Строка = Регистр.Остатки.ТекущийДокумент; |Измерение1 = Регистр.Остатки.Измерение1; |Измерение2 = Регистр.Остатки.Измерение2; .. |Ресурс1 = Регистр.Остатки.Ресурс1; |Ресурс2 = Регистр.Остатки.Ресурс2; .. |Реквизит1 = Регистр.Остатки.Реквизит1; |Реквизит2 = Регистр.Остатки.Реквизит2; |Условие(ДокументВладелец = ВыбДок); //выбдок - известен |
|||
42
Djelf
03.07.15
✎
01:11
|
Последовательность такая
База = СоздатьОбъект("SQLiteBase"); База.Открыть(":memory:"); Запрос = База.НовыйЗапрос(); тз = Запрос.ВыполнитьЗапрос(ТекстЗапроса); (39) реализуемо версия sqlite то какая? с тем что ты хочешь беда примерно такая: http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/789#789 |
|||
43
Злопчинский
03.07.15
✎
01:13
|
(42) ща, сек
|
|||
44
Злопчинский
03.07.15
✎
01:16
|
вариант = pre-build
Версия = 1, 0, 2, 4 (1.0.2.4 получается) Примечание = sqlite 3.6.22 |
|||
45
Злопчинский
03.07.15
✎
01:17
|
(42) я вот это не втыкаю: что это такое:
База.Открыть(":memory:"); и после выполнения запроса/получения результатов - надо что-то как-то обнулять? какой вариант 1Sqlite рекомендуете к использованию? |
|||
46
Злопчинский
03.07.15
✎
01:22
|
у себя 1SQLite вообщем практически не юзается (и так все неплохо) так что смена версии ни к чемустрашному не приведет.. ;-)
|
|||
47
Djelf
03.07.15
✎
01:23
|
Ха, админы и программисты мануали не читают?
Весьма советую посмотреть документацию https://snegopat.ru/downloads/1sqlite/ sqlite 1.0.2.4 или моей сборки 1.0.2.6 с 3.7.17 3.8.11.х еще в состоянии глубокой альфы Ёпрст прав в 1.0.2.6 движок sqlite глючный |
|||
48
Злопчинский
03.07.15
✎
01:32
|
(47) если бы я сидел и только программил... ;-)
|
|||
49
Djelf
03.07.15
✎
01:33
|
имхо тормозить будет жестоко, если попытаться все это в один запрос засунуть. оптимизатор sqlite сойдет с ума...
Тебе придется все наоборот в запросе думать - сначала выбрать подчиненные по ВыбДок, 1с с этим справляется быстрее sqlite Засовывать во временную таблицу sqlite Потом по iddoc во временной таблице фильтровать остатки не 5 минутная проблема ;( |
|||
50
Злопчинский
03.07.15
✎
01:35
|
(49) ну я сейчас для прототипа выбркой по движениям регистра. чтобы хоть какой-то рабочий отчет для тестирования результатов получить
|
|||
51
Злопчинский
03.07.15
✎
01:36
|
(49) "Потом по iddoc во временной таблице фильтровать остатки "
. читать как . Потом по iddoc во временной таблице фильтровать ДВИЖЕНИЯ ??? |
|||
52
Djelf
03.07.15
✎
01:38
|
да, все верно, iddoc то уникален в пределах базы
возьми глючный конструктор http://www.1cpp.ru/forum/YaBB.pl?num=1246429625/175#175 я его так и не доделал, но худо-бедно он работает... |
|||
53
Злопчинский
03.07.15
✎
01:38
|
(49) на уровне концепции я это понимаю, и какие-то отрывочные куски ходят в голове.
но еще ни разу не попадал в такие клинчи с проблемами быстродействия и прочего - чтобы припирало садитьяс и разбираться... вот так и болтаюсь, не освоя этот участок. мну проще заплатить под кокнретный запрос сколько-то денежек и не морочиться.. ;-) нетиповыми для меня проблемами ;-) у меян так уже кучу лет работает пару запросов, и пару их клонов которые сам минимально подтачивал - и все ок. вот. какой-то блин плач ярославны получается.. |
|||
54
Злопчинский
03.07.15
✎
01:41
|
И поставщика данных надо освоить.. а то все псевдожурналы/псевдодокументы на ТЗ сделаны. работает. но ХОЧЕТСЯ КРАСИВОСТЕЙ.
|
|||
55
Djelf
03.07.15
✎
01:44
|
Лучше сделай перебором, если по времени поджимает.
Такие запросы в sqlite взлетают плохо. |
|||
56
Злопчинский
03.07.15
✎
01:45
|
(55) уже сделал. практически мгновенно выбирается.
дбф, база только стартанула - пустая, пару доков. |
|||
57
Злопчинский
03.07.15
✎
01:46
|
(55) а что же в нем тогда взлетает хорошо? для каких целей имеет смысл использовать?
|
|||
58
Djelf
03.07.15
✎
02:00
|
Ну и правильно!
sql фактически тот же перебор, только логику перебора не ты думаешь, а sql-сервер Да, это экономия кучи "если тогда потом зачем и почему" Не всегда взлетает... С небольшим объемом данных 1с обычно опережает sqlite. При большом объеме данных sqlite работает значительно быстрее, ну и попадание в индекс тоже надо учитывать. Ссылку же я давал про разброс скорости? Вот тот отчет на sqlite в 10-20 раз быстрее перебора 1С Весь справочник засунуть в тз или ит на sqlite быстрее. У меня все интеграции на базах sqlite ибо нефиг всяку каку в основную базу засовывать. |
|||
59
Злопчинский
03.07.15
✎
02:49
|
(58) спасибо за внимание к моим проблемам.
по ссылке попытаюсь взять дерево подчиненности. надо посмотреть как оно сработает у меня - потому что может произойти зацикливание.... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |