Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
lerisamara
В основном интересует интеграция MyChat с 1С 8.х, какой-либо информации на тему найти не удалось, есть одна тема на форуме, но она уже два года без ответа. В частности, может ли mychat.dll работать в режиме внешней компоненты 1с, или нужны какие-либо костыли в виде дополнительной самописной dll-ки?
Аватара пользователя
Алексей Пикуров
Добрый день.

Описание библиотеки есть в справке сервера: http://www.nsoft-s.com/mcserverhelp/mcs ... ionapi.htm

Оно слегка устаревшее, но пользоваться можно.
mychat.dll работать в режиме внешней компоненты 1с,

Нет, не может, это отдельная обычная DLL библиотека, собранная в двух вариантах, x32 и x64.

А для какой конкретно версии 1С вам нужна такая компонента? Я давно не смотрел в эту сторону, возможно, получится что-то сделать сейчас.
lerisamara
Для версии 8.2 и 8.3. Стандарты разработки внешних компонент по технологии Native API у этих версий одинаковы. Если получится реализовать взаимодействие 1С 8.2 с MyChat через внешнюю компоненту, спрос на это будет. Например, при создании заказа автоматически отправлять уведомление исполнителю, это гораздо оперативнее, чем через почту.

Описание работы 1С Native API есть в интернете, если нужного не найдётся, у нас на ИТС должно быть.

Вот, например http://infostart.ru/public/184119/
lerisamara
Диск информационно-технического сопровождения от 1С. Там есть описание Native API и шаблон внешней компоненты. По крайней мере раньше был.
Аватара пользователя
Алексей Пикуров
Вы можете залить его образ на какой-то файлообменник типа Яндекс.Диска или DropBox?

И подскажите, где взять легальную триальную версию 1С для установки и тестирования?
lerisamara
Бесплатную версию платформы можно скачать тут: http://online.1c.ru/catalog/free/18610119/

Шаблоны внешних компонент сейчас ищу. Объём небольшой, можно по почте выслать.
Аватара пользователя
Алексей Пикуров
И ещё. У вас есть доступ к infostart.ru ?
Можете скачать библиотеку http://infostart.ru/public/177766/ ?
Аватара пользователя
Алексей Пикуров
За ссылку спасибо, сейчас скачаю. Материалы можно высылать на support@nsoft-s.com
lerisamara
Вот ссылка на описание технологии создания внешних компонент: http://its.1c.ru/db/metod8dev#content:3221:hdoc

Где-то в конце есть ссылка на скачивание.
Аватара пользователя
Алексей Пикуров
Есть, но там нет примеров на Delphi, на котором мы пишем. А что с инфостартом? У вас есть к нему доступ?
lerisamara
На инфостарте доступ есть, но та ссылка платная, как оказалась... попробую ещё примеров на дельфине поискать.
Аватара пользователя
Алексей Пикуров
Думаю, не оно. Во-первых это для 7-й линейки, во вторых, это COM-компонент.
Аватара пользователя
March Tom-Cat
Алексей Пикуров писал(а):И ещё. У вас есть доступ к infostart.ru ?
Можете скачать библиотеку http://infostart.ru/public/177766/ ?

Отправил на support@nsoft-s.com
Аватара пользователя
Алексей Пикуров
Благодарю вас, буду знать, к кому обращаться :)
Начинаем крутить 1С, "по заявкам радиослушателей" :)
Аватара пользователя
Алексей Пикуров
Кто-то может подсказать, какие действия нужно произвести, чтобы написать минимальную программу внутри 1С 8.3 и проверить работу внешнего компонента?

Возможно, есть какой-то простой пошаговый гайд для этого?
Аватара пользователя
March Tom-Cat
Алексей Пикуров писал(а):Кто-то может подсказать, какие действия нужно произвести, чтобы написать минимальную программу внутри 1С 8.3 и проверить работу внешнего компонента?

Возможно, есть какой-то простой пошаговый гайд для этого?

