Имя: Пароль:
1C
1C 7.7
v7: Неожиданный разультат черного запроса
0 palpetrovich
 
12.11.21
16:42
Для меня во всяком случае неожиданный...
В общем - база файловая, во такая процедура:
Процедура Сформировать()
    
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Период с ДатаС по ДатаПо;
    |
    |Товар = Регистр.Остатки.Товар;
    |ТекДок = Регистр.Остатки.ТекущийДокумент;
    |Кво = Регистр.Остатки.Кво;
    |
    |Функция КвоНач = НачОст(Кво);
    |Функция КвоПрих = Приход(Кво);
    |Функция КвоРасх = Расход(Кво);
    |Функция КвоКон = КонОст(Кво);
    |
    |Группировка ТекДок;
    |
    |Условие(Товар = выбТовар);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда  
        Возврат;
    КонецЕсли;
    
    Запрос.Выгрузить(тз, 0, 0);
    
КонецПроцедуры

В результат попадают непроведенные расходные накладные, что меня лично несколько напрягает :(
с файловой работал достаточно давно, переиндексация и ТиИ не помогли...

Чудо?
1 ДенисЧ
 
12.11.21
16:43
Попробуй проверить наличие движений у непроведённых документов. Банальным запросом.
2 Злопчинский
 
12.11.21
16:44
Переменную текдок выкинуть.
Группировку заменить на предопределенную
Группировка Документ;
3 Злопчинский
 
12.11.21
16:45
для проверки - проблемный непроведенный документ - провести, пометить на удаление, снять пометку.
4 palpetrovich
 
12.11.21
16:46
(1) - Банальным  ???
(2) - результат тот-же
5 palpetrovich
 
12.11.21
16:47
(3) ожидаемо получил "Недостаточно товара" ))
6 Builder
 
12.11.21
16:47
(0) Переиндексацию делал? Пересчет итогов?
7 palpetrovich
 
12.11.21
16:48
(6) переиндексация и ТиИ не помогли..
8 palpetrovich
 
12.11.21
16:57
:
    Если тз.ТекущаяКолонка() = "Документ" Тогда
        Док = тз.ПолучитьЗначение(тз.НомерСтроки, "Документ");
        Рег = СоздатьОбъект("Регистр.Остатки");
        Рег.ВыбратьДвиженияДокумента(Док);
        Пока рег.ПолучитьДвижение() =1 Цикл
            Сообщить(""+Рег.Товар+"  Кво "+Рег.Кво);
        КонецЦикла;
    КонецЕсли;

рез - куча движений у непроведенного документа
9 ДенисЧ
 
12.11.21
16:57
Просто группировка Документ; и потом перебором посмотри на проведённость документа.
Или, если силён - напиши прямой скуль-запрос.
10 ДенисЧ
 
12.11.21
16:58
(8) прямыми запросами игрался?
11 Volodja
 
12.11.21
16:59
(0) А у вас стоит автоматическое удаление движений?
12 ДенисЧ
 
12.11.21
17:00
(11) в 77 было такое?
13 palpetrovich
 
12.11.21
17:02
(10) база файловая, sqllite-ом попользваться не дадут, она у нас не является принятой в конторе
14 Ёпрст
 
12.11.21
17:02
(11) это вообще ни на что не влияет
15 Ёпрст
 
12.11.21
17:04
(0) прибей записи в регистре у этих доков, делов то.

ЗЫ: могли остаться после "свертки". Были тут раньше поделки, которые толкали записи регистров напрямую, без регистратора вообще.
16 Ёпрст
 
12.11.21
17:05
Можешь проще сделать. Выстави флаг проведения в 1sjourn у этого дока, потом в предприятии сделай отмену. Записи очистятся
17 Ёпрст
 
12.11.21
17:05
Тут видать, кто-то прямым запросом снял флаг проведения в табдичке доков
18 palpetrovich
 
12.11.21
17:07
(17) прямо запрос к файловой базе?
19 Volodja
 
12.11.21
17:07
(17) А если провести документ и тут же удалить? Движения должны же удалиться
20 palpetrovich
 
12.11.21
17:10
(19) провести  не получается т.к. остатков нет, они израсходованы этим чудесным документом :)
21 palpetrovich
 
12.11.21
17:11
(16) а как узнать IdDoc этого дока?
22 Volodja
 
12.11.21
17:11
(20) Поправить
Процедура ОбработкаПроведения()
  Возврат
.........
Конецпроцедуры

Провести, удалить, вернуть процедуру обратно
23 palpetrovich
 
12.11.21
17:12
(22) круто!!
24 Volodja
 
12.11.21
17:14
(23) Смекалка.
25 palpetrovich
 
12.11.21
17:17
(24) ага, жаль что не помогло )))
26 Volodja
 
12.11.21
17:18
Тогда (17)
27 Volodja
 
12.11.21
17:19
Порпробуйте Выгрузить, апотом загрузить базу.
28 palpetrovich
 
12.11.21
17:22
(27) да уже думаю, может в скуль его загрузить... правда боюсь, ошибка исчезнет )
29 ДенисЧ
 
