1 (изменено: Dementor, 2019-01-18 16:45:25)

Тема: Frontol (JS ActiveXObject)

Добрый день.

Frontol - это кассовое ПО.
Он поддерживает сценарии, они пишутся на обрезанном JS, в основном работа через ActiveXObject.
Не все от JS и ActiveXObject поддерживается, но все же лучше, чем ничего.

Задача - подключиться к фтп и проверить наличие файла.
Скрипт отрабатывает отлично, кроме того, что не разрывает сессию с фтп.
Подключаюсь так

ftp = new ActiveXObject("Msxml2.XMLHTTP");
ftp.open('GET',ftp://user:pass@adress/1.txt,false);
ftp.send();

Мб кто подскажет, как отключиться от фтп?
Сам фтп понимает команду "bye" и разорвет соединение, вот как ему передать эту команду для меня пока вопрос.

2

Re: Frontol (JS ActiveXObject)

Dementor, вообще сервер должен и так «рвать» соединение по неактивности. Вам это не подходит?

А так:
VBScript: работа с протоколом FTP с помощью компонента Chilkat FTP (Страница 1) — Windows Script Host, HTA (VBScript, JScript) — Коллекция скриптов и идей — Серый форум
HTA: OstroSoft Winsock Component (Страница 1) — Windows Script Host, HTA (VBScript, JScript) — Коллекция скриптов и идей — Серый форум

3 (изменено: Dementor, 2019-01-18 19:42:38)

Re: Frontol (JS ActiveXObject)

alexii Он рвет, через 600 секунд простоя, сервер filezila.
Cкрипт выполняется при каждом чеке.
За 600 секунд можно поймать очень много сессий: касса не одна - получается большая проблема.
Этот скрипт мы видели, нельзя подключить внешнюю компоненту "ChilkatFTP".

4

Re: Frontol (JS ActiveXObject)

Dementor, предполагаю, что у Вас не выгружается среда исполнения скрипта. Из-за этого объект остаётся в памяти и не рвёт соединение.
Сейчас проверил на своём тестовом сервере. Тоже поднял FileZilla Server. Как только скрипт завершается, соединение тут же рвётся. Можете проверить из WSH.


var ftp = new ActiveXObject('Msxml2.XMLHTTP');
ftp.open('GET','ftp://user:debugit@212.48.39.8/1.txt',false);
ftp.send();
ftp.abort();
ftp = null;
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5 (изменено: Dementor, 2019-01-19 01:52:09)

Re: Frontol (JS ActiveXObject)

Xameleon abort() пробовал, но сходу не скажу с "ftp." или без, останавливал выполнение всего скрипта.
Весь скрипт к сожалению выложить не могу.
а вот "ftp = null" свежая идея, в понедельник попробую, стенд с фронтолом на работе, спасибо за идею.

6 (изменено: Dementor, 2019-01-21 12:35:23)

Re: Frontol (JS ActiveXObject)

Решили вопрос с другой стороны, перенастроили файлзилу
Не помогло

ftp.abort();
ftp = null;

7

Re: Frontol (JS ActiveXObject)

А что мешает проверять существование файла через FileExists ?


if(fso.FileExists(filePath)){
...
}
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8 (изменено: Dementor, 2019-01-21 12:34:46)

Re: Frontol (JS ActiveXObject)

Xameleon пишет:

А что мешает проверять существование файла через FileExists ?


if(fso.FileExists(filePath)){
...
}

А разве прокатит по фтп?
Он же вроде только с путями самбы работает

9

Re: Frontol (JS ActiveXObject)

Не не не. Я про исходный файл ftp.txt
У Вас же было написано

 f = fso.OpenTextFile(fileName, 1); //Эта функция может сгенерировать исключение, если файл не существует

Я к тому, что этого исключения можно избежать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

10 (изменено: Dementor, 2019-01-21 12:39:31)

Re: Frontol (JS ActiveXObject)

Xameleon пишет:

Не не не. Я про исходный файл ftp.txt

Xameleon Это взял из примера разработчиков Frontol, у них код выглядел так:

Пример обработки исключений в сценарии
function readFile() {
	fileName = "c:\\script.txt";
	try // Начало блока, в котором ожидается возникновение исключений
	{
		fso = new ActiveXObject("Scripting.FileSystemObject");
		f = fso.OpenTextFile(fileName, 1); //Эта функция может сгенерировать
		//исключение, например, если файл не существует
		while (!f.AtEndOfStream) {
			line = f.ReadLine(); //Также может сгенерировать исключение
			if (isNaN(line))
				frontol.actions.showError("Файл содержит некорректное значение '" + line + "'.");
			// ... Дальнейшая обработка строки файла ...
		}
		f.Close();
	} catch (e) //Начало блока обработки исключений
	{
		if (e.message == "") //Выполнение прервано вызовом frontol.actions.cancel
		//или frontol.actions.showError
		{
			f.Close();
			throw e; //Чтобы Frontol обработал исключение, сгенерированное вызовом
			// frontol.actions.cancel или frontol.actions.showError в блоке try, оно передается дальше.
		} else
			switch (e.number) //Анализ кода ошибки системных исключений
		{
			case -2146828218:
				frontol.actions.showError("Проверьте разрешения для файла " + fileName + ".");
				break;
			case -2146828235:
				frontol.actions.showError("Файл " + fileName + " не найден.");
				break;
			default:
				frontol.actions.showError("Неизвестная ошибка: " + e.number + " " + e.message);
		}
	}
}

Вроде мой вариант работает

11

Re: Frontol (JS ActiveXObject)

Dementor
1) Постарайтесь, пожалуйста, форматировать код при постинге, а то читать линейную портянку очень неудобно.
Для этих целей можно использовать даже online сервисы. Например: www.freeformatter.com
2) Да, вижу их подход. Но по мне - лучше предотвратить ошибку, чем обрабатывать исключение, но хотя и такой подход как у них - имеет место быть.
3) Если смотреть тот, пример, который Вы выложили изначально, то у Вас там нет обработки происходящих исключений при недоступности файлов.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

12 (изменено: Dementor, 2019-01-21 13:17:50)

Re: Frontol (JS ActiveXObject)

Xameleon при отсутствии ftp.txt останавливается выполнение скрипта и frontol выдает ошибку
последний вариант кода у вас в личке

13

Re: Frontol (JS ActiveXObject)

Dementor, так ведь логично.

У вас кусок кода, где происходит исключение не взят в try {...} catch(e) {...}


f = fso.OpenTextFile(fileName, 1);
//Эта функция может сгенерировать исключение, если файл не существует
			while (!f.AtEndOfStream) {
				line = f.ReadLine();
				//Также может сгенерировать исключение
				if (isNaN(line)) {};
			}

// Вот так.


	try {
		f = fso.OpenTextFile(fileName, 1);
		//Эта функция может сгенерировать исключение, если файл не существует
		while (!f.AtEndOfStream) {
			line = f.ReadLine();
			//Также может сгенерировать исключение
			if (isNaN(line)) {};
		}
	} catch(e){
		//...
	}

Поэтому исключение останавливает выполнение кода.

Либо, как я уже говорил, можно проверить существование файла перед его открытием через fso.FileExists.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14 (изменено: Dementor, 2019-01-21 13:43:05)

Re: Frontol (JS ActiveXObject)

Поэтому исключение останавливает выполнение кода.

Так это хорошо, значит накосячили, значит магазин пнет либо админа, либо техподдержку
А так скрипт просто не сработает и все

15

Re: Frontol (JS ActiveXObject)

Dementor, ну по хорошему - наверное стоит обработать исключение и выдать сообщение клиенту, как это сделано в примере разработчиков.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16 (изменено: Dementor, 2019-01-21 15:21:35)

Re: Frontol (JS ActiveXObject)

Xameleon пишет:

Dementor, ну по хорошему - наверное стоит обработать исключение и выдать сообщение клиенту, как это сделано в примере разработчиков.

Мб вы и правы, начал пробовать вывести свой варнинг кассиру с помощью вашего кода, ругается

Post's attachments

555.jpg
555.jpg 16.01 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

17

Re: Frontol (JS ActiveXObject)

Ещё раз внимательно поизучал Ваш код.

1) Обратил внимание на то, что Вы объявляете переменные fso, ftp, f как глобальные, потому что не ставите var перед ними. Т.е они создаются не в пределах процедуры init и даже не в afterOpenDocument, а на самом глобальном уровне. Учитывая, что Frontol, видимо не выгружает среду исполнения скриптов, как я и говорил ранее, то по этой причине вы и получаете зависшие сессии, потому что эти переменные остаются в памяти. Если же сделать их объявление внутри процедуры, то они автоматически очистятся при её завершении.

2) Я бы начал вот с такого кода. К сожалению, писал без проверки, так как frontol-а пока под руками нет.


// Полифил функции удаления лишних пробелов из строки
if (!String.prototype.trim) {
  (function() {
    // Вырезаем BOM и неразрывный пробел
    String.prototype.trim = function() {
      return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
    };
  })();
}

// функция init() является основной и служит для привязки событий к обработчикам
function init() {
	//установка обработчика для события, срабатывающего после открытия документа
	frontol.addEventListener("openDocument", "afterOpenDocument", false); 
}

