Имя: Пароль:
1C
1С v8
Источник вызова процедур
,
0 elevika
 
09.11.20
14:37
Добрый день :)
Прошерстила много инфы, поняла, что в принципе, не возможно программно определить откуда вызвана процедура. Но может у кого-то возникнет др. решение задачи.
Задача такая: есть подписка на событие ПриЗаписи() в спр. Номенклатура. Необходимо реализовать следующее. Когда Номенклатура интерактивно, т.е. из формы элемента, выполнить один набор действий. Когда сохранение номенклатуры вызывается программно, то выполняется др. набор действий.
Пробовала указать директиву &Наклиенте, но в случает, если юзер запустил вн. обработку, которая в свою очередь программно выполняет сохранение номенклатуры, т.е. должен быть "не интерактивный набор действий", то в подписке все равно отрабатывется &НаКлиете, т.к. фактически вызов с клиента...
Уже голову сломала, что можно ещё сделать
1 shuhard
 
09.11.20
14:39
(0)[Когда сохранение номенклатуры вызывается программно,]
дык передай в доп.параметры флажок
2 Fish
 
09.11.20
14:39
Для этого же ДополнительныеСвойства существуют.
3 ДенисЧ
 
09.11.20
14:40
В дополнительные свойства пихай флаг
4 ДНН
 
09.11.20
14:44
5 MishaD
 
09.11.20
14:46
при записи номенклатуры программно процедуры из формы элемента вообще не должны отрабатывать.
6 elevika
 
09.11.20
14:58
(5) Отработка идет на процедурах формы, а в процедуре подписки на событие "ПриЗаписи"
7 Answer42
 
09.11.20
14:59
(0)  В качестве вредного совета - бросить исключение, сразу поймать, посмотреть на стек от него (вроде в последних версиях сделали)...
8 RomanYS
 
09.11.20
15:02
(6) Сделай подписку на ОбработкаПроверкиЗаполнения и там установи флаг ДополнительныеСвойства
9 elevika
 
09.11.20
15:02
(1) В подписке на событие "Призаписи" передаются два параметра - Источник и Отказ. Источник - это объект Номенклатура. Как передать доп. параметр?
10 H A D G E H O G s
 
09.11.20
15:04
Попытка
        ВызватьИсключение "";
    Исключение
        СтэкВызова=ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
11 RomanYS
 
09.11.20
15:06
(7) (10) :)) Интересно, предполагали ли разработчики платформы, для чего будут использовать этот функционал?
12 1CnikPetya
 
09.11.20
15:06
(7) (10) За такое стоить бить. Ногами. Рвать сертификаты и выгонять с позором.
13 Волшебник
 
09.11.20
15:07
(12) ой, ладно
14 Answer42
 
09.11.20
15:13
(11) Думаю, да.
И это, конечно, был аргумент против реализации этой функциональности.
Но если пытаться запрещать все вредные варианты использования, то не стоит продавать отвёртки и пр.
Например, ЗУП на инициализации одного из параметров сеанса выполняет запрос, выдающий ошибку на Oracle, таким образом понимает что это Oracle и потом (уже глядя на значение этого параметра сеанса) в некоторых местах выполняет другие запросы. Если пытаться это запретить - нужно оторвать конструкцию Попытка / Исключение вообще.
15 Волшебник
 
09.11.20
15:15
(14) круто
16 elevika
 
09.11.20
15:16
(8) Спасибо. Попробую этот вариант
17 ДНН
 
09.11.20
15:31
(0) в (4) ведь есть пример.
В модуле формы номенклатуры в событии ПередЗаписьюНаСервере пишите:
ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗаписьИзФормы", Истина);

В подписке на событие пишите:
Если Источник.ДополнительныеСвойства.Свойство("ЗаписьИзФормы") Тогда
//код который должен выполняться при интерактивной записи
Иначе
//код который должен выполняться при программной записи
КонецЕсли;
18 Жан Пердежон
 
09.11.20
15:36
(0) смотря какие действия из формы - возможно, их правильно будет в самом обработчике события формы описать...
19 elevika
 
09.11.20
15:38
(17) Спасибо. Но не хотелось трогать модули справочника. Попробую через подписку ОбработкаПроверкиЗаполнения - она вызывается только из формы
20 elevika
 
09.11.20
15:40
(18) Вот не хотелось бы трогать модули формы. Поэтому такие навороты пробую
Но я пока ещё думаю, что рациональнее в нашем случае сделать ))
21 УдавВПопугаях
 
09.11.20
15:43
(19) чего это такое
а где тогда трогать, в подписке что ли? собственно без разницы: когда перебираем обработкой, ДопСвойства.Вставить(), потом где угодно хоть в подписке, хоть нет проверка на ДопСвойства.Свойство(), все.
22 Жан Пердежон
 
09.11.20
15:44
(20) не трогать форму не получится (если только уже нет вызова ОМ из этого события), в крайнем случае - расширение в помощь
23 УдавВПопугаях
 
09.11.20
15:49
(22) форму обработки можно трогать, а конфы и надобности нет. но смотря что за обработки, если не типовые опять же.
24 VladZ
 
09.11.20
15:57
(0) Необходимо на этапе постановки задачи всеми фибрами упираться от задачи вида "Здесь играть, здесь не играть, а здесь я рыбу заворачивал".
25 alkorolev
 
09.11.20
15:59
(0) в типовом решении (ЕРП или там УТ) куча дополнительных свойств из формы объекта передается (см. событие ПередЗаписьюНаСервере). По-любому их более чем достаточно - даже форму менять не придется
26 alkorolev
 
09.11.20
16:00
ЕРП 2.4.11.91
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    ПараметрыЗаписи.Вставить("ЭтоНоваяНоменклатура", Не ЗначениеЗаполнено(Объект.Ссылка));
    
    ТекущийОбъект.ИспользоватьИндивидуальныйШаблонЭтикетки = Булево(ИспользоватьИндивидуальныйШаблонЭтикетки);
    ТекущийОбъект.ИспользоватьИндивидуальныйШаблонЦенника  = Булево(ИспользоватьИндивидуальныйШаблонЦенника);
    
    ТекущийОбъект.ДополнительныеСвойства.Вставить("НаименованиеДляПечатиСформировано");
    ТекущийОбъект.ДополнительныеСвойства.Вставить("РабочееНаименованиеСформировано");
    ТекущийОбъект.ДополнительныеСвойства.Вставить("СменаВидаНоменклатурыОтработана");
    ТекущийОбъект.ДополнительныеСвойства.Вставить("РабочееНаименованиеПроверено", Истина);
    
    // Обработчик механизма "Свойства"
    УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
    
    МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
    
КонецПроцедуры
27 УдавВПопугаях
 
09.11.20
16:02
(26) это не изменение модуля объекта?
28 alkorolev
 
09.11.20
16:04
(27) какой еще модуль объекта? директива указана и предопределенное событие "ПередЗаписьюНаСервере"
29 УдавВПопугаях
 
09.11.20
16:05
не то увидел
30 elevika
 
09.11.20
16:31
Всем спасибо за советы и обсуждения. Сделала так:
В подписке на событие "ОбработкаПроверкиЗаполнения" вставила Источник.ДополнительныеСвойства.Вставить("ЗаписьИзФормы", Истина);
Этот обработчик вызывается только при записи объекта из формы. Соответственно, значение Истина будет установлено только при записи через форму

В подписке на событие "ПриЗаписи" вставила проверку значения Источник.ДополнительныеСвойства.Свойство("ЗаписьИзФормы")
31 alkorolev
 
09.11.20
16:38
(30) необязателнь. Если сделать СправочникОбъект.ПроверитьЗаполнение() то тоже вызовется
32 Жан Пердежон
 
10.11.20
16:38
(30) не только из формы, и в общем случае - неправильно:

ОбработкаПроверкиЗаполнения (FillCheckProcessing)
Описание:
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение.
33 elevika
 
16.11.20
15:59
(31) (32) Вы правы... Увы, без изменения в модуле элемента справочника не обойтись. Пришлось доп. свойство вставлять в ПередЗаписью() там.
34 1Сергей
 
16.11.20
16:03
а вот этого не достаточно?

Если ОбменДанными.Загрузка Тогда
     Возврат;
КонецЕсли;
35 Фрэнки
 
16.11.20
16:12
А мне вот интересно, для кого такого грамотного разработчика в Типовом коде написано

МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);

Ведь нарочно указано!

Бери этот модуль и метод в Расширение с директивой После и дописывай туда хоть черта лысого... Но нет, надо упереться и ни в коем разе типовой код не смотреть.
36 Ненавижу 1С
 
гуру
16.11.20
16:15
(14) ну так себе средство, могли бы нормальное средство в платформу зашить
и потом это противоречит идеологии "один код - много платформ"
37 RomanYS
 
16.11.20
16:16
(33) "Пришлось" в смысле столкнулась с вызовом ОбработкаПроверкиЗаполнения ?
38 elevika
 
16.11.20
16:27
(35) Да потому что! )))
Эта конфа на обычных формах и платформа 8.3.5 по ряду причин (только не срашивайте, каких!)
39 elevika
 
16.11.20
16:31
(38) Нет, но во избежание...
40 Фрэнки
 
16.11.20
17:21
эхх... никогда заранее не пишите никаких подробностей задачи, а то подсказывать будут слишком быстро и слишком точно
41 Фрэнки
 
16.11.20
17:21
:-)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой