Имя: Пароль:
1C
1С v8
НеАктивная Кнопочка на форме
, ,
0 Kjifhf
 
21.04.12
16:46
Здрасте. У меня такая проблема.

Есть справочник СоглашениеСКлиентом. На него я поместил кнопочку ***. Нажав на эту кнопочку появляется созданный справочник ДоговорСКонтрАгентом. А дальше должно выполняться такое условие: Если ДоговорСКонтрагеном был сохранен перед закрытием, то кнопочка *** должна стать неактивной, а если я не сохранял и закрыл то кнопочка должна быть активной, то есть ничего не изменялось. Подскажите пожалуста как мне это реализовать.



Думал создать в обоих справочниках реквизит типа ссылки на ДоговорСКонтрагентом, и через него передавать сигнал если договор был сохранен. но что то не сложилось =(





А у вас какие идеи будут? Благодарю за внимание.
1 Kjifhf
 
21.04.12
19:07
Хорошо, тогда подскажите хотя бы это:

Как мне находясь в справочник1 изменить значение реквизита в справочник2 ??

вот я в договорСКонтрагентами. на форме кликаю кнопку, выполняется команда ***, в модуле

процедура ***(команда);
справочник2.реквизит = ....
конецпроцедуры



Но так работать не будет, а как мне правильно изменить значение ерквизита в справочник2???
2 Extro
 
21.04.12
19:40
процедура ***(команда);
Спр = справочник2.ПолучитьОбъект();
Спр.реквизит = ....
Спр.Записать();
конецпроцедуры
3 mistеr
 
21.04.12
19:46
Передать сигнал из одной формы в другую можно, используя свойство ВладелецФормы.При закрытии формы ДоговорСКонтрагеном вызвать процедуру в форме СоглашениеСКлиентом.

Или использовать механизм оповещений (метод Оповестить гл. контекста)
4 Kjifhf
 
21.04.12
20:07
(2) так не получится, ибо выдает ошибку неизвестная переменная справочник2.
5 Kjifhf
 
21.04.12
20:09
(3) но кажется соглашениеСКлиентом не является владельцем формы ДоговорСКонтрагентом.
6 Kjifhf
 
21.04.12
20:26
Спр = Справочник.СоглашениеСКлиентом.ПолучитьОбъект();
Спр.Форма.ФормаЭлемента.СоздатьДоговор.Доступность = Ложь;

Выдает ошибку:
переменная не определена (Справочник)

Что не так?
Пытаюсь обратиться к кнопке на форме
7 CepeLLlka
 
21.04.12
20:29
Справочники может стоит написать попробовать? :)
8 CepeLLlka
 
21.04.12
20:33
(6) Ой.. нет же лоло..

ПолучитьОбъект() это только если у тебя ссылка же..

Тебе нужно поступить вот так хотябы
//Сначала получить ссылку на нужный тебе справочник..
СпрСсылка = Справочники.СоглашениеСКлиентом.НайтиПоКоду("000005"); // затем уже получить объект(элемент справочника) по этой ссылке

СпрОбъект = СпрСсылка.ПолучитьОбъект();

Вот.. а потом уж я хз чё ты там хочешь с ним сделать.. мне кажется не получится у тебя вот это:
Спр.Форма.ФормаЭлемента.СоздатьДоговор.Доступность = Ложь;

Такое нужно делать в модуле формы.. в процедуре ПриСозданииНаСервере если у тебя УФ или же в ПриОткрытии если у тебя Обычные формы..
9 CepeLLlka
 
21.04.12
20:40
А по (0)
Надеюсь у тебя Справочник Договора который является подчинённым..
Если как я вижу ты планируешь что у тебя будет с контрагентом только лишь по одному договору.. (так по твоему условию) то можно сделать так... Ограничусь описанием для Обычных форм...

Вобщем в процедуре ПриОткрытии() делай запрос по типа

// Пишу от руки.. чтобы просто донести идею до тебя.. будут ошибки.. копипастить не надо.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|ДоговорСКонтрАгентом.Ссылка
|ИЗ
|Справочник.ДоговорСКонтрАгентом
|ГДЕ
|ДоговорСКонтрагентом.Владелец = &ТекущийКлиент";

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

Вот вроде так.. идея такова.. проверяй ошибки только :)
10 CepeLLlka
 
21.04.12
20:42
НЕ только нужно убрать в условии :) Ошибся..
11 CepeLLlka
 
21.04.12
20:43
И если помогло.. то отпиши тут.. я буду рад что помог тебе.
12 mistеr
 
21.04.12
21:20
(5) если из одной формы открываешь другую, то первая становится владельцем последней.

Манипулировать напрямую элементами на другой форме неверно. Нужно именно "передавать сигналы" (0).
13 kosts
 
21.04.12
21:35
(0) Можно попробовать через модальные формы.
Как-то так

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


Но грамотнее через оповещение. С другой стороны ограничение одним договором, это не совсем удобно.
Как быть в ситуации, если договор создали, а потом пометили на удаление...
В типовых удобно сделано, договоров может быть множество, и можно выбрать основной, который сохраняется в контрагенте.
14 Kjifhf
 
21.04.12
21:36
(8) выдает ошибку
значение не является значением объектного типа.  что то ты не так пдсказал
15 CepeLLlka
 
21.04.12
21:40
(14) Извини.. я старался как мог :)
16 Kjifhf
 
21.04.12
21:51
(13) так получается, чтобы кнопка стала неактивной на неё, после записи договора нужно будет ещё раз нажать?)
17 kosts
 
21.04.12
21:54
(16) Сразу недоступной должна сделаться.
18 CepeLLlka
 
21.04.12
22:12
(16) Тут да.. ты при вызове кнопки снова проверяй есть ли договор или нет.. если есть.. то просто открывай элемент этого договора.. а если нету то создавать новый..
19 GoldenCalf
 
21.04.12
22:41
ОбработкаЗаписиНовогоОбъекта - должна помочь
20 GoldenCalf
 
21.04.12
22:42
В крайнем случае ОбработкаОповещения
21 Kjifhf
 
22.04.12
00:00
я вот не пойму что надо исправить

СпрСС = Справочники.СоглашенияСКлиентами.НайтиПоКоду(Объект.Код);
спрСС.Реквизит1="123";
Спрсс.Записать();


Значение не является значением объекного типа(Реквизит1). А когда реквизит1 был булевым типом, такой код не менял реквизит1 в справочнике владельце.



Вот у меня просьба, напишите пожалуста как правильно чтобы шло обращение не к новому справочнику, а к справочнику владельцу. У меня ума не хватает самому запилить. Спасибо
22 mistеr
 
22.04.12
01:22
(21) Может таки мой совет попробуешь?
23 Kjifhf
 
22.04.12
03:16
(22) так я и пытаюсь.
1. В соглашениеСКлиентом сздаем реквизит булевского типа со значением ИСТИНА.
2  В модуле формы договора в процедуре передЗаписью  пишем код из (21) и меняем тем самым наш реквизит на ЛОЖЬ.
3. В модуле формы жлемента соглашений в обработчике кнопки пишем услвоие если реквизит ложь тогда кнопку делаем недоступной.
4  из соглашений вызываем договор. Записываем. Но у нас меняется реквизит в кааком то другом соглашении а не конткретно в соглашении-владельце.

Посему и вопрос, как мне обратиться к владельцу??

Ты ведь так предлагал?
24 mistеr
 
22.04.12
10:36
(23) Не так я предлагал. Взаимодействуют формы (объекты интерфейса), а не элементы справочников (объекты ИБ). Разницу понимаешь?
В п. 1) не реквизит создаешь, а экспортную процедуру в *модуле формы*.
В п. 2) вызываешь ее. В этой процедуре ты можешь делать с формой все что угодно; в данном случае делаешь недоступной кнопку.
П. 3), 4) нафиг.

В п. 2) не забудь проверить, что владелец тот, который тебе нужен. А то форма может быть вызвана из разных мест.
25 Kjifhf
 
22.04.12
14:27
(24) идея шикарна, только я в 1с совсем не давно, как мне проверить на владельца и что такое экспортная форма?
26 mistеr
 
22.04.12
14:40
(25) Ты что, притворяешься тупым, "экспортная форма"? Процедура с ключевым словом "Экспорт". Раз идея нравится, недостающие детали откопай в справке, не ленись.
27 Kjifhf
 
22.04.12
16:20
(26) Не работает =( Создал экспрт в модуле формы обозвал ***,  а при записи договора пишет что метод *** не найден =(.


И вот если через реквизит.
Спр = Справочники.СоглашенияСКлиентами.НайтиПоРеквизиту("Номер", Объект.Код).ПолучитьОбъект();
       спр.Реквизит1=ИСТИНА;
       спр.Записать();
       

Кажется он находит не тот документ. Ибо при открытии соглашения реквизит ЛОЖЬ. При зписи должен меняться в истину, но всё равно остается ложь для этого соглашения. НО ведь у каждого соглашения свой индивидуальный номер же. Блин работал бы отладчик давно бы понял в чем соль а так тприходится вас мучить
28 kosts
 
22.04.12
20:12
(27) Пригласи специалиста