Имя: Пароль:
1C
1С v8
Обработка проведения - не могу понять поведение
0 live in sky dreams
 
27.06.13
14:32
Суть задачи - по факту проведения "партияобразующего" дока - проверить было ли заполнено значение партии товара в ТЧ товаров.
Если не заполнено - проверить нет ли партии, созданной этим доком.
-Если партия такая есть(док был распроведен, потом снова проводим) - то просто подставить ее в строку ТЧ, реквизит "партия".
-Если такой партии нет(окумент новый) - то создать партию и подставить в строку ТЧ так же в реквизит "партия".

Условия: Использовать подписки на события + общие модули, код поставки своими каракулями не осквернять :)

Трабла:

Проводим док интерактивно. Поведение по кнопке "провести": все отрабатывает согласно задачи. Все заполняется, все прекрасно.
Проводим док интерактивно.

Проведение по кнопке "Провести и закрыть":
1) В случае, если такой партии ранее не было, - партия создается, в реквизит "партия" ТЧ товаров не добавляется.
2) В случае, если такая партия уже была создана, - так же в реквизит "партия" ТЧ товаров не добавляется.

Код механизма (Общий модуль):



Функция СоздатьНовуюПартиюЗапаса(Запас, ДокументСсылка, ВладелецПартии)
   
   ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
   
   НоваяПартия = Справочники.ПартииНоменклатуры.СоздатьЭлемент();
   НоваяПартия.ВладелецПартии = ВладелецПартии;
   НоваяПартия.Владелец = Запас;
   НоваяПартия.ФА_Документ = ДокументСсылка;
   НоваяПартия.Наименование = ДокументОбъект.Метаданные().Синоним + " №" + ДокументСсылка.Номер
                               + " от " + Формат(ДокументСсылка.Дата, "ДФ=""дд.ММ.гг 'г.'""");
   НоваяПартия.Записать();
   
   Возврат НоваяПартия.Ссылка
   
КонецФункции

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

Процедура ФА_КонтрольПартийОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
   
   Для Каждого СтрокаТЧЗапасы из Источник.Запасы Цикл
       Если НЕ ЗначениеЗаполнено(СтрокаТЧЗапасы.Партия) Тогда
           ОпределитьПартиюЗапаса(СтрокаТЧЗапасы, Источник.Ссылка);
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры
1 live in sky dreams
 
27.06.13
14:32
Точка входа: Процедура "ФА_КонтрольПартийОбработкаПроведения"
2 live in sky dreams
 
27.06.13
14:34
То есть кратко и просто: Жмакаем "провести" - все прекрасно заполняется, жмакаем "провести и закрыть" - не заполняется ТЧ.
3 Cyberhawk
 
27.06.13
14:36
А что за "Провести и закрыть"? УФ что ли?
4 live in sky dreams
 
27.06.13
14:36
Ога.
5 live in sky dreams
 
27.06.13
14:38
Сори не указал:
Платформа 1с: 8.2.18.61
УФ тонкий клиент
6 Cyberhawk
 
27.06.13
14:39
А проведение из списка документов подхватывается?
7 samozvanec
 
27.06.13
14:40
а если нажать провести, а потом уже - закрыть?
8 live in sky dreams
 
27.06.13
14:41
(6)Что ты имеешь ввиду?
Срабатывает ли подписка на событие?
Если так - то да, срабатывает
Иначе
Не понял что ты имеешь ввиду
КонецЕсли
9 live in sky dreams
 
27.06.13
14:41
(7) тогда все работает
10 live in sky dreams
 
27.06.13
14:43
В толстом клиенте такая ж фигня.
В момент проведения загрузил вот еще систему (Win) по полной. Поймал момент - увидел что реквизит "партия" в ТЧ перед самим закрытием реально заполняется. Тут же открываю этот док - реквизит не заполнен
11 live in sky dreams
 
27.06.13
14:45
+в движениях документа значение реквизита "Партия" не фигурирует.
Ну не писать же ему насильно в обработке проведения Записать()?
12 Cyberhawk
 
27.06.13
14:51
Скрой кнопку "Провести и закрыть" из УФ, и будет счастье
13 samozvanec
 
27.06.13
14:51
после подписки твоей что происходит?
14 live in sky dreams
 
27.06.13
14:56
(12)
- Доктор, у меня болит рука;
- Сестра, ножовку мне и лидокаин!

:)

(13)ээээ... а вот это интересно. Что раньше? Подписка или сам метод проведения?
15 samozvanec
 
27.06.13
15:03
(14) вот смотри. сначала отрабатывает проведение, потом подписка. на последней строке точку поставь и глянь, что там вообще на этот момент? есть разница, на какую кнопку жать?
16 live in sky dreams
 
27.06.13
15:08
ща
17 live in sky dreams
 
27.06.13
15:15
Точка останова - "КонецПроцедуры" в подписке.

результат в отладчике:
1) "Провести и закрыть" - Все значения в ТЧ заполнены как надо.
2) "Провести" - Все значения в ТЧ заполнены как надо.

результат в интерактиве:
1) "Провести и закрыть" - перед тем как форма закрывается видно, что значение реквизита "партия" в ТЧ заполняется. После открытия дока - значение реквизита "партия" в ТЧ не заполнено. В проводках так же "партия" пустая.
2) "Провести" - Значение реквизита ТЧ "партия" заполняется.
Если документ закрыть, затем снова открыть - реквизит не заполнено о.О (ранее не проверял).
18 live in sky dreams
 
27.06.13
15:17
Я так понимаю, что на момент проведения что либо пихать или менять в доке бессмысленно. Надо до записи еще менять. НО:

1) В подписках нет метода "ПередЗаписью".
2) Создавать элемент справочника "Партии" и подставлять их в ТЧ нужно только если документ не был проведен И проводится.

Как решить задачу? :(
19 live in sky dreams
 
27.06.13
15:21
Проведен или нет документ я могу в подписке "ПриЗаписи" впихнуть в структуру "ДополнительныеСвйства".
Загвоздка в том, что Узнать проводится док или просто записывается - можно только "ПередЗаписью". В методе "ПриЗаписи" это значение недоступно. То есть тут в подписке этого не узнать получается.
Как можно еще узнать РежимЗаписиДокумента?
20 live in sky dreams
 
27.06.13
15:23
Ой, че я нему. ПередЗаписью в подписках же есть. Ща попробую
21 live in sky dreams
 
27.06.13
15:32
Вроде решил как выполнить задачу.

В подписке "ПередЗаписью"

1)Узнаю проводится док или записывается.
2)Узнаю был ли док до настоящего действия проведен.
3)Если условия удовлетворяют(не был проведен и становится проведен), то запускаю требуемые действия по созданию и подстановке партий в ТЧ дока.

Вроде выглядит стройно
22 live in sky dreams
 
27.06.13
15:37
Да, все работает, всем спасибо! =)
23 samozvanec
 
27.06.13
15:39
обращайся
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.