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

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

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

Автор: ZhenyaYa 21.11.12, 17:57

Подскажите, пожалуйста, как запретить открытие формы, если открыта другая форма. Например, запретить открытие справочник по коду "32", если открыт документ "32". Что то в таком роде...
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет

Автор: Kutuzov 21.11.12, 18:18

Цитата(ZhenyaYa @ 21.11.12, 17:57) *
Подскажите, пожалуйста, как запретить открытие формы, если открыта другая форма. Например, запретить открытие справочник по коду "32", если открыт документ "32". Что то в таком роде...
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет


А надо ли открывать документ или справочник с кодом 33?
если нет, тогда открыть форму модально надо

Автор: ZhenyaYa 21.11.12, 18:28

Цитата
А надо ли открывать документ или справочник с кодом 33?

простите, не понял вопрос...
если я открою документ 33 модально, так я тогда вообще ничего открыть не смогу, а мне нужно запрет именно на соответствующий элемент справочника

Автор: Zaval 21.11.12, 18:32

Цитата(ZhenyaYa @ 21.11.12, 17:57) *
Что то в таком роде...


Так не пойдет, давайте конкретнее.
Какая связь между доком "32" и справочником "32*. В чем вообще смысл такой блокировки?
Может просто слегка развить много где имеющийся механизм, блокирующий изменение некоторых реквизитов справочника при наличиии в системе документов определенного вида?

Автор: ZhenyaYa 21.11.12, 18:48

Цитата
Какая связь между доком "32" и справочником "32*. В чем вообще смысл такой блокировки?

В доке есть реквизит, ссылаемый на справочник, и наоборот
При открытии, как и при записи, справочника происходит изменение документа соответствующего ему документа, и наоборот. Может получится неразбериха...

Цитата
блокирующий изменение некоторых реквизитов справочника при наличиии в системе документов определенного вида?

открытых документов?

Автор: Zaval 21.11.12, 18:58

Цитата(ZhenyaYa @ 21.11.12, 18:48) *
При открытии, как и при записи, справочника происходит изменение документа соответствующего ему документа, и наоборот

Это уже неразбериха. При открытии ничего меняться не должно в принципе. Давайте реальный пример.

2. Просто наличие проведенных документов.


Автор: ZhenyaYa 21.11.12, 19:06

Цитата
Это уже неразбериха. При открытии ничего меняться не должно в принципе

Согласен, погорячился smile.gif
Не при открытии, а во время работы, запустили процедуру в доке, в справочнике поменялась информация, плюс при записи дока информация меняется...
Реальный пример очееень долго нужно будет объяснять) Просто подскажите можно ли это сделать каким то способом? Если нет, буду искать как обойти...

Автор: Zaval 21.11.12, 21:09

В справочнике для реквизита достаточно запретить ручное изменение, оставить только документом?

Автор: mister-x 21.11.12, 21:37

Цитата(ZhenyaYa @ 21.11.12, 19:06) http://pro1c.org.ua/index.php?act=findpost&pid=60752
Не при открытии, а во время работы, запустили процедуру в доке, в справочнике поменялась информация, плюс при записи дока информация меняется...

тобто двічі при роботі із одним документом інформація змінюється в одному і тому ж елементі довіднику?

Автор: Zaval 21.11.12, 21:52

Хм... "Изменяется документами" доступно только для периодических.

Автор: faiden 21.11.12, 21:58

Цитата(ZhenyaYa @ 21.11.12, 17:57) *
Подскажите, пожалуйста, как запретить открытие формы, если открыта другая форма. Например, запретить открытие справочник по коду "32", если открыт документ "32". Что то в таком роде...
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет


Ну, как вариант, завести глобальную переменную - флаг, в которую при открытии документа "32" будет записываться какая-то инфа. А при октрытии элемента справочника - анализировать оную инфу и, в случае необходимости, блокировать открытие формы элемента. Как-то так.

Автор: ZhenyaYa 22.11.12, 8:47

Цитата
Ну, как вариант, завести глобальную переменную - флаг, в которую при открытии документа "32" будет записываться какая-то инфа. А при октрытии элемента справочника - анализировать оную инфу и, в случае необходимости, блокировать открытие формы элемента. Как-то так.

Спасибо, это оно smile.gif

Автор: Cthulhu 22.11.12, 9:29

Использовать метод встроенного языка "Блокировка".

Автор: ZhenyaYa 22.11.12, 12:04

Цитата
Использовать метод встроенного языка "Блокировка".


Не получалось у меня это сделать с помощью блокировки...возможно я что то не так делал...можно поподробней?

Автор: ZhenyaYa 22.11.12, 14:13

Сделал по совету Faiden
в глоб:

Перем глВозвр Экспорт;
Процедура глБлок(Флаг1) Экспорт;
    глВозвр=Флаг1;
КонецПроцедуры


в доке:
Процедура ПриОткрытии()
глБлок(НомерДок);
КонецПроцедуры


Процедура ПриЗакрытии()
глБлок("");
КонецПроцедуры


в справочнике:
Процедура ПриОткрытии()
Если СокрЛП(глВозвр)=СокрЛП(Наименование) Тогда
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры


Вродь работает...


