Имя: Пароль:
1C
1C 7.7
v7: 1С 7.7 простейший прямой запрос ОстаткиТМЦ ТиС
,
0 Zoeh
 
24.01.22
04:47
1С 7.7 простейший прямой запрос ОстаткиТМЦ ТиС

ТекстЗапроса = "
|DECLARE @Тов varchar(8)

|SET @Тов = ?

|SELECT
|     sum(Ост.ОстатокТовараОстаток) Остаток
|FROM $РегистрОстатки.ОстаткиТМЦ AS Ост
|WHERE    
|        Ост.Номенклатура = @Тов

|";

РекордСет.ДобПараметр(1, 14, 8, 0);


РекордСет.Подготовить(ТекстЗапроса);
// ВыбСкл="";                          
РекордСет.УстПараметр(1, Ном.ТекущийЭлемент());
//RS.УстПараметр(2, ВыбСкл);

Рез = РекордСет.ВыполнитьСкалярный();
РекордСет.Закрыть();                                  
Конец = _GetPerformanceCounter()    ;
Сообщить(Конец-Старт);
Сообщить(Рез);
Сообщить(ТипЗначенияСтр(Рез));
КонецПроцедуры


Выводит:
1
0
Число

хотя остаток там есть, уже голову сломал
1 ADirks
 
24.01.22
06:47
патамушта char(9)
прежде чем запросы писать почитай тут: http://www.script-coding.com/v77tables.html
2 Zoeh
 