function afterOpenDocument() {
	// Путь до файла списка загрузок
	var fileName = "d:\\ftp.txt",
		//создаем объект считывания из фаила параметров подключения ftp
		fso = new ActiveXObject("Scripting.FileSystemObject"),
		// Создание объекта для загрузки данных с FTP
		ftp = new ActiveXObject("Msxml2.XMLHTTP");
	
	if(!fso.FileExists(fileName)) throw new Error('Файл списка загрузок не найден !')

	// Открытие файла
	var ts = fso.OpenTextFile(fileName,1),
		line = '';
		
	// Построчное чтение файла
	while(!ts.AtEndOfStream){
		// Считывание строки и удаление из неё пробелов и табуляций по краям текста
		line = ts.ReadLine().trim();
		// Если в строке хоть что-то есть, то пробуем использовать её как адрес
		if(line.trim() != ''){
			ftp.open('GET',line,false);
			ftp.send();
			// Действия с файлом - ftp.responseBody
		}
	}
}

3) В этот код в дальнейшем надо добавить обработчик ошибки если пользователь нажал на Cancel. Но надо понять, что сейчас скрипт будет сообщать, если этого обработчика пока нет.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

18

Re: Frontol (JS ActiveXObject)

И снова исправил. Обновляем.


// Полифил функции удаления лишних пробелов из строки
if (!String.prototype.trim) {
	(function() {
		// Вырезаем BOM и неразрывный пробел
		String.prototype.trim = function() {
			return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
		};
	})();
}

// функция init() является основной и служит для привязки событий к обработчикам
function init() {
	//установка обработчика для события, срабатывающего после открытия документа
	frontol.addEventListener("openDocument", "afterOpenDocument", false); 
}

// Событие открытия документа
function afterOpenDocument() {
	// Путь до файла списка загрузок
	var fileName = "d:\\ftp.txt"
		//создаем объект считывания из фаила параметров подключения ftp
		,fso = new ActiveXObject("Scripting.FileSystemObject")
		// Создание объекта для загрузки данных с FTP
		,ftp = new ActiveXObject("Msxml2.XMLHTTP");
	
	if(!fso.FileExists(fileName)) {
		return frontol.actions.showError('Файл списка загрузок "' + fileName + '" не найден !');
	}
	// Открытие файла
	var ts = fso.OpenTextFile(fileName,1)
		,line = '';
		
	// Построчное чтение файла
	while(!ts.AtEndOfStream){
		// Считывание строки и удаление из неё пробелов и табуляций по краям текста
		line = ts.ReadLine().trim();
		// Если в строке хоть что-то есть, то пробуем использовать её как адрес
		if(line.trim() != ''){
			ftp.open('GET',line,false);
			try {
				ftp.send();
				// Действия с файлом - ftp.responseBody
			} catch(e){
				return frontol.actions.showError('Не удалось загрузить файл "' + line + '"');
			}
		}
	}
}

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

19 (изменено: Dementor, 2019-01-21 16:37:54)

Re: Frontol (JS ActiveXObject)

Xameleon
Заработал на уровне функциональности изначального скрипта, но:
- если файл на фтп есть - не выдает сообщения.
- если файла нет - сообщение выдается.
Должно быть наоборот, если файл есть - значит фронтолу нужно грузить данные, значит выдать ошибку кассиру что бы не трогал кассу.
----------------------
Мы сейчас пришли к той же ситуации, что была и у нас:
- если файл есть на фтп, то сессия одна.
- если файла нет на фтп, то сессии плодятся.

20

Re: Frontol (JS ActiveXObject)

Dementor, прекрасно, а что делать с загружаемыми данными то ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

21 (изменено: Dementor, 2019-01-21 16:49:43)

Re: Frontol (JS ActiveXObject)

Xameleon
Попробую расписать подробнее.
Есть программа товароучет, она делает выгрузку со всеми справочниками, товарами, ценами и т.д.
Она выгружает файл import5.txt, далее как файл готов создает пустой файл-флаг загрузки import5.upd
Как только фронтол видит файл-флаг загрузки, он своими средствами начинает качать файл, и после сделает обновление справочников.
После окончания загрузки фронтол удалит import5.upd
Но т.к. кассиры "слепые" и не смотрят на фронтол, то задача при наличии import5.upd выдавать им ошибку, что бы смотрели.
Сейчас для простоты файл назван 1.txt
import5.upd есть - показать кассиру ошибку.
import5.upd нет - не показывать ошибку, все хорошо.
По факту, это костыль, что бы кассиры не смогли торговать, пока идет загрузка данных

22

Re: Frontol (JS ActiveXObject)

Dementor, написал Вам на почту

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !