Имя: Пароль:
1C
1С v8
Очистить запись регистра накоплений
,
0 b7music
 
26.03.15
12:03
Всем привет!
Подскажите, пожалуйста.
Есть документ заказ-наряд.
У него 3 статуса заказа
В Работе
Выполнен
Отменен
В документ добавлен реквизит "ЧистаяПрибыль". Указывается в каждом документе индивидуально.
После проведения документа, независимо от статуса заказа, данные падают в регистр накопления "ЧистаяПРибыль". Необходимо чтобы при статусе "Отменен" данные в регистр не попадали, а если есть существующие, то удалялись.
Пробую сделать через подписку на событие

Процедура ПодпискаЧистаяПрибыльПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если  (Источник.СостояниеЗаказа = Перечисления.СтатусыЗаказов.ВРаботе) И (Источник.Закрыт = Истина)
          
    Тогда
            Источник.Движения.ЧистаяПрибыль.Очистить();
            Источник.Движения.ЧистаяПрибыль.Записывать = Истина;

КонецЕсли;
КонецПроцедуры

Но не работает :(

В модуле объекта указано движение
    // регистр ЧистаяПрибыль  
    Движения.ЧистаяПрибыль.Записывать = Истина;
    Движение = Движения.ЧистаяПрибыль.Добавить();
    Движение.Период = Дата;
    Движение.Склад = СтруктурнаяЕдиницаРезерв;
    Движение.Сумма = СуммаДокумента;
    Движение.ЧистаяПрибыль = ЧистаяПрибыль;

Подскажите
1 kosts
 
26.03.15
12:06
(0) Очищать специально не надо. Т.к. при каждом проведении движения так и так очищаются. Надо при статусе отменен не допустить записи в регистр. Ну конечно что этот регистр является движением, а не отдельным.
2 b7music
 
26.03.15
12:09
Подробнее
"регистр является движением, а не отдельным."
3 anatoly
 
26.03.15
12:10
писать в РН через попдиску - это вредительство.
если только в РС - вести логи изменений.

(2) документ является регистратором этого регистра?
4 sFAQer
 
26.03.15
12:10
(0) Подписка нужна на событие ОбработкаПроведения а не перед записью, в перед записью у тебя ещё не сформированы движения...
5 b7music
 
26.03.15
12:11
Да, документ является регистратором. Регистр сам делал.
6 sFAQer
 
26.03.15
12:11
(3) Подписка не пишет, а очищает движения у дока, перечитай (0)
7 kosts
 
26.03.15
12:12
(5) В процедуре обработка проведения поставь условие если

   Движения.ЧистаяПрибыль.Записывать = Истина;
Если Не отменен Тогда
    Движение = Движения.ЧистаяПрибыль.Добавить();
    Движение.Период = Дата;
    Движение.Склад = СтруктурнаяЕдиницаРезерв;
    Движение.Сумма = СуммаДокумента;
    Движение.ЧистаяПрибыль = ЧистаяПрибыль;
КонецЕсли;
8 D_E_S_131
 
26.03.15
12:12
(1) "Т.к. при каждом проведении движения так и так очищаются." — а для чего тогда сделано свойство "Удаление движений" у документа?
9 Nuobu
 
26.03.15
12:18
(8) Если выставить галочку "Не удалять автоматически", то движения, без кнопки "Удаление движений" останутся. Более того, при определённых обстоятельствах, могут появиться новые)).
(0)  Можно насильно очистить Движения.ЧистаяПрибыль.Очистить().   Это чтоб наверочку.
10 b7music
 
26.03.15
12:25
(7)
Работает, но суть в том, что как такового "Отменен" нету.
Статус = "В работе"
СостояниеЗаказа = СостояниеВРаботе;
Объект.Закрыт = Ложь;
Статус = "Выполнен" Тогда
Объект.СостояниеЗаказа = СостояниеВыполнен;
Объект.Закрыт = Истина;
Статус = "Отменен" Тогда
Объект.СостояниеЗаказа = СостояниеВРаботе;
Объект.Закрыт = Истина;


