|
| 1 | +//engine: JScript |
| 2 | +//uname: Autosave |
| 3 | +//dname: Автосохранение |
| 4 | +//author: Синиченко Александр <[email protected]> |
| 5 | +//descr: При изменении текста модуля, сохраняет текст в файл и позволяет восстанавливить этот текст в случае падения платформы. |
| 6 | +//help: inplace |
| 7 | +//addin: global |
| 8 | +//addin: stdlib |
| 9 | +//addin: stdcommands |
| 10 | + |
| 11 | +stdlib.require("TextWindow.js", SelfScript); |
| 12 | +stdlib.require("SettingsManagement.js", SelfScript); |
| 13 | + |
| 14 | +global.connectGlobals(SelfScript); |
| 15 | + |
| 16 | +var ФормаНастроек; |
| 17 | + |
| 18 | +var ИмяКаталогаБазы = ""; |
| 19 | +var КаталогСохранения = ""; |
| 20 | +var cfgName = metadata.current.rootObject; |
| 21 | +var lastText = ""; |
| 22 | +var timerId = null; |
| 23 | +var TxtDoc = v8New("ТекстовыйДокумент"); |
| 24 | +var currentModule = null; |
| 25 | + |
| 26 | +// Настроки сохранения модулей определяем одни для всех баз |
| 27 | +var settings = SettingsManagement.CreateManager('Autosave', { 'КаталогСохранения': '', 'ИнтервалСохранения': 500 }); |
| 28 | + |
| 29 | +// Инициализация |
| 30 | +settings.LoadSettings(); |
| 31 | +init(); |
| 32 | + |
| 33 | +function init(){ |
| 34 | + |
| 35 | + var строкаИБ = СтрокаСоединенияИнформационнойБазы(); |
| 36 | + if (СтрНайти(строкаИБ.toLowerCase(), "file") > 0){ |
| 37 | + var Путь = НСтр(строкаИБ, "File"); |
| 38 | + var МассивСтрок = СтрРазделить(Путь, "\\"); |
| 39 | + ИмяКаталогаБазы = МассивСтрок.Получить(МассивСтрок.Количество()-1); |
| 40 | + } else { |
| 41 | + var МассивСтрок = СтрРазделить(НСтр(строкаИБ, "Srvr"), ":"); |
| 42 | + var ИмяСервера = МассивСтрок.Получить(0); |
| 43 | + var ИмяБазы = НСтр(строкаИБ, "Ref"); |
| 44 | + ИмяКаталогаБазы = ИмяСервера + "_" + ИмяБазы; |
| 45 | + } |
| 46 | + |
| 47 | + if (settings.current.КаталогСохранения == ''){ |
| 48 | + Сообщить("Не заданы настройки автосохранения! Необходимо произвести настройку перед началом работы."); |
| 49 | + openFormSettings(); |
| 50 | + } else { |
| 51 | + КаталогСохранения = settings.current.КаталогСохранения + "\\" + ИмяКаталогаБазы + "\\"; |
| 52 | + var НайденныеФайлы = НайтиФайлы(КаталогСохранения, "*", true); |
| 53 | + |
| 54 | + // Было падение, остались сохраненные файлы |
| 55 | + if (НайденныеФайлы.Количество() > 1) { |
| 56 | + |
| 57 | + var now = new Date(); |
| 58 | + var formatedDate = now.getDate() + "-" + now.getMonth() + "-" + now.getFullYear() + "_" + now.getHours() + "-" + now.getMinutes() + "-" + now.getSeconds(); |
| 59 | + var fs = new ActiveXObject("Scripting.FileSystemObject"); |
| 60 | + var КаталогОбъект = fs.GetFolder(КаталогСохранения); |
| 61 | + try{ |
| 62 | + КаталогОбъект.Name = ИмяКаталогаБазы + "_bkp_" + formatedDate; |
| 63 | + } catch (e) { |
| 64 | + Сообщить("Не удалось переимновать каталог сохранения в резервный, возможно он уже открыт! Работа автосохранения приостановлена чтобы не потерять данные."); |
| 65 | + Сообщить("Для возобновления работы автосохранения, откройте форму настроек Автосохранения и нажмите ОК, перезагрузите скрипт или перезапустите конфигуратор."); |
| 66 | + return; |
| 67 | + } |
| 68 | + ЗапуститьПриложение(settings.current.КаталогСохранения + "\\" + КаталогОбъект.Name); |
| 69 | + Сообщить("Найдены резервные файлы предыдущей несохраненной сессии! Каталог с резервными файлами был открыт!"); |
| 70 | + } |
| 71 | + |
| 72 | + try{ |
| 73 | + СоздатьКаталог(КаталогСохранения); |
| 74 | + СоздатьКаталог(КаталогСохранения + "Прочее"); |
| 75 | + } catch (e) { |
| 76 | + Сообщить("Не корректно заданы настройки автосохранения! Необходимо произвести настройку перед началом работы."); |
| 77 | + openFormSettings(); |
| 78 | + return; |
| 79 | + } |
| 80 | + |
| 81 | + events.connect(metadata, "MetaDataEvent", SelfScript.self, "OnMetaDataEvent"); |
| 82 | + timerId = createTimer(settings.current.ИнтервалСохранения, SelfScript.self, "AutoSaveModule"); |
| 83 | + } |
| 84 | +} |
| 85 | + |
| 86 | +stdlib.createMacros(SelfScript.self, "Открыть каталог сохранения", "Открывает каталог с сохраненными модулями", stdcommands.Frame.FileOpen.info.picture, function(){ |
| 87 | + |
| 88 | + if (settings.current.КаталогСохранения == ''){ |
| 89 | + return; |
| 90 | + } |
| 91 | + |
| 92 | + ЗапуститьПриложение(КаталогСохранения); |
| 93 | + |
| 94 | +}); |
| 95 | + |
| 96 | +stdlib.createMacros(SelfScript.self, "Настройка", "Открывает форму с настройками скрипта", stdcommands.CfgStore.OpenCfgStoreAdmin.info.picture, function(){ |
| 97 | + |
| 98 | + openFormSettings(); |
| 99 | + |
| 100 | +}); |
| 101 | + |
| 102 | +// События |
| 103 | +function OnMetaDataEvent(mdp) { |
| 104 | + |
| 105 | + // Сохранение |
| 106 | + if (mdp.kind == 6 || mdp.kind == 5) { |
| 107 | + if (mdp.obj.container == metadata.current){ |
| 108 | + // Сохранили конфигурацию |
| 109 | + var НайденныеФайлы = НайтиФайлы(КаталогСохранения, "*"); |
| 110 | + |
| 111 | + for(var i = 0; i < НайденныеФайлы.Количество(); i++){ |
| 112 | + var Файл = НайденныеФайлы.Получить(i); |
| 113 | + if (!Файл.ЭтоКаталог()) { |
| 114 | + УдалитьФайлы(НайденныеФайлы.Получить(i).ПолноеИмя); |
| 115 | + } |
| 116 | + } |
| 117 | + } else { |
| 118 | + // Сохранили что-то еще |
| 119 | + //var ИмяОбъекта = mdp.container.rootObject.name + "_" + txtWindow.textWindow.mdProp.name(1); |
| 120 | + var fileName = mdp.container.rootObject.name + "_"; |
| 121 | + var НайденныеФайлы = НайтиФайлы(КаталогСохранения, "Прочее\\" + fileName + "*"); |
| 122 | + |
| 123 | + for(var i = 0; i < НайденныеФайлы.Количество(); i++){ |
| 124 | + var Файл = НайденныеФайлы.Получить(i); |
| 125 | + if (!Файл.ЭтоКаталог()) { |
| 126 | + УдалитьФайлы(НайденныеФайлы.Получить(i).ПолноеИмя); |
| 127 | + } |
| 128 | + } |
| 129 | + } |
| 130 | + |
| 131 | + } |
| 132 | + |
| 133 | +} |
| 134 | + |
| 135 | +// Прочее |
| 136 | +function loadForm(){ |
| 137 | + |
| 138 | + if (!ФормаНастроек) |
| 139 | + ФормаНастроек = loadScriptFormEpf(SelfScript.fullPath.replace(/js$/i, "epf"), "Настройка", SelfScript.self); |
| 140 | + |
| 141 | +} |
| 142 | + |
| 143 | +function openFormSettings(){ |
| 144 | + |
| 145 | + loadForm(); |
| 146 | + ФормаНастроек.Open(); |
| 147 | + |
| 148 | +} |
| 149 | + |
| 150 | +function ПриОткрытии(){ |
| 151 | + |
| 152 | + ФормаНастроек.КаталогСохранения = settings.current.КаталогСохранения; |
| 153 | + ФормаНастроек.ИнтервалСохранения = settings.current.ИнтервалСохранения; |
| 154 | + |
| 155 | +} |
| 156 | + |
| 157 | +function КаталогСохраненияНачалоВыбора(Элемент, СтандартнаяОбработка){ |
| 158 | + |
| 159 | + var ВыборКаталога = v8New("FileDialog", РежимДиалогаВыбораФайла.ВыборКаталога); |
| 160 | + ВыборКаталога.Каталог = ФормаНастроек.КаталогСохранения; |
| 161 | + ВыборКаталога.Заголовок = "Укажите расположение каталога сохранения модулей"; |
| 162 | + if (!ВыборКаталога.Выбрать()) |
| 163 | + return; |
| 164 | + |
| 165 | + ФормаНастроек.КаталогСохранения = ВыборКаталога.Каталог; |
| 166 | +} |
| 167 | + |
| 168 | +function КнопкаОК(Кнопка){ |
| 169 | + |
| 170 | + settings.current.КаталогСохранения = ФормаНастроек.КаталогСохранения; |
| 171 | + settings.current.ИнтервалСохранения = ФормаНастроек.ИнтервалСохранения; |
| 172 | + settings.SaveSettings(); |
| 173 | + |
| 174 | + if(timerId){ |
| 175 | + killTimer(timerId); |
| 176 | + } |
| 177 | + |
| 178 | + КаталогСохранения = settings.current.КаталогСохранения + "\\" + ИмяКаталогаБазы + "\\"; |
| 179 | + СоздатьКаталог(КаталогСохранения); |
| 180 | + СоздатьКаталог(КаталогСохранения + "Прочее"); |
| 181 | + |
| 182 | + |
| 183 | + if (settings.current.КаталогСохранения != '' && settings.current.ИнтервалСохранения > 0){ |
| 184 | + timerId = createTimer(settings.current.ИнтервалСохранения, SelfScript.self, "AutoSaveModule"); |
| 185 | + } |
| 186 | + ФормаНастроек.Закрыть(); |
| 187 | +} |
| 188 | + |
| 189 | +function AutoSaveModule(){ |
| 190 | + |
| 191 | + txtWindow = GetTextWindow(); |
| 192 | + if (!txtWindow || txtWindow.textWindow.readOnly || !txtWindow.textWindow.mdCont || !txtWindow.textWindow.mdCont.isModified || lastText == txtWindow.textWindow.text){ |
| 193 | + return; |
| 194 | + } |
| 195 | + |
| 196 | + if (lastText == ""){ |
| 197 | + lastText = txtWindow.textWindow.text; |
| 198 | + return; |
| 199 | + } |
| 200 | + |
| 201 | + lastText = txtWindow.textWindow.text; |
| 202 | + |
| 203 | + // Это объект конфигурации |
| 204 | + if (txtWindow.textWindow.mdObj.container == metadata.current){ |
| 205 | + var metadataName = txtWindow._view.title; |
| 206 | + metadataName = replaceAll(metadataName, " ", "_"); |
| 207 | + metadataName = replaceAll(metadataName, ":", "_"); |
| 208 | + var fileName = КаталогСохранения + metadataName + ".txt"; |
| 209 | + } |
| 210 | + // Что-то еще |
| 211 | + else { |
| 212 | + var Файл = v8New("Файл", txtWindow.textWindow.mdCont.identifier); |
| 213 | + if(!Файл.Существует()) |
| 214 | + var ИмяОбъекта = txtWindow.textWindow.mdCont.rootObject.name + "_" + txtWindow.textWindow.mdProp.name(1); |
| 215 | + else |
| 216 | + var ИмяОбъекта = Файл.Имя; |
| 217 | + |
| 218 | + var fileName = КаталогСохранения + "Прочее\\" + replaceAll(ИмяОбъекта, ".", "_") + ".txt"; |
| 219 | + } |
| 220 | + |
| 221 | + try{ |
| 222 | + TxtDoc.УстановитьТекст(lastText); |
| 223 | + TxtDoc.Записать(fileName); |
| 224 | + } catch (e) { |
| 225 | + Сообщить("Не удалось сохранить резервную копию модуля, возможно отсутствуют права на запись в каталог резервных копий!"); |
| 226 | + } |
| 227 | +} |
| 228 | + |
| 229 | +function escapeRegExp(string) { |
| 230 | + return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); |
| 231 | +} |
| 232 | + |
| 233 | +function replaceAll(str, find, replace) { |
| 234 | + return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); |
| 235 | +} |
| 236 | + |
| 237 | +// "Заготовка" на будущее |
| 238 | +//events.connect(Designer, "onChangeTextManager", SelfScript.Self); |
| 239 | +/* |
| 240 | +function onChangeTextManager(p1, p2, p3){ |
| 241 | + |
| 242 | + // TODO: Сюда переедет функция AutoSaveModule() после того как починят работу initTextAreaModifiedTraps() |
| 243 | + // и он перестанет ронять снегопат при удалении символов # |
| 244 | + |
| 245 | +} |
| 246 | +*/ |
0 commit comments