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

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

вот думали такой вариант будет красивым, но почему в событии ПриСозданииНаСервере, в нашем объекте, структура ДополнительныеСвойства пустая...
Вопрос №1) Почему структура ДополнительныеСвойства пустая в модуле формы?
Вопрос №2) Знает ли кто какой-то ещё красивый способ (без добавления реквизита "ДокументОснование" в метаданные) отказаться от ввода на основании?
Vofka
Цитата(Bernet @ 29.05.17, 10:50) необходимо зарегистрироваться для просмотра ссылки
В обычных формах было все просто, берем экспортную переменную в виде флага, устанавливаем, проверяем перед открытием и идем в отказ.

В управляемой можно то же самое сделать, не? Добавьте новый реквизит на форму и в ПриСозданииНаСервере проверяйте.
Bernet
Vofka @ Сегодня, 11:09 необходимо зарегистрироваться для просмотра ссылки ,
а как? чего-то я туплю... добавил допустим я реквизит на форму, как мне его заполнить из модуля объекта из процедуры "ОбработкаЗаполнения"?
Flexy
Цитата(Bernet @ 29.05.17, 9:50) необходимо зарегистрироваться для просмотра ссылки
Собственно задумался над вопросом как отказаться от ввода на основании в упр. формах, чтобы окно формы не появлялось?

Зачем так сложно? crazy.gif
Если УсловиеИстина Тогда
ВводДокументаНаОсновании();
КонецЕсли;
Bernet
Flexy @ Сегодня, 11:27 необходимо зарегистрироваться для просмотра ссылки ,
дык стандартный механизм ввода на основании же, в одном документе есть стандартное меню "Ввести на основании ..." выбираю нужный мне документ, попадаю в процедуру модуля объекта "ОбработкаЗаполнения" нужного мне документа и там мне надо проверить мой документ основание, если по условию не проходит, то не показывать форму и выдать сообщения что нельзя создать документ.

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

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

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

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

Не понимаю, почему вам не нравится ВызватьИсключение? Во многих типовых конфигурациях на упр.ф. реализовано именно так.
Иначе это делается в ПриСозданииНаСервере, там и отказывайтесь от открытия формы. Либо рисуйте отдельную команду которая будет проверять условия до создания объекта.
Bernet
logist @ Сегодня, 11:50 необходимо зарегистрироваться для просмотра ссылки ,
Просто думал может есть ещё способ сделать по аналогии с обычными формами, в итоге вообщем все таки добавил реквизит "ДокументОснование" в свой документ и проверяю его по своим условиям в форме "ПриСозданииНаСервере"... а то с утра мозгую как его лучше было сделать, лучше дальше задачу буду делать, а оптимизация если что наступит со временем =)
Petre
Bernet @ Сегодня, 11:56 необходимо зарегистрироваться для просмотра ссылки ,
Если условие размещаете в "ПриСозданииНаСервере", то не надо добавлять реквизит, т. к. уже есть "Параметры.Основание".
Bernet
Petre @ Сегодня, 12:00 необходимо зарегистрироваться для просмотра ссылки ,
об этом забыл, спасибо wink.gif
Batchir
Для управляемых форм можно пойти через одно место))) 32541510.gif
1. Добавляем подписку на событие
2. Указываем источник ДокументМенеджер (выбираем наш документ-ы)
3. Указываем событие ОбработкаПолученияФормы
4. Добавляем общую форму "НеОткрыватьФорму" и при открытии указываем Отказ = Истина;
5. Добавляем Параметр сеанса "МойПарметрСеанса". Инициализируем его при старте программы и в обработке заполнения закидываем в него нужные нам параметры
6. В обработчике события ОбработкаПолученияФормы вставляем код который смотрит переданные параметры, а так же данные хранящиеся в нашем параметре
Если получили условие при котором не нужно открывать форму, то выполняем код
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "ОбщаяФорма.НеОткрыватьФорму";

32542460.gif
т.е. мы переопределили форму на ту которая никогда не откроется crazy.gif
З.Ы. Сам не пробовал, чисто теоретически, хотя сомневаюсь что сначала будет вызываться обработка заполнения, нужно пробовать.
Flexy
Batchir @ Сегодня, 11:06 необходимо зарегистрироваться для просмотра ссылки ,
"месье знает толк в извращениях..." 32541510.gif

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

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

я такое делал когда мне нужно было переопределить типовую форму, но не хотел лезть в типовой код вообще))
Bernet
Batchir @ Сегодня, 12:06 необходимо зарегистрироваться для просмотра ссылки ,
АДЪ 47046430.gif
это извините за выражение icon_2707.gif ))) как у вас так мозги работают, да ещё и в понедельник...млин, пойду напьюсь icon_alc7.gif
Но выглядит круто, не спорю 44000000.gif
Vofka
Цитата(Bernet @ 29.05.17, 11:18) необходимо зарегистрироваться для просмотра ссылки
а как? чего-то я туплю... добавил допустим я реквизит на форму, как мне его заполнить из модуля объекта из процедуры "ОбработкаЗаполнения"?

Никак. Это я перепутал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.