Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=37509)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Отказ при вводе на основании (упр формы)

Автор: Bernet 29.05.17, 9:50

Всем привет.
Собственно задумался над вопросом как отказаться от ввода на основании в упр. формах, чтобы окно формы не появлялось?
В обычных формах было все просто, берем экспортную переменную в виде флага, устанавливаем, проверяем перед открытием и идем в отказ.
В управляемых формах такого сделать не получится, стал думать как можно красивее такое замутить, видел публикацию нашего уважаемого админа Vofki, там в обработке заполнения вызывается исключение

ВызватьИсключение("Упс, произошла какая-то неведомая фигня");
Решение интересное, но думал может есть что-то красивее, чем еррор на экране))
Так вот, подумали с коллегой и решили попробовать через структуру "ДополнительныеСвойства", которая есть по умолчанию в объекте. Получилось что-то вроде такого:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    // наше условие, при котором документ не должен заполняться и
        ДополнительныеСвойства.Вставить("НеОткрыватьФорму", Истина);
    
КонецПроцедуры

и далее в форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ТекущийОбъект = РеквизитФормыВЗначение("Объект");
    НеОткрыватьФорму = Ложь;
    Если ТекущийОбъект.ДополнительныеСвойства.Свойство("НеОткрыватьФорму", НеОткрыватьФорму) Тогда
        Отказ = НеОткрыватьФорму;
    КонецЕсли;
        
КонецПроцедуры

вот думали такой вариант будет красивым, но почему в событии ПриСозданииНаСервере, в нашем объекте, структура ДополнительныеСвойства пустая...
Вопрос №1) Почему структура ДополнительныеСвойства пустая в модуле формы?
Вопрос №2) Знает ли кто какой-то ещё красивый способ (без добавления реквизита "ДокументОснование" в метаданные) отказаться от ввода на основании?

Автор: Vofka 29.05.17, 10:09

Цитата(Bernet @ 29.05.17, 10:50) *
В обычных формах было все просто, берем экспортную переменную в виде флага, устанавливаем, проверяем перед открытием и идем в отказ.

В управляемой можно то же самое сделать, не? Добавьте новый реквизит на форму и в ПриСозданииНаСервере проверяйте.

Автор: Bernet 29.05.17, 10:18

Vofka @ Сегодня, 11:09 * ,
а как? чего-то я туплю... добавил допустим я реквизит на форму, как мне его заполнить из модуля объекта из процедуры "ОбработкаЗаполнения"?

Автор: Flexy 29.05.17, 10:27

Цитата(Bernet @ 29.05.17, 9:50) *
Собственно задумался над вопросом как отказаться от ввода на основании в упр. формах, чтобы окно формы не появлялось?

Зачем так сложно? crazy.gif
Если УсловиеИстина Тогда
ВводДокументаНаОсновании();
КонецЕсли;

Автор: Bernet 29.05.17, 10:33

Flexy @ Сегодня, 11:27 * ,
дык стандартный механизм ввода на основании же, в одном документе есть стандартное меню "Ввести на основании ..." выбираю нужный мне документ, попадаю в процедуру модуля объекта "ОбработкаЗаполнения" нужного мне документа и там мне надо проверить мой документ основание, если по условию не проходит, то не показывать форму и выдать сообщения что нельзя создать документ.

Кажется вы меня не так поняли, я имел в виду что хочу получить что-то вроде параметра "Отказ" по которому я смогу регулировать открывать форму документа или нет, а не отказаться от каких-то окон вообще и заполнять документ программно.

Автор: Flexy 29.05.17, 10:45

Цитата(Bernet @ 29.05.17, 10:33) *
процедуру модуля объекта "ОбработкаЗаполнения" нужного мне документа и там мне надо проверить мой документ основание, если по условию не проходит, то не показывать форму и выдать сообщения что нельзя создать документ.

Теперь понятно.
Имхо это не сильно по методе / концепции УФ. Т.к. в данном случае сам ДокументОбъект и ОбработкаЗаполнения() выполняются на сервере и их контекста на данном этапе "оторван" даже от серверного контекста формы (тяжело, понять, да). Разве, что городить доп параметры и т.д. и потом как-то их передавать в контекст открываемой формы &НаСервере. Но в таком случае возникает ризонный вопрос - "а нахиба?". Имхо это велосипед будет. Если в УФ сделан упор на асинхронность, то стоит все таки перед вызовом "чего либо" 200 раз подумать smile.gif

