"Если вдруг открылся люк, не пугайся, это глюк!" (с) Если что-то работает не так, вы нашли ошибку или опечатку в программе — вам в этот раздел
dkonakov
Добрый день.

Используем компоненту для оповещения менеджеров о статусе сборке товара.
Столкнулись с такой проблемой.
Если выводим 1 строку, например "Сборка накладной начата!", то всё проходит нормально.
Если же в одной функции есть несколько вызовов КомпонентMyChat.SendPrivateMessage, то передаётся первое сообщение, остальное куда-то пропадает.

Делали различные тесты, например если в отладке пошагово строки проходить, то всё отлично работает, сделали вывод, что нужна пауза между выводом сообщений.

Второй путь - собрать все сообщения в одно и выводить его. Но тут неприятность возникла, как можно делать перевод строки в том сообщении? В 1с сообщение отображается с переводом строки, в MyChat - без.


Поэтому два вопроса, почему при массовом отправлении КомпонентMyChat.SendPrivateMessage только 1 строка отправляется.
Как передать символ перевода строки в сообщении, которое выводит КомпонентMyChat.SendPrivateMessage?
Аватара пользователя
Алексей Пикуров
Здравствуйте, Дмитрий.

Перевод строки - нужно вставить в текст [CRLF] (6 символов).

Насчёт отправки только первого сообщения - я проверю, что это может быть. Возможно, срабатывает антифлуд-фильтр в сервере.
dkonakov
Ага, спасибо, сейчас попробуем.
У меня антифлуд отключён, но быть может есть какая-то базовая защита?
Во вложении настройки антифлуда и пользователь Кладовщик ( Замки) вроде как сняты все ограничения.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Надо код смотреть, не готов ответить.
Аватара пользователя
Алексей Пикуров
Покажите свой исходник в 1С, пожалуйста.
dkonakov
Код: Выделить всё
Результат=ПодключитьВнешнююКомпоненту("mychatvk.dll","MyChat", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
   КомпонентMyChat = Новый ("AddIn.MyChat.MyChatClass");
   Иначе Сообщить("Ошибка подключения mychatvk.dll!");
      возврат;
КонецЕсли;
   Отправитель = ПараметрыСеанса.ТекущийПользователь.ЛАД_UID_Чат;
   Получатель = Реализация.Ответственный.ЛАД_UID_Чат;
   Если флРасхождения Тогда
      //фиксируем расхождения в документе
      ЛАД_ПривилегированныйМодуль.ЗафиксироватьРасхожденияПриСборке(Реализация,ТаблицаРасхождений,мУдаляемыеСтроки);
      
КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, "-----------------------");
КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, "Расхождения в накладной " + Реализация.Номер + "(" + Реализация.Контрагент +"): ");
      Для каждого СтрокаРасхождения Из ТаблицаРасхождений Цикл
         Если СтрокаРасхождения.КоличествоДокумент <>  СтрокаРасхождения.КОличествоСобрано Тогда
КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, "В позициии " + СтрокаРасхождения.Номенклатура + " было количество " + СтрокаРасхождения.КоличествоДокумент + ", стало: " + СтрокаРасхождения.КОличествоСобрано);
         КонецЕсли;   
      КонецЦикла;   
      Для каждого ЭлУдаленный Из мУдаляемыеСтроки Цикл
         КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, ЭлУдаленный.Представление);   
      КонецЦикла;   
   КонецЕсли;   
   
   КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, "Сборка накладной " + Реализация.Номер + "(" + Реализация.Контрагент +") завершена!");
   
   ЛАД_ОбщийМодуль.УстановитьСтатусСборки(Перечисления.ЛАД_СтатусыСборкиРеализаций.СборкаЗавершена,Реализация);
   Закрыть();

Аватара пользователя
Алексей Пикуров
"Отправитель" у вас всегда один и тот же? Тот юзер, что находится в списке исключений антифлуд-фильтра?
dkonakov
Значить попробовал "собирать" все сообщения в одно путем добавления в конец каждой строки [CRLF].
На выходе получил просто сплошной текст.
Код: Выделить всё
-----------------------[CRLF]Расхождения в накладной НОСН0004515(Шавро И.М. ИП): [CRLF]В позициии Замок врезной противопожарный Apecs 2000-ZN было количество 34, стало: 33[CRLF]В позициии Термоактивная лента Fireks 1*15 было количество 5, стало: 4[CRLF]Сборка накладной НОСН0004515(Шавро И.М. ИП) завершена!



По поводу отправителя, да, он всегда один. и это именно он в исключениях.
Аватара пользователя
Алексей Пикуров
Окей, разберусь в вопросе и отвечу позже.
Аватара пользователя
Алексей Пикуров
Версия 5.17, пробую писать код:

Код: Выделить всё
Перем КомпонентMyChat;

Процедура ПоказатьТекстСтатусаНажатие(Элемент)
   Результат=ПодключитьВнешнююКомпоненту("mychatvk.dll","MyChat", ТипВнешнейКомпоненты.Native);
   
   Если Результат Тогда
   КомпонентMyChat = Новый ("AddIn.MyChat.MyChatClass");
   
   КомпонентMyChat.SendPrivateMessage("192.168.10.1", 2004, "iddqd", "3", "6", "Привет![CRLF]Ещё раз привет!");
   КомпонентMyChat.SendPrivateMessage("192.168.10.1", 2004, "iddqd", "3", "6", "Привет номер 2");
   КомпонентMyChat.SendPrivateMessage("192.168.10.1", 2004, "iddqd", "3", "6", "Привет номер 3");
   
   Иначе Сообщить("Ошибка подключения mychatvk.dll!");
   КонецЕсли;
КонецПроцедуры


Три сообщения подряд, всё приходит отлично. Но переносов строк нет, тут я проверю, почему.
1ctest-small.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
P.S. Для перевода строки достаточно написать вот так:
Код: Выделить всё
КомпонентMyChat.SendPrivateMessage("192.168.10.1", 2004, "iddqd", "3", "6", "Привет!" + Символы.CR + Символы.LF + "Ещё раз привет!");
Аватара пользователя
Алексей Пикуров
Обновите компоненту, исправлена мелкая ошибка: viewtopic.php?p=21961#p21961

mychatvk.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
dkonakov
Ну у меня сообщения побольше размером, может в этом дело?
Версия чата 5.16 у меня, сегодня обновлюсь на 5.17 и компоненту обновлю.

Сегодня отметили, что баг плавающий, иногда 2 строки выдаст из 5, иногда 3.

Завтра ещё протестируем все варианты, хотелось бы разобраться с отправкой одиночных сообщений. Напишу позднее.

Спасибо за оперативный ответ!
Аватара пользователя
Алексей Пикуров
Ок, жду результата. Размер сообщений значения не имеет. Ограничение есть, но оно очень большое.
dkonakov
Обновились на 5.17. Компоненту не обновлял в папке 1с.
Многострочность заработала сразу, просто добавляю в конец строки:
Символы.ВК+Символы.ПС.