Отправил по почте.
Аватара пользователя
Алексей Пикуров
Спасибо. Посмотрел архив, примеры есть. Но я совершенно не понимаю, что надо "крутить" в самом 1С и где, чтобы посмотреть, как использовать сделанный компонент.

Запускаю 1C, показывается окошко:
1start-small.png
1start-small.png (9.36 КБ) Просмотров: 1940


А что дальше? Пробовал запускать "1С Предприятие", пробовал "Конфигуратор", появляется окно с кнопками и огромным меню с тучей пунктов. Но совершенно неясно, что дальше делать. Есть какой-то гайд по тому, куда и где нажимать, и какой минимальный код писать, чтобы задействовать написанный компонент и увидеть, работает он или нет?
Аватара пользователя
March Tom-Cat
Насколько я понял с 1С совсем не знакомы? :)
1. Запускаем 1С
2. Добавить...
2.1. Создание новой информационной базы
2.2. Создание информационной базы без конфигурации для разработки новой конфигурации или загрузки выгруженной ранее информационной базы.
2.3. Указываем имя, и выбираем "На данном компьютере или на компьютере в локальной сети"
2.4. Выбираем путь для базы.
2.5. Оставляем все как есть. "Готово".
3. Выбираем созданную базу, жмем "Конфигуратор".
3.1. Конфигурация->Открыть конфигурацию
3.2. Закрываем 1С
3.3. Копируем файл с заменой V80\DB\1Cv8.1CD в папку куда создали базу.
3.4. Снимаем с файла атрибут "рид-онли".
3.5. Запускаем конфигуратор, если запросит преобразование - соглашайтесь.
3.6. В конечном итоге должны получить следующую картинку:
http://www.nsoft-s.com/forum/download/file.php?mode=view&id=1745
http://www.nsoft-s.com/forum/download/file.php?mode=view&id=1744
4. Весь код для 1С будет на закладке "Модуль".
5. Закрываем 1С.
6. Компилируем AddIn.Dll
7. Выкладываем DLL куда-то (тут нужно гуглить, я не работал с внешними компонентами сейчас путь не подскажу).
8. Открываем 1С предприятие.
9. Нажимаем "Пример работы с компонентой".
Вложения
1C-02.png
1C-02.png (193.2 КБ) Просмотров: 1938
1C-01.png
1C-01.png (200.17 КБ) Просмотров: 1938
Аватара пользователя
March Tom-Cat
Ну что получилось?
Вот кстати тут про то куда нужно выкладывать... http://kb.mista.ru/article.php?id=419

В отличие от 7.7 необходимо указывать полный путь к DLL (или положить файл DLL в папку BIN платформы 1С:Предприятие). Вместо СоздатьОбъект("Addin.Имя") используется Новый("Addin.Имя"), использовать при этом ключевое слово COMОбъект не нужно.
Аватара пользователя
Алексей Пикуров
Спасибо за инструкцию. C 1C не знаком совершенно :)

Библиотека с InfoStart под Delphi не компилируется :) Ни в 7 ни в XE3, валятся ошибки. Под FreePascal не знаю, завтра попробую. Взял пример на Delphi из официального SDK под 8.0. Он тоже сразу не скомпилировался (пришлось добавлять модуль Variants в uses). Собрал DLL, подложил.

Однако после нажатия на кнопку "Пример работы с компонентой" я получаю вот что (dll библиотеку пробовал класть и в \bin и в произвольную папку, результат одинаков):
1сscreen-small.png
1сscreen-small.png (34.87 КБ) Просмотров: 1923

Оказывается, библиотеку нужно регистрировать в системе с помощью regsvr32. Потому что это COM-компонент. От имени администратора. После этого всё завелось и кнопка в 1С заработала.

Теперь нужно из примера сделать рабочую библиотеку для MyChat :)

Спасибо за содействие, буду задавать вопросы в этой теме по ходу продвижения работы.
Аватара пользователя
March Tom-Cat
Алексей Пикуров писал(а):Оказывается, библиотеку нужно регистрировать в системе с помощью regsvr32. Потому что это COM-компонент. От имени администратора. После этого всё завелось и кнопка в 1С заработала.

Не за что. Будут вопросы - задавайте, чем смогу - помогу. [smilie=friends.gif]
А по поводу регистрации - возможно нужно было 1с от имени админа запускать, 1с сама должна регистрировать дллку, если та не зарегистрирована...
Аватара пользователя
Алексей Пикуров
Чёрт его знает. Пока что по ощущениям, 1С тот ещё велосипед :) Попробую собрать библиотеку на FreePascal, насколько я понял, при использовании 1С nativeAPI COM объект устанавливать не нужно и обвязок там меньше, да и сама DLL работать будет быстрее.

Субьективно, COM DLL в 1С работает не сильно шустро, видны подтормаживания даже в официальном примере.

Спасибо за поддержку, вопрос уже есть :)
Как в 1С во встроенном языке работать с форматом JSON? Есть какая-то поддержка?
Аватара пользователя
March Tom-Cat
Субъективно 1С даже не компилятор, а интерпретатор... со всеми вытекающими проблемами.
Любая специализированная программа будет работать как минимум на порядок быстрее 1с (если написана по уму, а не как всегда). Другое дело, что для работы с 1с не нужно знать языков и механизмов работы с базами данных (тот же SQL например).

По поводу JSON и 1С: http://v8.1c.ru/o7/201410json/index.htm
Аватара пользователя
Алексей Пикуров
В общем, получилось сделать DLL NativeAPI, которую не нужно устанавливать как COM-объект. На FreePascal, но работает. С JSON всё плохо, насколько я понимаю, потому что в доке сказано, что поддержка JSON в 1С появилась только в версии 8.3.6.1977

Учебная версия 1С, что использую я, скачанная с оф.сайта - 1С:Предприятие 8.3, учебная версия (8.3.5.1248)

И не факт, что у всех людей самая свежая версия, так что ориентироваться на встроенные механизмы JSON в 1С, скорее всего, нельзя.

Буду делать тестовый пример DLL, выложу здесь для тестирования.
Аватара пользователя
March Tom-Cat
JSON в 1С:Предприятие 8.2 http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=547702
JSON и UnJSON в 1С (версия от 27/11/2009) http://infostart.ru/public/61194/
1С 8.2 УП : Обмен данными с сайтом используя формат JSON в 1С https://helpf.pro/faq82/view/1664.html

Все это выдал гугл на запрос "JSON в 1с 8.2". Привел первые 3 ссылки... [smilie=biggrin.gif]
Аватара пользователя
Алексей Пикуров
Я не об этом. Уже смотрел эти ссылки и я, когда гуглил. Это куски кода, которые нужно вставлять самостоятельно. Часть которых у меня, кстати "не завелась". Попробовал несколько и плюнул. Можно написать функцию и затем прилагать её к DLL, но это "грабли". Которые корректно работают в одной версии 1С и могут некорректно работать в другой.

Это неправильный подход.

Я постараюсь написать функцию внутри нашей DLL, которая на вход будет принимать строку, а на выход отдавать ESCAPE-последовательность. Таким образом строка будет корректно переводиться в JSON-like, с экранированиями символов и прочим, даже без нативной поддержки JSON в 1С.
Аватара пользователя
March Tom-Cat
Я может быть что-то не понимаю, но почему бы не сделать как в примере?
Т.е. условно:

Код: Выделить всё
КодВозврата = Компонента.ПодключитсяКСерверу(ИмяСервера, Порт, ИмяПользователя, Пароль);
Если КодВозврата <> 0 Тогда
        Сообщить ("Ошибка подключения к серверу");
        Возврат;
КонецЕсли;

КодВозврата = Компонента.НайтиПользователя (ИмяПользователя);
Если КодВозврата <> 0 Тогда
        Сообщить ("Пользователь не найден");
        Возврат;
КонецЕсли;