Автор: logist 29.05.17, 10:50

Цитата(Bernet @ 29.05.17, 10:50) *
Почему структура ДополнительныеСвойства пустая в модуле формы?

Потому что она существует только в модуле объекта, РеквизитВЗначение не делает Объект полнофункциональным.

Цитата(Bernet @ 29.05.17, 11:33) *
и там мне надо проверить мой документ основание, если по условию не проходит, то не показывать форму и выдать сообщения что нельзя создать документ.

Не понимаю, почему вам не нравится ВызватьИсключение? Во многих типовых конфигурациях на упр.ф. реализовано именно так.
Иначе это делается в ПриСозданииНаСервере, там и отказывайтесь от открытия формы. Либо рисуйте отдельную команду которая будет проверять условия до создания объекта.

Автор: Bernet 29.05.17, 10:56

logist @ Сегодня, 11:50 * ,
Просто думал может есть ещё способ сделать по аналогии с обычными формами, в итоге вообщем все таки добавил реквизит "ДокументОснование" в свой документ и проверяю его по своим условиям в форме "ПриСозданииНаСервере"... а то с утра мозгую как его лучше было сделать, лучше дальше задачу буду делать, а оптимизация если что наступит со временем =)

Автор: Petre 29.05.17, 11:00

Bernet @ Сегодня, 11:56 * ,
Если условие размещаете в "ПриСозданииНаСервере", то не надо добавлять реквизит, т. к. уже есть "Параметры.Основание".

Автор: Bernet 29.05.17, 11:00

Petre @ Сегодня, 12:00 * ,
об этом забыл, спасибо wink.gif

Автор: Batchir 29.05.17, 11:06

Для управляемых форм можно пойти через одно место))) 32541510.gif
1. Добавляем подписку на событие
2. Указываем источник ДокументМенеджер (выбираем наш документ-ы)
3. Указываем событие ОбработкаПолученияФормы
4. Добавляем общую форму "НеОткрыватьФорму" и при открытии указываем Отказ = Истина;
5. Добавляем Параметр сеанса "МойПарметрСеанса". Инициализируем его при старте программы и в обработке заполнения закидываем в него нужные нам параметры
6. В обработчике события ОбработкаПолученияФормы вставляем код который смотрит переданные параметры, а так же данные хранящиеся в нашем параметре
Если получили условие при котором не нужно открывать форму, то выполняем код
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "ОбщаяФорма.НеОткрыватьФорму";

32542460.gif
т.е. мы переопределили форму на ту которая никогда не откроется crazy.gif
З.Ы. Сам не пробовал, чисто теоретически, хотя сомневаюсь что сначала будет вызываться обработка заполнения, нужно пробовать.

Автор: Flexy 29.05.17, 11:23

Batchir @ Сегодня, 11:06 * ,
"месье знает толк в извращениях..." 32541510.gif

P.S. Кстати, по моему оно будет работать только если вызывать "Форма = ПолучитьФорму()"...Форма.Открыть(). С метода "ОткрытьФорму()" - не взлетает, а жаль.

Автор: Batchir 29.05.17, 11:35

Цитата(Flexy @ 29.05.17, 12:23) *
P.S. Кстати, по моему оно будет работать только если вызывать "Форма = ПолучитьФорму()"...Форма.Открыть(). С метода "ОткрытьФорму()" - не взлетает, а жаль.

не, там достаточно указать путь к форме, как написал
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "ОбщаяФорма.НеОткрыватьФорму";

я такое делал когда мне нужно было переопределить типовую форму, но не хотел лезть в типовой код вообще))

Автор: Bernet 29.05.17, 11:39

Batchir @ Сегодня, 12:06 * ,
АДЪ 47046430.gif
это извините за выражение icon_2707.gif ))) как у вас так мозги работают, да ещё и в понедельник...млин, пойду напьюсь icon_alc7.gif
Но выглядит круто, не спорю 44000000.gif

Автор: Vofka 29.05.17, 12:13

Цитата(Bernet @ 29.05.17, 11:18) *
а как? чего-то я туплю... добавил допустим я реквизит на форму, как мне его заполнить из модуля объекта из процедуры "ОбработкаЗаполнения"?

Никак. Это я перепутал.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua