Имя: Пароль:
1C
1C 7.7
v7: ТиС, Отчет.ОстаткиТМЦ - непонятный код...
0 Злопчинский
 
04.04.20
22:52
Кто в теме: в чем глубокий смысл по сабжу
Кусок типового кода (страый релиз, может в новом/свежем не так?)

    Если (ПредставлениеЦены = "отпускная цена (только розница)") Тогда
        ТекстЗапроса = ТекстЗапроса +
        "ЦенаПрод        = Регистр.ОстаткиТМЦ.ЦенаПрод, Регистр.ПартииОтданные.Номенклатура.МинОстаток;
        |Группировка ЦенаПрод;";  
    КонецЕсли;

Вылез на это когда отчекрыживал работу с комиссионерами...

В чем смысл адресации к мин.остатку? ошибка написания кода? или как/что?
1 Aleksey
 
04.04.20
22:58
ну судя по условию это самописка, а значит может быть все что угодно, в том числе и ЦенаПрод храниться в реквизите МинОстаток
2 Харлампий Дымба
 
04.04.20
23:50
(0) Скажи релиз, интересно глянуть, неужто типовая.
Но согласен с (1) - уверен на 99% самописка и притом корявая.
3 Злопчинский
 
05.04.20
00:02
А вот фиг вам, самая что ни на есть штатная. Могу, конечно, ошибаться.... но...
(2) если есть что-то более-менее свежее - скиньте этот отчет как внешний на [email protected]

Релизы с "проблемой" с 932 по 944 точно. сильно уверен что и в текущем релизе такая же лабуда.
Вдобавок ошибка есть в расчете/заполнении количества у комиссионеров - не учитывается КФ ед, заданный в настройках отчета "выводить в базовых или основных")
4 Злопчинский
 
05.04.20
00:02
(2) "..и притом корявая." - а вот это было обидно.

;-)
5 Злопчинский
 
05.04.20
00:03
с волнением жду возможных унижений.. ;-)
6 GreyK
 
05.04.20
00:03
(0) В типовой не было "отпускная цена (только розница)", т.ч. однозначно "левая дописка".
7 Злопчинский
 
05.04.20
00:06
хм... полез смотреть глубже...
8 GreyK
 
05.04.20
00:08
+(6) Извиняюсь, посмотрел, есть такое!
9 Злопчинский
 
05.04.20
00:12
на всякий случай приготовил пистолет застрелиться, но если не застрелюсь - ну сами тогда понимаете для кого ган пригодится... ;-)
10 Злопчинский
 
05.04.20
00:21
Значит так.
я конечно не восьмерчоник, поэтому код ТИС штатный еще от самописных вставок отличаю...

0. Специалистов по ТИС здесь не осталось.
1. Я самый что ни на есть Специалист (с большой буквы!
2. 984 релиз, нулевая без изменений - все так как в (0)
3. Ошибка с количеством для комиссионеров тоже есть (мог тут налажать, но вряд ли)
https://i.ibb.co/1sJyr1W/2020-04-05-001605.png
4. Пистолет не прячу, пригодится для всяких .. ну вы поняли.. кто тут ночью бродит невменяемый ;-)
11 Злопчинский
 
05.04.20
00:30
по  (10) п.3 прогнал тестик, да, есть ошибка в типовой
https://ibb.co/26bDy5v - исходные данные
https://ibb.co/chwV6BG - типовой вариант, ошибка
https://ibb.co/qjw356F - исправленный, правильно
12 Злопчинский
 
05.04.20
00:31
самое интересное что с комиссионерами в основной которе туеву хучу лет работали, и не выплыло. потому как колво в упаковках у комиссионеров никогда никого не интересовало, на складе еще м.б., а на стороне - пофиг...
13 Злопчинский
 
05.04.20
00:33
Пичалька видимо в том, что ошибки в ТиС уже наверное давно не исправляют, даже написать некуда, только в ООН...
14 Aleksey
 
05.04.20
00:35
(3) в 999 релизе (от января 2019) таже байда
15 Злопчинский
 
05.04.20
00:48
(14) я так и написал "сильно уверен что и в текущем релизе такая же лабуда."
16 Злопчинский
 
05.04.20
00:49
...аааатпууускаааааяяяя ценааааа пахнеееет гоооречьюююююю
17 Pit0n_08
 
05.04.20
12:10
(13) не так давно писал на hline - ответили, исправили. Конечно, блажен кто верует, но ТиС ещё на поддержке.
18 Злопчинский
 
05.04.20
12:57
(17) Понял, спасибо. Отпишу им.
19 Злопчинский
 
05.04.20
12:59
хотя, как-то давно писал им ошибку по пересорту в ТиС, расписал все подробно, с примерами, участками кода где криво, но так все и осталось, бо первое что надо для исправления ошибки - сообщить регномер своей поставки...
20 aka AMIGO
 
05.04.20
13:03
Для интересу, глянул в старинную ТиС, чудо то-же самое, деньги и количество уживаются в одной переменной :)
21 Харлампий Дымба
 
05.04.20
13:43
(18) Подожди не пиши. Давай разберёмся. Доверия к семерочникам, писавшим ТиС в 2003 году, у меня гораздо больше, чем к нынешнему "1С:Специалисту", который в 2020 году не знает как сделать элемент "Переключатель" в 7.7, а использует "Флажки" с обнулением. Не хватает у него квалификации, чтобы разбираться с чем-то сложным - книги покупок и продаж я так и не смог добиться, чтобы правильно поправили в Бух - каждое изменение не только не исправляло проблему, а вносило новые косяки. Так что лучше не трогать, чтобы не ухудшить.
ДА и написать про "странный код" не получится - надо показать "ошибку" при выполнении.

Итак:
Этот код появился в 926 релизе от 27.01.2003г. с подписью:

Отчет ОстаткиТМЦ ("Остатки ТМЦ")
-----------------------------------------------------------------
Исправлено:
SQL-базе неправильно выводились остатки
по комиссионерам.

Внесены изменения в модуль формы отчета.

Было:
"ЦенаПрод        = Регистр.ОстаткиТМЦ.ЦенаПрод;
Стало:
"ЦенаПрод        = Регистр.ОстаткиТМЦ.ЦенаПрод, Регистр.ПартииОтданные.Номенклатура.МинОстаток;

И я бы обратил твоё внимание на
Функция ТекстЗапросаСКомиссией()
Было так:
    |Склад            = Регистр.ОстаткиТМЦ.Склад,            
    |                 Регистр.РезервыТМЦ.Склад,
    |                 Регистр.ПартииОтданные.Договор.Владелец;";
А стало так:
    |Склад            = Регистр.ОстаткиТМЦ.Склад,            
    |                 Регистр.РезервыТМЦ.Склад;
    |Комиссионер    = Регистр.ПартииОтданные.Договор.Владелец;";

Предположу, что без присвоения ЦенаПрод="любому числовому значению" вместо "неопределено", отчет падал в SQLe. Поэтому и добавили заполнение этой переменной на случай, когда ЦенаПрод смысла не имеет, но заполнена быть должна. Может Ёпрст или кто-то активно работающий с SQL в 7.7 точнее скажет, но в целом - код в типовой явно не лишён смысла.
22 Харлампий Дымба
 
05.04.20
13:45
(4) беру свои слова обратно)
23 MWWRuza
 
гуру
05.04.20
14:11
(21) Если это так:
что без присвоения ЦенаПрод="любому числовому значению" вместо "неопределено",
То, не правильнее было сделать:

Если ПустоеЗначение(ЦенаПрд) = 1 Тогда
ЦенаПрод = 0; // ну, или любому числу...
КонецЕсли;

Или я чего-то не понял в сути проблемы?
24 HawkEye
 
05.04.20
14:17
(23) запрос жеж
25 Злопчинский
 
05.04.20
14:20
(21) Я тоже думал, что в цену впихнули какой-то числовой "мусор". чтобы там было что-то.
но, тупо убрал в ЦенаПрод значение из регитра партий - как работало - так и работает (база скульная)

Я вот ХЗ как выглядит чорный запрос в скульном виде, когда там

|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,Регистр.ПартииОтданные;
|ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод,Регистр.ПартииОтданные.Номенклатура.МинОстаток;

и что будет в Цена Прод для номенклатуры которая на остатках есть только у комиссионеров в регистре партий

|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,Регистр.ПартииОтданные;
|ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод;


причем нахрена было через точку (джоином) цеплять .Номенклатура.МинОстаток если можно было и из ресурсов число дернуть любое, взять то же самое Регистр.ПартииОтданные.Количество...??? М.б. потому что МинОстаток редко когда юзается и по большей части там почти всегда 0?
26 Харлампий Дымба
 
05.04.20
14:20
(23)Если бы ЦенаПрод была переменной запроса, то может и прокатило бы, а так как ЦенаПрод - группировка запроса, то, видимо в SQL не прокатывало.
27 Злопчинский
 
05.04.20
14:21
Вот еще из этого же отчета мелкая корявка, некритичная, но все же...

            Если ВыбРазделитель2.Выбран() = 1 Тогда
                СписокФирм = СоздатьОбъект("СписокЗначений");
                СпрФирм = СоздатьОбъект("Справочник.Фирмы");
                СпрФирм.ВыбратьЭлементы();
                Пока СпрФирм.ПолучитьЭлемент() = 1 Цикл
                    Если СпрФирм.ЮрЛицо = ВыбРазделитель2 Тогда
                        СписокФирм.ДобавитьЗначение(СпрФирм.ТекущийЭлемент());
                    КонецЕсли;
                РегПартии.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
                РегОтданные.УстановитьЗначениеФильтра("Фирма", СписокФирм, 2);
                КонецЦикла;
            КонецЕсли;
28 Злопчинский
 
05.04.20
14:22
Кстати, на ИСе, по-моему, лежит типовой Отчет.ОстаткиТМЦ на прямых запросах. Интересно, как там "оттранслировано"
29 Харлампий Дымба
 
05.04.20
14:23
(25) Ну согласись же, что код осмысленный, а не случайная ошибка, как казалось в начале. То что у тебя работает без этой правки, не значит, что она была не нужна
30 Харлампий Дымба
 
05.04.20
14:25
(27) А что не так? (Если что - я люблю Бух и ЗиК, а ТиС я отвергаю)
31 Злопчинский
 
05.04.20
14:28
(21) "Давай разберёмся. Доверия к семерочникам, писавшим ТиС в 2003 году, у меня гораздо больше, чем к нынешнему "1С:Специалисту", который в 2020 году не знает как сделать элемент "Переключатель" в 7.7, а использует "Флажки" с обнулением."
я так изредка делаю (последний раз года четыре назад, наверное), исключительно из чувства прекрасного, флажки с обнулением красивше выглядят ;-)

"Так что лучше не трогать, чтобы не ухудшить.
ДА и написать про "странный код" не получится - надо показать "ошибку" при выполнении."
- вот это и да, пока что "ошибку" или слом получить не удалось.
32 HawkEye
 
05.04.20
14:30
(30)  фильтры на регистры из цикла не мешало бы вынести...
33 Харлампий Дымба
 
05.04.20
14:34
(32) Ха) Да, видимо копипаста сыграла шутку. Слона не приметил. Ну это если одно юр.лицо - 100 фирм, а для обычных людей что в цикле, что без.
34 Злопчинский
 
05.04.20
14:36
(29) ну так я и не полез сразу бездумно править. ТиС достаточно хорошо вылизанная конфа и ошибок в ней мало. Поэтому я и поперся на форум.
.
Сейчас попробую затестить, впихнуть в комиссионный товар мин.остаток в карточку, по идее в отчете просто лабуда получится в части группировки по "ЦенаПрод", будет просто кривизна вывода, которую надо "пользовательски" фильтровать/понимать, что отпусканя цена для строк комиссионеров смысла не имеет. Если минОстаток комиссионного товара совпадет с ЦенаПрод остатка на складе, то норм будет, не совпадет - строка по идее на две расщепится...
35 Злопчинский
 
05.04.20
14:37
(30) "....а ТиС я отвергаю" - отщепенец... ;-)
почему это? по ТиС не работал просто?
36 Харлампий Дымба
 
