Skip to content

Commit d0b071d

Browse files
Nytlencorefkov
authored andcommitted
Новый скрипт Автосохранения текстов модулей
Новый скрипт Автосохранения текстов модулей. Сохраняет редактируемые модули в текстовые файлы. Если платформа упала и модули не были сохранены должным образом - позволяет восстановить тексты утраченных отредактированных модулей.
1 parent 43ace84 commit d0b071d

File tree

2 files changed

+246
-0
lines changed

2 files changed

+246
-0
lines changed

addins/Autosave.epf

6.97 KB
Binary file not shown.

addins/Autosave.js

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
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

Comments
 (0)