Имя: Пароль:
1C
 
Чертовщина при проведении документа
,
0 trim89
 
29.01.16
10:20
Доброго времени суток!

Пользуюсь КА 2.0.3.67. Программно создаю документ "Поступление товаров услуг", после его создания делаю "Перемещение товаров" на основании поступления. Дата перемещение + 3 сек от даты поступления.

При проведении перемещения выдается ошибка, что превышен остатков товаров организации, при этом все движения поступления корректны.

Фишка в том, что если вручную изменить дату перемещения в большую сторону, то документ проведётся, если в меньшую, то нет, также если сначала распровести документ, а потом провести, не меняя даты, то тоже проводится.

Почему может так делаться?
1 Лефмихалыч
 
29.01.16
10:22
(0) перемещение проводится моментом времени до поступления. Почему так - смотри отладчиком - у тебя в коде где-то костыли и несерьезно
2 vde69
 
29.01.16
10:23
по тому, что контроль остатков сделан до записи движений по регистрам, а надо после...
3 vde69
 
29.01.16
10:23
то есть движения самого документа не правильно учитываются
4 trim89
 
29.01.16
10:25
(1) Нет. Поступление уже проведено. Даже транзакции разные.
5 trim89
 
29.01.16
10:26
(3) А почему при распроведении/проведени они вдруг стали правильно учитываться?
6 Serg_1960
 
29.01.16
10:29
См. (1)  - "у тебя в коде где-то костыли и несерьезно"

(офф) Как правильно перевести на русский язык фразу автора "выдается ошибка, что превышен остатков товаров"? :)
7 Metman
 
29.01.16
10:30
База по сети? Разное время на компах.
8 vde69
 
29.01.16
10:30
(5)

01 остаток 5
02 продали 3, остаток 2

препроводим более поздним числом

01 остаток 5
02 остаток 2 (старые движения еще не удалили)
03 пытаемся продать 3, одной не хватает...
9 trim89
 
29.01.16
10:31
(6) Нет костылей в коде, во всяком случае не в складском учете точно =) Практически типовая
10 trim89
 
29.01.16
10:31
(7) Локальная
11 Metman
 
29.01.16
10:32
Пытать базу отладчиком пробовал?
12 ibreiter
 
29.01.16
10:33
Если поступление создать не программно, и потом на основании создать перемещение, что получится?
Пусть также через 3 секунды
13 Metman
 
29.01.16
10:33
Отладчик как цыганка. Все знает, все видит.
14 trim89
 
29.01.16
10:34
(11) Не осилил. Там километровые запросы + временные таблицы, которые хер пойми откуда. Проще вообще проверку отрубить.
15 Масянька
 
29.01.16
10:35
(10) Насчет времени док-ов - уверен на 100%?
При проведение - выведи сообщалку и глянь.
16 trim89
 
29.01.16
10:35
(13) Все норм
17 trim89
 
29.01.16
10:36
(12) Все норм
18 trim89
 
29.01.16
10:36
(15) Все норм
19 Metman
 
29.01.16
10:36
(18) чудес не бывает
20 trim89
 
29.01.16
10:37
(8) Навряд ли проблема в этом, так как проводилась бы нормально пока движений нет. Или при изменении времени в меньшую сторону проводилось бы тоже норм.
21 Масянька
 
29.01.16
10:37
(18) И как 3 секунды вычисляешь о назначаешь док-ту?
22 Serg_1960
 
29.01.16
10:37
Не исключаю, что при интерактивном перепроведении документа, конфигурация "корректирует" исходные данные, заполняя их значениями "по умолчанию".
23 vde69
 
29.01.16
10:39
(20) поставь в процедуре проведения первым оператором очистку всех движений с записью в базу
24 trim89
 
29.01.16
10:39
(21) ручками =) интерактивное занесение работает
25 trim89
 
29.01.16
10:40
Может быть, посмотрю что на форме делает
26 trim89
 
29.01.16
10:40
(23) Да если нет еще движений, что мне очищать?
27 Масянька
 
29.01.16
10:41
(24) Ручки, да еще, и интерактивно, по-разному работают.
28 hhhh
 
29.01.16
10:42
(20) если меняешь в меньшую сторону, то раньше поступления получается, не должно проводиться.
29 trim89
 
29.01.16
10:42
(22) Ничего такого не делает
30 Serg_1960
 
29.01.16
10:42
А текст ошибки автор озвучит? Ошибка или ошибки? По всем позициям документа или только по некоторым?