05.04.20
14:44
(31) "я так изредка делаю (последний раз года четыре назад, наверное), исключительно из чувства прекрасного, флажки с обнулением красивше выглядят ;-)"
Дело твоё, но подозреваю, что писатель типовых так делает не из чувства прекрасного, а из чувства неизведанного.

Хорошо, а так ты делаешь:
1) Делаешь переменную справочника "Сотрудники" - "ПостоянноПроживалВКрыму18Марта2014Года" - "Число 1.0";
2) Выводишь флажок на форму "ФлПроживалКрым", во флажке пишешь формулу ИзмФлагКрым()
3) Пишешь функцию:
Процедура ИзмФлагКрым()
ПостоянноПроживалВКрыму18Марта2014Года = ФлПроживалКрым;
КонецПроцедуры
4) В ПриОткрытии пишешь:
ФлПроживалКрым = ПостоянноПроживалВКрыму18Марта2014Года;

А вот 1С теперь так делает типовые. Ведь просто добавить реквизит "ПостоянноПроживалВКрыму18Марта2014Года" на форму в виде флажка - это слишком просто...
37 Харлампий Дымба
 
05.04.20
14:48
(35) Пусть каждый возделывает свой сад) Но мой красивее)
ЗиК же прелесть, а не конфа. А если ещё помнить безумного монстра ЗиК 1.0, рожденного сумеречным сознанием одной уважаемой тётушки...
38 Злопчинский
 
05.04.20
14:50
(36) ну, может не умеют они ездить на автомате, только на механике... или наоборот...
39 Харлампий Дымба
 
05.04.20
14:55
(35) Ах да, ещё я культивирую лень.
Представляешь, какая прекрасная жизнь, когда не надо знать, что такое ВетИс Меркурий, ЕГАИС, он-лайн ККМ, прямые запросы и SQL-базы, ну другие какие там у вас ещё в ТиСе страшилки!
А просто собирать абонентку с клиентов за их спокойную уверенность в сегодняшнем дне!
40 HawkEye
 
05.04.20
15:06
(39) это все не страшилки... давно уж...
41 Злопчинский
 
05.04.20
15:20
(34) Сейчас попробую затестить, впихнуть в комиссионный товар мин.остаток в карточку, по идее в отчете просто лабуда получится в части группировки по "ЦенаПрод", будет просто кривизна вывода, которую надо "пользовательски" фильтровать/понимать, что отпусканя цена для строк комиссионеров смысла не имеет. Если минОстаток комиссионного товара совпадет с ЦенаПрод остатка на складе, то норм будет, не совпадет - строка по идее на две расщепится..."

- проверил,так и есть. если в карточке товара задать мин.остаток, то он - как и написано в запросе - трактуется как ЦенаПрод и строка товара распадается на две (или больше) - одна по товару у комиссионеров, где в столбце ОтпусканяЦена стоит мин.остаток из карточки и остальные нормальные строки по розничным точкам/складам с ЦенаПрод.

Можно это конечно убрать постобработкой результатов запроса, но извращенно будет.
С другой стороны, если

вместо
|ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод,Регистр.ПартииОтданные.Номенклатура.МинОстаток;

оставить
|ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод;

то вроде ничего не падает...
Может на каких-то старых скулях или на дбфной-версии падает, хз...
42 Злопчинский
 
05.04.20
15:25
(40) страшилки, страшилки. про ЧЗ товарищ который в теме, охеревает. как и ранее по ЕГАИсам. да и в типовых по ЕГАИСам нет тех возможностей, которые в самописках есть. Но это совсем другая тема, здесь ее не развиваем!
43 Харлампий Дымба
 
05.04.20
15:43
(42) Прости, что присели на твою завалинку со своей пустопорожней болтовнёй)
Если по делу, то
(41) Если прям совсем интересно, запусти на своём типовом 932? 944? отчет из 1001го. Может уже и поправили вывод для комиссионеров и не выводят в отчет МинОстаток, а зануляют.
Ну а в целом, уже больше нечего сказать.
44 Злопчинский
 
