Имя: Пароль:
1C
1C 7.7
v7: Удаление строк документа
,
0 OnePrg
 
09.12.21
21:48
Док = СоздатьОбъект("Документ.ГрупповаяПереоценка");
    тбПереоценка.ВыбратьСтроки();
    Пока тбПереоценка.ПолучитьСтроку() = 1 Цикл
        Док.НайтиДокумент(ВыбГрупповаяПереоценка);
        Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку() = 1 Цикл
            Если (Док.Склад = тбПереоценка.Склад) и
                 (Док.Товар = тбПереоценка.Товар) Тогда
                     Если тбПереоценка.НаОстатке = 0 Тогда
                         Док.УдалитьСтроку();  
                         Док.Записать();
                     Иначе
                         Док.Количество = тбПереоценка.НаОстатке;
                         Док.СуммаНОВ = Док.Количество *  Док.ЦенаНов;
                     КонецЕсли;    
                     Прервать;
            КонецЕсли;
        КонецЦикла;                
    КонецЦикла;
    Док.Провести();

После выполнения этого кода, у меня в Док нет строк, хотя в тбПереоценка в колонка НаОстатке есть не только нули. Отладчиком проверял: заходит по условию в обе ветки.

Что не так?
1 VladZ
 
09.12.21
21:50
Док.ВыбратьСТроки() и Док.УдалитьСтроку() - вот что не так.
2 OnePrg
 
09.12.21
21:51
Это уже перекрученный код, изначально было так.

Док = СоздатьОбъект("Документ.ГрупповаяПереоценка");
Док.НайтиДокумент(ВыбГрупповаяПереоценка);

    тбПереоценка.ВыбратьСтроки();
    Пока тбПереоценка.ПолучитьСтроку() = 1 Цикл
        Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку() = 1 Цикл
            Если (Док.Склад = тбПереоценка.Склад) и
                 (Док.Товар = тбПереоценка.Товар) Тогда
                     Если тбПереоценка.НаОстатке = 0 Тогда
                         Док.УдалитьСтроку();  
                     Иначе
                         Док.Количество = тбПереоценка.НаОстатке;
                         Док.СуммаНОВ = Док.Количество *  Док.ЦенаНов;
                     КонецЕсли;    
                     Прервать;
            КонецЕсли;
            Док.Записать();
        КонецЦикла;                
    КонецЦикла;
    Док.Провести();
3 OnePrg
 
09.12.21
21:51
(1) Так прервать же есть.
4 OnePrg
 
09.12.21
21:52
(1) ладно, щас переделаю
5 OnePrg
 
09.12.21
22:04
(1)

вот так тоже не работает

    Док = СоздатьОбъект("Документ.ГрупповаяПереоценка");
    Док.НайтиДокумент(ВыбГрупповаяПереоценка);
    тбПереоценка.ВыбратьСтроки();
    Пока тбПереоценка.ПолучитьСтроку() = 1 Цикл
        Для инд = 1 по Док.КоличествоСтрок() Цикл
            Док.ПолучитьСтрокуПоНомеру(инд);
            Если (Док.Склад = тбПереоценка.Склад) и
                 (Док.Товар = тбПереоценка.Товар) Тогда
                     Если тбПереоценка.НаОстатке = 0 Тогда
                         Док.УдалитьСтроку();  
                     Иначе
                         Док.Количество = тбПереоценка.НаОстатке;
                         Док.СуммаНОВ = Док.Количество *  Док.ЦенаНов;
                     КонецЕсли;    
                     Прервать;
            КонецЕсли;
        КонецЦикла;                
    КонецЦикла;
    Док.Провести();
6 acanta
 
09.12.21
22:10
Док.Удалить строку(инд);
Инд=инд-1;
7 OnePrg
 
09.12.21
22:13
(6) странно

в СП написано

УдалитьСтроку();
Синтаксис:
УдалитьСтроку()
Назначение:
Удалить текущую строку документа.

ну щас попробую
8 Харлампий Дымба
 
09.12.21
22:15
Правильно, надо учить семёрку!

Безотносительно к качеству кода в (0), он рабочий, хотя и на грани. Вопрос по алгоритму:
А если в тбПереоценка товар с НаОстатке<>0, а в документе его ещё нет? В твоем коде ничего не происходит в этом случае. Сдаётся мне должно быть где-то Док.НоваяСтрока()
9 OnePrg
 
09.12.21
22:17
(6) нифига СП был прав

Док.УдалитьСтроку(инд);  
Слишком много параметров передано при вызове функции/процедуры объекта
10 OnePrg
 
09.12.21
22:20
(8) операторы заполняют переоценку по остаткам, а потом шаловливые ручки задним числом правят остатки. Этот код приводит документ к новым остаткам. Если на остатке нет, а в документе есть - удаляем строку, если на остатке есть, то пишем в документ остаток.
11 acanta
 
09.12.21
22:22
Можно выгрузить в тз, дописать и свернуть. Запись документа в цикле излишне дергает базу.
12 OnePrg
 
09.12.21
22:23
(11) изначально записи в цикле не было, вставил, думал это поможет
13 Харлампий Дымба
 
09.12.21
22:23
(10) Ты изменяешь остаток, только если он уже есть в документе. А если его в документе нет, а в тбПереоценка есть - то в твоем коде остаток в документ не добавляется. То есть, если Док изначально пустой, то он пустым и останется. В этом был мой вопрос.
14 OnePrg
 
09.12.21
22:26
(13) точно
как всегда ларчик просто

спасибо
15 OnePrg
 
09.12.21
22:26
(13) тбПереоценка не корректно заполнялось
заработался
16 Харлампий Дымба
 