А озвучить картинку с детальным отчетом [отрицательных] остатков этих двух документов слабо?
31 vde69
 
29.01.16
10:43
просто сделай так:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    ПолныеПрава.УдалитьДвиженияРегистратора(Ссылка, Отказ);
32 trim89
 
29.01.16
10:43
(28) На 1 сек, получается меньше чем было, но больше поступления
33 trim89
 
29.01.16
10:44
(30) Перемещение превышает остаток товара организации Торговый дом "Комплексный" на складе Транзит под ремонты для менеджера Федоров Борис Михайлович
34 trim89
 
29.01.16
10:44
(30) По всем позициям
35 trim89
 
29.01.16
10:45
(30) Скрин делать не буду, лень. Поверь на слово, это тестовая база. Поступление, потом сразу перемещение. В отчетах все видно, остатки есть.
36 trim89
 
29.01.16
10:46
(31) Данной процедуры нет
37 hhhh
 
29.01.16
10:47
(33) оперативное проведение? Тогда оно само даты ставит. На ваши даты плюет.
38 Масянька
 
29.01.16
10:47
(33) А для другого менеджера есть?
39 trim89
 
29.01.16
10:48
Ну и что? в любом случае сначала проводится поступление одной транзакцией, потом перемещение следующей транзакцией.
40 hhhh
 
29.01.16
10:48
(36) ну так добавьте ее.
41 trim89
 
29.01.16
10:49
(38) Нет, тестовая база, информация скудная, заводить под другим долго. Да и так все должно работать
42 hhhh
 
29.01.16
10:50
(41) не должно это работать. В том виде, в котором ты описал - это задница.
43 vde69
 
29.01.16
10:52
(36)
Процедура УдалитьДвиженияРегистратора(ДокументСсылка, Отказ, СписокРегистровДляОчисткиДвижений = Неопределено) Экспорт
    ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
    
    Для Каждого Движение ИЗ ДокументОбъект.Движения Цикл
        Если  (не СписокРегистровДляОчисткиДвижений = Неопределено)
            И (СписокРегистровДляОчисткиДвижений.Найти(ТипЗнч(Движение)) = неопределено) Тогда
            Продолжить;
        КонецЕсли;
        
        Движение.Прочитать();
        Если Движение.Количество() > 0 Тогда
            ПозицияТочки = Найти(Строка(Движение), ".");
            ТипРегистра = Лев(Строка(Движение), ПозицияТочки - 13);
            ИмяРегистра = СокрП(Сред(Строка(Движение), ПозицияТочки + 1));
            
            ЕСли ТипРегистра = "РегистрНакопления" Тогда
                МетаданныеНабора = Метаданные.РегистрыНакопления[ИмяРегистра];
                Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
                
            ИначеЕсли ТипРегистра = "РегистрБухгалтерии" Тогда
                МетаданныеНабора = Метаданные.РегистрыБухгалтерии[ИмяРегистра];
                Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
                
            ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
                МетаданныеНабора = Метаданные.РегистрыСведений[ИмяРегистра];
                Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
                
            ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
                МетаданныеНабора = Метаданные.РегистрыРасчета[ИмяРегистра];
                Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
                
            КонецЕсли;
            
            Набор.Отбор.Регистратор.Установить(ДокументСсылка.Ссылка);            
            Попытка
                Набор.Записать();
            Исключение
                Отказ = Истина;
                ВызватьИсключение "Операция не выполнена";
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
44 trim89
 
29.01.16
10:52
(42) Почему?
45 trim89
 
29.01.16
10:52
(43) Я уже скопировал с рабочей базы =) сейчас тестить буду
46 Serg_1960
 
29.01.16
10:53
Автор, ты - партизан? Честно признайся, я пытать - не буду.

(0) "...после его создания делаю "Перемещение товаров" на основании поступления" - кратко алгоритм или я ухожу. Если опять "не буду, лень" - код, которым проводишь документ.

(37) Если и плюет, то не на дату, а только на время.

(42) Я бы сказал короче. Всего два слова - "автор - задница" :)
47 trim89
 
29.01.16
10:54
(43) Не работает
48 trim89
 
29.01.16
10:56
(46) Алгоритм тут не нужен, на мой взгляд - ничего интересного. Коль уж просят то конечно дам.
49 trim89
 
29.01.16
10:56
Для каждого стр из НовДер.Строки цикл         
        Если  ТекСкладОтг<>стр.СкладПоступления или ТекСкладПол<>стр.Склад тогда             
            ТекСкладОтг = стр.СкладПоступления;
            ТекСкладПол = стр.Склад;
            
            Если докП<>Неопределено тогда
                докП.Дата = докП.ДокументОснование.Дата + 3;
                докП.УстановитьНовыйНомер();
                попытка
                    докП.Записать(РежимЗаписиДокумента.Проведение);
                Исключение
                    докП.Записать(РежимЗаписиДокумента.Запись);
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
                КонецПопытки;
            КонецЕсли;
            
            докП = Документы.ПеремещениеТоваров.СоздатьДокумент();
            докП.Заполнить(стр.ДокПоступления);
            докП.Товары.Очистить();
            докП.СкладОтправитель = стр.СкладПоступления;
            докП.СкладПолучатель = стр.Склад;     
            докП.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваров;
        КонецЕсли;
        //Теперь нужно заполнить строку. Будем заполнять по поступлению, номер строки известен
        нов = докП.Товары.Добавить();
        стрП = стр.ДокПоступления.Товары.Получить(стр.номерСтрокиП - 1);
        ЗаполнитьЗначенияСвойств(нов,стрП);
        нов.Кодстроки = 0;
    КонецЦикла;
50 hhhh
 
29.01.16
10:59
(49) ну вот же задница

          докП.Заполнить(стр.ДокПоступления);


ты берешь дату Перемещения = дате поступления.
51 Serg_1960
 
29.01.16
11:00
Вот ведь какой упёртый автор попался - не колется. Скажи спасибо пятнице :)

PS: Мать/перемать, разреши отрицательные остатки, проведи ты наконец-то своей программой этот чёртов документ и дай нам полюбоваться отчетом движения товаров.
52 trim89
 
29.01.16
11:01
(50) Нет, перед записью меняется дата на нужную.
53 trim89
 
29.01.16
11:02
(51) Чуток попозже, у меня идея возникла =) Если не срастется, то все сделаю
54 Serg_1960
 
29.01.16
11:07
(52) Хех. Что это за "порнография" в "Если докП<>Неопределено тогда"-"КонецЕсли"? Ты меняешь дату не в том документе, как ты нам тут рассказывал.

И вот ещё, рекомендую :)
Документ.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
55 trim89
 
29.01.16
11:10
(54) Хех. Что это за "порнография"

вполне обоснованная той задачей, которая нужна

(54) Ты меняешь дату не в том документе, как ты нам тут рассказывал.

В том
56 vde69
 
29.01.16
11:11
зачем ты в разных итерациях создание и запись поместил?

как минимум это чревато, что последняя строка не запишется... по этому у тебя после цикла должно еще идти изменение даты и повторная запись, скорее всего именно после цикла ты и забыл прибавить 3 сек


я понимаю ты хочешь собирать по складам, но если у тебя склады идут не по порядку???

правильно делать по другому....
57 trim89
 
29.01.16
11:12
(51) А вот тут здравое замечание. Реально отрицательный остаток появился. Каким то макаром серия не прописывается в аналитику учета партий. Буду копать. спасибо!
58 trim89
 
29.01.16
11:13
(56) Кусок с последним складом я сюда не вставил, промазал когда выделял =) Склады сортирую сначала
59 Serg_1960
 
29.01.16
11:20
(56) Насколько я понял алгоритм, автор попытался реализовать "сводный" документ перемещения по складу.

В цикле обходит документы поступления, сортированные по складам; если новый склад - предыдущий документ перемещения закрыть и провести, открыть новый; если склад тот-же - добавить позиции из поступления.
60 trim89
 
29.01.16
11:26
(59) В целом, да
61 trim89
 
29.01.16
11:28
(59) Все решилось. Нужно было указать еще Статус серии для склада отправителя и склада получателя. В поступлении не было, они и не заполнялись.
62 trim89
 
29.01.16
11:28
Всем спасибо =)
63 hhhh
 
29.01.16
11:29
в общем, мы тут таких красивых гипотез навыдвигали, а оказвывается автор тупо не указал серию в документе.
64 trim89
 
29.01.16
11:32
(63) Да я сам в шоке =) Сам напридумывал гипотез не менее прекрасных =) и не серию указал, а статус серии. Наследие богомерзкого ут 11, с которым никогда не работал.
65 Serg_1960
 
29.01.16
12:21
"Истина - где-то рядом" - я был близок к истине в (22) :)