24.01.22
06:50
ТекстЗапроса = "
        |SELECT
        |    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
        |    Рег.КоличествоОстаток as Количество
        |FROM  
        |    $РегистрОстатки.ОстаткиТМЦ(,,Номенклатура IN (SELECT Val FROM #ТНоменклатура),(Номенклатура),Количество) as Рег";

        //|    $РегистрОстатки.МенеджерыПокупатели("+?(ВремИтогиАктуальны=0,":ВыбДата~","")+",,Договор IN (SELECT Val FROM #ВЗПДоговор) AND Менеджер IN (SELECT Val FROM #ВЗПМенеджер),(КредДокумент,Договор,Менеджер),СуммаРуб) as Рег";
        СН = СоздатьОбъект("СписокЗначений");
        СН.ДобавитьЗначение(Ном.ТекущийЭлемент());
        РекордСет.УложитьСписокОбъектов(СН, "#ТНоменклатура", "Номенклатура");
        
        //Если ВремИтогиАктуальны = 0 Тогда
        //    RS.УстановитьТекстовыйПараметр("ВыбДата", СформироватьПозициюДокумента(ТекущийДокумент(), -1));
        //КонецЕсли;
          
        //RS.Отладка(1);                  
        ТЗДолгов = РекордСет.ВыполнитьИнструкцию(ТекстЗапроса);  



Internal error:


и по скорости медленнее
3 Андрей_Андреич
 
naïve
24.01.22
07:30
ТекстЗапроса = "
        |SELECT
        |    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
        |    Рег.КоличествоОстаток as Количество
        |FROM  
        |    $РегистрОстатки.ОстаткиТМЦ(,,Номенклатура = ?,(Номенклатура),Количество) as Рег";

         РекордСет.Подготовить(ТекстЗапроса)
    РекордСет.ПостроитьПараметры();
        ТЗДолгов = РекордСет.ВыполнитьИнструкцию(ТекстЗапроса);
4 Андрей_Андреич
 
naïve
24.01.22
07:31
Параметрический запрос у тебя зачем? ты его в цикле хочешь выполнять?
5 Андрей_Андреич
 
naïve
24.01.22
07:31
+(3) еще установить параметр впихнуть
6 Ёпрст
 
24.01.22
08:00
(4) очевидно, хочет засунуть его в форму списка или подбора таким извоащенным способом
7 Ёпрст
 
24.01.22
08:01
В формулу текстовой колонки поди пихает свой запрос для показа останка.
8 АгентБезопасной Нацио
 
24.01.22
08:13
(7) есть же класс для этого...
9 Ёпрст
 
24.01.22
12:09
Ну и надо ВыполнитьСкалярный всё же
10 Zoeh
 
24.01.22
13:24
ТекстЗапроса = "
|SELECT
|    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|    Рег.КоличествоОстаток as Количество
|FROM  
|    $РегистрОстатки.ОстаткиТМЦ(,,Номенклатура = ?,(Номенклатура),Количество) as Рег";


РекордСет.ДобПараметр(1, 14, 9, 0);
РекордСет.Подготовить(ТекстЗапроса);
                          
РекордСет.УстПараметр(1, Ном.ТекущийЭлемент());
ТЗДолгов = РекордСет.ВыполнитьСкалярный(ТекстЗапроса);

Конец = _GetPerformanceCounter()    ;
Сообщить(Конец-Старт);
Сообщить(ТЗДолгов);
Сообщить(ТипЗначенияСтр(ТЗДолгов));





результат


0
0
Число
11 Zoeh
 
24.01.22
13:25
(4)+(6)
да все верно в подборе в цикле
12 Ёпрст
 
24.01.22
13:30
(10) да уж.. блин, ну нельзя же применять советуемые методы не ознакомившись с докумментацией.
13 Ёпрст
 
24.01.22
13:31
14 Ёпрст
 
24.01.22
13:35

ТекстЗапроса = "
|SELECT
|    Рег.КоличествоОстаток
|FROM  
|    $РегистрОстатки.ОстаткиТМЦ(,,Номенклатура = ?,(Номенклатура),Количество) as Рег";
....

КоличествоОстаток= РекордСет.ВыполнитьСкалярный(ТекстЗапроса);
Сообщить(КоличествоОстаток);
15 Ёпрст
 
24.01.22
13:37
Но.. метод порочный, быстрее посчитать останки для всей номенклатуры и закешировать это в ИТЗ, и затем поиск в ИТЗ.

ИЛИ, открывать табличное поле с поставщиком прямого запроса. там уже будет как ннадо и быстро.
16 Zoeh
 
24.01.22
13:40
кэш долго будет при  открытии думать,
(14) возвращает остаток = 0

хотя там есть остаток в разрезе фирм и складов
17 Zoeh
 
24.01.22
13:41
сводныйостаток тоже возвращает не ноль
18 Ёпрст
 
24.01.22
13:41
(16) схрена ? твои остатки, что штатно с ВыгрузитьИтоги, что через прямой запрос для всей номенлатуры.. это милисекунды.
19 Zoeh
 
24.01.22
13:42
(18) нужно динамическое обновление остатка
20 Ёпрст
 
24.01.22
13:43
(19) в подборе ? Ну и обновляй свою ИТЗ по таймеру.
21 Ёпрст
 
24.01.22
13:44
Хотя на практике, это нах никому не впёрлось.
22 Zoeh
 
24.01.22
13:45
(14)
проблема в фильтре?
ему не нравится справочник.Номенклатура?
нужно что то типа ИДОбъекта ?
23 Ёпрст
 
24.01.22
13:45
У тебя в любом случае, даже если оператор подобрал нечто, он может док проводить не сразу, а потом и остатка- тю-тю уже не будет в момент проведения.

Вся эта хрень с побором остатков - только как доп информация при выборе, какой из однотипных товаров выбрать. У вас же не штучный товар в подборе ?
24 Ёпрст
 
24.01.22
13:48
(22) выведи так, для начала и посмотри, че там..

ТекстЗапроса = "
|SELECT
|    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|    Рег.КоличествоОстаток as Количество
|FROM  
|    $РегистрОстатки.ОстаткиТМЦ(,,,(Номенклатура),Количество) as Рег";


ТЗДолгов = РекордСет.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗДолгов.ВыбратьСтроку() и сымотри, чего там есть
25 Zoeh
 
24.01.22
14:04
(24)
пусто(((
даже таблица не создалась
26 Zoeh
 
24.01.22
14:05
ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp.dll");
        БазаДанных = СоздатьОбъект("ODBCDataBase");
        БазаДанных.Соединение("
        |DRIVER=Microsoft Visual FoxPro Driver;
        |Deleted=No;
        |Null=No;
        |Collate=RUSSIAN;
        |BackgroundFetch=No;
        |Exclusive=No;
        |SourceType=DBF;
        |SourceDB=" + КаталогИБ());
        РекордСет=СоздатьОбъект("ODBCRecordset");
        РекордСет.УстБД(БазаДанных);
27 Zoeh
 
24.01.22
14:25
ИБ=СоздатьОбъект("ODBCDataBase");
ИБ.ПрисоединитьИБ("\\server\КаталогИБ\");
рс=СоздатьОбъект("ODBCRecordset");
рс.УстБД(ИБ);
Результат=рс.ВыполнитьИнструкцию(ТекстЗапроса);

как по статье то не соединяет вовсе
Ошибка соединения: State IM001, native 0, message [Microsoft][Диспетчер драйверов ODBC] Драйвер не поддерживает данную функцию
28 Ёпрст
 
24.01.22
14:50
(26) У тя дбф что ле ???? )))))))))))))
29 Ёпрст
 