КодВозврата = Компонента.ОтправитьСообщение (ИмяПользователя, Сообщение);
Если КодВозврата <> 0 Тогда
        Сообщить ("Пользователь не найден");
        Возврат;
КонецЕсли;


Ну и далее в таком духе. Зачем изобретать велосипед через JSON? Есть же уже у Вас АПИ, вот через него и работать...
Аватара пользователя
Алексей Пикуров
Я покажу работающий пример и всё станет ясно, а если нет — поясню. Там всё проще. Подождите немного, допиливаю.
Аватара пользователя
Алексей Пикуров
Итак, работающий пример.
Качаем http://www.nsoft-s.com/files/mychat/int ... k-1c8x.zip

Внутри две DLL-библиотеки. Выкладываем их в C:\Program Files (x86)\1cv8t\8.3.5.1248\bin\

Далее, в конфигурации 1С пишем что-то в этом духе:
Код: Выделить всё
Перем КомпонентMyChat;

Процедура ПоказатьТекстСтатусаНажатие(Элемент)
   ТекстСообщения = ТекстСтатуса; 
                            // адрес сервера, номер порта, ключ Integration API, отправитель, получатель, текст сообщения
   Результат = КомпонентMyChat.SendPrivateMessage("your-server-ip", 2004, "iddqd", "0", "6", ТекстСообщения);
   Сообщить(Результат); // результат работы функции
КонецПроцедуры

Процедура ПриОткрытии()
   Сообщить("Версия MyChat.dll - " + КомпонентMyChat.GetMyChatLibVersion());
   Сообщить("Дата MyChat.dll - " + КомпонентMyChat.GetMyChatLibReleaseDate());
   Сообщить("Версия MyChatVK.dll - " + КомпонентMyChat.GetMyChatVKLibVersion());
   Сообщить("Дата MyChatVK.dll - " + КомпонентMyChat.GetMyChatVKLibReleaseDate());
КонецПроцедуры

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

Запускаем конфигурацию и жмём кнопку (в учебной версии стандартный пример):
1cpressbutton-small.png
1cpressbutton-small.png (4.67 КБ) Просмотров: 1902


Если компонент загрузился успешно, мы должны в логе увидеть вот что:
1ctestcomponent-small.png
1ctestcomponent-small.png (13.45 КБ) Просмотров: 1902


Набираем текст сообщения, жмём кнопку, и в MyChat приходит уведомление:
1ctestcomponentsendmessage-small.png
1ctestcomponentsendmessage-small.png (18.49 КБ) Просмотров: 1902


Пробуйте, проверяйте, жду комментариев и вопросов.
Аватара пользователя
March Tom-Cat
Работает... [smilie=dance4.gif]
Вложения
MyChat02.png
MyChat02.png (315.42 КБ) Просмотров: 1901
Аватара пользователя
Алексей Пикуров
Ну надо же, завелось сразу? :)

Хорошо. Тогда несколько вопросов.

1. Какая у вас версия 1С?
2. Есть ли возможность попробовать на линейке 7.x?
3. Какие функции, кроме отправки приватного сообщения, вам бы понадобились?
4. Что бы вы сделали с помощью этой технологии сейчас, в своём 1С для удобства интеграции с MyChat?
5. Чего в Integration API сейчас недостаёт?

Желательно поподробнее, я сейчас готовлю документацию + расширяю API, скоро будет новый релиз, 5.13.
Аватара пользователя
March Tom-Cat
Алексей Пикуров писал(а):Ну надо же, завелось сразу? :)

Сразу, скопировал дллки, ничего не регистрировал, и все заработало. :)

Алексей Пикуров писал(а):1. Какая у вас версия 1С?

8.2.19.116
8.3.5.1248

Алексей Пикуров писал(а):2. Есть ли возможность попробовать на линейке 7.x?

Есть, одна проблема времени сейчас чем-то серьезным заниматься нет времени совсем. Придется ждать, возможно целый месяц. Надеюсь здесь найдутся кроме меня заинтересованные пользователи.
Также могу опробовать не файловый вариант, а вариант клиент-сервер.

Алексей Пикуров писал(а):3. Какие функции, кроме отправки приватного сообщения, вам бы понадобились?

Наименование функций условное.

Функция ПодключитсяКСерверу(Параметры) - установить соединение с сервером, в дальнейшем использовать это соединение, до явного подключения к другому серверу.
Возвращает истина - подключились, ложь - соединение не установлено.
Параметры:
IPАдрес, НомерПорта

Функция ПодключитсяКСерверуПоИмени(Параметры) - установить соединение с сервером, в дальнейшем использовать это соединение, до явного подключения к другому серверу.
Возвращает истина - подключились, ложь - соединение не установлено.
Параметры:
ИмяСервера - имя сервера MyChat (частичное или полное FQDN)
НомерПорта

Можно сделать перегружаемую функцию, вот только для 1с придется вводить еще один параметр, либо сделать универсальную функцию ПодключитсяКСерверу(Сервер, Порт, ПодключатьсяПоИмени). Если ПодключатьсяПоИмени - истина, то в "Сервере" имя сервера, иначе там IP-адрес.

Функция ПолучитьСписокПользователей(БезПараметов) - возвращает таблицу значений и/или список значений. Таблица значений предпочтительнее. Поля таблицы занчений - UID, ФИО (можно по отдельности), Статус (не найден, оффлайн, онлайн, не беспокоить), ИмяДомена (если есть). Кстати по Статусу рекомендация, -1 возвращать если пользователя нет, и возвращать 2 или 0 (или сколько там по порядку), если пользователь оффлайн.

Функция НайтиПользователя (Фамилия, Имя, Отчество) - возвращает UID, либо строку таблицы значений аналогичную структуре ПолучитьСписокПользователей().

Функция НайтиПользователя (ФамилияИмяОтчество) - возвращает UID, либо строку таблицы значений аналогичную структуре ПолучитьСписокПользователей().

Функция УстановитьПользователяОтКоторогоПосылаемСообщения(Фамилия, Имя, Отчество)
Функция УстановитьПользователяОтКоторогоПосылаемСообщения(ФамилияИмяОтчество)
Функция УстановитьПользователяОтКоторогоПосылаемСообщения(UID)
устанавливает от имени какого пользователя будут отсылаться сообщения, если явно не указан другой пользователь.
Возвращает истина - установили, ложь - пользователь не найден.

Функция ПослатьСообщение(Кому, Сообщение, ОтКого)
Возвращает КодОшибки. Возможно достаточно будет истина - отослано, ложь - не отослано. Но тут нужно хорошо думать...
Параметры:
Кому, варианты:
Фамилия, Имя, Отчество;
ФамилияИмяОтчество;
UID;
Сообщение - текст сообщения
ОтКого - может отсутствовать, варианты:
Фамилия, Имя, Отчество;
ФамилияИмяОтчество;
UID.

Процедура ОтключитьсяОтСервера(БезПараметров) - разрывает установленное соединение с сервером. Возможно излишнее - пока не могу сказать.

Функция ПолучитьПоследнийКодОшибки(БезПараметров) - возвращает код ошибки последней операции, для развернутого анализа.

Функция ПолучитьПараметрыПодключения(БезПараметров) - возвращает параметры которые были указаны при подключении к серверу, при условии, что было установлено соединение с сервером.

Надеюсь ничего не упустил.

Алексей Пикуров писал(а):4. Что бы вы сделали с помощью этой технологии сейчас, в своём 1С для удобства интеграции с MyChat?

Не понял вопроса.

Алексей Пикуров писал(а):5. Чего в Integration API сейчас недостаёт?

Сначала нужно изучить API, прежде чем что-либо говорить, но в ответе на вопрос 3 содержится примерное мое видение API.

Вроде все. Если что не понятно - спрашивайте, ну или можно голосом пообщаться.
Аватара пользователя
Алексей Пикуров
Функций подключения к серверу и отключения от сервера нету.

Дело в том, что IntegrationAPI построен по принципу: отправил команду - получил результат, отвалился. В один заход.
Упрощённая авторизация. Минимум телодвижений.

Далее. Любая команда возвращает результат, вы видели это в консоли лога 1С. Обычный JSON-объект, текстовая строка.

По остальному - из всего списка нужны функции получения списка юзеров и поиска юзера. Я добавлю это в протокол к тем командам, что уже есть. Подробное описание будет в доке IntegrationAPI на сервере MyChat.
Аватара пользователя
Алексей Пикуров
Алексей Пикуров писал(а):
4. Что бы вы сделали с помощью этой технологии сейчас, в своём 1С для удобства интеграции с MyChat?

Не понял вопроса.

Будете ли вы применять эту технологию у себя в компании и что конкретно сделаете?
Аватара пользователя
March Tom-Cat
Алексей Пикуров писал(а):Будете ли вы применять эту технологию у себя в компании и что конкретно сделаете?

90% что будем. Есть как минимум 2 задачи, которые можно ускорить это электронное согласование заявок на платежи, и электронное согласование документов. По документам сейчас отправляются электронные письма, что приводит к довольно большим задержкам. Оповещение через чат будет оперативнее на мой взгляд.
Аватара пользователя
Алексей Пикуров
Окей, я тогда "дожимаю" документацию и жду от вас статью о том, как будете интегрировать MyChat со своим 1С :)
Аватара пользователя
Алексей Пикуров
Тема перенесена в раздел "Боты, плагины, скрипты и разные дополнения".
Аватара пользователя
Алексей Пикуров
Уже есть, постоянно дополняется. Пишите сюда, чего не хватает.
https://nsoft-s.com/mcserverhelp/index. ... mple1c.htm
Аватара пользователя
Алексей Пикуров
Раскройте раздел справки (иконка книжечки) и читайте. "Описание функций внешней компоненты".
lerisamara
В клиенте работает нормально, на стороне сервера не хочет. Возможно, связано с тем, что сервер 64-битный?
Аватара пользователя
Алексей Пикуров
Библиотека x32, если сервер x64, то конечно не будет работать. А спецификация внешних компонент для 1С клиентского приложения и серверного одинаковая? Один и тот же компонент будет работать и там и там?
lerisamara
И ещё... некоторые сообщения об ошибках выдаются в виде модального окна. Например, когда мы поместили mychatvk.dll в каталог программы и попытались его подключить, вышло окно "Не найден файл mychat.dll". В случае запуска на клиенте это не страшно, есть кому нажать "ОК", но в случае выдачи такого сообщения на стороне сервера процесс зависнет.
lerisamara
Спецификация внешних компонент вряд ли отличается. По крайней мере, упоминаний об этом не встречал. Скорее всего, просто надо ту же DLL-ку пересобрать под 64 бита. Пусть будет, например, mychatvk64.dll :)
Аватара пользователя
Алексей Пикуров
Окей, я попробую собрать ещё и x64 версию.
Например, когда мы поместили mychatvk.dll в каталог программы

Библиотеки выкладываются в папку \bin 1C, в документации сказано об этом.
Сообщения выдаются не нами, а 1С, мы не рулим этим процессом.
dkonakov
Попробовал интеграцию, всё заработало, но я так и не понял, как заставить Элизу написать в главный чат.
Есть функция: SendChannelMessage - а вот что ей передавать?
dkonakov
Разобрался.
Функции SendChannelMessage передавайте параметры: адрес_сервера, порт, пароль, UID откого, UID канала( у Главного канал 1, ТекстСообщения).

Сразу возник вопрос. Вот приходится размещать mychat.dll и mychatvk.dll в папке BIN текущего релиза 1с. Но дело в том, что релизы достаточно часто обновляются и придется не забывать файлы перемещать при обновлении.
У 1с есть файл 1сestart.exe, который автоматом запускает последний релиз. Быть может возможно положить файлы mychat рядом с этим файлом?