12.11.21
17:24
(28) Лучше сделай (22) и иди отдыхать
30 palpetrovich
 
12.11.21
17:26
(29) см (25)
31 Ёпрст
 
12.11.21
17:27
На вот, поправь что хочешь
https://infostart.ru/public/79515/
32 Ёпрст
 
12.11.21
17:27
Хотя по мне, проче через консоль и delete удалить записи, где док не проведен
33 Volodja
 
12.11.21
17:28
(31) Точно. У меня же тоже она есть
34 Масянька
 
12.11.21
17:29
(31) И док не проведен, и движения есть :)
35 Масянька
 
12.11.21
17:29
+ (34) Классная вещь!
36 Volodja
 
12.11.21
17:29
(32) Даже через обычный WinDBFView.exe можно поудалять и упаковать
37 palpetrovich
 
12.11.21
17:30
(36) да можно, как узнать IdDoc нужного ???
38 palpetrovich
 
12.11.21
17:31
кста, граната из (31) где-то валялась )
39 Ёпрст
 
12.11.21
17:31
ну, или значениевстрокувнутр или через метадатаворк
40 Ёпрст
 
12.11.21
17:31
там есть метод
41 Ёпрст
 
12.11.21
17:32
42 Garykom
 
гуру
12.11.21
17:33
(0) Документов надеюсь за все года не много?
Максимальный IDDOC не превышен?
43 Volodja
 
12.11.21
17:34
() ЗначениеВСтрокуВнутр(Документ) а потом

Функция _глПолучитьВнутреннийIDЭлемента(Знач внтКод)
    ВнтКод=Сред(ВнтКод,2,СтрДлина(ВнтКод)-2);
    _Строка=СтрЗаменить(ВнтКод,",",РазделительСтрок);
    _КодСправочника=СтрЗаменить(СтрПолучитьСтроку(_Строка,4),chr(34),"");
    _КодЭлемента=СтрЗаменить(СтрПолучитьСтроку(_Строка,7),chr(34),"");
    Возврат СокрЛП(_IDtoStr(_КодСправочника))+"_"+СокрЛП(_IDtoStr(_КодЭлемента));
КонецФункции

Только это у меня было для справочника, там возможно чуть-чуть переделать
44 Garykom
 
гуру
12.11.21
17:34
(42)+ Причем если делали свертку с удалением старых доков, то вполне оно будет работать но индексы по второму кругу пошли
45 Volodja
 
12.11.21
17:35
в 1С++ вроде еще метод есть
46 Ёпрст
 
12.11.21
17:36
Ого, смотрю кто-то даже на нимфостарте камментит поделки, токма я там давно забанен и проипал все логины/пароли.
47 palpetrovich
 
12.11.21
17:36
(42) если ДБФнавигатор соритрует правильно - крайний  '  44KK   '
(43) спсибо, смотрю
48 Volodja
 
12.11.21
17:39
(47) 1С++
ЗначениеВСтрокуБД(<?>)
Синтаксис:
ЗначениеВСтрокуБД(<Object>)
Назначение:
преобразует ссылочный тип данных 1С (Справочник, документ, перечисление) во внутренние представление системы, только внутренний ИД объекта. Возвращает строку - внутреннего представления в виде: [ID(6)][Sign(3)] = 9 символов.
Возвращаемое значение:
(Строка)
Параметры:
<Object> - объект неопределенного вида
49 Ёпрст
 
12.11.21
17:39
метадата = СоздатьОбъект("MetaDataWork");
Сообщить(матадата.ЗначениеВСтрокуБД(ТвойДок);
50 Смотрящий
 
12.11.21
18:02
(46) Метода относительно честного отъема интеллектуальной собственности ?
51 серый КТУЛХУ
 
12.11.21
18:09
такие движения чаще всего появляются в результате заворачвания проведения в транзакции.
52 palpetrovich
 
12.11.21
18:14
Ну что, ручное удаление записей из RG45.DBF помогло, спасибо всем
53 palpetrovich
 
12.11.21
18:17
(52) * из RA45.DBF конечно же )
54 серый КТУЛХУ
 
12.11.21
18:21
... и пересчет итогов, я надеюсь?.. ))
55 palpetrovich
 
12.11.21
18:27
(54) еще нет :)
56 palpetrovich
 
12.11.21
18:31
обнаружил в ОбработкеПроведения вот это:
    ~КОНЕЦ:    
КонецПроцедуры

...без перейти :)
57 серый КТУЛХУ
 
12.11.21
18:53
(56): ну м.б. человек так комментарии "особой важности" расставляет... с прицелом на будущее к тому же...
58 Злопчинский
 
12.11.21
18:55
(5) отключи временно контроль олстатков меню-сервис-настрока учета -контроль остатков не контролировать
59 Злопчинский
 
12.11.21
18:57
(23) не проканает если отключено автоматическое удаление .
а в типовой Тис это именно так.
60 Злопчинский
 
12.11.21
18:59
(56) это нормуль
61 Злопчинский
 