24.01.22
14:51
уй ё... как всё запущено.
30 Масянька
 
24.01.22
15:11
(16) Слушай Ё!
Остатки при открытии, в таблицу, на форму доп. колонку (поле).
По опыту могу сказать: такой способ работает в разу быстрее, чем демонический (тьфу, динамический).
31 Масянька
 
24.01.22
15:14
(21) Иногда надо. И (в тот самый момент) помогает.
32 Zoeh
 
24.01.22
16:30
(31) а есть?
я че та не могу к базе через
Microsoft Visual FoxPro Driver
подключицца
проверил на справочнике
пусто
33 Андрей_Андреич
 
naïve
24.01.22
17:37
(23) У меня, например, оператор может час с клиентом подбирать товар. Так что построчное проведение при подборе и динамические остатки. Может человеку такое же надо
34 Ёпрст
 
24.01.22
17:43
(32) Формат базы какой ? SQl или дбф, для начала ?
35 Pit0n_08
 
24.01.22
19:16
(33) Другая реализация через движение справочника "Резервы" при выборе ТМЦ в форме подбора прямым запросом и доп колонка в той же форме.
36 Злопчинский
 
24.01.22
22:07
(33) ну, если заказ на пару лямов - почему бы и нет. А когда заказ из 50 позиций на 20тыс... - назер таких операторов на тлф.
37 Zoeh
 
25.01.22
07:28
Не могу только теперь добавить фильтр по номенклатуре
|SELECT

//| $Рег.Склад as [Склад $Справочник.Склады],

| $Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],

| $Рег.Количество as Количество

|FROM

| $Регистр.ОстаткиТМЦ as Рег

|WHERE

| $Рег.Номенклатура = ?";

Запрос.ДобПараметр (1, 14, 9, 0);

Запрос.УстановитьПараметр(1, Ном.ТекущийЭлемент());


Отсутствует значение для одного или нескольких требуемых параметров.
38 Zoeh
 
25.01.22
07:31
|SELECT
    
    //|  $Рег.Склад as [Склад $Справочник.Склады],
    
    |  $Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
    
    |  $Рег.Количество as Количество
    
    |FROM
    
    |  $Регистр.ОстаткиТМЦ as Рег
    
    |WHERE
    
    |  $Рег.Номенклатура = ВыбНом";

Запрос.УложитьСписокОбъектов(Ном.ТекущийЭлемент(), "#ВыбНом", "Номенклатура");
Column 'ВЫБНОМ' is not found.
39 Zoeh
 
25.01.22
07:37
ВОТ ПОЛНОСТЬЮ РАБОЧИЙ КОД
по скорости всего в 2 раза быстрее чем СводныйОстаток, хотелось бы быстрее



Процедура ПриОткрытии()
    ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp.dll");

    ОлеДБ = СоздатьОбъект("OLEDBData");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
    Рез = ОлеДБ.Соединение(Соединение);
    Запрос = ОлеДБ.СоздатьКоманду();
    Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
    Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
    Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
    Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");


КонецПроцедуры

//*******************************************
Процедура Сформировать()
    Старт = _GetPerformanceCounter();    ;
    

    
    ВрТаблГрупп="";
    Запрос.УложитьСписокОбъектов(Ном.ТекущийЭлемент(), ВрТаблГрупп, "Номенклатура");
    ТекстЗапроса = "
    |SELECT
    
    //|  $Рег.Склад as [Склад $Справочник.Склады],
    
    |  $Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
    
    |  $Рег.Количество as Количество
    
    |FROM
    
    |  $Регистр.ОстаткиТМЦ as Рег
    
    |WHERE
    
    |  $Рег.Номенклатура IN (SELECT Val FROM " + ВрТаблГрупп + ")";


    ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    Конец = _GetPerformanceCounter()    ;
    Сообщить(Конец-Старт);
    Сообщить(ТЗ);
    Сообщить(типЗначенияСтр(ТЗ));
    
    
