Имя: Пароль:
1C
1С v8
Программное изменение движений документа при проведении, подписка на событие.
0 palm1c
 
11.09.12
10:32
Доброе утро.

Есть документ ОтчетПроизводстваЗаСмену.
Стоит задача при проведении документа, если определенный реквизит = Истина, подсчитывать сумму всех списанных материалов, и устанавливать эту сумму в плановую себестоимость.

Хочется всё это сделать подпиской на событие, чтобы не особо изменять конфигурацию.

Спрашиваю советов мудрых, как всё это лучше реализовать.
Какую подписку на событие использовать - при проведении документа или при записи регистра? И вообще, можкт быть, для этих целей уже есть какой-нибудь механизм в типовой УТП?

Спасибо.
1 ДенисЧ
 
11.09.12
10:35
Процедура ПриПроведении_СтоимостьГП(Источник, Отказ, РежимПроведения) Экспорт
   //Возврат;
   
   стрЗАпросЦены = "
   |ВЫБРАТЬ ТипЦен, Номенклатура, СерияНоменклатуры
   |ИЗ РегистрСведений.ЦеныНоменклатуры
   |ГДЕ Период = НАЧАЛОПЕРИОДА(&ВыбДата, ДЕНЬ)
   |И ТипЦен = &ТипЦены
   |И Номенклатура = &Номенклатура
   |И СерияНоменклатуры = &Серия";
   
   ЗАпросЦены = Новый Запрос(стрЗАпросЦены);
   
   стрЗапрос =
   "ВЫБРАТЬ
   |    АУЗ.Затрата, АУЗ.Затрата.ЕдиницаХраненияОстатков КАК Единица,
   |    АУЗ.СерияЗатраты,
   |    СУММА(УчетЗатрат.Количество) КАК Количество,
   |    СУММА(УчетЗатрат.Стоимость) КАК Стоимость
   |ИЗ
   |    РегистрНакопления.УчетЗатрат КАК УчетЗатрат
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаВидаУчета КАК АВУ
   |        ПО УчетЗатрат.АналитикаВидаУчета = АВУ.Ссылка
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаЗатрат КАК АУЗ
   |        ПО УчетЗатрат.АналитикаУчетаЗатрат = АУЗ.Ссылка
   |ГДЕ
   |    УчетЗатрат.Регистратор = &ссылка
   |    И УчетЗатрат.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
   |    И АВУ.РазделУчета = Значение(Перечисление.РазделыУчета.МПЗ)
   |
   |СГРУППИРОВАТЬ ПО
   |    АУЗ.Затрата,
   |    АУЗ.СерияЗатраты";
   
   Запрос = Новый Запрос(стрЗАпрос);
   
   Запрос.УстановитьПараметр("ссылка", Источник.Ссылка);
   рез = ЗАпрос.Выполнить();
   Если рез.Пустой() Тогда
       //Сообщить("Нет прихода по МПЗ для " + Источник);
       Возврат;
   КОнецЕсли;
   
   нз                                        = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
   нз.Отбор["Регистратор"].Использование    = Истина;
   нз.Отбор["Регистратор"].Значение        = Источник.Ссылка;
   
   типЦены    = Константы.ТипЦенПлановойСебестоимостиНоменклатуры.Получить();
   рубли    = Константы.ВалютаУправленческогоУчета.Получить();
   
   ЗАпросЦены.УстановитьПараметр("ТипЦены", типЦены);
   ЗАпросЦены.УстановитьПараметр("ВыбДата", Источник.Дата);
   
   выб = рез.Выбрать();
   Пока выб.Следующий() Цикл
       
       ЗАпросЦены.УстановитьПараметр("Номенклатура", выб.Затрата);
       ЗАпросЦены.УстановитьПараметр("Серия", выб.СерияЗатраты);
       рез = Запрос.Выполнить();
       Если не Рез.Пустой() Тогда
           //цены на эту продукцию и серию за этот день уже есть
           Продолжить;
       КонецЕсли;
       
       запись                        = нз.Добавить();
       запись.Регистратор            = Источник.Ссылка;
       запись.Активность            = Истина;
       запись.Период                = Источник.Дата;
       запись.ТипЦен                = типЦены;
       запись.Номенклатура            = выб.Затрата;
       Запись.СерияНоменклатуры    = выб.СерияЗатраты;
       запись.Валюта                = рубли;
       запись.Цена                    = выб.Стоимость / выб.Количество;
       запись.ЕдиницаИзмерения        = выб.Единица;
   КОнецЦИкла;
   
   Если нз.Количество() > 0 Тогда
       нз.Записать(Истина);
   КонецЕсли;
   
КонецПроцедуры


Сильнро ногами не бить, за запросы в цикле, это первая прикидка, ещё не в боевом режиме.
2 palm1c
 
11.09.12
10:38
(1) Я думал сделать чуть хитрее. Можно считать регистр ПартииТоваров, какую себестоимомть списываем, а потом в движение приход её записать (исправить). И в документ записать. Как-то так можно?
3 zladenuw
 
11.09.12
10:39
(1)   выб = рез.Выбрать();
   Пока выб.Следующий() Цикл
       
       ЗАпросЦены.УстановитьПараметр("Номенклатура", выб.Затрата);
       ЗАпросЦены.УстановитьПараметр("Серия", выб.СерияЗатраты);

Передать параметры списком. и получить на выходите таблицу нз и записать ее ?
4 palm1c
 
11.09.12
10:39
(2) То есть исправить движение приход, записать в него ровно ту себестоимость, которую программа рассчитала для списываемых партий.
5 ДенисЧ
 
11.09.12
10:40
(2) Какие партии? У меня РАУЗ...
(3) разумеется. Просто пока не до этого. Когда в бой буду запускать, там ещё много что переделать придётся.
6 zladenuw
 
11.09.12
10:41
(3) а может даже и 1 запросом. или он будет трудоемкий ? и на выходе также нз и загрузка ее. это так мысли вслух. ход мышление. или правильно :)
7 palm1c
 
11.09.12
10:42
Вопрос вот в чём: обработчик подписки события ОбработкаПроведения, уже можно читать движения по этому документу?
8 DrShad
 
11.09.12
10:48
(7) можно, я не против
9 palm1c
 
11.09.12
11:01
(8) Спасибо.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.