﻿$engine JScript
$uname silence
$dname Тишина в отсеках
$addin stdlib
$addin stdcommands

// (с) Александр Орефков orefkov at gmail.com
// Это небольшой скрипт для подавления некоторых сообщений Конфигуратора, бессмысленных и беспощадных.
// Пока реализовано "в-лоб", в дальнейшем надо сделать список из "регэксп + результат",
// и гуи по настройке, какие подавлять, какие нет.

// Подключение библиотеки log4js, для удобвного логгирования различных событий. 
stdlib.require('log4js.js', SelfScript);
stdlib.require('SettingsManagement.js', SelfScript);
stdlib.require("SelectValueDialog.js", SelfScript);

var logger = Log4js.getLogger(SelfScript.uniqueName);
var appender = new Log4js.BrowserConsoleAppender();
// Определяем формат вывода сообщений. 
appender.setLayout(new Log4js.PatternLayout(Log4js.PatternLayout.TTCC_CONVERSION_PATTERN));
logger.addAppender(appender);
logger.setLevel(Log4js.Level.ERROR);

// # Подпишемся на событие при выводе предупреждения/вопроса
// ## подписки на события показа окон: 
// __onMessageBox__ - для модальных блокирующих окошек типа Предупреждение. 
// __onDoModal__ - для модальных окошек типа "Вопрос" , в частности для включенной "провекри синтасиса при записи"" подключаемся на событие модального окна. 
//
events.connect(windows, "onMessageBox", SelfScript.self)
if (profileRoot.getValue("ModuleTextEditor/CheckAutomatically")){
    events.connect(windows, "onDoModal", SelfScript.self);  
}

var notify = true;
// # onMessageBox
//  Функция - обработчик
// ## Параметры
// __param__ - словарь содержащий все параметры Предупреждения
// ``` 1c
// Message(param.caption + " | " + param.text + " | " + param.type + " | " + param.timeout)
//```
function onMessageBox(param)
{

    // При отработке события перехват с MessageBox'а снимается, и в обработчике
    // можно смело его вызывать, не боясь зацикливания. Например мы сами хотим узнать ответ
    // пользователя и в зависимости от него выполнить какие-то действия
    // param.result = MessageBox(param.text, param.type, param.caption, param.timeout)
    // param.cancel = true

    if(param.text == "Внимание!!! Месторасположение информационной базы изменилось.\nПродолжить?")
    {
        param.result = mbaYes
        param.cancel = true
        return;
    }
    
    // сообщения типа "Объект Роль.Менеджер заблокирован." или "Объект Справочник.СохраненныеНастройки заблокирован."
    reRoleBlock = /Объект\s*[\d\wzа-яё]+\.[\d\wzа-яё\.]+\s*заблокирован\./ig
    if(reRoleBlock.test(param.text)){
        Message(param.text)
        param.result = mbaYes
        param.cancel = true
        return;
    }
    
    // сообщения типа "Объединение конфигураций завершено."
    reConfigUnionEnd = /объединение\s+конфигураций\s+завершено\./ig
    if(reConfigUnionEnd.test(param.text)){
        param.result = mbaYes
        param.cancel = true
        Message(param.text)
        return;
    }
}
// Перехватываем модальное окошко и если в первом контроле в тексте содержиться 
// фраза "При проверке модуля обнаружены ошибки!" тогда подавляем данно сообщение с выводом в трее неблокируюещего 
// сообщения о наличии ошибок. 
function onDoModal(dlgInfo){
    if(dlgInfo.stage == openModalWnd)
    {
        if (dlgInfo.Caption == "Конфигуратор"){

            for(var c = 0; c < dlgInfo.form.controlsCount; c++)
            {
                if (c > 2){
	               //Опытным путем подобранно, что больше чем 2 контрола нет на форме, соответственно если больше, то это не наша форма. 
                    return;
                }
                var ctr = dlgInfo.form.getControl(c);
                
                //Определим текстовое значение, если не заполненно, значит это не наш случай. 
                var text = ctr.value;
                if (!text){
                    continue;
                }

                if (text.indexOf("При проверке модуля обнаружены ошибки!")!=-1){
                    try{
			         //Создадим объект sendkeys и отправим нажатие ENTER
                     //TODO: исправить на нативное нажатие кнопки. 
                        new ActiveXObject("WScript.Shell").SendKeys("{ENTER}");
                        if (notify)
                        {
			             //Создается объект notify для возможности отправить сообщение. 
			             //анализируем параметры системы и версии 1С, для версий выше 8.2.13 пользуемся стандартным сообщением пользователю. 
                          var notifysend = stdlib.require('NotifySend.js').GetNotifySend();
                          var СистемнаяИнформация = v8New("СистемнаяИнформация");
                          var версия = СистемнаяИнформация.ВерсияПриложения;
                          if (версия.indexOf("8.2.13")==-1){
                              notifysend.provider = notifysend.initprovider("Встроенный1С");
                          }
                          notifysend.Error("Сохраняем ", "При сохранении есть ошибки \n имей ввиду", 3);
                          notify = false;
                          stdlib.setTimeout(function () {
                              notify = true;
                          }, 3000);
                        }
                    } catch (e){
                };
                return
                }
            }
       }
    }
}