Пробую
  Движения.ЧистаяПрибыль.Записывать = Истина;
  Если Не СостояниеЗаказа.СтатусЗаказа = Перечисления.СтатусыЗаказов.ВРаботе и Закрыт = Истина
      Тогда
    Движение = Движения.ЧистаяПрибыль.Добавить();
    Движение.Период = Дата;
    Движение.Склад = СтруктурнаяЕдиницаРезерв;
    Движение.Сумма = СуммаДокумента;
    Движение.ЧистаяПрибыль = ЧистаяПрибыль;
  КонецЕсли;
Так он теперь и при статусе Вработе делает тож самое что и в статусе отменен.
11 kosts
 
26.03.15
12:29
(10) Создай новую функцию СоздаватьДвижения() и в ней уже накручивай логику отменен он там или не отменен, в работе или закрыт. К первоначальному вопросу уже не относиться.

Если СоздаватьДвижения() Тогда
    Движение = Движения.ЧистаяПрибыль.Добавить();
    Движение.Период = Дата;
КонецЕсли;
12 b7music
 
26.03.15
15:11
Что-то не допру :(
13 anatoly
 
26.03.15
15:14
(6) ну очистка как бы тоже запись. в любом случае в подписке такое делать - зло. особенно если регистр подчиненный.
14 kosts
 
26.03.15
15:18
(12) Не нужно удалять, надо всего лишь не создавать


Процедура ОбработкаПроведения()
    
    Если СоздаватьДвижения() Тогда
        Движение = Движения.ЧистаяПрибыль.Добавить();
        Движение.Период = Дата;
        ...
    КонецЕсли;

КонецПроцедуры

Функция СоздаватьДвижения()

    Если Статус = "Отменен" и ... или ... и ... Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;

КонецФункции
15 b7music
 
26.03.15
15:39
Сделал
Функция СоздаватьДвижения()

    Если Перечисления.СтатусыЗаказов.ВРаботе И Закрыт = Истина Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;

КонецФункции  

Теперь ругается
{Документ.ЗаказПокупателя.МодульОбъекта(1539)}: Преобразование значения к типу Булево не может быть выполнено
    Если Перечисления.СтатусыЗаказов.ВРаботе И Закрыт = Истина Тогда
16 Mankubus
 
26.03.15
15:42
(15) Перечисления.СтатусыЗаказов.ВРаботе И Перечисления.СтатусыЗаказов.Закрыт
17 b7music
 
26.03.15
15:51
Все равно таже самая ошибка. В Перечеслениях нет Закрыт. http://i59.fastpic.ru/big/2015/0326/d8/c07a9af94cbf7e18faa56026c109b7d8.jpg
18 b7music
 
26.03.15
17:34
Уже весь моск взорвал.
Если делаю так:
    Если ЭтотОбъект.СостояниеЗаказа = "ВРаботе" И ЭтотОбъект.Закрыт = Истина    
        Тогда    
        Возврат Ложь;    
    Иначе    
        Возврат Истина;    
    КонецЕсли;

То он почему то возвращает истину, хотя должен ложь.
http://i57.fastpic.ru/big/2015/0326/aa/347518e03e3b648bd51f1ac8e61b44aa.jpg
http://i67.fastpic.ru/big/2015/0326/38/20ae852707c5d5f21e585937bea4d138.jpg
ЧЯДН?
19 ДенисЧ
 
26.03.15
17:37
(18) У тебя ссылка на справочник никогда не будет равна строке
20 b7music
 
26.03.15
17:40
Через перечисления не пашет, через справочник тоже, так как же быть?
21 kosts
 
27.03.15
07:42
(20) В каком смысле не пашет?...
Если СтатусЗаказа = Перечисления.СтатусыЗаказов.ВРаботе Тогда
22 b7music
 
27.03.15
07:58
Емае! Сделал так
    Если ЭтотОбъект.СостояниеЗаказа.СтатусЗаказа = Перечисления.СтатусыЗаказов.ВРаботе И ЭтотОбъект.Закрыт = Истина    
        Тогда    
        Возврат Ложь;    
    Иначе    
        Возврат Истина;    
    КонецЕсли;

Все заработало! Большое всем спасибо!
23 kosts
 
27.03.15
08:00
(22) а как же " Необходимо чтобы при статусе "Отменен" данные в регистр не попадали", а тут получается при работе не попадут
24 b7music
 
27.03.15
08:24
При работе попадут. Если состояние ЗН в работе, то тогда Закрыт = Ложь. (10)
Независимо от того, куда вы едете — это в гору и против ветра!