Хотя...Обойти все равно можно : открыть другой документ, и значение в глВозвр поменяется...Придется запрещать вообще открытие всех доков при этом...

Автор: Vofka 22.11.12, 14:57

ZhenyaYa, храните не просто глобальную переменную, а глобальную переменную в виде таблицы значений с 2 колонками: Документ, Справочник. При открытии документа туда будет добавляться строка какой документ какой элемент справочника блокирует. Так же при открытии проверяйте есть ли в таблице элемент справочника, который в данном документе. Если есть - значит документ не открываем и пишем, что элемент заблокирован таким-то документом. При закрытии, соответственно, удаляем соответствующую строку из таблицы.

Автор: ZhenyaYa 22.11.12, 16:40

Цитата(Vofka @ 22.11.12, 14:57) *
ZhenyaYa, храните не просто глобальную переменную, а глобальную переменную в виде таблицы значений с 2 колонками: Документ, Справочник. При открытии документа туда будет добавляться строка какой документ какой элемент справочника блокирует. Так же при открытии проверяйте есть ли в таблице элемент справочника, который в данном документе. Если есть - значит документ не открываем и пишем, что элемент заблокирован таким-то документом. При закрытии, соответственно, удаляем соответствующую строку из таблицы.



Спасибо smile.gif Работает как надо smile.gif

Еще один вопрос, я в глобальном переменной глВозвр делаю таблицей значений в процедуре ПриНачалеРаботыСистемы

глВозвр=СоздатьОбъект("ТаблицаЗначений");
    глВозвр.НоваяКолонка("Док");
    глВозвр.НоваяКолонка("Спр");


а значения в нее добавляю в другой процедуре

Процедура глБлок(Флаг1,Флаг2) Экспорт; 
    глВозвр.НоваяСтрока();
    глВозвр.Док=СокрЛП(Флаг1);
    глВозвр.Спр=СокрЛП(Флаг2);
КонецПроцедуры


Это правильно?

Автор: Cthulhu 22.11.12, 18:01

кхм.
а что, если один пользователь открыл документ "ЫЫЫ" (который будет пытаться откорректировать элемент справочника "ыыы") - а другой пользователь в это время открыл элемент справочника "ыыы" (который будет пытаться откорректировать документ "ЫЫЫ", котороый открыт у первого пользователя), ммм?..

Цитата(ZhenyaYa @ 21.11.12, 18:48) *
В доке есть реквизит, ссылаемый на справочник, и наоборот
При открытии, как и при записи, справочника происходит изменение документа соответствующего ему документа, и наоборот. Может получится неразбериха...

Допустим, что. Документ нельзя открывать на редактирование, если кто-то (кто угодно!) в это время редактирует элемент справочника, который прописан в реквизите, допустим, "ыыы" этого документа. Тогда достаточно в модуле формы такого документа, в предопределенной процедуре "ПриОткрытии" добавить следующий код:
  Если Форма.ТолькоПросмотр()<>1 Тогда Если ыыы.Выбран()<>0 Тогда
    тСпр=СоздатьОбъект("Справочник."+ыыы.Вид()); тСпр.НайтиЭлемент(ыыы);
    Если тСпр.Блокировка(1)<>1 Тогда
      Предупреждение("Ненене. Кто-то корректирует """+ыыы.ПолноеНаименование()+"""... приходите в єтот документ чуть позже.",12);
      СтатусВозврата(0); Возврат; // ну или Форма.ТолькоПросмотр(1); чтобы не скучал человек...
    Иначе тСпр.Блокировка(0) КонецЕсли;
  КонецЕсли КонецЕсли;
КонецПроцедуры //ПриОткрытии

Допустим, что. Элемент справочника нельзя открывать на редактирование, если кто-то (кто угодно!) в это время редактирует элемент справочника, который прописан в реквизите, допустим, "ЫЫЫ" элемента справочника. Тогда достаточно в модуле формы элемента такого справочника, в предопределенной процедуре "ПриЗаписи" добавить следующий код:
  Если Форма.ТолькоПросмотр()<>1 Тогда
      тДок=СоздатьОбъект("Документ"); Если тДок.НайтиДокумент(ЫЫЫ)<>0 Тогда
        Если тДок.Блокировка(1)<>1 Тогда
          Предупреждение("Ненене. Кто-то корректирует Документ """+ЫЫЫ+"""... приходите в єтот элемент справочника чуть позже.",12);
          СтатусВозврата(0); Возврат; // ну или Форма.ТолькоПросмотр(1); чтобы не скучал человек...
        Иначе тДок.Блокировка(0) КонецЕсли;
    КонецЕсли;
  КонецЕсли;
КонецПроцедуры //ПриОткрытии

как-то так...

Автор: ZhenyaYa 23.11.12, 13:39

Cthulhu, да, вашим методом получше будет smile.gif

Автор: Cthulhu 23.11.12, 14:14

Цитата(ZhenyaYa @ 23.11.12, 13:39) *
Cthulhu, да, вашим методом получше будет

Только ещё надо себе отчет отдавать, например, ещё в следующем.
если упомянутые реквизиты в процессе редактирования могут быть изменены... а кто-то в это время уже редактирует тот самый элемент справочника/документ, который выбирается в етот реквизит.... тоо....
ну, например.
32000000.gif

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