09.12.21
22:28
Ты же ещё и документ перечитываешь Док.НайтиДокумент(ВыбГрупповаяПереоценка) в цикле Пока тбПереоценка.ПолучитьСтроку() = 1 Цикл - это точно надо делать перед   тбПереоценка.ВыбратьСтроки();
И Док.Записать() лучше унеси из цикла и поставь перед Док.Провести()
Остальное некрасиво, но терпимо
17 OnePrg
 
09.12.21
22:29
(16) та я же говорю: это уже передёрганный код, щас наведу порядок
18 Злопчинский
 
09.12.21
22:33
(17) аккуратнее передергивать надо...
19 hhhh
 
10.12.21
01:18
(5) Док.Записать();  нету
20 Ёпрст
 
10.12.21
07:32
(0) весь код, в топку, было уже?
21 Злопчинский
 
10.12.21
12:12
(20) все так подумали, но толерантность растет и нельзя обижать альтернативно думающих ;-)
хотел переписать код сюда, а потом думаю - а нахрена?
22 Kigo_Kigo
 
10.12.21
12:31
Ну для такого кода в принципе помогло бы после удаления строки их перевыбрать опять
Док.УдалитьСтроку()
Док.ВыбратьСтроки()
23 Kigo_Kigo
 
10.12.21
12:34
(20) (21) Да чт написано то написано и скорее всего это поделка на использования раз, ну или раз в месяц максимум, по этому терпимо, там главная проблема - это перепроведение задним числом, которое надо закрывать и регламентом перепроводить до точки закрытия
ну то есть можно лубую дичь вытворять минус 4 дня, далее , перепроводка и закрытие периода, кто не успел того "того"
24 Злопчинский
 
10.12.21
12:56
(23) а почему 4 дня?
25 Kigo_Kigo
 
10.12.21
12:58
(24) это к примеру, кому то 4 дня (обычно сменяемость смен 3 дня + день), кому то месяц, для получения и фиксации отчетности, зависит от предприятия
26 Злопчинский
 
10.12.21
13:08
задним числом обычно приходится вводить возвраты от покупателей (это некритично), отчеты комиссионеров (это некритично). остальное - в ТА. Бывает иногда что-то надо в заднем счиле действительно подправить, но это редко и не является нормой типа "4 дня"
27 Kigo_Kigo
 
10.12.21
13:17
(26) Да хере те чушь нести, всякое подобное в сабже когда мне надоело выковыривать косяки, ввел правило 4 дня, для определенных видов доков, все как бабка пошептала, а уж что то исправить задним числом через служебку "кого надо" подписи, а там по головке за это не гладят, теперь все вовремя и в срок, редко еосяки, в основном ввода всплывают, ну люди не роботы- тоже ошибаются
28 Злопчинский
 
10.12.21
14:12
Дзен ждет тебя ещё.. ;-)
Давно-давно у себя тоже так было.
Потом даже в текущем дне отрубил работу задним числом.
Слава богу опт, не сильно интеллектуальные процессы..
Задним числом пару человек только могут работать. Один из них бух.
И то, суко, регулярно приходится "веником бить", ну не держат они в голове нихрена кроме однйо текущей задачи типа "что надо сделать сейчас", а какие последствия этого или дальнейшую цепочку действий - всё, ноль... а сопли надоело постоянно вытирать. При более-менее активной работе даже пару дней заднего числа уже может потянуть длинную историю косяков, исправлять потом заколебешься, несложно, но мутоно. так что - закручиваю гайки и норм работают. Понятное дело, что не у всех такая хорошая ситуация, где-то побольше бардака, но julf там скорее всего надо процесс перестраивать или типовую подгонять...
29 Злопчинский
 
10.12.21
14:13
(27) "ну люди не роботы- тоже ошибаются" - это точняк. поэтому основное - не давать ошибаться. а если они знают, что если вдруг что - то типа можно поправить - начинают (несознательно) халявить по чуть-чуть...
30 Злопчинский
 
10.12.21
14:14
Поэтому например у всяких лавочников тяжело идет процесс внедрения WMS, первое что сразу хотят - чтобына ТСД "можно было посмотреть и исправить если не туда кнюпнул/жмакнул"... и всё.. понеслось.. "ругаюсь" тут с заказчиками постоянно. Не иду на такое...
31 1Сергей
 
10.12.21
14:16
"...бабка пошептала..."
32 Kigo_Kigo
 
10.12.21
15:17
(30) У меня мастера смены 1/3 работают, по этому есть незавершенка, которую потом доделывают и вносят в БД, потом еще должен обработать диспетчер, в 01.00 запускается обработчик, который перепроводит день и закрывает его, если конечно по контролю проходит, если нет, то мне и диспетчерам на "стол" причину, в 90% диспетчера сами исправляют косяки и старший дисп закрывает день/период, открыть он его не может, только я и через служебку
33 Kigo_Kigo
 
10.12.21
15:20
(32) 1/2 (день 12 часов) 2 дня отдыхают, каждый мастер отвечает только за заказ наряд, по этому другой мастер его доделать не может, только тот на кого выписан
34 Kigo_Kigo
 
10.12.21
15:21
+ (33)это исправление к этому  = не 1/3, а 1/2
35 GrayS19
 
10.12.21
17:01
когда то увидел код для удаления строк по условию:
        Для инд = -Док.КоличествоСтрок()1 по -1 Цикл
            Док.ПолучитьСтрокуПоНомеру(-инд);
            Если Условие = 1 Тогда
                Док.УдалитьСтроку();  
            КонецЕсли;
        КонецЦикла;        

обычно им пользуюсь
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс