Поиск статьи в Базе знаний
Как перенести и установить скрипт мессенджера КОРП на сервер
1.Установить web-сервер. Web-сервер — это программа, которая предназначена для обработки запросов к сайтам и отправки пользователям страниц веб-сайтов.
2. Разместить на web-сервере скрипт js клиенской части мессенджера
3. Прописать в 1С путь к скрипту мессенджера (см. скрин).
4. Установить node js. Node.js® — это JavaScript-окружение построенное на движке Chrome V8.
5. Сделать службу из node-js скрипта.
6. Открыть порт 3484

Скрипты:
main.js
mes-srv.js
2. Разместить на web-сервере скрипт js клиенской части мессенджера
3. Прописать в 1С путь к скрипту мессенджера (см. скрин).
4. Установить node js. Node.js® — это JavaScript-окружение построенное на движке Chrome V8.
5. Сделать службу из node-js скрипта.
6. Открыть порт 3484

Скрипты:
main.js
//developertment
//alert('Внимание! Мессенджер находится на beta тестировании.');
//developertment
var externalForm = null;
var windowHeight = document.documentElement.clientHeight;
var dataWasSand = false;
try {
var socket = new WebSocket("ws://zakupki.enter-it.ru:3484");
socket.onmessage = function(event) {
var incomingMessage = event.data;
if (incomingMessage[0] == '@') {
if (incomingMessage == '@RequestForSubmission') {
var TimeToStartWaitiong = performance.now() + 10000;
do {
try {
externalForm.ОтправитьДанныеДляСозданияОбсуждения();
} catch (ex) {
if (externalForm != null) {
alert('Ошибка выполнения сценария: ' + ex.message);
}
}
if (performance.now() > TimeToStartWaitiong) {
alert('Инициализация мессенджера длится дольше, чем обычно. Возможно, на загрузку вложений потребуется больше времени. Нажмите ОК, для продолжения.');
externalForm.ОтправитьДанныеДляСозданияОбсуждения();
}
}
while (externalForm == null)
} else if (incomingMessage.substring(0, 14) == '@InformNewUser') {
UserData = JSON.parse(incomingMessage.replace('@InformNewUser', ''));
AddNewClient(UserData.UserIcon, UserData.UserName, UserData.UserID);
} else if (incomingMessage.substring(0, 14) == '@InformDelUser') {
UserData = JSON.parse(incomingMessage.replace('@InformDelUser', ''));
DellClient(UserData.UserID);
}
} else {
showMessage(incomingMessage);
}
};
} catch (ex) {
alert(ex.message);
}
function CloseConnection() {
socket.close();
}
// показать сообщение в div#subscribe
function showMessage(message) {
OBJ_Message = JSON.parse(message);
var mess_main = document.createElement('table');
mess_main.className = 'mess_main';
mess_main.setAttribute('mess_stat', 'new');
var TR_Main = document.createElement('tr');
mess_main.appendChild(TR_Main);
var mess_logo = document.createElement('th');
mess_logo.className = 'mess_logo';
TR_Main.appendChild(mess_logo);
var mess_logoImage = document.createElement('img')
mess_logoImage.className = 'mess_logoImage';
mess_logoImage.src = OBJ_Message.UserLogo;
mess_logo.appendChild(mess_logoImage);
var mess_content = document.createElement('th');
mess_content.className = 'mess_content';
TR_Main.appendChild(mess_content);
var div_mainTH = document.createElement('div');
mess_content.appendChild(div_mainTH);
var div_mainTH_header = document.createElement('div');
div_mainTH.appendChild(div_mainTH_header);
var mess_headName = document.createElement('p');
mess_headName.className = 'mess_headName';
mess_headName.appendChild(document.createTextNode(' ' + OBJ_Message.User + ' '));
div_mainTH_header.appendChild(mess_headName);
var mess_headTime = document.createElement('p');
mess_headTime.className = 'mess_headTime';
mess_headTime.appendChild(document.createTextNode(' ' + OBJ_Message.DateTime + ' '));
div_mainTH_header.appendChild(mess_headTime);
var mess_textMessage = document.createElement('div');
mess_textMessage.className = 'mess_textMessage';
mess_textMessage.appendChild(document.createTextNode(OBJ_Message.TextMessage))
div_mainTH.appendChild(mess_textMessage);
if (OBJ_Message.attach == 'uri_1C' || OBJ_Message.attach == 'uri_file'){
var Uri_contrl = document.createElement('p');
var Uri_contrl_but = document.createElement('attach');
Uri_contrl.appendChild(Uri_contrl_but);
Uri_contrl_but.appendChild(document.createTextNode(OBJ_Message.attachDescription));
Uri_contrl_but.setAttribute('attachFile', OBJ_Message.attachValue);
if(OBJ_Message.attach == 'uri_1C'){
Uri_contrl_but.setAttribute('onclick', 'openThisObject(this)');
} else{
Uri_contrl_but.setAttribute('onclick', 'opneThisFile(this)');
}
Uri_contrl_but.className = 'attachedFile';
mess_textMessage.appendChild(Uri_contrl);
} else if (OBJ_Message.attach == 'uri_img')
{
mess_textMessage.innerHTML = mess_textMessage.textContent + '<p><img src="' + OBJ_Message.attachValue + '"></p>';
}
document.getElementById('main_body').appendChild(mess_main);
ScrollChatToButtom();
showVisible();
}
function AddNewClient(UserIcon, UserName, UserID) {
var NewClient = document.createElement('img');
NewClient.id = UserID;
NewClient.src = UserIcon;
NewClient.alt = UserName;
NewClient.className = 'OnLineUser';
var OnLineClientsDiv = document.getElementById('OnLineUsers');
OnLineClientsDiv.appendChild(NewClient);
}
function DellClient(UserID) {
var OnLineClientsDiv = document.getElementById('OnLineUsers');
var DelUser = document.getElementById(UserID);
OnLineClientsDiv.removeChild(DelUser);
}
//Элементы управления диалогом:
function ScrollChatToButtom() {
try {
window.scrollTo(0, getDocumentHeight());
} catch (err) {
alert(err.message);
}
}
function getDocumentHeight() {
return (document.body.scrollHeight > document.body.offsetHeight) ?
document.body.scrollHeight :
document.body.offsetHeight;
}
// Визуализаторы состояния прчтения
function showVisible() {
var _messgaes = document.getElementsByTagName('table');
for (var i = 0; i < _messgaes.length; i++) {
var _message = _messgaes[i];
if (isVisible(_message)) {
_message.style.backgroundColor = '#fff';
if (_message.getAttribute('mess_stat') == 'new') {
externalForm.ОтметитьКомментарииКакПрочитанные();
}
_message.setAttribute('mess_stat', 'readed');
}
}
}
function isVisible(elem) {
var coords = elem.getBoundingClientRect();
// верхняя граница elem в пределах видимости ИЛИ нижняя граница видима
var topVisible = coords.top > 0 && coords.top < windowHeight;
var bottomVisible = coords.bottom < windowHeight && coords.bottom > 0;
return topVisible || bottomVisible;
}
// Вызовый из 1С (команды)
function SendMessageFrom1C(TextMessage) {
socket.send(TextMessage);
return false;
}
function openThisObject(object){
}
function opneThisFile(object){
externalForm.ОткрытьПрикрепленныйФайл(object.getAttribute('attachFile'))
}
setTimeout(showVisible, 2000);
mes-srv.js
var http = require('http');
var Static = require('node-static');
var WebSocketServer = new require('ws');
var ID_MIN = 1;
var ID_MAX = 5000;
function GetRandomID() {
var RandomValue = ID_MIN - 0.5 + Math.random() * (ID_MAX - ID_MIN + 1);
return RandomValue;
}
//Откроем WebSocket-сервер на порту 3484
var webSocketServer = new WebSocketServer.Server({
port: 3484
});
//Описание класса "Куча" - сюда подключаются все клиенты WS, отсюда мы и будем брать WS для отправки
class _Stack {
constructor() {
this.Clients = new Map();
}
Add(ws) {
var _StackClientID = Math.round(GetRandomID());
this.Clients.set(_StackClientID, ws);
return _StackClientID;
}
}
//Описание класса "Дисскуссия" - это объект кторый содержит в себе информацию о предмете дисскуссиии и список всех ее членов
class _Discussion {
constructor(Discussion_ID, Discussion_Description) {
this.Discussion_ID = Discussion_ID;
this.Discussion_Description = Discussion_Description;
this.Clients = new Map();
}
AddClient(Client_ID, ClientData) {
this.Clients.set(Client_ID, ClientData);
}
IsEmpty() {
if (this.Clients.size > 0) {
return false;
} else {
return true;
}
}
}
//Объявим глобальные переменные
var Discussions = new Map();
var Stack = new _Stack();
webSocketServer.on('connection', function(ThisClientWS) {
//Добивим подключившегося клиента в кучу
var ThisClientID = Stack.Add(ThisClientWS);
ThisClientWS.send('@RequestForSubmission');
ThisClientWS.on('message', function(WS_Message) {
try {
OBJ_Message = JSON.parse(WS_Message);
if (OBJ_Message.TypeOf == 'RequestForSubmission') {
if (Discussions.get(OBJ_Message.Discussion_ID) == undefined) {
var Discussion = new _Discussion(OBJ_Message.Discussion_ID, OBJ_Message.Discussion_description);
var ClientData = {};
ClientData['UserName'] = OBJ_Message.UserName;
ClientData['UserIcon'] = OBJ_Message.UserIcon;
ClientData['UserID'] = ThisClientID;
Discussion.AddClient(ThisClientID, ClientData);
Discussions.set(Discussion.Discussion_ID, Discussion);
//Оповестим всех участников дисскуссии о добавлении нового клиента
for (let ClntDsctn_ID of Discussion.Clients.keys()) {
Stack.Clients.get(ClntDsctn_ID).send('@InformNewUser' + JSON.stringify(ClientData));
}
} else {
var Discussion = Discussions.get(OBJ_Message.Discussion_ID);
//Отправим клиенту данные обо всех участниках дисскусссии
if (Discussion.IsEmpty() != true) {
for (let ClntData of Discussion.Clients.values()) {
ThisClientWS.send('@InformNewUser' + JSON.stringify(ClntData));
}
}
var ClientData = {};
ClientData['UserName'] = OBJ_Message.UserName;
ClientData['UserIcon'] = OBJ_Message.UserIcon;
ClientData['UserID'] = ThisClientID;
Discussion.AddClient(ThisClientID, ClientData);
//Оповестим всех участников дисскуссии о добавлении нового клиента
for (let ClntDsctn_ID of Discussion.Clients.keys()) {
Stack.Clients.get(ClntDsctn_ID).send('@InformNewUser' + JSON.stringify(ClientData));
}
}
} else if (OBJ_Message.TypeOf == 'TextMessage') {
var Discussion = Discussions.get(OBJ_Message.Discussion_ID);
for (let ClntDsctn_ID of Discussion.Clients.keys()) {
Stack.Clients.get(ClntDsctn_ID).send(WS_Message);
}
}
} catch (ex) {
console.log('ОШИБКА!=' + ex.message);
}
});
ThisClientWS.on('close', function() {
Stack.Clients.delete(ThisClientID);
for (let Dsctn of Discussions.values()) {
if (Dsctn.Clients.get(ThisClientID) != undefined) {
ClientData = Dsctn.Clients.get(ThisClientID);
Dsctn.Clients.delete(ThisClientID);
}
if (Dsctn.IsEmpty() == true) {
Discussions.delete(Dsctn.Discussion_ID);
} else {
for (let ClntDsctn_ID of Dsctn.Clients.keys()) {
try{
Stack.Clients.get(ClntDsctn_ID).send('@InformDelUser' + JSON.stringify(ClientData));
} catch(ex) {
//TODO: добавить тут удаление пользователя из кучи и из дискуссий
console.log('Клиенту c ID: ' + ClntDsctn_ID + ' не удалось отправить сообщение. Он был удален из кучи (:TODO Пока не реализовано!)');
}
}
}
}
});
});
console.log('Сервер мессенджера успешно запущен на порту: < 3484 >');
console.log('Ожидание новых подключений......');
Вы нашли эту статью полезной?
Похожие статьи
-
Поиск и загрузка тендеров в программе 'Управление тендерным отделом' (версия 2.0)
Общая концепция поиска и загрузки Какие тендеры доступны для загрузки Варианты поиска по ключевым словам: Полнотекстовый поиск по ключе...
-
Рабочее место специалиста по снабжения (расчет тендера и подбор товара для участия)
Расчет тендера в рабочем месте специалиста по снабжению и памятка по созданию шаблонов расчета:Данная форма используется только в качестве шаблона для...
-
Как интегрировать конфигурацию “Управление тендерным отделом” в другую конфигурацию
Как интегрировать конфигурацию "Управление тендерным отделом" в состав другой конфигурации для использования в качестве подсистемы. Очень часто польз...
-
Команда "Анализ закупки заказчика"
Команда "Анализ закупки заказчика"Расположена на форме документа "Закупка" и на форме "Рабочего места специалиста по снабжению" и служит как комплексн...
-
Как пользователю выгрузить свои данные из программы
У пользователей ежедневно возникает необходимость выгрузить данные из 1С в сторонние программы или файлы. В данной статье рассмотрим, что тако...