Работа с Windows Sockets в 1С Предприятие.
Разработка - Разработка внешних компонент
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Эта библиотека входит в состав пакета Visual Basic который можно установить вместе с пакетом программ MS Office. Ну или найти в Интернете.
Её полноценное использование в среде 1С:Предприятие возможно только в качестве ActiveX элемента на форме.

На форме появится значок с двумя компьютерами, примерно такой (все зависит от используемой вами операционной системы и версии библиотеки).

Не забудьте для компоненты снять флажок видимости. Компонент не имеет элементов интерфейса, тем не менее 1С пытается его отрисовать, что приводит к некрасивым результатам.

После добавления компонента на форму становятся доступными все связанные с ним свойства и события. Наиболее часто используемые события добавляются на форму свойств.

Остальные свойства и события доступны через контекстную подсказку "IntelliSense" в модуле формы.

Свойства.
Из дополнительных свойств стоит отдельно выделить свойство "State" в это свойство содержит числовое значение текущего состояния компоненты - Статус.
Список возможных значений
| Состояние | Числовое значение | Описание |
| sckClosed | 0 | Default. Closed Значение по умолчанию. Подключение закрыто. |
| sckOpen | 1 | Open Подключение активно. Соединение установлено. |
| sckListening | 2 | Listening Режим "прослушки". Компонента ждет подключение по указанному порту. |
| sckConnectionPending | 3 | Connection pending Ожидание подключения |
| sckResolvingHost | 4 | Resolving host Получение адреса компьютера (хоста) по имени. |
| sckHostResolved | 5 | Host resolved Адрес компьютера получен. |
| sckConnecting | 6 | Connecting Подключение |
| sckConnected | 7 | Connected Подключен |
| sckClosing | 8 | Peer is closing the connection Клиент закрыл подключение |
| sckError | 9 | Error Ошибка |
Свойство Protocol содержит числовой параметр, указывающий, с каким протоколом работать. Protocol принимает одно из двух возможных значений
- 0 - протокол TCP/IP
- 1 - Протокол UDP
Свойство LocalPort числовой параметр, указывающий, какой порт будем прослушивать функцией Listen().
Свойства RemotePort и RemoteHost - это параметры, указывающие по какому адресу (IP или DNS) и на какой порт совершать подключение к серверу функцией Connect().
Для каждого параметра есть одноименная функция, которая возвращает текущее значение параметра или устанавливает новое значение. За исключением параметра State, для разработчика этот параметр ReadOnly.
Доступные события.
Error - Событие возникает при возникновении какой-либо ошибки.
Сообщить(Description);
КонецПроцедуры
В параметрах события возвращается
- Number - цифровой код возникшей ошибки,
- Description - текстовое описание ошибки,
- Scode - код ошибки в типе Long (HRESULT) SCODE
- Source - описание источника ошибки,
- HelpFile - ссылка на Файл справки
- HelpContext - контекст файла справки
- CancelDisplay - флаг отмены отображения стандартного окна об ошибке. По умолчанию значение - Истина. Окно не выводится.
DataArrival - возникает при поступлении данных.
ТкстСообщения = "";
WinSocket1.GetData(ТкстСообщения);
Сообщить("Получен ответ" + Символы.ПС + ТкстСообщения);
КонецПроцедуры
В параметр bytesTotal передается числовое значение, сколько байт было принято. Сами данные можно получить функцией GetData(). В параметр этой функции нужно передать строковую переменную, в которую функция вернет полученные данные.
Connect - событие возникает при успешном подключении к серверу. Возникает только на стороне клиента.
Сообщить("Покдлючение к " + Элемент.RemoteHost + " успешно.");
КонецПроцедуры
Это событие не имеет собственных параметров.можно работать только с параметрами самой компоненты.
ConnectionRequest - серверное событие, возникает при поступлении запроса на подключение.
Сообщить("Запрос подключения");
Сост = "Подключение";
Если НЕ WinSocket.State = 0 Тогда
WinSocket.Close()
КонецЕсли;
WinSocket.Accept(requestID);
Сообщить("Приконнектился "+WinSocket.RemoteHostIP);
КонецПроцедуры
В параметр requestID поступает идентификатор подключаемого клиента. При этом, обратите внимание, что перед разрешением на подключение функцией Accept(requestID) необходимо компоненту перевести в состояние "0", т.е. закрыть открытый прослушиваемый поток.
Тут же можем получить IP-адрес подключаемого клиента из параметра RemoteHostIP.
Теперь, после установления соединения, можем передавать данные в обе стороны.
Close - Событие, возникающее при вызове метода Close() т.е. при закрытии компоненты.
SendProgress - Событие, возникающее при передаче данных, возникает при каждом переданном байте - так что не стоит навешивать слижком громоздкую или ресурсоемкую логику. Да и как показала практика, в 1С это событие использовать нет смысла, потому как процедура, связанная с этим событием, срабатывает только 1 раз, когда форма получает обратно фокус ввода.
Следующая процедура выводит прогресс отправки в окно служебных сообщений. По сути должна выводить сообщение для каждого отправленного байта. Но следующая картанка показывает что это не так.
Сообщить("Байт отправленно - " + bytesSent + "/ байт осталось - " + bytesRemaining);
КонецПроцедуры
Из картинки видно, что вызов процедуры произошел только один раз.
![]()
SendComplete - Событие, возникающее при завершении отправки данных. Следующий код демонстрирует функционирование данного события.
Сообщить("-----------------------------------");
Сообщить("" + + ТекущаяДата() + " |Отправка данных завершена! ");
Сообщить("-----------------------------------");
КонецПроцедуры
Ну и сам результат вызова.