КонецПроцедуры
40 Zoeh
 
25.01.22
08:00
Думаю дело в фильтре, можно как то добавить 1 объект? Без УложитьСписокОбъектов?
41 АгентБезопасной Нацио
 
25.01.22
09:24
(40) если один - то что мешает использовать параметр? зачем IN?
42 АгентБезопасной Нацио
 
25.01.22
09:25
И вообще, какова цель?
43 АгентБезопасной Нацио
 
25.01.22
09:30
а, цель понял...
ну тогда тебе проще кэшировать в ТЗ/ИТЗ.
44 FN
 
25.01.22
09:42
(40)

$Рег.Номенклатура = :ВыбТовар
и Запрос.УстановитьТекстовыйПараметр("ВыбТовар",Ном.ТекущийЭлемент())

И добавь условие по периоду
Например (если периодичность регистров месяц) - Запрос.УстановитьТекстовыйПараметр("Период",НачМесяца(ПолучитьДатуТА()))
Рег.Period = :Период
45 Ёпрст
 
25.01.22
10:06
(40)
на вот, развлекайся
ТекстЗапроса="
       |select
       |     $Итоги.Количество КонОст
        |    FROM
        |        $РегистрИтоги.ОстаткиТМЦ Итоги
        |    WHERE
        |        DTOS(Итоги.period)+$Итоги.Номенклатура
        |        LIKE  (DTOS(:ПредПериод~~)+:Номенклатура)
        |";
   мд = СоздатьОбъект("MetaDataWork");
   НачПериод = мд.ПолучитьНачПериода(ПолучитьДатуТА());

   Запрос.УстановитьТекстовыйПараметр("ПредПериод",ПредПериод);
   Запрос.УстановитьТекстовыйПараметр("Номенклатура",Номенклатура);
   ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТЗ.ВыбратьСтроку();

Это запрос останка н дату ТА.
На произвольную дату запрос другой.
46 Zoeh
 
27.01.22
04:50
(45) самое главное низкий поклон тебе низкий человек, помог лентяю решить проблему. кошельки у тебя актуальны в личке?
47 Zoeh
 
27.01.22
04:50
(46) Опечатка! Низкий поклон умному человеку!
48 Zoeh
 
27.01.22
12:42
еще можно так:
ТекстЗапроса="
       |select
       |     $Итоги.Количество КонОст
        |    FROM
        |        $РегистрИтоги.ОстаткиТМЦ Итоги
        |    WHERE
        |        DTOS(Итоги.period)+$Итоги.Номенклатура + $Итоги.Склад
        |        LIKE  (DTOS(:ПредПериод~~)+:Номенклатура + :Склад)
        |";
   мд = СоздатьОбъект("MetaDataWork");
   НачПериод = мд.ПолучитьНачПериода(ПолучитьДатуТА());

   Запрос.УстановитьТекстовыйПараметр("ПредПериод",НачПериод);
   Запрос.УстановитьТекстовыйПараметр("Номенклатура",Ном);
   Запрос.УстановитьТекстовыйПараметр("Склад",ВыбСклады);
49 Ёпрст
 
27.01.22
12:59
(48) нужно смотреть индексное выражение, хотя бы в словарике, и значения измерений указывать в нужном порядке, чтоб был задействован нужный индекс.
50 Zoeh
 
27.01.22
13:02
(49)
яндекс кошельки корректные в профиле?
51 Ёпрст
 
27.01.22
13:07
яндекс, вроде да
52 Zoeh
 
27.01.22
13:09
(52)проверяй должно придти!
53 Zoeh
 
27.01.22
13:11
(51) упало?
54 Ёпрст
 
27.01.22
13:35
(53) да, спсб.
55 Zoeh
 
27.01.22
13:44
(54) Тебе огромное пасибо)
56 Злопчинский
 
27.01.22
20:52
на ИС есть типовой Тис.Отчеты.ОстаткиТМЦ переделанный на прямой запрос
57 victuan1
 
28.01.22
05:28
(56) А ссылку можно на него?
58 Андрей_Андреич
 
naïve
28.01.22
05:36
(56) А можно сам отчет? Юзать не буду (типовых у меня нет) - просто для самообучения.
Закон Брукера: Даже маленькая практика стоит большой теории.