Порядок действий системы при выполнении интерактивных процессов

  1. Старт всех процессов

    1. Создание (извлечение из стека) дескриптора процесса.
    2. Параметры запуска:
      1. Переменные окружения.
      2. OnSetSubwindow
    3. Загрузка окна, если оно не открыто:
      1. Если окна нет в кэш, то загрузка из wdo до состояния заготовки
      2. Если окно в состоянии заготовки:
        1. OnInitializeWindow
        2. для каждой зоны окна: анализ условий представлений и фильтров; если содержит сохраняемый фильтр, то OnInitializeZoneFilters
    4. Позиционирование в целевой зоне:
      1. есть исходная зона: частичный видеоконформ из нее в целевое окно
      2. нет исходной зоны: позиционирование на "первую" запись в мастере целевого окна, а из него частичный видеоконформ в подчиненные зоны.
      Частичный видеоконформ, отличается от полного:
      1. позиционирование не во всех зонах, а только в тех, которые находятся на пути между исходной зоной и целевой
      2. отрисовка не выполняется
      3. (только для целевой зоны) предложение снять фильтр
      4. (только для целевой зоны) на старте процесса Ins OnReposition и OnChangeIndex не вызываются
      5. (только для целевой зоны) перед вызовом OnReposition и OnChangeIndex:
        1. (Ins, Edit, Del) проверка признака зоны ViewOnly. Если он есть, сообщение "вставка/редактировние/удаление не предусмотрено"
        2. (ShowWin, Edit, Del) проверка наличия текущей позиции. Если ее нет, то "Смотреть/Редактировать/Удалять нечего"
        3. (старт первого процесса окна)
          1. OnOpenWindow
          2. Проверка: окно вмещается в консоль
        4. OnOpenZone
    5. Переход к выполнению конкретного процесса
  2. Процессы View, Ask, ShowWin.

    1. (Ask, начальная стадия, еще на исходном окне)
      1. OnBeforeAsk
      2. Получение имени справочного окна, его загрузка, запуск там собственно процесса Ask
    2. (Ask, только неавтоматический) OnAskPhase1 (в вариациях для разных исходных процессов).
    3. Во всех зонах всех окон сброс признака "позиция установлена программно".
    4. В цикле ожидания очередной команды:
      1. Видеоконформ
      2. Во всех зонах всех окон сброс признака "позиция установлена программно".
      3. OnGotFocus
      4. Окно становится видимым.
      5. Получение и обработка команды
    5. (неавтоматический Ask по опции EnterCur) OnAskPhase2 (в вариациях для разных исходных процессов)
  3. Процессы Ins и Edit.

    1. Во всех зонах всех окон сброс признака "позиция установлена программно".
    2. Только на старте нового процесса:
      1. (Edit) перепозиционирование на текущую запись и ее монопольная блокировка.
    3. Цикл по различным редактируемым записям:
      1. Отметка в SYSLOG о начале работы
      2. Только для процесса Ins:
        1. Если в вышестоящей зоне уже редактируется запись нашего мастер-файла, то сообщение о невозможности вставки.
        2. Поля текущей записи заполняются default-значениями
        3. Поля БД, входящие в селект зоны, получают значения из этого селекта. При этом если поле БД, участвующее в ручном селекте, получает значение не совпадающее со значением по умолчанию и имеется поле зоны, где это поле БД доступно для редактирования, которое должно сопровождаться событием OnSuccessfulChange, то выдается сообщение с предложением "снять отбор записей".
        4. Для зоны с иерархическим отображением или ее подчиненной панели:
          1. Если в зоне не установлен FORM_ZONE.ShowLeavesInHierarchicView, поле Leaf получает значение 0 (контейнер) и выставляется запрет его редактирования
          2. Если перед выполнением вставки текущая запись существовала, то значения полей иерархической связи копируются в новую запись так, чтобы она стала иерархически подчиненной к исходной, а если исходная запись - это лист, то к контейнеру этого листа.
        5. Собственно вставка новой записи. Если ошибка "нарушение уникальности", последнее поле текущего индекса получает пустое значение. Но если это поле входит в селект зоны, в том числе ручной, то выдается сообщение "Вставка ведет к нарушению уникальности..." и процесс завершается.
        6. OnBeforeInsert
        7. Только если редактирование в таблице: проверка соответствия вставляемой записи зонному фильтру. При несоответствии пользовательскому фильтру предложение снять фильтр. При отказе или несоответствии перманентному фильтру процесс завершается.
      3. Только для процесса Edit:
        1. Если в вышестоящей зоне уже редактируется запись нашего мастер-файла, то сообщение о невозможности редактирования.
        2. Проверка ссылочной целостности редактируемой записи.
        3. Для зоны с иерархическим отображением или его подчиненной панели:
          1. если в зоне не установлен FORM_ZONE.ShowLeavesInHierarchicView, выставляется запрет редактирования поля Leaf
        4. OnBeforeEdit
      4. Запоминается число модификаций в транзакции редактирования. Если других модификаций не будет, а также не будет вызова FIX_ALTERING, выход из редактирования не будет сопровождаться вопросом "Сохранять?"
      5. Видеоконформ + во всех зонах всех окон сброс признака "позиция установлена программно".
      6. Окно становится видимым.
      7. Цикл ожидания очередной команды
        1. Установка контекста на редактируемое поле
        2. OnGotFocus
        3. Видеоконформ + во всех зонах всех окон сброс признака "позиция установлена программно".
        4. Редактирование поля и ожидание очередной команды
          1. Опция Ask на поле типа Date - OnOpenCalendar
        5. Проверка введенного значения: выходит за допустимые пределы, не должно быть пустым и т.п.
        6. Replace. Если редактировалось справочное поле, сообщение "Менять в других файлах"
        7. OnSuccessfulChange
        8. Если в результате редактирования поля запись перестала попадать в пользовательский фильтр или ручной селект, то сообщение с предложением их снять
        9. Обработка полученной команды
        10. Если получена опция завершения редактирования:
          1. Проверка, что все доступные для редактирования поля зоны с признаком FORM_FIELD.MustBeNonempty имеют непустое значение. Иначе сообщение "Это поле не должно быть пустым" и переход в редактирование этого поля той же записи
          2. Сообщение "Сохранить  Не сохранять  Редактировать дальше". В случае "Сохранить:
            1. Видеоконформ + во всех зонах всех окон сброс признака "позиция установлена программно".
            2. OnAfterInsert или OnAfterEdit.
            3. Проверка, что имеют непустые значения:
              1. Поля связи индексов, которые являются центром куста индексов или Lend-ом
              2. Поле Leaf при иерархическом отображении
              Если одно из этих полей имеет пустое значение, соответствующее сообщение.
      8. Отметка в SYSLOG об окончании редактирования
  4. Процесс Del.

    1. Во всех зонах всех окон сброс признака "позиция установлена программно".
    2. Видеоконформ
    3. Окно становится видимым.
    4. Сообщение для подтверждения "Вы хотите удалить запись?"
    5. Перепозиционирование на текущую запись и ее монопольная блокировка.
    6. Проверка ссылочной целостности редактируемой записи.
    7. OnBeforeDelete
    8. Отметка в SYSLOG
    9. Собственно удаление
    10. OnAfterDelete
  5. Завершение последнего процесса окна

    1. OnCloseWindow
    2. Перемещение открытого окна в кэш окон