Оригинал статьи на nastroy-ka.ru
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Внешние источники данных Разработчик Аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)
Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.
35000 руб.
15.11.2022 33877 53 49
Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)
Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.
85400 руб.
05.10.2022 14609 17 8
Розничная торговля Внешние источники данных Разработчик Бухгалтер 1С:Предприятие 8 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Бухгалтерский учет Управленческий учет Платные (руб)
Загрузка данных продаж и инкассаций из сервисов Kit Vending/Kit Shop в 1С. Реализовано в виде Расширения. Мониторинг состояний торговых автоматов.
12200 руб.
10.06.2019 34699 49 25
Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)
Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.
122000 руб.
19.08.2020 30676 28 3
Внешние источники данных Зарплата Бюджетный учет Разработчик Бухгалтер 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)
Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.
85400 руб.
24.04.2017 57691 99 165
Разработка внешних компонент POS терминал Рабочее место Розничная торговля Разработчик Пользователь 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)
Медиадисплей покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Экран можно использовать в качестве графического меню-борда в кафе и видеовывески. В качестве устройства отображения можно использовать Android-планшеты, смарт-телевизоры с Android, мониторы или проекторы под управлением Windows или Linux-компьютера. Linux-версия успешно запускается на одноплатных компьютерах Raspberri Pi и Orange Pi. Настраивается ЛЮБОЙ ДИЗАЙН экрана при помощи встроенного графического редактора! Решение можно масштабировать от одного экрана до тысяч экранов с централизованным управлением.
18300 руб.
30.05.2017 57910 12 71
Производство готовой продукции (работ, услуг) Внешние источники данных 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)
Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.
10370 руб.
24.06.2021 26869 66 55
Внешние источники данных Розничная торговля Разработчик Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Бухгалтерия 3.0 Здравоохранение, медицина, стоматология Розничная и сетевая торговля (FMCG) Россия Бухгалтерский учет Налоговый учет Платные (руб)
Внешняя обработка обмена данными между системами ЮНИКО и 1С:Бухгалтерия 3.0.
6100 руб.
01.11.2011 55507 129 81
Для работы с этими протоколами в среде Windows предназначена технология Windows Sockets.
Реализует эту технологию библиотека Mswinsock.dll (Mswinsock.ocx).
В качестве транслятора в протоколы TCP\IP или UDP данных из (в) 1С:Предприятие можно использовать ActiveX компоненту, входящую в состав библиотеки Mswinsock.dll.
В этом способе есть одна сушественная проблема. еслисоздавать сервер на стороне 1С то сервер принимает только одно подключение. Создать стек серверов из одной компоненты, как это делается в примерах для C# или VB. тут не получится, а жаль.
Я считаю, что при таких мизерных различиях реализация сокетов на платформе 1С имеет больше преимуществ чем ВК. Взять хотя бы открытость кода.
P.S. В ближайшее время на суд обществености предоставлю конфу которая как раз и реализует своеобразный мультиканальный Socket's-проксисервер.
Я считаю, что при таких мизерных различиях реализация сокетов на платформе 1С имеет больше преимуществ чем ВК. Взять хотя бы открытость кода.
P.S. В ближайшее время на суд обществености предоставлю конфу которая как раз и реализует своеобразный мультиканальный Socket's-проксисервер.
(4) написали конфу уже?
Нет, отпала в ней необходимость.
Библиотека зарегистрирована в элементах ActiveX отображаеться нормально.
Что нибудь надо дописывать?
{Форма.Форма.Форма(5)}: Поле объекта не обнаружено (State)
Если WinSocket.State <> 0 тогда
Попробуйте в режиме отладки проверить, что находится в объекте WinSocket, скорее всего у вас не создается COM-объект.
Отправить данные(клиент)- да, но сервер ожидающий прихода данных из вне(например в бесконечном цикле).... это на 1С реализовать мне кажется нормально не получится.))
Поэтому я писал свою ВК на C#, примеров в инте много, даже не зная языка мне это удалось за пару дней))
И такой закономерный вопрос: Зачем писать ВК для работы с другой ВК?
Еще одним преимуществом использования событий по сравнению с Com-сервером, вижу то, что 1С не "зависает" отслеживая циклами изменение состояния.
Исправлю в статье информацию о том где взять компоненту.
Попытка
ws = Новый COMОбъект("mswinsock.winsock");
Исключение
Возврат Ложь;
КонецПопытки;
//Попытка
ДобавитьОбработчик ws.Close, Close;
ДобавитьОбработчик ws.Connect, Connect;
ДобавитьОбработчик ws.ConnectionRequest, ConnectionRequest;
ДобавитьОбработчик ws.DataArrival, DataArrival;
ДобавитьОбработчик ws.Error, Error;
ДобавитьОбработчик ws.SendComplete, SendComplete;
ДобавитьОбработчик ws.SendProgress, SendProgress;
//Исключение
//КонецПопытки;
Возврат Истина;
Спасибо за пример.
А из (19) можно взять реализацию программного создания экземпляра библиотеки с привязкой процедур в модуле объекта, а не на форме - позволит работать на стороне сервера в фоне.
Пример
Попытка
ws = Новый COMОбъект("mswinsock.winsock");
ДобавитьОбработчик ws.Close, Close;
ДобавитьОбработчик ws.Connect, Connect;
...
КонецПопытки;
Попытка
ws_2 = Новый COMОбъект("mswinsock.winsock");
ДобавитьОбработчик ws_2.Close, Close_2;
ДобавитьОбработчик ws_2.Connect, Connect_2;
...
КонецПопытки;
Относительно вашего замечания по использованию технологий .Net - полностью с вами согласен! Но я не спец по этой технологии и написать соответствующую ВК не в состоянии, нужно потратить много времени на изучение, а нужно было здесь и сейчас, вот и пришлось использовать то, что есть.
Как старую компоненту заставить работать на X64 показано на видео
Я эту проблему решил следующим образом
1. создаю обработку "прослушку" предопределенного порта
2. когда на порт поступает входящий запрос создаю инстанс обработки "proxy" в которой назначаю новый порт и передаю этот порт клиенту с требованием переподключиться на него.
3. "Прослушку" опять перевожу в режим прослушки на предопределенный порт.
В примере нет справки и код не причесан, но суть понять можно.
(43)
По многопоточности. Теоретически можно подойти к вопросу еще одним образом. Программно разместить на форме требуемое количество невидимых экземпляров ActiveX WinSock в соответствии с количеством портов, требующих прослушки. Программно назначить им одни и те же процедуры-обработчики событий. При этом в каждую процедуру при наступлении события будет платформой передаваться соответствующий экземпляр компоненты в параметр "Элемент", т.о. мы сможем всегда определить от какого экземпляра пришло событие и обработать его соответствующим образом.
Как Вам такая идея реализации?
подробнее про индексы в (43).
А если посмотреть на пример из (19) то необходимость создавать компоненты на форме отпадает сама собой. И приведенные примеры можно организовывать на стороне сервера.
Использование компоненты на стороне сервера сразу решает вопрос использования компоненты в управляемых формах.
Это решение вопроса для (27)
Но если нужно прослушивать много портов, подход в (19) усложняет жизнь. Если мы назначим программно события, мы в событии не узнаем каким конкретно экземпляром оно рождено. Либо создавать наборы событий для каждого экземпляра, но это не всегда гибко.
Как поставить компоненту через Офис или Basic так и не понял.
Очень помогло вот это, магия заработала!
Компонента появилась, но сначала писала ошибку типа
{ВнешняяОбработка.WinSocksServer.Форма.Форма.Форма(88)}: Ошибка при вызове конструктора (COMОбъект): -2147221230(0x80040112): Класс не лицензирован для использования
Но потом догадался снова запустить ключ реестра и все заработало!
Автору огромное спасибо!
Есть проблема в Winsock.
На Windows server 2008 32-bit компонента не работает нормально.
При размещении ActiveX объекта на форме добавляется новый элемент, но в палитре свойств нет его специфических свойств и событий. Программно тоже не видит свойства и методы.
На Windows XP работает нормально.
На Windows 7 такая же проблема.
Может, кто сталкивался с проблемой?
1.MSWINSCK.ocx
2.license.reg
3.mswsock.dll - это стандартная библиотека Windows
Ключик из license.reg
[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]
@="mlrljgrlhltlngjlthrligklpkrhllglqlrk"
А подскажите пож-а, в фоновом задании программно создаю WinSock, подключаюсь как положено через Connect(), назначаю для него событие "ДобавитьОбработчик ws.Connect, Connect" кручу бесконечный цикл, а в событие не падает? Почему? Возможно ли вообще реализовать вызов внешних событий в фоновом задании?
При использовании того же когда на клиенте, все работает ок.
Попытка
ws = Новый COMОбъект("mswinsock.winsock");
Исключение
Возврат Ложь;
КонецПопытки;
//Попытка
ДобавитьОбработчик ws.Close, Close;
ДобавитьОбработчик ws.Connect, Connect;
ДобавитьОбработчик ws.ConnectionRequest, ConnectionRequest;
ДобавитьОбработчик ws.DataArrival, DataArrival;
ДобавитьОбработчик ws.Error, Error;
ДобавитьОбработчик ws.SendComplete, SendComplete;
ДобавитьОбработчик ws.SendProgress, SendProgress;
//Исключение
//КонецПопытки; ПоказатьПишет, что "Метод объекта не обнаружен"...ни один...в чем может быть проблема ?
С созданным на форме объектом работало нормально, но нужно создавать программно, а я не могу назначить ему обработчики событий.
Попытка
ws = Новый COMОбъект("mswinsock.winsock");
Исключение
Возврат Ложь;
КонецПопытки;
//Попытка
ДобавитьОбработчик ws.Close, Close;
ДобавитьОбработчик ws.Connect, Connect;
ДобавитьОбработчик ws.ConnectionRequest, ConnectionRequest;
ДобавитьОбработчик ws.DataArrival, DataArrival;
ДобавитьОбработчик ws.Error, Error;
ДобавитьОбработчик ws.SendComplete, SendComplete;
ДобавитьОбработчик ws.SendProgress, SendProgress;
//Исключение
//КонецПопытки;
...Показать ПоказатьПишет, что "Метод объекта не обнаружен"...ни один...в чем может быть проблема ?
С созданным на форме объектом работало нормально, но нужно создавать программно, а я не могу назначить ему обработчики событий.
При использовании кода через пару секунд (наверное на подключение) 1с просто ругает на Runtime и валится((
&НаСервере
Процедура СнятьTCPНаСервере()
WinSock = Новый COMОбъект("MSWinsock.Winsock");
Если WinSock.State <> 7 Тогда
Если WinSock.State <> 0 Тогда
WinSock.Close();
КонецЕсли;
WinSock.RemoteHost = СокрЛП(Адрес);
WinSock.RemotePort = СокрЛП(Порт);
WinSock.Protocol = 0;
WinSock.Connect();
КонецЕсли;
ДобавитьОбработчик ws.Close, Close;
ДобавитьОбработчик ws.Connect, Connect;
ДобавитьОбработчик ws.ConnectionRequest, ConnectionRequest;
ДобавитьОбработчик ws.DataArrival, DataArrival;
ДобавитьОбработчик ws.Error, Error;
ДобавитьОбработчик ws.SendComplete, SendComplete;
ДобавитьОбработчик ws.SendProgress, SendProgress;
КонецПроцедуры ПоказатьПроцедура на клиенте
Адрес="192.168.1.100";
порт="6000";
Попытка
WinSocket1 = Новый COMОбъект("MSWinsock.Winsock");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//WinSocket1.Protocol =0;
Если WinSocket1.State <> 7 тогда
Если WinSocket1.State <> 0 Тогда
WinSocket1.Close();
КонецЕсли;
WinSocket1.RemoteHost = СокрЛП(Адрес);
WinSocket1.RemotePort = СокрЛП(Порт);
WinSocket1.Connect();
КонецЕсли;
Если WinSocket1.State = 7 тогда //Подключились удачно, отправляем данные
WinSocket1.SendData("1234567");
Иначе
Сообщить( WinSocket1.State);
КонецЕсли; ПоказатьСтатус постоянно 6. В какие-то моменты сервер принимает подключения, но самого сообщения нет.
Подскажите как решить проблему? спасибо!
ActiveX нельзя, поэтому подключаем COMобъект и храним его в параметрах сеанса:
Процедура ПриОткрытииНаСервере()
Контроллер = Новый COMОбъект("mswinsock.winsock");
ПараметрыКонтроллера = Новый Структура("Адрес, Порт");
ПараметрыКонтроллера.Адрес = "xxx.xxx.xxx.xxx";
ПараметрыКонтроллера.Порт = "pppp";
СтруктОбъекта = Новый Структура("Контроллер",Контроллер);
ПараметрыСеанса.Z5=ПоместитьВоВременноеХранилище(СтруктОбъекта,Новый УникальныйИдентификатор());
ИнициализироватьПодключение(ПараметрыКонтроллера);
КонецПроцедуры
//------------------------------------------
&НаСервере
Процедура ИнициализироватьПодключение(ПараметрыПодключения)
ws = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Z5).Контроллер;
// ws = Новый COMОбъект("mswinsock.winsock");
Если ws.State <> 7 тогда
Если ws.State <> 0 Тогда
ws.Close();
КонецЕсли;
ws.RemoteHost = СокрЛП(ПараметрыПодключения.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
ws.RemotePort = СокрЛП(ПараметрыПодключения.Порт);
ws.Connect();
Иначе
ws.Close();
ws.RemoteHost = СокрЛП(ПараметрыПодключения.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
ws.RemotePort = СокрЛП(ПараметрыПодключения.Порт);
ws.Connect();
КонецЕсли;
Объект.Статус = ws.state; //передаем статус отображаем его на форме
КонецПроцедуры
//Событие DataArrival недоступно! Поэтому создаем тандемом 2 обработчика ожидания:
//Отправка команды, ниже ожидание ответа:
&НаКлиенте
Процедура ВыполнитьКоманду()
ПолучитьСтатус();
Элементы.Статус.Заголовок = Объект.Статус;
Если Объект.Статус = 0 Тогда //Не подключено
ПриОткрытииНаСервере();
Возврат;
ИначеЕсли Объект.Статус = 6 Тогда // еще идет подключение
Возврат;
КонецЕсли;
УправлениеДоступностью(Ложь); //ничего нельзя делать на форме
Результат = ОтправитьДанные(); // Ниже функция отправки
Элементы.Статус.Заголовок = Объект.Статус;
Если Результат Тогда
Объект.Лог = Формат(ТекущаяДата(),"ДЛФ=DT") + ": " + Объект.Команда +" --> " + Символы.ПС + Объект.Лог;
Объект.Лог = Объект.ТекстСообщения + Символы.ПС + Объект.Лог;
ОтключитьОбработчикОжидания("ВыполнитьКоманду"); //Команда выполнилась, отключаем этот обработчик
ПодключитьОбработчикОжидания("ПолучитьОтвет",1); //Подключаем ожидание ответа Многократно
Иначе
Если Объект.Статус = 9 Тогда //ошибка, не расшифровать нафиг
ПриОткрытииНаСервере(); //реконнект (кстати не помогает. Только отключение кабеля)
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Ежесекундная проверка ответа
&НаКлиенте
Процедура ПолучитьОтвет()
Элементы.Статус.Заголовок = Объект.Статус;
Результат = ПолучитьОтветНаСервере(); //ф-я ниже
Элементы.Статус.Заголовок = Объект.Статус;
Если Результат Тогда
ОтключитьОбработчикОжидания("ПолучитьОтвет"); //ответ получен, отключаем обработчик
Объект.Лог = Формат(ТекущаяДата(),"ДЛФ=DT") + ": " +Объект.Команда +" <-- " + Символы.ПС + Объект.Лог;
Объект.Лог = Объект.ОтветКонтроллера + Символы.ПС + Объект.Лог;
ВыполнитьОбработкуОтвета(); // Здесь много условий которые получают название команды и соответственно ее обрабатывают
Иначе
ПриОткрытииНаСервере(); /реконнект
КонецЕсли;
КонецПроцедуры
//Отправляет данные через SendData()
&НаСервере
Функция ОтправитьДанные()
Результат = Ложь;
Контроллер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Z5).Контроллер; //получили winsocket из параметров сеанса
buff = ПреобразоватьДляОтправки(Объект.ТекстСообщения); // преобразование в массив HEX требуется для моего контроллера
buff[0] = "&H" + Объект.ТипКоманды;
ВОтправку = "";
Для н = 0 По buff.Количество()-1 Цикл
ВОтправку =ВОтправку + buff[н] + " ";
КонецЦикла;
Объект.Статус = Контроллер.State;
Если Контроллер.State = 7 тогда //Подключились удачно, отправляем данные
Попытка
Для н = 0 По buff.Количество()-1 Цикл
Контроллер.SendData(Chr(buff[н])); // отправляю посимвольно из буфера Chr(Код) - функция с VBScript которая преобразует из HEX в символ.
КонецЦикла;
Результат = Истина;
Исключение
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции ПоказатьСобственно, отправка команды:
Объект.ТипКоманды = "20";
Объект.Команда = "ПолучитьАдресКонтроллера";
Объект.ТекстСообщения = "00 08 08 01 00 00 00 00";
ПодключитьОбработчикОжидания("ВыполнитьКоманду",1);
Функция обработки полученных ответов:
&НаКлиенте
Процедура ВыполнитьОбработкуОтвета()
// БуферПриема = СтрокуВМассивы(Объект.ОтветКонтроллера);
Если Объект.Команда = "ПолучитьАдресКонтроллера" Тогда
М4 = ОтветВМассив();
ФлагПриема = Истина;
//Расшифруем полученные данные
i = 8;
Пока i < 20 Цикл
текАдр = АдресКонтроллера(М4[i], i - 8);
Если ТекАдр.Количество()>0 Тогда
Для Каждого Эл Из ТекАдр Цикл
Объект.СписокКонтроллеров.Добавить(Эл.Значение);
КонецЦикла;
КонецЕсли;
i = i + 1;
КонецЦикла;
Объект.Команда = "";
ИначеЕсли Объект.Команда = "СписокКарт" Тогда
..........................................
КонецЕсли;
УправлениеДоступностью(Истина);
КонецПроцедуры
ПоказатьМедленно, но работает!!!
Надеюсь, кому-нибудь пригодится.
Есть мнение, кому не жалко немного времени, создать ВК с методами:
1. Подключить(Адрес,Порт) Возвращает Истина, Ложь
2. ОтправитьСтроку(Строка) Возвращает Истина Ложь
3. ПрочитатьОтвет() Возвращает ответы, накопленные в буфере Возможен вариант, В какой-либо переменной появляется ответ, который на стороне 1С можно прочитать и/или удалить, если прочитали
4. Отключить
Там строк 50 текста будет, которые повысят стабильность, избавят от асинхронности в 1С, которая требует обработчиков, которые работают 1 раз в секунду.
Понимаю, что можно было организовать иначе, но основное требование - минимум изменений. Добавлено в конфигурацию только: переменная Z5 в параметры сеансов
WinSocket = Новый COMОбъект("MSWinsock.Winsock");при вызове на сервере валится с ошибкой
Ошибка при вызове конструктора (COMОбъект)
WinSocket = Новый COMОбъект("MSWinsock.Winsock");
по причине:
-2147221164(0x80040154): Class not registered.
Платформа 8.3.12.1567.
На клиенте всё работает...
Для всех этих библиотек есть сови собственные лицензии.
На мисте появлялась подобная проблема, но с другой библиотекой. В обсуждении скидывали лицензии наиболее часто используемых библиотек. Может и этот класс есть.
Лицензии вроде установлены, по инструкции .
А из приведенной Вами ссылке взял вторую пару ключ-лицензия.
Но без толку.
Единственное что поменялось, это после 2х попыток поставить Visual Basic 6 (на win10 видимо не станет, виснет при установке) из комментария выше (50), текст ошибки снова показывает другой класс.
-2147221164(0x80040154): Класс не зарегистрирован
(93)
Кодировка пакета с расчетом контрольной суммы. Если требуется, можно поискать в архивах документацию. Модуль выглядит страшновато...
Функция ПреобразоватьДляОтправки(ТекстСообщения)
Скрипт = Новый COMObject("MSScriptControl.ScriptControl");
Скрипт.language = "vbscript";
М4 = РазложитьСтрокуВМассив(Объект.ТекстСообщения);
//вычисляем длину для отправки
стр = "5 * Int((&H" + м4[1] + " + 3) / 4) + 1";
lgs = HEX(Скрипт.Eval("" + стр));
lgs_ = ToDEC(lgs,16);
lgs = "&H" + lgs;
//Контрольная сумма
ht = 0;
i=0;
j=1;
Пока i < м4.Количество()-1 Цикл
ht ="&H" + HEX(Скрипт.eval("&H" + м4[i] + " + " + ht));
i = i + 1;
КонецЦикла;
Стр = ht + " - Int(" + ht + " / &H100) * &H100";
ht = "&H" + HEX(Скрипт.Eval("" + стр));
стр = "&H100 - " + ht;
ht = "&H" + HEX(Скрипт.Eval("" + стр));
Если ht = "&H100" Тогда
ht = "&H" + HEX(0);
КонецЕсли;
м4[0] = hex(ht);
//пишем в буфер
i=0;
buff = новый массив(lgs_+1);
j = 1;//1
i = 0;
Пока j < lgs_ Цикл
//'пишем в буфер
//'формируем 0 байт
стр = "((&H" + м4[i] + " AND " + "&H80)/&H10)+" + "((&H" + м4[i+1] + " AND " + "&H80)/&H20)+" + "((&H" + м4[i+2] + " AND " + "&H80)/&H40)+" + "((&H" + м4[i+3] + " AND " + "&H80)/&H80)";
нн = HEX(Скрипт.Eval("" + стр));
buff[j] ="&H" + нн;
If СравнитьHEX(buff[j]," < ", "&H30") Then //параметры А, знак "<,>,=", B вернет булево
стр = "&HCA Xor " + buff[j];
нн = HEX(Скрипт.Eval("" + стр));
buff[j] = "&H" + нн; // &HCA Xor Buf.buff(j)
EndIf;
//'формируем 1 байт //Buf.buff(j + 1) = m4(i) And &H7F
стр ="&H" + м4[i] + " AND &H7F";
нн = HEX(Скрипт.Eval("" + стр));
buff[j + 1] = "&H" + нн;
If СравнитьHEX(buff[j + 1], " < ", "&H30") Then //buff(j + 1) = &HCA Xor Buf.buff(j + 1)
стр = "&HCA Xor " + buff[j+1];
нн = HEX(Скрипт.Eval("" + стр));
buff[j+1] = "&H" + нн;
EndIf;
//'формируем 2 байт
стр ="&H" + м4[i+1] + " AND &H7F";
нн = HEX(Скрипт.Eval("" + стр));
buff[j + 2] = "&H" + нн;
If СравнитьHEX(buff[j + 2], " < ", "&H30") Then
стр = "&HCA Xor " + buff[j+2];
нн = HEX(Скрипт.Eval("" + стр));
buff[j+2] = "&H" + нн;
EndIf;
//'формируем 3 байт
стр = "&H" + м4[i+2] + " AND &H7F";
нн = HEX(Скрипт.Eval("" + стр));
buff[j + 3] = "&H" + нн;
If СравнитьHEX(buff[j + 3], " < ", "&H30") Then
стр = "&HCA Xor " + buff[j+3];
нн = HEX(Скрипт.Eval("" + стр));
buff[j+3] = "&H" + нн;
EndIf;
//'формируем 4 байт
стр = "&H" + м4[i+3] + " AND &H7F";
нн = HEX(Скрипт.Eval("" + стр));
buff[j + 4] = "&H" + нн;
If СравнитьHEX(buff[j + 4], " < ", "&H30") Then
стр = "&HCA Xor " + buff[j+4];
нн = HEX(Скрипт.Eval("" + стр));
buff[j+4] = "&H" + нн;
EndIf;
j = j + 5;
i = i + 4;
КонецЦикла;
buff[lgs_]="&H0D";
Возврат buff;
КонецФункции
Показатьчитаю и вспомнил. Инструкции не было, были исходники на С, java и чем-то еще. Буквально, переводил код функции преобразования оттуда на "русский язык", не задумываясь. Получилось что-то мало напоминающее 1С. И да, самому страшно смотреть)))))
Спасибо за ответ. Помогите еще плиз
Я вот подключаюсь, вижу статус = 7
мне дали команду которую надо отправить
ws.senddata("08AB00000009011052890001020002");
но реакции - ноль.
Если эти данные отправляю приблудой, которая к контроллеру идет - все ок, данные в регистре контроллера меняются.
Вот вы отправляете побайтно в цикле. Это почему так, строку сразу нельзя? Или мне ее тоже надо перекодировать? Во что? в двоичные данные или как?
Вот вымученные функции подключения к контроллеру:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.AddINКомпоненты = "" Тогда
Объект.AddINКомпоненты = "mswinsock.winsock.1";
КонецЕсли;
Если Объект.ТаймаутОпроса = 0 Тогда
Объект.ТаймаутОпроса = 10;
КонецЕсли;
Объект.НоваяКарта = Ложь;
ИспользоватьПодключаемоеОборудование=Истина;
// ПодключаемоеОборудование
МенеджерОборудованияКлиентПереопределяемый.НачатьПодключениеОборудованиеПриОткрытииФормы(ЭтаФорма, "СканерШтрихкода,СчитывательМагнитныхКарт");
// Конец ПодключаемоеОборудование
ПоказатьЛогПриИзменении(Элементы.ПоказатьЛог);
//Попытка
Результат = ВыполнитьПодключениеККонтроллеру(); // <=== Это она!!!
//Исключение
Если НЕ Результат Тогда
Сообщить("Нет подключения. Проверьте настройки. Нажмите кнопку [Обновить]");
Возврат;
КонецЕсли;
&НаКлиенте
Функция ВыполнитьПодключениеККонтроллеру()
Попытка
Контроллер = Новый COMОбъект(Объект.AddINКомпоненты);
ПараметрыКонтроллера = Новый Структура("Адрес, Порт");
ПараметрыКонтроллера.Адрес = Объект.АдресПодключения;
ПараметрыКонтроллера.Порт = Объект.ПортПодключения;
// ws = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Z5).Контроллер;
// ws = Новый COMОбъект("mswinsock.winsock");
Если Контроллер.State <> 7 тогда
Если Контроллер.State <> 0 Тогда
Контроллер.Close();
КонецЕсли;
Контроллер.RemoteHost = СокрЛП(ПараметрыКонтроллера.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
Контроллер.RemotePort = СокрЛП(ПараметрыКонтроллера.Порт);
Контроллер.Connect();
Иначе
Контроллер.Close();
Контроллер.RemoteHost = СокрЛП(ПараметрыКонтроллера.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
Контроллер.RemotePort = СокрЛП(ПараметрыКонтроллера.Порт);
Контроллер.Connect();
КонецЕсли;
ДобавитьОбработчик Контроллер.Connect, Connect;
ДобавитьОбработчик Контроллер.ConnectionRequest, ConnectionRequest;
ДобавитьОбработчик Контроллер.DataArrival, DataArrival;
ДобавитьОбработчик Контроллер.Error, WinSocketError;
// СтруктОбъекта = Новый Структура("Контроллер",Контроллер);
// ПараметрыСеанса.Z5=ПоместитьВоВременноеХранилище(СтруктОбъекта,Новый УникальныйИдентификатор());
// ИнициализироватьПодключение(ПараметрыКонтроллера);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
ПоказатьНарочно оставил комментарии, чтобы видели мои ошибки.
Обратите внимание на это условие. Видно не спроста. Делал в 2017, уже не помню, почему так:
Если Контроллер.State <> 7 тогда
Если Контроллер.State <> 0 Тогда
Контроллер.Close();
КонецЕсли;
//.......
Контроллер.Connect(); //Проверили, что может быть уже подключен, но если нет, то подключаем.
Иначе //А если статус = 7 (подключен), то закрываем соединение и открываем вновь
Контроллер.Close();
Контроллер.RemoteHost = СокрЛП(ПараметрыКонтроллера.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
Контроллер.RemotePort = СокрЛП(ПараметрыКонтроллера.Порт);
Контроллер.Connect();
КонецЕсли;
ПоказатьСтранное условие, но вымученное и работало.
Утилиту какую-то ведь дали для установки на Win и тестированию устройства? Если да, то слушайте какую-либо команду и пытайтесь ее повторить из 1С. Я так делал для проверки правильности.
Никита, с этой компонентой никак, посмотри в командах WMI для работы с окружением ОС.
Там скорее всего есть.
MsgBox "IP address for " & Server & " is " & _
Winsock.RemoteHostIP, vbInformation, AppName
CloseMsgBox
End Sub
Узнать IP-адрес удаленного компьютера можно так как метод Connect является асинхронным - то есть возврат из него осуществляется сразу же, не дожидаясь установления соединения. Чтобы узнать о соединении (или о произошедшей ошибке), нам нужно дождаться события Connect (или, соответственно, события Error). Воспользуемся простейшим вариантом - после метода Connect покажем message box, а после получения события - закроем его.
#Область ComObject_WinSocket
&НаКлиенте
Процедура InitWinSocketClient()
Порт = 8888;
Хост="10.4.1.8";
WinsocketClient = Новый COMObject("mswinsock.winsock");
ДобавитьОбработчик WinsocketClient.Connect, ПриПодключенииКлиентаКCерверу;
ДобавитьОбработчик WinsocketClient.SendProgress, WinSocketSendProgress;
ДобавитьОбработчик WinsocketClient.SendComplete, WinSocketSendComplete;
ДобавитьОбработчик WinsocketClient.DataArrival, WinSocketDataArrival;
ДобавитьОбработчик WinsocketClient.Error, WinSocketError;
WinsocketClient.RemoteHost = Хост;
WinsocketClient.RemotePort = Порт;
Попытка
WinsocketClient.Connect();
// само подключение состоится только после выхода из текущего метода
// после подключения выполнится ПриПодключенииКлиентаКсерверу
Исключение
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура WinSocketSendProgress(bytesSent, bytesRemaining)
Состояние("Передача списка",(bytesSent+bytesRemaining)/bytesSent*100);
КонецПроцедуры
&НаКлиенте
Процедура WinSocketSendComplete()
Сообщить(Строка(ТекущаяДата()) + " | Отправка данных завершена!!! ");
КонецПроцедуры
&НаКлиенте
Процедура WinSocketError(Number, Description, Scode, Source, HelpFile,HelpContext, CancelDisplay)
Сообщить("Ошибка передачи:"+ Description);
КонецПроцедуры
&НаКлиенте
Процедура WinSocketDataArrival(bytesTotal)
ТкстСообщения = "";
WinsocketClient.GetData(ТкстСообщения, bytesTotal);
Сообщить(ТкстСообщения);
КонецПроцедуры
&НаКлиенте
Процедура ПриПодключенииКлиентаКCерверу() Экспорт
//КодДляПередачи=686;
// Если ЗначениеЗаполнено(ЗаписьJSON) Тогда
WinsocketClient.SendData(ЗаписьJSON.Закрыть());
// КонецЕсли;
УдалитьОбработчик WinsocketClient.Connect, ПриПодключенииКлиентаКCерверу;
КонецПроцедуры
#КонецОбласти
ПоказатьDataArrival в 1С не совсем работает
На стороне сервера ошибок с отправкой не возникает?
Нарыл на мисте ветку, где обсуждается похожий вопрос. И проблем с DataArrival нет
В 1С оно не доступно, к сожалению!
Пытался сделать некий суррогат.
Одна обработка с инициализированной библиотекой - слушателем, который принимает на определенный порт запрос от клиента на подключение. В ответ, создается экземпляр обработки - сервера. В этой обработке мы открываем новую копию библиотеки с новым портом. Этот порт записываем в таблицу.
Далее на запрос клиента скидываем ему адрес порта из созданного сервера с командой на переподключение.
Довести до ума не довелось, сменилась программа клиент и такое подключение более не востребовано.
Пробовал на разных операционных системах. Заработало только на WinXP.
На win7 и win10 ни в какую не хочет работать. Пробовал и разные версии 1С и разные версии компоненты и как в (37) описано в видеоролике прописывать через службы компонентов. Чувствую, что что-то делаю не так, а что - не пойму.
Возможно вам проще будет реализовать функционал средствами 1С через подключение обработчиков функцией ПодключитьОбработчик, как в 75 посте
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.AddINКомпоненты = "" Тогда
Объект.AddINКомпоненты = "mswinsock.winsock.1";
КонецЕсли;
Если Объект.ТаймаутОпроса = 0 Тогда
Объект.ТаймаутОпроса = 10;
КонецЕсли;
Объект.НоваяКарта = Ложь;
ИспользоватьПодключаемоеОборудование=Истина;
// ПодключаемоеОборудование
МенеджерОборудованияКлиентПереопределяемый.НачатьПодключениеОборудованиеПриОткрытииФормы(ЭтаФорма, "СканерШтрихкода,СчитывательМагнитныхКарт");
// Конец ПодключаемоеОборудование
ПоказатьЛогПриИзменении(Элементы.ПоказатьЛог);
//Попытка
Результат = ВыполнитьПодключениеККонтроллеру(); // <=== Это она!!!
//Исключение
Если НЕ Результат Тогда
Сообщить("Нет подключения. Проверьте настройки. Нажмите кнопку [Обновить]");
Возврат;
КонецЕсли;
&НаКлиенте
Функция ВыполнитьПодключениеККонтроллеру()
Попытка
Контроллер = Новый COMОбъект(Объект.AddINКомпоненты);
ПараметрыКонтроллера = Новый Структура("Адрес, Порт");
ПараметрыКонтроллера.Адрес = Объект.АдресПодключения;
ПараметрыКонтроллера.Порт = Объект.ПортПодключения;
// ws = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Z5).Контроллер;
// ws = Новый COMОбъект("mswinsock.winsock");
Если Контроллер.State <> 7 тогда
Если Контроллер.State <> 0 Тогда
Контроллер.Close();
КонецЕсли;
Контроллер.RemoteHost = СокрЛП(ПараметрыКонтроллера.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
Контроллер.RemotePort = СокрЛП(ПараметрыКонтроллера.Порт);
Контроллер.Connect();
Иначе
Контроллер.Close();
Контроллер.RemoteHost = СокрЛП(ПараметрыКонтроллера.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
Контроллер.RemotePort = СокрЛП(ПараметрыКонтроллера.Порт);
Контроллер.Connect();
КонецЕсли;
ДобавитьОбработчик Контроллер.Connect, Connect;
ДобавитьОбработчик Контроллер.ConnectionRequest, ConnectionRequest;
ДобавитьОбработчик Контроллер.DataArrival, DataArrival;
ДобавитьОбработчик Контроллер.Error, WinSocketError;
// СтруктОбъекта = Новый Структура("Контроллер",Контроллер);
// ПараметрыСеанса.Z5=ПоместитьВоВременноеХранилище(СтруктОбъекта,Новый УникальныйИдентификатор());
// ИнициализироватьПодключение(ПараметрыКонтроллера);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
ПоказатьНарочно оставил комментарии, чтобы видели мои ошибки.
Обратите внимание на это условие. Видно не спроста. Делал в 2017, уже не помню, почему так:
Если Контроллер.State <> 7 тогда
Если Контроллер.State <> 0 Тогда
Контроллер.Close();
КонецЕсли;
//.......
Контроллер.Connect(); //Проверили, что может быть уже подключен, но если нет, то подключаем.
Иначе //А если статус = 7 (подключен), то закрываем соединение и открываем вновь
Контроллер.Close();
Контроллер.RemoteHost = СокрЛП(ПараметрыКонтроллера.Адрес);
// ws.RemoteHostIP = СокрЛП(ПараметрыПодключения.Адрес);
Контроллер.RemotePort = СокрЛП(ПараметрыКонтроллера.Порт);
Контроллер.Connect();
КонецЕсли;
ПоказатьСтранное условие, но вымученное и работало.
buff = ПреобразоватьДляОтправки(Объект.ТекстСообщения);
//buff - массив вида "08","AB","00"....
buff[0] = "&H" + Объект.ТипКоманды; //добавление первого байта - тип команды контроллера
//в моём виде массив с Вашей командой выглядит как &H0,&H8A,&HB0,&H00, ... и т.д. 00009011052890001020002
//т.к. я использую VBScript для преобразования в ASCII. Была, что-ли, проблема с управляющими символами
//ниже отправляю побайтно
Для н = 0 По buff.Количество()-1 Цикл
Контроллер.SendData(Chr(buff[н])); //Chr(buff[н]) - ниже
КонецЦикла;
Результат = Истина;
//а вот функция преобразования
&НаКлиенте
Функция Chr(Code)
sc = Новый COMОбъект("MSScriptControl.ScriptControl"); //можно один раз объявить переменную на клиенте, а не дергать постоянно, но было не до этого.
sc.language="VBscript";
Возврат sc.eval("Chr("""+Code+""")");
КонецФункции ПоказатьОтпишитесь о результатах. интересно.
ЗЫ: Может и не побайтно, а сформировать команду целиком, как я уже говорил. Контроллер.SendData("asdfg123456..."). В моем случае требовалось побайтно, типа:
.....
SendData("a");
SendData("b");
......
Вы передаете в ф-цию CHR на VBScript не HEX а STRING.
В функцию должно приходить не "AB" а "&HAB", где &H - показывает, что Вы передаете HEX.
08,AB,00,00,00,09,01,10,52,89,00,01,02,00,02
&НаКлиенте
Процедура Преобразовать(Команда)
buff = стрРазделить(код,",");
аа = "";
Для н = 0 По buff.Количество()-1 Цикл
преобразованное = Chr("&H" + buff[н]); //Chr(buff[н]) - ниже
ааа = ааа + преобразованное;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция Chr(Code)
sc = Новый COMОбъект("MSScriptControl.ScriptControl"); //можно один раз объявить переменную на клиенте, а не дергать постоянно, но было не до этого.
sc.language="VBscript";
симв = sc.eval("Chr("""+Code+""")");
Возврат симв;
КонецФункции
ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 119982
Создание 09.03.12 04:14
Обновление 15.03.12 17:34
Просмотры 85248
Загрузки 290
Рейтинг
149
Комментарии 99
Код открыт Не указано
Рубрики Внешние источники данных Разработка внешних компонент
Кому
Системный администратор
,
Разработчик
Тип файла Архив с данными
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)