// # DebugSilence
// 
// Во время активной разработки очень часто приходится перезапускать предприятие, открытое в режиме отладки 
// при этом каждый раз от пользователя ждут различных действий, таких как подтверждение перезапуска предприятия и подтверждения обновления базы данных. По факту получается для перезаска отладки неоходимо нажать F5 , потом ответить утвердительно на вопрос "Перезапустить предприятие", и снова ответь на вопрос "Обнвоить ли базу данных!". 
// Если посчитать сколько в день приходиться нажимать F5 потом enter, enter, то в итоге родился такой скрипт, который анализирует текущее состояние базы (отличаются конфигурации), при этом у нас включен режим отладки - значит мы в режиме отладки что-то подправили и теперь пытаемся перезапустить предприяте.
DebugModeHelper = stdlib.Class.extend({

    settingsRootPath : 'sillenceDebugModeHelper',
    defaultSettings : {
            use: false
    },

    construct : function () {    
        DebugModeHelper._instance = this;
        
        this.settings = SettingsManagement.CreateManager(this.settingsRootPath, this.defaultSettings);
        this.loadSettings();
        //events.connect(windows, "onDoModal", this);
        //stdcommands.CDebug.Start.addHandler(this, "onRestartDebug");
        this.first = false;
    },

    loadSettings:function(){
        this.settings.LoadSettings();
        if(!this.settings.current.use)
            this.settings.current.use = false;

        if (this.settings.current.use==true){
            stdcommands.CDebug.Start.addHandler(this, "onRestartDebug");
        } else {
            try{
                stdcommands.CDebug.Start.delHandler(this, "onRestartDebug");
            } catch (e) {}
             try{
                events.disconnect(windows, "onDoModal", this, "onDoModalRestart");
            } catch (e) {}

        }

    },

    changeSettings : function(){

        var values = v8New('СписокЗначений');
        values.add("on", "Включить перехват");
        values.add("off", "Выключить перехват");

        var name = "Перехват вопросов о перезапуске, сейчас "+ ((this.settings.use == true) ? " включен": " выключен");
        var dlg = new SelectValueDialog(name, values);
         if (dlg.selectValue()) {
             if (dlg.selectedValue=="on") {
                this.settings.current.use = true;
            } else if (dlg.selectedValue == "off") {
                this.settings.current.use = false;
            }
        }

        this.settings.SaveSettings();
        this.loadSettings();
    },

     //Перехватим событие о старте отладки . 
     onRestartDebug:function(cmd){
        if (!this.settings.current.use) {
            return;
        }
        if(cmd.isBefore)
        {   
            if (stdlib.isConfigsDifferent() && this.isDebugEnabled()){
                this.first = false;
                events.connect(windows, "onDoModal", this, "onDoModalRestart");    
            }
        }  else {
            try{
                events.disconnect(windows, "onDoModal", this, "onDoModalRestart");
            } catch (e) {}
        }
    },
    
    
    // Определим находимся ли в режиме отладки или нет. 
    isDebugEnabled:function()
    {
        // Команда "Перезапустить " неактивна - значит, мы не в режиме отладки.
        var state = stdcommands.CDebug.Restart.getState()
        return state && state.enabled
    },


    onDoModalRestart:function(dlgInfo){
        
        if(dlgInfo.caption == "Конфигуратор" && dlgInfo.stage == afterInitial)
        {
            try{
                var text = dlgInfo.form.getControl(0).value;
                if (text == "Приложение запущено. Перезапустить?") {
                    if (stdlib.isConfigsDifferent()){
                        this.first = true;
                        dlgInfo.form.sendEvent(dlgInfo.form.getControl(2).id, 0);
                    }
                } else if(text == "Редактируемая конфигурация отличается от конфигурации базы данных.\nОбновить конфигурацию базы данных?" && this.first) {
                    this.first = false;
                    dlgInfo.form.sendEvent(dlgInfo.form.getControl(2).id, 0);
                }
            } catch (e){
                logger.debug(e.description);

            };
        }
    }
})

function GetDebugModeHelper() {
    if (!DebugModeHelper._instance)
        new DebugModeHelper();
    return DebugModeHelper._instance;
}


// ### Инициализия класса . 
//
//  Для отключения, достаточно только закомментировать данную строкоу.  
// TODO: добавить включение, выключение данного поведения. 
var dbg = GetDebugModeHelper();

SelfScript.self['macrosВкл/выкл вопросов при перезапуске во время отладки'] = function(){
    dbg.changeSettings();
    return true;

}