05.04.20
16:33
(43) нема у меня свежего релиза. да и сильно уверен, что ничего не поправлено. запросом - фиг так выкрутишь, а постобработка там мелкоизвращенная будет, никто ее писать не будет.
45 Злопчинский
 
05.04.20
16:38
И в этом же отчете - перед расчетом/выгрузкой итогов партий для расчета себестоимости представляется целесообразным впихнуть фильтр ну по крайней мере если не по МФ номенклатуры если он задан, а хотя бы по группе ТМЦ если она задана, а то себсетоимость среднюю долго выгружает. Понятно, что некритчино, мало кто юзает такой режим. Но "как-то неаккуратненько, доктор!" ;-)

            КонецЕсли;
        КонецЕсли;
        
        //[+]progadmin, 04.04.2020, ДОБАВЛЕНО НЕТИПОВОЕ
        Если ВыбТМЦ.Выбран()=1 Тогда
            РегОтданные.УстановитьЗначениеФильтра("Номенклатура", ВыбТМЦ, 2);
            Тогда РегПартии.УстановитьЗначениеФильтра("Номенклатура", ВыбТМЦ, 2);
        КонецЕсли;
        //[+]-progadmin, 04.04.2020, ДОБАВЛЕНО НЕТИПОВОЕ
        
        Если (ДатаКонца<ПолучитьДатуТА()) Тогда
            РегПартии.ВременныйРасчет();
            РегОтданные.ВременныйРасчет();
            ВремРегистры.РассчитатьРегистрыПО(ДатаКонца);
        КонецЕсли;
46 Злопчинский
 
05.04.20
19:03
Вот еще что мне нифига непонятно.

Язык запросов. "Группровка". СП:

"Все - в запрос выводятся все значения, и нулевые тоже (используется для группировок по справочникам и временных группировок).

ВошедшиеВЗапрос - уточняет предыдущее ключевое слово 'Все'. Использование данного слова подразумевает, что в каждую строку запроса будут включены значения данных (в том числе нулевые), для которых есть ненулевое значение хотя бы в одной строке запроса."

Для меня вот эти пояснения какие-то мутные. Не понимаю я их.
47 Злопчинский
 
05.04.20
19:03
"Все - в запрос выводятся все значения, и нулевые тоже (используется для группировок по справочникам и временных группировок)."

- какие "нулевые"? нулевые чего? в запрос что, не все значения выводятся? в каких случаях следует использовать "Все"..? На примере на пальцах может кто пояснить мне тупому?
.
48 Злопчинский
 
05.04.20
19:07
Вариант1

Фирма            = Регистр.ПартииОтданные.Фирма;
УпрАналитика     = Регистр.ПартииОтданные.Фирма.УпрАналитика;
ЮрЛицо         = Регистр.ПартииОтданные.Фирма.ЮрЛицо;
Номенклатура    = Регистр.ПартииОтданные.Номенклатура;
Комиссионер    = Регистр.ПартииОтданные.Договор.Владелец;    
Количество     = Регистр.ПартииОтданные.Количество;
Функция КоличествоКонОст = КонОст(Количество);
Группировка Номенклатура Все; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Группировка Комиссионер без групп Все ВошедшиеВЗапрос ;
Условие (Номенклатура в ВыбТМЦ);

Вариант2
Фирма            = Регистр.ПартииОтданные.Фирма;
УпрАналитика     = Регистр.ПартииОтданные.Фирма.УпрАналитика;
ЮрЛицо         = Регистр.ПартииОтданные.Фирма.ЮрЛицо;
Номенклатура    = Регистр.ПартииОтданные.Номенклатура;
Комиссионер    = Регистр.ПартииОтданные.Договор.Владелец;    
Количество     = Регистр.ПартииОтданные.Количество;
Функция КоличествоКонОст = КонОст(Количество);
Группировка Номенклатура; //!!!!!!!!!!!!!!!!!!!!!
Группировка Комиссионер без групп Все ВошедшиеВЗапрос ;
Условие (Номенклатура в ВыбТМЦ);

Результат одинаковый.
Вариант 2 - работает раз в 10-15 быстрее.
.
в чем разница?
49 Злопчинский
 
05.04.20
19:10
что я приниципиально не понимаю?
50 Харлампий Дымба
 
05.04.20
23:50
(47) Если простыми словами, то:
Склад1 Товар1;
Склад2 Товар2;
Товар3 - нету нигде

1)
Группировка Склад
Группировка Товар
Склад1 Товар1
Склад2 Товар2

2)
Группировка Склад
Группировка Товар Все
Склад1 Товар1
Склад1 Товар2
Склад1 Товар3
Склад2 Товар1
Склад2 Товар2
Склад2 Товар3

2)
Группировка Склад
Группировка Товар Все ВошедшиеВЗапрос
Склад1 Товар1
Склад1 Товар2
Склад2 Товар1
Склад2 Товар2

(48) Ну получается, что тебе первый запрос собирает по твоей просьбе в группировку ВЕСЬ справочник номенклатуры, а потом все ненужные группировки чекрыжит по условию. А второй собирает не весь справочник номенклатуры, а только то что КонОст(Количество)<>0.
51 Lazy Stranger
 
05.04.20
23:58
а "все вошедшие в запрос" используется для шахматки: если первая группировка номенклатура, а вторая склад, который выводится колонками (например те самые остатки ТМЦ) то код
    ТекстЗапроса = ТекстЗапроса +
    "Группировка Склад Все ВошедшиеВЗапрос;";
включит в результат запроса для каждой номенклатуры все склады, где есть остаток по хоть какой-то номенклатуре, вошедшей в этот запрос
52 Злопчинский
 
06.04.20
00:07
(50), (51) спасибо за пояснения
.
а если есть Склад3 - по которому нет остатков.
.
Склад Все
Товар Все
- даст полное перемножение, будут все возможные сочетания Склад-Товар, там где в сочетании есть остаток - будет значение, а где остатка нет - будет ноль.. - так?
53 Злопчинский
 
06.04.20
00:09
Группировка Склад
Группировка Товар Все ВошедшиеВЗапрос

Все вошедшиевзапрс- получается имеет смысл только для группировок нижнего уровня?

Группировка Склад Все ВошедшиеВЗапрос
Группировка Товар
- смысла не имеет?

Группировка Склад Все ВошедшиеВЗапрос
Группировка Товар Все ВошедшиеВЗапрос
- аналогично как
Группировка Склад
Группировка Товар
..?
54 Харлампий Дымба
 
06.04.20
00:21
(52) Да
(53)
1 - да;
2 - да, ВошедшиеВЗапрос там лишнее;
2 - нет. Как раз если у тебя будет Склад 3 без остатков, то для "Группировка Склад Все ВошедшиеВЗапрос" это будет эквивалентно "Группировка Склад Все" (это ж верхний уровень) и тогда для запроса
Группировка Склад Все ВошедшиеВЗапрос
Группировка Товар Все ВошедшиеВЗапрос
Склад 3 в группировку попадёт
а для запроса
Группировка Склад
Группировка Товар
Склад 3 в группировку не попадёт.
Ну или то что в (50) написано - разница между примерами 1) и 3)
55 Злопчинский
 
06.04.20
00:24
(54) спсб.
56 Харлампий Дымба
 
06.04.20
00:24
Группировка Склад Все ВошедшиеВЗапрос
Группировка Товар
- смысла не имеет?

Да, для первого уровня группировки:
"Группировка Склад Все ВошедшиеВЗапрос"  =  "Группировка Склад"
57 Cthulhu
 
06.04.20
01:59
(55): если сплясать от "зачем?" - может понятнее получиться.
эти пляски с "все" и "вошедшиевзапрос" - обеспечивают возможность вывода шахматки (кросс-таблицы) по группировкам тупым их перебором - т.к. в этих случаях выбираются "блоки" с одинаковым количеством значений групировки - что оч.удобно при выводе их "по колонкам" в тек.строке (по вышестоящей группировке). при этом "все" выбирает блоками тупо все имеющиеся в справочнике значения, а с "вошедшие в запрос" - из "все"-варианта удаляет "нулевые колонки"... как-то так...
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс