Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрет на открытие формы
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
ZhenyaYa
Подскажите, пожалуйста, как запретить открытие формы, если открыта другая форма. Например, запретить открытие справочник по коду "32", если открыт документ "32". Что то в таком роде...
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет
Kutuzov
Цитата(ZhenyaYa @ 21.11.12, 17:57) необходимо зарегистрироваться для просмотра ссылки
Подскажите, пожалуйста, как запретить открытие формы, если открыта другая форма. Например, запретить открытие справочник по коду "32", если открыт документ "32". Что то в таком роде...
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет


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

простите, не понял вопрос...
если я открою документ 33 модально, так я тогда вообще ничего открыть не смогу, а мне нужно запрет именно на соответствующий элемент справочника
Zaval
Цитата(ZhenyaYa @ 21.11.12, 17:57) необходимо зарегистрироваться для просмотра ссылки
Что то в таком роде...


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

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

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

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

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

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

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

Согласен, погорячился smile.gif
Не при открытии, а во время работы, запустили процедуру в доке, в справочнике поменялась информация, плюс при записи дока информация меняется...
Реальный пример очееень долго нужно будет объяснять) Просто подскажите можно ли это сделать каким то способом? Если нет, буду искать как обойти...
Zaval
В справочнике для реквизита достаточно запретить ручное изменение, оставить только документом?
mister-x
Цитата(ZhenyaYa @ 21.11.12, 19:06) необходимо зарегистрироваться для просмотра ссылки
Реальный пример очееень долго нужно будет объяснять)

зробіть скріншоти чи відео

Цитата(ZhenyaYa @ 21.11.12, 19:06) необходимо зарегистрироваться для просмотра ссылки
Не при открытии, а во время работы, запустили процедуру в доке, в справочнике поменялась информация, плюс при записи дока информация меняется...

тобто двічі при роботі із одним документом інформація змінюється в одному і тому ж елементі довіднику?
Zaval
Хм... "Изменяется документами" доступно только для периодических.
faiden
Цитата(ZhenyaYa @ 21.11.12, 17:57) необходимо зарегистрироваться для просмотра ссылки
Подскажите, пожалуйста, как запретить открытие формы, если открыта другая форма. Например, запретить открытие справочник по коду "32", если открыт документ "32". Что то в таком роде...
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет


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

Спасибо, это оно smile.gif
Cthulhu
Использовать метод встроенного языка "Блокировка".
ZhenyaYa
Цитата
Использовать метод встроенного языка "Блокировка".


Не получалось у меня это сделать с помощью блокировки...возможно я что то не так делал...можно поподробней?
ZhenyaYa
Сделал по совету Faiden
в глоб:
Перем глВозвр Экспорт;
Процедура глБлок(Флаг1) Экспорт;
    глВозвр=Флаг1;
КонецПроцедуры


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


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


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


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


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



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

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

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


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

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


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

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

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

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

как-то так...
ZhenyaYa
Cthulhu, да, вашим методом получше будет smile.gif
Cthulhu
Цитата(ZhenyaYa @ 23.11.12, 13:39) необходимо зарегистрироваться для просмотра ссылки
Cthulhu, да, вашим методом получше будет

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