Имя: Пароль:
1C
1С v8
Загрузить в РН не делает расход
0 serg-lom89
 
25.02.19
10:05
Добрый день
Есть запрос проведения.

                 Запрос = Новый Запрос;
                 Запрос.УстановитьПараметр("Ссылка",ДокументСсылка);
                 Запрос.Текст =
                 "ВЫБРАТЬ
                 |    ПеремещениеТоваровТовары.Ссылка.Дата КАК Период,
                 |    ЗНАЧЕНИЕ(Перечисление.ВидыДвиженийПриходРасход.Расход) КАК ВидДвижения,
                 |    ПеремещениеТоваровТовары.Ссылка КАК Регистратор,
                 |    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
                 |    ПеремещениеТоваровТовары.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                 |    ЗНАЧЕНИЕ(справочник.СерииНоменклатуры.пустаяссылка) КАК СерияНоменклатуры,
                 |    ПеремещениеТоваровТовары.Количество КАК ВНаличии,
                 |    ПеремещениеТоваровТовары.Количество КАК ВРезерве,
                 |    ПеремещениеТоваровТовары.Ссылка.СкладОтправитель КАК Склад
                 |ИЗ
                 |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
                 |ГДЕ
                 |    ПеремещениеТоваровТовары.Ссылка = &Ссылка
                 |
                 |ОБЪЕДИНИТЬ ВСЕ
                 |
                 |ВЫБРАТЬ
                 |    ПеремещениеТоваровТовары.Ссылка.Дата,
                 |    ЗНАЧЕНИЕ(Перечисление.ВидыДвиженийПриходРасход.Приход),
                 |    ПеремещениеТоваровТовары.Ссылка,
                 |    ПеремещениеТоваровТовары.Номенклатура,
                 |    ПеремещениеТоваровТовары.ХарактеристикаНоменклатуры,
                 |    ЗНАЧЕНИЕ(справочник.СерииНоменклатуры.пустаяссылка),
                 |    ПеремещениеТоваровТовары.Количество,
                 |    ПеремещениеТоваровТовары.Количество,
                 |    ПеремещениеТоваровТовары.Ссылка.СкладПолучатель
                 |ИЗ
                 |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
                 |ГДЕ
                 |    ПеремещениеТоваровТовары.Ссылка = &Ссылка"  ;

                 Результат = Запрос.выполнить();
        
ТаблицаДанных =  Результат .Выгрузить();
                     движения.SW_СвободныеОстатки.Записывать = Истина;
                     движения.SW_СвободныеОстатки.БлокироватьДляИзменения = Истина;
                     движения.SW_СвободныеОстатки.Загрузить(ТаблицаДанных );
                    
                     движения.Записать();

и почему то у меня нету движения расхода...только 2 прихода получаются.
или лыжи не едут или я..
ЧЯДНТ?
1 serg-lom89
 
25.02.19
10:05
1С:Предприятие 8.3 (8.3.10.2753)
2 Ёпрст
 
25.02.19
10:12
(0) И? как/чем ты видишь, что 2 движения расход ?
3 Ёпрст
 
25.02.19
10:12
сам РН открываешь, или смотришь г-отчетом ?
4 serg-lom89
 
25.02.19
10:13
(2) Регистр открываю
5 serg-lom89
 
25.02.19
10:14
сразу грешил на отчет,но открыл регистр и там 2+
6 Ненавижу 1С
 
гуру
25.02.19
10:16
а какое отношение твое перечисление ВидыДвиженийПриходРасход имеет к виду движений записей РН?
7 Chameleon1980
 
25.02.19
10:19
+/-
8 serg-lom89
 
25.02.19
10:22
(6) виноват,болван!
9 Slypower
 
25.02.19
10:22
Так задай вид движения - расход перед записью
10 Chameleon1980
 
25.02.19
10:23
системное перечисление перепутал с обычным :)
11 Ёпрст
 
25.02.19
10:23
(6) ой

(0) поменяй на  ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) как ВидДвижения и ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
12 serg-lom89
 
26.02.19
09:40
наверное не буду создавать новую тему,потому что впринципе в рамках этой этой же темы.
движение получилось,всем спасибо за отклик и участие в обсуждении.


