|
v7: Проведение подчиненных с основанием: прошу аудита по коду (чуть-чуть) | ☑ | ||
---|---|---|---|---|
0
ptrtss
28.05.12
✎
12:22
|
Предыстория такая. Торговля. Основание - это поступление ТМЦ. Подчиненные - перемещения
По приходу товар поступает просто на склад, а перемещения раскладывают поступивший товар по складскимя ячейкам. Но приход может быть сначала не проведен, цены выковыриваются из поставщика уже после прихода Поэтому, приход лежит некоторое время не проведенным. Продавать такой товар нельзя, но раскладывать по ячейкам - необходимо Ну так вот, перемещение на проведенном приходе проводится по остаткам ТМЦ Перемещение на не проведенном приходе проводится только по ячеечному регистру При проведении основания перемещения нужно перепроводить При отмене проведения - тоже перепроводить (но в режиме "только по ячейкам") Код вроде работает. Но я в нем не уверен, боюсь разных рассогласований с основанием и прочей ерунды. Гляньте кто опытный по связкам документов, есть где подводные камушки? За ранее спасибо //Кнопка "Записать": //#Записать //Кнопка "Провести": //НадоПровести = 1#Записать //Кнопка "ОК": //НадоПровести = 1#Записать Закрыть //Кнопка "Закрыть": //#Закрыть Перем НадоПровести; Процедура ПриЗаписи() Если СтатусВозврата() <> 0 Тогда СтатусВозврата(0); НачатьТранзакцию(); Записать(); Если (Проведен() = 0) И (НадоПровести = 1) Тогда НадоПровести = 0; Если Провести() = 0 Тогда ОтменитьТранзакцию(); Форма.Обновить(1); Возврат; КонецЕсли; КонецЕсли; дд = 0; чч = 0; мм = 0; сс = 0; ПолучитьВремяПеремещений(дд, чч, мм, сс); Подчиненные = СоздатьОбъект("Документ"); Подчиненные.ВыбратьПодчиненныеДокументы(, , ТекущийДокумент()); Пока Подчиненные.ПолучитьДокумент() = 1 Цикл Если Подчиненные.Вид() = "ПеремещениеТМЦ" Тогда Если Подчиненные.ПометкаУдаления() = 1 Тогда Продолжить; КонецЕсли; Попытка ПодчиненныйБылПроведен = Подчиненные.Проведен(); Если Подчиненные.Проведен() = 1 Тогда Подчиненные.СделатьНеПроведенным(); Сообщить("Отменено проведение документа "+Подчиненные.ТекущийДокумент()); КонецЕсли; УстановитьДатуВремя(Подчиненные, дд, чч, мм, сс); Если Проведен() = 1 Тогда Подчиненные.РаскладкаНеПроведенногоПрихода = 0; Иначе Подчиненные.РаскладкаНеПроведенногоПрихода = 1; КонецЕсли; Подчиненные.Записать(); Если ПодчиненныйБылПроведен = 1 Тогда Если Подчиненные.Провести() = 0 Тогда ОтменитьТранзакцию(); Форма.Обновить(1); Возврат; КонецЕсли; Сообщить("Проведен подчиненный документ "+Подчиненные.ТекущийДокумент()); КонецЕсли; Исключение Сообщить(ОписаниеОшибки()); Сообщить("Подчиненный документ кем-то открыт: "+Подчиненные.ТекущийДокумент()); ОтменитьТранзакцию(); Форма.Обновить(1); Возврат; КонецПопытки КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); КонецЕсли; КонецПроцедуры НадоПровести = 0; |
|||
1
Злопчинский
28.05.12
✎
12:31
|
а не надо ячеечный контур пересекать с контуром взаиморасчетов с поставщиком. Тогда все проблемы отпадут автоматом. а так смотри как перепроводится СЧФ в доке реализация
|
|||
2
ptrtss
28.05.12
✎
12:37
|
СФ только распроводятся, они обратно не проводятся
|
|||
3
ptrtss
28.05.12
✎
12:44
|
(1) У нас ничего и не увязано. Поступление - один документ. Раскладка - другой. И проблем собственно нет, есть задача
|
|||
4
Z1
28.05.12
✎
19:52
|
подчиненные.ВыбратьПодчиненныеДокументы(, , ТекущийДокумент());
1. т.к док записываешь то индекс по подчинению может сбиться и не факт что переберешь все документы 2. Если ОтменитьТранзакцию(); попал на этот оператор то проведение то тоюе будет проходить наверное надо после ОтменитьТранзакцию(); ставить СтатусВозврата(0); 3. Что будет с данными если все это выполниться а исходных документ не сможет сохраниться , провестись ? |
|||
5
Fragster
гуру
28.05.12
✎
19:53
|
блин, у нас была сотрудница, которая тоже писала "за_пробел_ранее благодарю"
|
|||
6
Мимохожий Однако
28.05.12
✎
20:02
|
(5)ОФФ:И там и там западала клавиша.)))
|
|||
7
Злопчинский
28.05.12
✎
20:29
|
(3) если нет проблемы - то откуда задача, увязанная с проблемой?
|
|||
8
Злопчинский
28.05.12
✎
20:30
|
(2) застрелись, посмотри что делается если в реалдизации поменять например договр
|
|||
9
ptrtss
29.05.12
✎
06:59
|
(4)
>>т.к док записываешь то индекс по подчинению может сбиться >>и не факт что переберешь все документы Принял к сведению. На сколько велика опасность и что с этим делать - пока не знаю >>2. Если ОтменитьТранзакцию(); попал на этот оператор >>то проведение то тоже будет проходить >> >>наверное надо после ОтменитьТранзакцию(); >>ставить СтатусВозврата(0); А у меня СтатусВозврата(0) стоит прям в начале всего кода >>3. Что будет с данными если все это выполниться а исходных >>документ не сможет сохраниться , провестись ? По идее основание записывается со всем хозяйством в одной транзакции. Для этого специально сделано СтатусВозврата(0);//отменяем запись которая прилагается к "ПриЗаписи" НачатьТранзакцию(); Записать();//себя родимого, вместо отмененной "стандартной" записи // перепровести друзей ЗафиксироватьТранзакцию(); |
|||
10
Z1
29.05.12
✎
08:10
|
(9)
>>>На сколько велика опасность и что с этим делать - пока не знаю Опасность очень велика. Что делать либо используй две переменные по одной цикл по второй запись либо сначала все записывай а тз или Списокзначений ( можно и с помощью 1с++ ) потом цикл по этой тз.подготовить это лучше это до начала транзакции ( чем короче транзакции тем лучше) Про статус возврата понятно. про проведение тоже оно отдельной кнопкой. но логика очень запутанная. |
|||
11
ptrtss
29.05.12
✎
08:54
|
(10)
>> либо сначала все записывай а тз или Списокзначений Вариант. У незаписанного документа подчиненных же быть не должно)) Спасибо |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |