gifts2017

Контроль закрытия объекта "Таблица"

Опубликовал Михаил Семенов (Shaman100M) в раздел Программирование - Практика программирования

После Таб.Показать(,); выведенная табличная форма предоставлена сама себе (или пользователю). Как не потерять контроль и выполнить какие-либо действия при ее закрытии?
Контроль закрытия объекта "Таблица".

На "Мисте" автору одной из веток http://www.forum.mista.ru/topic.php?id=305108 понадобилось сохранять выведенную табличную форму после ее печати на принтер. Решение, как это иногда бывает, пришло само собой, имею смелось его выложить на Инфостарте.

Вообще, придумать потребность (и вышеуказанная тоже плохо "читается"), для чего нужна бы была отработка определенных действий с уже выведенной таблицей, оказалось достаточно сложно. К потребности автора ветки я смог добавить только две:

- сравнить данные в "открываемой" и "закрываемой" таблицах, не менял ли чего в них пользователь
- отменить закрытие таблицы

Ну и, собственно, само решение задачи, - момент сохранения таблицы переместить с "после печати" на "при закрытии".

ПриЗакрытии()!

Идея такая: табличную форму нужно передать во внешний (или встроенный) отчет с использованием пустой таблицы во все окно. А дальше все просто - закрывается не таблица, а отчет, используем предопределенную ПриОткрытии()

 // где-то в коде...
 Таб.Показать(,); 

заменяем на:
ИмяФайла = "C:\ЗадатьИмяФайла.mxl";
Таб.Записать(ИмяФайла);
ОткрытьФорму("Отчет.НапримерВстроенный#",ИмяФайла);


В отчете открываем и выводим переданный в кач. параметра файл таблицы,
прописываем наши действия в ПриЗакрытии()

Процедура ПриОткрытии()
    Таблица.ИсходнаяТаблица(Форма.Параметр);
    Таблица.Вывести();
КонецПроцедуры

Процедура ПриЗакрытии()
    // мои варианты
    // таблица была изменена?
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица(Форма.Параметр);
    Таб.Вывести();
    Если Таб.ВысотаТаблицы() <> Таблица.ВысотаТаблицы() Тогда
        БылиИзменения = 1;
    ИначеЕсли Таб.ШиринаТаблицы() <> Таблица.ШиринаТаблицы() Тогда
        БылиИзменения = 1;
    Иначе
        Для М1 = 1 По Таб.ВысотаТаблицы() Цикл
            Для М2 = 1 По Таб.ШиринаТаблицы() Цикл
                БылиИзменения = 0;
                Если Таб.Область(М1,М2).Текст <> Таблица.Область(М1,М2).Текст Тогда
                    БылиИзменения = 1;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            Если БылиИзменения = 1 Тогда
                Прервать;
            КонецЕсли;  
        КонецЦикла;
    КонецЦикла;
    Если БылиИзменения = 1 Тогда
        Сообщить("Были изменения");
    КонецЕсли;  
 
    // записать таблицу при закрытии
    Таблица.Записать(ИмяФайла); 

    // отменить закрытие таблицы 
    СтатусВозврата(0);
КонецПроцедуры

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.