12.11.21
19:01
А ЗначениеВстрокуВнутр(СсылкаНаМойДок) - дает не ту строку, которую можно в табличках визуально посмотреть?

ЗначениеВстрокуВнутр как соотносится с IdToStr и ЗначениеВСтрокуБД ..?
62 palpetrovich
 
12.11.21
19:05
(61)
ЗначениеВстрокуВнутр  {"O","0","0","0","0","0","      5136    192297   "}
ЗначениеВСтрокуБД  '  44DL   '
63 Volodja
 
12.11.21
19:08
(58) Почему-то я такое у себя не нахожу.
64 Volodja
 
12.11.21
19:10
+63 , Понял.Видимо это для типовых?
65 серый КТУЛХУ
 
12.11.21
19:36
тЗнач=ЗначениеВСтрокуВнутр(тОбъект); тСЗ=СоздатьОбъект("СписокЗначений");
тСЗ.ИзСтрокиСРазделителями(Сред(Лев(тЗнач,СтрДлина(тЗнач)-1),2));
тЗнач=СокрЛП(тСЗ.ПолучитьЗначение(1));    // T=счет/O=документ/B=справочник/E=перечисление/U=неопределеннный:
Если ПустоеЗначение(тЗнач)<>0 Тогда тЗнач="U" Иначе тЗнач=?(Найти("TOBEU",Лев(тЗнач,1))=0,"U",Лев(тЗнач,1)) КонецЕсли;
// Тип объекта данных:
ИдОбъекта=тЗнач;
тЗнач=тСЗ.ПолучитьЗначение(тСЗ.РазмерСписка());
ИдОбъекта=ИдОбъекта
// + Id Вида объекта данных:
+_IdToStr(Число(?(СтрДлина(тЗнач)=13,тСЗ.ПолучитьЗначение(4),Лев(тЗнач,10))));
тЗнач=тСЗ.ПолучитьЗначение(тСЗ.РазмерСписка());
Если СтрДлина(тЗнач)>13 Тогда тЗнач=Прав(тЗнач,13) КонецЕсли;
ИдОбъекта=ИдОбъекта
// + Id экземпляра объекта данных + код ИБ создания объекта (нет урбд - три пробела):
+_IdToStr(Число(Лев(тЗнач,СтрДлина(тЗнач)-3))) + Прав(тЗнач,3);
66 Злопчинский
 
12.11.21
21:45
(64) да
67 Харлампий Дымба
 
13.11.21
01:04
А после того как Коллективный разум победит, рекомендую ТС следующую выдержку из желто-красных книжек:

Следует понимать, что не все функции внутри конкретной группировки запроса могут иметь четко интерпретируемый смысл. Например, для группировки по документу движения регистра следующие функции
|Функция ПрихКол = Приход(Количество);
|Функция РасхКол = Расход(Количество);
имеют четкий смысл — приращения, сделанные документом при движении регистра. С другой стороны, в той же группировке следующие функции:
|Функция НачКол = НачОст(Количество);
|Функция КонКол = КонОст(Количество);
явно не имеют смысла (в запросах по регистрам, обычно задают период запроса при помощи оператора Период C. Функция НачКол в данном примере должна по смыслу показывать остаток ресурса "Количество" на начальную дату запроса. Внутри группировки по документу вопрос: «Какой начальный остаток ресурса на дату 10.01.97?» по документу, проведенному, например, 13.01.97, не имеет смысла). Поэтому в таких ситуациях функция будет иметь нулевое значение.
68 серый КТУЛХУ
 
13.11.21
02:37
(67): нахрена это тут да еще в виде простыни?
во-первых, вопросов про остатки вообще не было.
во-вторых, уже не осталось в мире семерочников (кроме восьмерочников, которые лезут не в свою парафию), которые бы не знали об отсутствии остатков в запросе по группировке документ.
69 Djelf
 
13.11.21
06:07
(13) Дискриминация! И в лопатофонах тоже sqlite нельзя? А как тогда вообще жить? оО
Код открыт, заглушек нет, можно часик на ревизию потратить и пересобрать по своему, там же все самое страшное спрятано в процедуре  
"ненавижу_инн_222_и_сотру_у_него_в_базе_все", но этой процедуры там нет ;)
70 palpetrovich
 
13.11.21
13:23
(67) а догадаться что запрос в (0) - несколько обрезан - не судьба? :)
71 Харлампий Дымба
 
13.11.21
14:38
(68) (70) Ладно, ладно, закидали. Догадайся, что ТС не "восьмерочник, который лезет не в свою парафию", догадайся, что код в реале один, а в вопросе другой. Извините, добрый люди, что неуместно сослался на ЖКК)
И раз уж тут все по умолчанию прошареные, давно интересовал вопрос, а есть ли разница между:

|ТекДок = Регистр.Остатки.ТекущийДокумент;
|Группировка ТекДок;

и

|Группировка Документ;
?
72 Злопчинский
 
13.11.21
15:46
есть.
73 Злопчинский
 
13.11.21
15:46
когда-то давно копали вопрос. но я уже не помню.