Hare.ru @ Коллективный разум / Hare.ru @ Дикое место

Архив hare.ru 
Мысли, конвертированные в текст

Собственные руки TM


Все статьи раздела

Обход блокировок в открытых формах документов и справочников.

Алексей Николаев (AlexNik) (июнь 2002)

Иногда возникает необходимость изменения даты проведенного документа в момент, когда открыта форма этого документа.

Пользователь хочет изменить дату документа, не открывая журнал и не закрывая форму документа.

Проблема очевидна – пока открыта форма документа, он заблокирован, и программные действия (СделатьНеПроведенным, Записать и пр.) просто недопустимы.

Необходимо придумать что-то такое, чтобы пользователь смог изменить дату проведенного документа, просто нажав на кнопку в открытой форме этого же документа.

Та же самая ситуация возникает, когда мы хотим изменить родителя или владельца в открытой форме элемента справочника.

Вопрос: а можно ли как-нибудь обойти блокировку некоторых методов объекта "Документ" или "Справочник", возникающуюю автоматически при открытии формы объекта? Ответ: "да, можно". Хотя ответ и не очивиден, но он именно таков.

Механизм одинаков для всех случаев, для удобства рассмотрим пример решения задачи по изменению даты проведенного документа.

Задача

Пользователь открыл документ. Документ проведен. Пользователь меняет дату, жмет на кнопку (например, "Провести")… V7 не выдает сообщение "Изменена дата проведенного документа!", а молча отрабатывает действие пользователя.

Решение

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

Последовательность программных действий следующая.

  1. По кнопке в документе, например, по той же "ОК", открываем форму некоей обработки, в которую передаем необходимые параметры.
  2. В обработке, в процедуре ПриОткрытии, инициализируем переданные параметры, закрываем форму документа.
  3. В форме документа, в процедуре ПриЗакрытии, проверяем, что это "инициатива" служебной обработки, закрываем форму обработки.
  4. В форме обработки, в процедуре ПриЗакрытии, делаем необходимые манипуляции с документом, затем открываем его форму обратно.

В результате наблюдаем эффект мелькания формы документа на экране. Если документ долго перепроводится, то открытое в этот момент окно формы обработки можно использовать для вывода сообщений, типа "wait please…".

Что при этом происходит

  1. Oткрывается обработка, документ пока заблокирован
  2. закрывается документ (из обработки при ее открытии), документ еще заблокирован
  3. при закрытии документа вызываем закрытие обработки, документ пока заблокирован
  4. при закрытии обработки документ уже разблокирован (форма наконец-то закрыта), меняем его как угодно, открываем форму документа
Программный код

//В модуле формы документа

Перем ПараПараметров;

...

Процедура ПриЗакрытии()
   Если ТипЗначенияСтр(ПараПараметров) = "ГрупповойКонтекст" Тогда
// форма обработки открыта
      ПараПараметров.Форма.Закрыть();
// закрываем форму обработки
   КонецЕсли;
КонецПроцедуры // ПриЗакрытии

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

// Модуль формы обработки.

Перем ТекДок, НоваяДата;
// вспомогательные переменные, можно хранить в списке значений

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

// при открытии формы обработки запоминаем переданные параметры,
// после чего закрываем форму документа (ставится "в очередь")

Процедура ПриОткрытии()
   Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
      КонтекстДокумента = Форма.Параметр.Получить("КонтекстДокумента");
      НоваяДата = Форма.Параметр.Получить("НоваяДата");
      ТекДок = КонтекстДокумента.ТекущийДокумент();
      КонтекстДокумента.Форма.Закрыть(0);
   Иначе
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры // ПриОткрытии

Всё, готово дело. Задача решена.

Партнеры:


Также может быть интересно:

Канал Россия 1 на http://spbtvonline.ru/
   
 Сайт поддерживается за счет партнеров:
:::... Сайт содержит архив двух версий hare.ru Карта сайта