Имя: Пароль:
1C
1C 7.7
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) спасибо за внимание к моим проблемам.
по ссылке попытаюсь взять дерево подчиненности.
надо посмотреть как оно сработает у меня - потому что может произойти зацикливание....