Далее опытным путём следующий код выдаёт:
Код: Выделить всё
   Результат=ПодключитьВнешнююКомпоненту("mychatvk.dll","MyChat", ТипВнешнейКомпоненты.Native);
   Если Результат Тогда
      КомпонентMyChat = Новый ("AddIn.MyChat.MyChatClass");
   Иначе Сообщить("Ошибка подключения mychatvk.dll!");
      возврат;
   КонецЕсли;
   Отправитель = ПараметрыСеанса.ТекущийПользователь.ЛАД_UID_Чат;
   Получатель = Реализация.Ответственный.ЛАД_UID_Чат;
   ПереводСтроки = "";
   Если флРасхождения Тогда
      ЛАД_ПривилегированныйМодуль.ЗафиксироватьРасхожденияПриСборке(Реализация,ТаблицаРасхождений,мУдаляемыеСтроки);
      Сообщение = "===================================================================";
      КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, Сообщение);
      Сообщить(Сообщение);
      Сообщение = "Расхождения в накладной " + Реализация.Номер + "(" + Реализация.Контрагент +"): ";
      КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, Сообщение );
      Сообщить(Сообщение);
      Для каждого СтрокаРасхождения Из ТаблицаРасхождений Цикл
         Если СтрокаРасхождения.КоличествоДокумент <>  СтрокаРасхождения.КОличествоСобрано Тогда
            Сообщение = "В позициии " + СтрокаРасхождения.Номенклатура + " было количество " + СтрокаРасхождения.КоличествоДокумент + ", стало: " + СтрокаРасхождения.КОличествоСобрано;
            КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, Сообщение );
            Сообщить(Сообщение);
         КонецЕсли;   
      КонецЦикла;   
      Для каждого ЭлУдаленный Из мУдаляемыеСтроки Цикл
         Сообщение = ЭлУдаленный.Представление;
         КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, Сообщение );   
         Сообщить(Сообщение);
      КонецЦикла;   
      Сообщение = "===================================================================";
      КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, Сообщение );
      Сообщить(Сообщение);
   КонецЕсли;   
      
   
   Сообщение = "Сборка накладной " + Реализация.Номер + "(" + Реализация.Контрагент +") завершена!";   
   КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", Отправитель, Получатель, Сообщение);
   
   Закрыть();





Выдаёт в служебных сообщениях:
===================================================================
Расхождения в накладной НОСН0004515(Шавро И.М. ИП):
В позициии Замок врезной противопожарный Apecs 2000-ZN было количество 28, стало: 27
В позициии Ручки на планке Apecs HP-72.1303-GR (Spring) было количество 8, стало: 7
===================================================================
А в чате:
Снимок.JPG

Опытным путём я решил сделать намеренную паузу в выводе.
После каждого вывода пауза 500 милисекунд. ( пробовал 100, тогда выводится первая и последняя строка, это наводит на мысль, что либо это срабатывает антифлуд, либо компоненте нужно время после вывода).

Тогда всё выводится корректно.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Выведите в лог результат работы КомпонентMyChat.SendPrivateMessage

Контроля на антифлуд для IntegrationAPI нету. Я приводил код выше - три сообщения подряд, всё работает отлично, никаких пропусков.
dkonakov
А каким образом я могу вывести его в лог? Я ж не знаю, какие параметры для этого использовать.
Свой лог в 1с я вывел, я формирую переменную Сообщение, которую передаю в
КомпонентMyChat.SendPrivateMessage и ниже делаю вывод на экран того же сообщения.
Вывод есть, сообщения в чате, кроме первого, нет.
Аватара пользователя
Алексей Пикуров
Сообщить(КомпонентMyChat.SendPrivateMessage..
dkonakov
ВО! Вот теперь кое-что ясно.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Аватара пользователя
Алексей Пикуров
Список ошибок:

Код: Выделить всё
MCIAPI_Error_NetworkError            = 1; // сетевая ошибка
MCIAPI_Error_WrongSenderUser         = 2; // неверный UIN, логин или email отправителя
MCIAPI_Error_WrongRecieverUser       = 3; // неверный UIN, логин или email получателя
MCIAPI_Error_EmptyMessage            = 4; // отправляемое сообщение не может быть пустым
MCIAPI_Error_WrongIntegrationKey     = 5; // неверный ключ IntegrationAPI
MCIAPI_Error_UnknownUID              = 6; // текстовый канал с заданным UID не существует
MCIAPI_Error_UserNotInChannel        = 7; // пользователя нет в указанном канале
MCIAPI_Error_UINNotFound             = 8; // идентификатор пользователя не найден (поиск UIN по нику или email)
MCIAPI_Error_API_Disabled            = 9; // Integration API отключен на сервере
MCIAPI_Error_ParameterAbsent         = 10; // пропущен параметр командной строки
MCIAPI_Error_WrongDomainUserReciever = 11; // такой доменный пользователь-получатель не зарегистрирован на сервере
MCIAPI_Error_WrongDomainUserSender   = 12; // такой доменный пользователь-отправитель не зарегистрирован на сервере
MCIAPI_Error_Nick_Already_Exists     = 14; // нельзя зарегистрировать нового пользователя, такой ник уже существует


У вас в логе - ошибка номер 2. MCIAPI_Error_WrongSenderUser
dkonakov
Хорошо, добавил лог с выводом отправителя.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71

А вот такой же точно лог с паузой 500 милисекунд.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
Аватара пользователя
Алексей Пикуров
Чудес не бывает, проверьте свой код. Ошибка однозначно говорит о проблеме.
dkonakov
Я понимаю, что чудес не бывает :)

но в данном случае переменная Отправитель присваивается один раз и используется при каждом вызове. То есть в этот момент она не меняется и отправитель явно существует.

Смотрите, меняю Паузу на 100 милисекунд.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71

Пауза 150.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71

Пауза 200.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Отправитель - 71
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Отправитель - 71



Код везде одинаков, меняется лишь время паузы и как видите - результат всё время разный.
Аватара пользователя
Алексей Пикуров
Это точно никак не связано с MyChat Server. Поставьте в свой код вместо переменной константу и проверьте.
dkonakov
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}

в каждом вызове отправитель указан 71 вручную и получатель 4. Без переменных.
Аватара пользователя
Алексей Пикуров
Код покажите.
dkonakov
Код: Выделить всё
Результат=ПодключитьВнешнююКомпоненту("mychatvk.dll","MyChat", ТипВнешнейКомпоненты.Native);
   Если Результат Тогда
      КомпонентMyChat = Новый ("AddIn.MyChat.MyChatClass");
   Иначе Сообщить("Ошибка подключения mychatvk.dll!");
      возврат;
   КонецЕсли;
   Отправитель = ПараметрыСеанса.ТекущийПользователь.ЛАД_UID_Чат;
   Получатель = Реализация.Ответственный.ЛАД_UID_Чат;
   
   ПереводСтроки = "";
   Если флРасхождения Тогда
      ЛАД_ПривилегированныйМодуль.ЗафиксироватьРасхожденияПриСборке(Реализация,ТаблицаРасхождений,мУдаляемыеСтроки);
      Сообщение = "===================================================================";
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "71", "4", Сообщение));
      Сообщение = "Расхождения в накладной " + Реализация.Номер + "(" + Реализация.Контрагент +"): ";
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd",  "71", "4", Сообщение ));
      Для каждого СтрокаРасхождения Из ТаблицаРасхождений Цикл
         Если СтрокаРасхождения.КоличествоДокумент <>  СтрокаРасхождения.КОличествоСобрано Тогда
            Сообщение = "В позициии " + СтрокаРасхождения.Номенклатура + " было количество " + СтрокаРасхождения.КоличествоДокумент + ", стало: " + СтрокаРасхождения.КОличествоСобрано;
            Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd",  "71", "4", Сообщение ));
         КонецЕсли;   
      КонецЦикла;   
      Для каждого ЭлУдаленный Из мУдаляемыеСтроки Цикл
         Сообщение = ЭлУдаленный.Представление;
         Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd",  "71", "4", Сообщение ));
      КонецЦикла;   
      Сообщение = "===================================================================";
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd",  "71", "4", Сообщение ));
   КонецЕсли;   
   
   Сообщение = "Сборка накладной " + Реализация.Номер + "(" + Реализация.Контрагент +") завершена!";   
   Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd",  "71", "4", Сообщение));
Аватара пользователя
Алексей Пикуров
Вроде все Ок, не знаю, в чём может быть проблема у вас.

Я только что проверил у себя, работает как часы. Отправляется любое количество сообщений подряд, любого размера.
Аватара пользователя
Алексей Пикуров
А напишите просто тупо вот так, для теста:

Код: Выделить всё
Сообщение = "===================================================================";
Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
dkonakov
Написал обработку:
Код: Выделить всё
   Результат=ПодключитьВнешнююКомпоненту("mychatvk.dll","MyChat", ТипВнешнейКомпоненты.Native);
   Если Результат Тогда
      КомпонентMyChat = Новый ("AddIn.MyChat.MyChatClass");
   Иначе Сообщить("Ошибка подключения mychatvk.dll!");
      возврат;
   КонецЕсли;
Сообщение = "===================================================================";
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
      Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));

Результат тот же.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}

Сервер на Windows XP стоит.
Аватара пользователя
Алексей Пикуров
Сервер чего? MyChat?
dkonakov
Да, тот который 192.168.2.13 там WinXP Prof.
Пробовал запускать обработку с Windows 7 и с Windows Server 2008.
Ладно, видимо это какая то особенность закрытия соединений, раз работает, если ставлю паузу полсекунды.
Если кто столкнется с данной проблемой - решений предлагаю 2.
1. Ставьте паузу после каждого вызова отправки сообщения (у меня 500 миллисекунд).
Код: Выделить всё
Процедура ПаузаНаКлиенте(ПаузаВМс)    
   
   Скрипт=Новый ТекстовыйДокумент();
   Скрипт.УстановитьТекст("WScript.Sleep(" + Формат(ПаузаВМс, "ЧГ=0") + ");");
   
   GUID = Новый УникальныйИдентификатор;
   ИмяФайлаСкрипта = КаталогВременныхФайлов() + GUID + "_sleep.js";
   Скрипт.Записать(ИмяФайлаСкрипта, КодировкаТекста.ANSI);
   
   WshShell = Новый COMОбъект("wscript.shell");
   WshShell.Run("wscript.exe """ + ИмяФайлаСкрипта + """ ", 0, Истина);
   УдалитьФайлы(ИмяФайлаСкрипта);
КонецПроцедуры

2. Собирайте все сообщения в одно и добавляйте в конец каждой строки: Символы.ВК+Символы.ПС.
Аватара пользователя
Алексей Пикуров
А в 1С разве нет человеческой функции для паузы? Типа Delay или Wait? Или это некошерно? :)
dkonakov
Алексей, это же 1с, приходится использовать "костыли". Ну тему можно делать решенной. Лично для себя я ее решил :) Может еще поможет кому.
Аватара пользователя
Алексей Пикуров
Попробуйте вот так:
Код: Выделить всё
Процедура глПауза(Сек)
scr = Новый COMОбъект("WScript.Shell");
scr.Run("sleep "+СокрЛП(Число(Сек)),0,1);
КонецПроцедуры; 

Чуть компактнее костыль :)
Аватара пользователя
Алексей Пикуров
P.S. Я сделаю лог на сервере MyChat, мне самому интересно, почему у вас так отрабатывает функция, если не делать паузу.
Аватара пользователя
Алексей Пикуров
Не удержался :)

Насчёт костылей:
841b3185-92b7-4515-af6b-5506606e052e.gif
У вас нет необходимых прав для просмотра вложений в этом сообщении.
dkonakov
Отличная картинка на тему Костылей :)
Лог вы поставите, мне потом версию myChat обновить или как?
Аватара пользователя
Алексей Пикуров
Да, в следующей версии хотелось бы всё же выяснить, в чём конкретно проблема. Без костылей :)
dkonakov
Я выбрал второй вариант, так что я без костылей.
Готов к сотрудничеству, если нужно. Мы эту тему собираемся дальше широко использовать.
dkonakov
Алексей, ну вот сегодня мне пожаловались пользователи, что сообщения к ним не доходят.
Я запустил обработку, там 6 подряд вызовов сообщений в приват и получил:
Код: Выделить всё
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}


У меня лицензия на 40 пользователей, но сейчас 42, включая бота Элизу, может это быть связано с количество лицензий?
Почему, кстати, пускает больше 40 пользователей?
Аватара пользователя
Алексей Пикуров
Вашему подключению "нет места", сервер его отшибает.

Как вы определили, что у вас 42 подключения?
dkonakov
А в консоли сервера где колонка Люди у меня было 42.
Аватара пользователя
Алексей Пикуров
P.S. Посмотрите лог сервера, там будет ошибка "Исчерпано максимальное количество соединений на сервере", и указан IP, с которого происходит подключение. Скорее всего, это и будет ваш 1С.
Аватара пользователя
Алексей Пикуров
dkonakov писал(а):А в консоли сервера где колонка Люди у меня было 42.

Хочу увидеть :) И вообще надо смотреть первую страницу сервера, где указано, сколько коннектов занято.

В списке онлайн-пользователей могут быть "фантомные" пользователи, которые будут "убиты" спустя какое-то время.
dkonakov
Да вот собственно скрин, хотите могу удаленно показать)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
В WEB-админке нужно смотреть. Раздел "Информация о сервере" и "Онлайн-пользователи".
dkonakov
В Web админку зайти не могу ж, не пускает, пока не выключу одного из пользователей.
Впрочем, завтра куплю расширение на 10 юзеров, посмотрим.
Аватара пользователя
Алексей Пикуров
Ок.
dkonakov
Проверил, ну точно, похоже что отправка сообщения требует отдельной свободной лицензии.
Сейчас же расширили на 10 пользователей и результат обработки стал:
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
Аватара пользователя
Алексей Пикуров
Отлично, хорошо, что определились.

1. В логе сервера делается запись, если лицензии закончились.
2. В справку по Integration API я добавил информацию о том, что для подключения требуется доп. лицензия (1 коннект).
dkonakov
Для отправки каждого сообщения нужна доп. лицензия ? Как происходит закрытие соединение после отправки сообщения?
Аватара пользователя
Алексей Пикуров
Схема работы такая:

1. Вызов функции в 1С.
2. Открытие соединения с MyChat Server, передача сообщения, получение ответа.
3. Закрытие соединения.

Поскольку вызовы выполняются последовательно у вас, то достаточно 1 коннекта для всех отправок ваших сообщений.
dkonakov
Не соглашусь, вот сейчас у меня 40 юзеров в чате, запустил из 1с скрипт вывод в цикле 20 сообщений.
Код: Выделить всё
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":2,"UINTo":4,"hash":"","State":0}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
{"Cmd":1,"ErrNum":2,"Msg":"0 Connection Closed Gracefully."}
Аватара пользователя
Алексей Пикуров
Можно ваш код цикла увидеть?
dkonakov
Код: Выделить всё
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Результат=ПодключитьВнешнююКомпоненту("mychatvk.dll","MyChat", ТипВнешнейКомпоненты.Native);
   Если Результат Тогда
      КомпонентMyChat = Новый ("AddIn.MyChat.MyChatClass");
   Иначе Сообщить("Ошибка подключения mychatvk.dll!");
      возврат;
   КонецЕсли;
Сообщение = "===================================================================";

Для Р = 1 По 20 Цикл
   Сообщить(КомпонентMyChat.SendPrivateMessage("192.168.2.13", 2004, "iddqd", "0", "4", Сообщение));
КонецЦикла;
КонецПроцедуры
dkonakov
Сделайте так, чтобы лицензий было например 10. И увидите как не проходят все сообщения.
Аватара пользователя
Алексей Пикуров
Попробую. Отпишу позже.
dkonakov
Решил апнуть тему, не придумали решение? У нас по прежнему актуально, пока что мы все сообщения собираем в кучу и отправляем. А хотелось бы в цикле, но из-за лицензий не выходит.
Аватара пользователя
Алексей Пикуров
Я ещё не занимался этим вопросом плотно, подозрение на 1С, но до конца пока неясно. Разберусь — напишу.