Сейчас делаю контроль остатков и хочется уточнить у знатоков все ли правильно я сделал



    Если ТипЗнч(ДокументСсылка) = Тип("Документссылка.ПеремещениеТоваров") тогда
        склад =  ДокументСсылка.СкладОтправитель;
    иначе
        склад= ДокументСсылка.Склад;
    КонецЕсли;
    
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка",ДокументСсылка);
    
      ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);  
    Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);    
    
    Запрос.УстановитьПараметр("Склад",склад);
    
    Текст = "ВЫБРАТЬ
                   |    Товары.Номенклатура КАК Номенклатура,   ";
    
    
    Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        Текст= Текст+ "  
        |    ЗНАЧЕНИЕ(справочник.СерииНоменклатуры.пустаяссылка) КАК СерияНоменклатуры,   ";
    иначе    
        Текст= Текст+ "  
        |    Товары.СерияНоменклатуры КАК СерияНоменклатуры,   ";
    КонецЕсли;
    
                  
    Текст= Текст+ "  
                   |    Товары.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
                   |ПОМЕСТИТЬ ВТ_Товары
                   |ИЗ
                   |    Документ."+ДокументСсылка.метаданные().Имя+".Товары КАК Товары
                   |ГДЕ
                   |    Товары.Ссылка = &Ссылка
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    SW_СвободныеОстатки_Остатки.Номенклатура КАК Номенклатура,
                   |    SW_СвободныеОстатки_Остатки.Склад КАК Склад,
                   |    СУММА(SW_СвободныеОстатки_Остатки.ВНаличииОстаток) КАК ВНаличииОстаток,
                   |    СУММА(SW_СвободныеОстатки_Остатки.ВРезервеОстаток) КАК ВРезервеОстаток
                   |ИЗ
                   |    РегистрНакопления.SW_СвободныеОстатки.Остатки(&МоментВремени
                   |            ,  Склад = &Склад   И
                   |            (Номенклатура, СерияНоменклатуры, ХарактеристикаНоменклатуры) В
                   |                (ВЫБРАТЬ
                   |                    ВТ_Товары.Номенклатура КАК Номенклатура,
                   |                    ВТ_Товары.СерияНоменклатуры КАК СерияНоменклатуры,
                   |                    ВТ_Товары.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
                   |                ИЗ
                   |                    ВТ_Товары КАК ВТ_Товары)) КАК SW_СвободныеОстатки_Остатки
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    SW_СвободныеОстатки_Остатки.Номенклатура,
                   |    SW_СвободныеОстатки_Остатки.Склад
                   |
                   |ИМЕЮЩИЕ
                   |    (СУММА(SW_СвободныеОстатки_Остатки.ВНаличииОстаток) < 0
                   |        ИЛИ СУММА(SW_СвободныеОстатки_Остатки.ВРезервеОстаток) < 0)";
    
    
    
    
    
    Запрос.Текст = Текст;
    РезультатЗапроса = Запрос.Выполнить();      
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Сообщение = Новый СообщениеПользователю;
        
        Сообщение.Текст = "Не хватает товара  " + Выборка.Номенклатура + ","+  Выборка.Склад +" в регистр Свободные остатки!" ;
        Сообщение.Сообщить();
        
        Отказ = Истина;        
        
    КонецЦикла;  
    


прошу подсказать если что то не так.так то вроде все ок работает но тем не менее
13 serg-lom89
 
26.02.19
10:04
up-ну тему
14 ДенисЧ
 
26.02.19
10:07
А в чём вопрос? Ты всё по методичке сделал...
Единственно - блокировок не вижу
15 Мимохожий Однако
 
26.02.19
10:10
(12) Если получил нужный результат, то правильно
16 MrStomak
 
26.02.19
10:16
По производительности - очень неоптимально.
По функциональности - если развернутое сальдо +100, -100 в разрезе серий или характеристик, то твой контроль посчитает, что это нормально.
17 serg-lom89
 
26.02.19
10:22
(14) да брал из методички
18 serg-lom89
 
26.02.19
10:23
(16) по оптимальности могли бы подсказать как лучше сделать
19 serg-lom89
 
26.02.19
10:25
(18) =))по производительности
20 serg-lom89
 
26.02.19
10:41
(14) насчет блокировки ,я же устанавливаю блокировку когда загружаю ТЗ в РН
движения.SW_СвободныеОстатки.БлокироватьДляИзменения = Истина;
21 MrStomak
 
26.02.19
10:43
(18)
1. таблица товаров должна быть "Выбрать различные". Эта таблица используется только для отбора и дублирующие записи там бесполезны
2. Условие В (Выбрать ххх) следует использовать только когда заранее известно, что записей во вложенном запросе будет совсем чуть-чуть. Если это неизвестно точно, то оптимальнее соединяться внутренним соединением на таблицу остатков вместо этого. Предикаты в операторах физического обхода таблиц в этом случае всё равно будут включать условия отбора по полям соединения.
3. Польза момента времени при таком контроле сомнительна. Одно дело, когда ты партии выбираешь по ФИФО и тебе нужно, чтобы несколько документов в 1 секунде брали разные партии. Другое дело, когда тебе просто нужно понять, не добавило ли проведение документа минусов. От того, что ты, проводя документ задним числом, проконтролировал его остатки, но следующий документ в этой же секунде теперь стал уводить остатки в минус, сильно легче не станет. Такой контроль - по свободным остаткам без партий, логично осуществлять на конец дня, месяца или текущей даты.
22 ДенисЧ
 
26.02.19
10:43
(20) Это плохая блокировка. Надо использовать управляемые
23 MrStomak
 
26.02.19
10:53
(20) Это контроль ПОСЛЕ записи движений регистров. Какая еще блокировка нужна? Для справки - управляемая блокировка устанавливается платформой при любой записи объекта/регистра в транзакции. Устанавливается автоматически (иначе не могло бы быть ожидания на блокировке в момент записи). БлокироватьДляИзменения - это чтобы блокировка с учетом сплиттера ставилась, чтобы не словить дедлок на таблице остатков.
24 ДенисЧ
 
26.02.19
10:55
(23) "управляемая блокировка устанавливается платформой при любой записи объекта/регистра в транзакции. "
Ага. Лепит на всю таблицу, почти....
25 MrStomak
 
26.02.19
10:56
(24) Ну неправда же, по измерениям лепит
26 ДенисЧ
 
26.02.19
10:57
(25) А зачем тогда управляемые придумали, если и так всё отлично было?
Или ты про эскалацию не слышал?
27 MrStomak
 
26.02.19
11:00
(26) Это и есть управляемые.
Если ты поставишь ручную блокировку, то это никогда не уменьшит блокировки, которые накладывает объект при записи. Когда пишется регистр, платформа не делает так: "о, ДенисЧ тут еще блокировку сам какую-то ставил, значит он всё стопудняк продумал и я могу без локов писаться спокойно".
28 MrStomak
 
26.02.19
11:01
Ручная блокировка нужна, когда тебе нужно обеспечить консистентность ДО записи. Т.е., например, взять нужную партию.
29 serg-lom89
 
26.02.19
11:09
(21) ну например надо будет провести пачку доков которые делают движение по этому РН.
Если брать на конец дня(КонецДня(ДатаДокумента)) тогда это не совсем верно будет..ну или я неправ
30 MrStomak
 
26.02.19
11:11
(29) Почему? Ты гарантируешь этим, что в этот день минусов не занёс, в какой бы последовательности эти документы не проводил
31 serg-lom89
 
26.02.19
11:24
(30) ну идея хорошая.
я просто первоначально делал без даты в виртуальной таблице..но потом понял что то не так делаю
32 MrStomak
 
26.02.19
11:34
(30) Можешь делать на конец дня, можешь на конец секунды. Использование момента замедляет, а пользы - 0.
33 serg-lom89
 
26.02.19
12:22
(32) просто если они будут проводить не последовательно документы,то тогда схема по остаткам контролю посыпется вся
34 serg-lom89
 
26.02.19
12:25
хотя за такое надо по рукам давать)
35 MrStomak
 
26.02.19
12:40
(33) Всё наоборот, схема контроля остатков при непоследовательном проведении посыпется, если использовать МоментВремени ))). Контроль на конец секунды, дня и т.д. более устойчивы к "непоследовательности".
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.