gifts2017

Программа - всплывающий клиент для оповещения и работы с 1С без интерактивного запуска самого 1С:Предприятия пользователем

Опубликовал Alexander Vaniev (Kis_s) в раздел Программирование - Инструментарий

Клиент при запуске подключается к 1C:Предприятию. После этого висит в системном трее и с определенной периодичностью опрашивает базу данных. В случае каких-либо изменений, показывает пользователю необходимую информацию. Также, прямо в окне клиента можно реализовать Web интерфейс для каких-нибудь несложных действий, например, утверждения Заявок или Участия в корпоративном чате. Таким образом можно организовать двустороннюю связь Клиент - 1С:Предприятие без открытия главного окна программы.

//------------------------------------------------------------------------------------------------------------------------------------
Состав комплекта

PopUp1C.exe - Программа-клиент
PopUp1C.ini - файл настроек клиента (редактируется блокнотом). Должен иметь то же название, что и исполняемый файл клиента.
PopUp1C.html - Файл общего шаблона для всех окон программы. При выводе очередных данных в этом файле строка "PopUp1C Content" заменяется на содержание.
default.css - Файл html стилей, используемых при выводе страниц клиента.
ReadMe.html - Файл этого описания.
IMG\*.png - Картинки, используемые системой.
SCR\*.png - скриншоты клиента 
1Cv8.dt - Демонстрационная база данных 1С:Предприятие 8.2 с общим модулем PopUp1C, который наглядно демонстрирует возможности системы.

//------------------------------------------------------------------------------------------------------------------------------------
Быстрый старт

- Восстановить из 1Cv8.dt базу данных 1С:Предприятие (можно 8.2, а можно и 8.3, убрав все ограничения)
- Открыть блокнотом файл PopUp1C.ini и в нем прописать:

Путь к развернутой базе данных 1С (имя пользователя и пароль не менять):
;Строка подключения к базе данных
DB="File='F:\c++\PopUp1C\Db';usr='Иванов';pwd='';"

Тип Com, используемый в Вашей системе. Для 8.2 это будет "V82.Application". Для 8.3 это будет "V83.Application".
;COM объект
Application=V82.Application

- Запустить клиента и убедиться, что он не выдает в своем окне ошибок.

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

//------------------------------------------------------------------------------------------------------------------------------------
Алгоритм работы

По-умолчанию, клиент открывает и постоянно держит Com соединение с базой данных. Но, если период опроса выставить довольно большой, то можно указать, что соединяться нужно каждый раз при опросе базы данных (PermanentConnection=0)
[CONFIG]
;Сохранять постоянное соединение
PermanentConnection=1

Клиент после соединения вызывает в 1С глобальную функцию, указанную в настройках ini файла:
[INDEX]
;Первоначально вызываемая глобальная функция в 1С PopUpIndex(Параметр1="") Экспорт
IndexFunction = PopUpIndex
;В 1С глобальная функция получит это значение:
Parameter1=

Полученный из функции html код помещает в шаблон PopUp1C.html на место строки "PopUp1C Content" и получившийся результат выводит в свой экран.
Если пользователь свернул клиента в системный трей, но текст с последнего опроса этой функции изменился - окно клиента автоматически всплывает поверх всех приложений Windows.
Значок в системном трее имеет контекстное меню, которое позволяет управлять видимостью клиента. При выборе пункта "Update" окно клиента также показывается, если было скрыто.
По левой кнопке на значке клиента - просто показывается.

Во время работы пользователь может переходить по ссылкам или выполнять какие-либо действия в окне клиента, но, если при очередном запросе к базе данных html код от текущей функции изменится - окно клиента будет полностью обновлено!

//------------------------------------------------------------------------------------------------------------------------------------
Особенности работы и написания html кода для страниц клиента

Клиент помнит имя текущей глобальной функции 1С:Предприятия, у которой он запрашивает данные. Эта функция в процессе перехода по ссылкам и страницам может меняться.


Существует несколько перехватываемых клиентом управляющих ID объектов:

<a href="" ID="Home">Home</a> - отправляет пользователя на начальную функцию, описанную в [INDEX]IndexFunction и в дальнейшем вызывает её, пока не будет переопределения.
<a href="" ID="Update">Update</a> - запрашивает данные у текущей функции, не дожидаясь срабатывания таймера. Таймер [MAIN]TimeUpdate запускается сначала.
<a href="" ID="Cancel">Cancel</a> - cкрывает окно клиента, оставляя его в системном трее.
<a href="" ID="Exit">Exit</a> - завершает работу клиента.
<a href="" ID="Page" Name="FunctionName">Page</a> - запрашивает глобальную функцию 1С с именем FunctionName, делает её текущей и в дальнейшем вызывает её, пока не будет переопределения.
<a href="" ID="Function" Name="FunctionName">Function</a> - запрашивает глобальную функцию 1С с именем FunctionName, делает её текущей и в дальнейшем вызывает её, пока не будет переопределения. Не отличается от предыдущего.
<a href="" ID="Procedure" Name="ProcedureName">Procedure</a> - вызывает глобальную процедуру 1С с именем ProcedureName (но не запоминает её) после чего обновляется, вызывая текущую функцию.
<a href="" ID="Command" Name="CommandString">Command</a> - выполняет командную строку системы при помощи API ShellExecuteEx. В CommandString может быть даже любой URL - откроется браузер, любое имя файла с параметрами, просто командная строка.

Объектов с одинаковыми ID на одной странице может быть сколько угодно.

//------------------------------------------------------------------------------------------------------------------------------------
Передача данных в 1С:Предприятие

При вызове ID "Page", "Function" и "Procedure" в функции и процедуры 1С передается один параметр. Этот параметр - строка из всех управляемых элементов текущей страницы клиента. В общем виде что-то типа:

ИмяЭлемента ТипЭлемента ТэгЭлемента ЗначениеЭлемента
Doc000000001 checkbox <INPUT type=checkbox border=0 name=Doc000000001>
Doc000000002 checkbox <INPUT CHECKED type=checkbox border=0 name=Doc000000002> 1
Doc000000003 checkbox <INPUT type=checkbox border=0 name=Doc000000003>
accept button <INPUT id=Function type=button value=OK name=accept> OK

Строки разделены символом перевода строк, а колонки - табуляцией. Всего колонок четыре. В демонстрационной базе есть функция, которая преобразует эту строку в таблицу значений:
ПараметрВТаблицу(Знач Параметр, МинимумКолонок=0) Экспорт
После чего с этими данными можно работать как угодно 
//------------------------------------------------------------------------------------------------------------------------------------
Известные проблемы

По непонятным пока причинам, при соединении с базами данных, запускаемыми в режиме управляемого приложения свойство соединения Visible установлено в TRUE, что приводит к появлению окна 1С. После установки соединения, мы его, конечно, спрятали, но на долю секунды оно все-равно появляется ;о((( Устанавливать свойство до соединения бесполезно. С обычными приложениями такого не наблюдается.

//------------------------------------------------------------------------------------------------------------------------------------

29.01.2015

Обновление. Клиент 1.1.1.2. Конфигурация демобазы изменена к лучшему.

- V8*.Connector без запуска экземпляра самого 1С-приложения

- Возможность включить JavaScript в окне

- Начало блока быстрого анализа OnLine/OffLine

- Добавлены параметры ini-файла настроек

- Нормальная работа в клиент-серверном режиме

- Компиляция проекта в режиме, не требующем внешних библиотек

- Исправлены ошибки по утечке памяти

- Обработка для отладки вызываемых функций

- Мелкие изменения.

//------------------------------------------------------------------------------------------------------------------------------------

18.02.2015

- Добавлена возможность работы через HttpСервис

- HttpСервис есть в демобазе. На самом деле выполняет роль "заглушки", вызывая глобальные функции

- Встроенная интерактивная авторизация

- Расширено контектное/систрейное меню

- Возможность включить JavaScript в основном окне

- Запоминает последний используемый раздел

- Добавлен отдельный таймер периода подключения

- Небольшие изменения

- Пароль Иванова 123. HttpСервис с логином, но без пароля, работать не будет


Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
PopUp1C.exe, файлы клиента, настроек и прочее
.rar 725,87Kb
18.02.15
52
.rar 1.2.0.0 725,87Kb 52 Скачать
Выгрузка демонстрационной базы данных. В конфигурации множество примеров реализаций. (Общий модуль - PopUp1C)
.rar 45,99Kb
18.02.15
46
.rar 45,99Kb 46 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгения Карук (ekaruk) 27.01.15 15:17
Интересная штука.
На чем написана?
Можно ли самостоятельно расширять функционал?
2. Alexander Vaniev (Kis_s) 27.01.15 15:41
(1) ekaruk, Написана на С++ (Microfoft Visual Studio + MFC). Функционал можно расширять до бесконечности - всё содержимое окон формируется в виде html кода в глобальных функциях 1С. Клиент лишь компонует результат вызова функций 1С с шаблоном, следит, когда этот html изменился и нужно всплывать ..... ну и отслеживает клики по управляемым элементам html, чтобы перехватить командные и выполнить определенные действия ... ;о) .... например, перейти на вызов другой функции ...
3. Alexander Vaniev (Kis_s) 27.01.15 15:45
(1) ekaruk, Причем функции очень простые, вот, например, страница калькулятора (все они есть в демобазе):

Функция PopUpКалькулятор(Параметр="", ПредыдущаяСтрока="", СтрокаРезультат = "") Экспорт
	Стр = "<img src='IMG\calc.png'><br><br>"+Символы.ПС;
	
	Если СтрокаРезультат<>"" Тогда
		Стр = Стр + СтрокаРезультат+"<br><br>";
	КонецЕсли;
	
	Стр = Стр + "Что посчитать: ";
	Стр = Стр + "<input name='TextCalc' type='Text' border='3' value='"+ПредыдущаяСтрока+"'>";
	
	//добавляем кнопку OK
	Стр = Стр + "<input id='Function' name='PopUpCalc' value='OK' type='Button'>"+Символы.ПС;
	
	Стр = Стр + "<br><br><i>Введите любую формулу и нажмите ОК. 1С выполнит вычисление и вернет результат или ошибку.</i>"+Символы.ПС;
	
	Возврат Стр;
КонецФункции

Функция PopUpCalc(Параметр="") Экспорт
	ТП = ПараметрВТаблицу(Параметр, 4);
	
	СтрТП = ТП.Найти("TextCalc",ТП.Колонки[0].Имя);
	ПредыдущаяСтрока = "";
	Результат = "";
	Если СтрТП<>Неопределено Тогда
		ПредыдущаяСтрока = СтрТП[3];
		Попытка
			Результат = Вычислить(СтрТП[3]);
			СтрокаРезультат = "<font color='#4978af'><b>"+СокрЛП(СтрТП[3])+" = "+СокрЛП(Результат)+"</b></font>";
		Исключение
			Результат = ОписаниеОшибки();
			СтрокаРезультат = "<font color='#f97e7e'><b>"+СокрЛП(СтрТП[3])+" = "+СокрЛП(Результат)+"</b></font>";
		КонецПопытки;
	КонецЕсли;
	
	Возврат PopUpКалькулятор(Параметр="", ПредыдущаяСтрока, СтрокаРезультат);
КонецФункции
...Показать Скрыть
4. script Мальчинко (script) 27.01.15 19:20
Скажите, а чем не устраивает родной метод "ПоказатьОповещениеПользователя()" ?
5. Александр Капустин (kapustinag) 27.01.15 20:06
(4) script, Рискну ответить за автора.
Посмотрите внимательнее приложенные картинки. То, что можно в (0) реализовать, в ПоказатьОповещениеПользователя() и не снилось.
soulsteps; +1 Ответить
6. Alexander Vaniev (Kis_s) 27.01.15 22:26
(4) script, Попробую объяснить ...
1. Не требуется интерактивного запуска 1С:Предприятия от пользователя. Все мы прекрасно знаем, что не будет начальство с открытой 1Ской сидеть ... да и отмазка "У меня не была программа открыта" делает систему оповещения через "ПоказатьОповещениеПользователя()" не оптимальной идеей ....
2. У данного клиента размер окна оповещения изменяется пользователем, так что влезает больше информации... и она может быть структурирована!
3. У данного клиента есть возможность вставлять не одну ссылку, а любое количество полноценных DHTML объектов, включая кнопки, переключатели, поля ввода текста, ссылки, картинки и т.д. Вообщем, хоть полноценный веб-сайт рисуй в окне. Что, кстати, позволяет делать его окна гораздо более интересными с точки зрения эргономики и юзабилити ....
4. У пользователя есть возможность изменять какие-то значения прямо в окне клиента не отвлекаясь на запуск основного окна 1Ски. Т.е. вносить изменения в базу!
5. Окно клиента можно в любой момент свернуть в системный трей, если некогда, а потом вернуться к обработке его информации, просто развернув окно из контекстного меню значка систрея ....
6. Т.к. окно клиента является потомком iExplorer, то прямо в нем можно организовать переход на контекстный поиск по Гуглю или на web-сервер 1С предприятия, если он есть ...
7. Сам по себе клиент, если честно, может работать не только с 1С, но и с любой другой системой, поддерживающей Com соединение ;о). Он полноценный Com-клиент. Может подключаться по стандартам Com, запрашивать у сервера перечень процедур, функций ... вызывать их .... если нужно, то и на v7.7 - то он тоже будет работать...
8. Если проект получит развитие, то вполне возможно держать соединение не с одной базой данных, а с любым их количеством ;о)

Это навскидку ;о)
7. Дмитрий Краснощеков (reddima) 28.01.15 07:58
Добрый день,

интересное решение, но

ОС Win 7

попробовал, при запуске приложения вываливается ошибка "Не удалось запустить приложение поскольку его параллельная конфигурация неправильна...".

Что бы это могло быть?
8. Дмитрий Краснощеков (reddima) 28.01.15 09:05
И как увязать ее с базой на сервере 1С?
9. Александр Медведев (anig99) 28.01.15 09:10
ООО!!!! Это именно то, что я недавно искал и давно задумал!
10. Руслан Новиков (ruslan0277) 28.01.15 09:35
Во время работы пользователь может переходить по ссылкам или выполнять какие-либо действия в окне клиента, но, если при очередном запросе к базе данных html код от текущей функции изменится - окно клиента будет полностью обновлено!

А почему бы не спрашивать пользователя "Текущие данные формы изменились по таймауту. Обновить или где?". Имхо, принудительно прерывать работу пользователя не есть гуд.

Очень хорошая и полезная идея.

ЗЫ Жаль потестировать не могу
11. Alexander Vaniev (Kis_s) 28.01.15 10:57
(7) reddima, Проект скомпилирован в режиме "Use MFC in a Shared DLL", т.е. использует внешние dll системы, что позволяет существенно уменьшить его размер (исполняемый файл 87 Кб). Обычно этого хватает. Если же библиотек не хватает - выводит эту ошибку. Я бы посоветовал установить пакеты microsoft visual c++ 2008 redistributable * для вашей системы. Они бесплатны и гуглятся в два счета В дальнейшем попробую перекомпилировать проект в режиме "Use MFC in a Static Library" и проблема должна исчезнуть ....

(8) reddima, В описании есть:
Открыть блокнотом файл PopUp1C.ini и в нем прописать:
;Строка подключения к базе данных
DB="File='F:\c++\PopUp1C\Db';usr='Иванов';pwd='';"

(10) ruslan0277, Возможно. Но очень трудно определить, начал ли пользователь менять что-то в окне клиента - придется вешать перехват на все DHTML элементы, а это напряжно. Да еще при учете, что в этом окне принудительно отключен JawaScript ... Скорее всего, попробую повесить вопрос при активном и видимом окне клиента ...

(9) anig99, Так пользуйтесь ;о)))
12. Руслан Новиков (ruslan0277) 28.01.15 11:08
(11) А если разделить на главная/не главная страница? И соответственно главную обновлять без вопроса, на второстепенных с вопросом.
13. Дмитрий Краснощеков (reddima) 28.01.15 11:12
(11) Kis_s, Спасибо большое за ответы, по серверу я попробовал указать данные имени сервера и базы данных, но не получилось. Срока была DB="srvr='1c82';Ref='uat_prof';usr='Администратор';pwd='12345';"
14. Alexander Vaniev (Kis_s) 28.01.15 12:10
(13) reddima, Если в окне клиента пишет "Error: GetIDsOfNames: PopUpIndex (Не найдена функция PopUpIndex) " - 1С говорит, что нет у неё такой, видимой извне, глобальной функции. Следует сделать вот что: В свойствах ОбщийМодуль.PopUp1C установить галочку "Клиент *"... на различных платформах и даже в рамках текущих 8.3 релизов 1С ведет себя по-разному ;о(((

Если не помогает - скопируйте сюда ошибку из окна клиента. И не забудьте, что вызываемые функции должны быть, и должны быть рабочими!!! Попробуйте вызвать их из любой внешней обработки и посмотрите, что они возвращают.

PS Правда, тогда могут возникнуть проблемы при другой компоновке ;о(. По-хорошему, функции нужно разделить по модулям НаСервере и НаКлиенте ... сделаю попозже ...
15. Alexander Vaniev (Kis_s) 28.01.15 12:22
(12) ruslan0277, Сейчас работа клиента проста и понятна - Есть Текущая глобальная функция 1С, которую он с завидной периодичностью вызывает и её результат выводит в окно .... она может быть изменена согласно логике управляющих команд .... текущей станет другая ... как только возвращаемые данные будут отличаться от предыдущего вызова - перерисовываем окно клиента .... логично предположить, что пользователь уже что-то понатыкал в окне клиента ... скорее всего, я сделаю так: перехватываем что-нибудь типа WM_LBUTTONDOWN и считаем, что данные окна изменились ... тогда при обновлении можно и спросить .... но только не модально, т.к. таймер опроса базы повиснет, а многопоточность использовать не хочется .... Если же разделять на окна, то это уже SDI/MDI приложение получится. Там другие родители у классов и т.д и т.п. ... все переписывать .... и нереально усложнять ... в целом - нужно переспать с этой мыслью и сделать какое-то элегантное решение ...
ruslan0277; +1 Ответить
16. Ададуров Виталий (adva) 28.01.15 12:32
Извиняюсь, народ, как из форума перейти на саму публикацию?
17. Alexander Vaniev (Kis_s) 28.01.15 12:46
18. Дмитрий Краснощеков (reddima) 28.01.15 14:24
(14) Kis_s,Спасибо, это помогло, на сервере тоже работает.
1. И еще, пока ваше приложение заходит в базу, выдается сообщение "Действие не может быть завершено так как программа не отвечает на запросы..." "Переключиться, повторить..".
2. И если устанавливаю, что каждый раз нужно подключаться к базе (не сохранять постоянным соединение), то на каждый раз запускается новый процесс 1сv8.exe, т.е. получается, что он старый не гасит при выходе из него?
19. Angry (Angry) 28.01.15 14:45
Идея супер. Реализация хорошо.
А почему на COM а не на WEB сервисе?

П.С, Может кто знает аналог на веб сервисах? Штука-то полезная.
20. Alexander Vaniev (Kis_s) 28.01.15 15:58
(18) reddima, спасибо, что помогаете выявлять проблемы .... Что касается Com - соединения, то, видимо, 1Ска не быстро откликается, вот и проходит время .... вечером погоняю в таком режиме на sql базах ....

На текущий момент я переделал глобальные модули:

1. PopUp1C (Свойства Глобальный/Клиент/Сервер)
Функция PopUpIndex(Параметр="") Экспорт
	
	Стр = "<img src='IMG\home.png'>"+Символы.ПС;
	Стр = Стр + "vaniev12@gmail.com"+Символы.ПС;
	
	Возврат Стр;
КонецФункции
...Показать Скрыть


2. PopUp1CНаСервере (Свойства Сервер/Вызов сервера)
Функция СтрокаВМассив(Знач Стр, Разделитель, МинимальноЭлементов=0) Экспорт
	мДанных = Новый Массив;
	Поз = Найти(Стр,Разделитель);
	Пока Поз<>0 Цикл
		мДанных.Добавить(Лев(Стр,Поз-1));
		Стр = Сред(Стр,Поз+1);
		
		Поз = Найти(Стр,Разделитель);
	КонецЦикла;
	Если Стр<>"" Тогда
		мДанных.Добавить(Стр);
	КонецЕсли;
	Пока мДанных.Количество()<МинимальноЭлементов Цикл
		мДанных.Добавить("");
	КонецЦикла;
	Возврат мДанных;
КонецФункции

Функция ПараметрВТаблицу(Знач Параметр, МинимумКолонок=0) Экспорт
	//В параметре приходит массив из эленемнов DHTML, примерно такой (разделители = перевод строки и табуляция):
	
	//Doc000000001	checkbox	<INPUT type=checkbox border=0 name=Doc000000001>		
	//Doc000000002	checkbox	<INPUT CHECKED type=checkbox border=0 name=Doc000000002>	1	
	//Doc000000003	checkbox	<INPUT type=checkbox border=0 name=Doc000000003>		
	//accept	button	<INPUT id=Function type=button value=OK name=accept>	OK
	
	Т = Новый ТаблицаЗначений;
	
	мСтрок = СтрокаВМассив(Параметр, Символы.ПС);
	Для ИндексСтрок=0 По мСтрок.ВГраница() Цикл
		мЗначений = СтрокаВМассив(мСтрок[ИндексСтрок], Символы.Таб, МинимумКолонок);
		
		Пока Т.Колонки.Количество()<мЗначений.Количество() Цикл
			Т.Колонки.Добавить("_"+СокрЛП(Т.Колонки.Количество()));
		КонецЦикла;
		
		СтрТ = Т.Добавить();
		Для ИндексКолонок=0 По мЗначений.ВГраница() Цикл
			СтрТ[ИндексКолонок] = мЗначений[ИндексКолонок];
		КонецЦикла;
	КонецЦикла;
	
	Пока Т.Колонки.Количество()<МинимумКолонок Цикл
		Т.Колонки.Добавить();
	КонецЦикла;
	
	Возврат Т;
КонецФункции

Функция ПолучитьТаблицуДокументов() Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Бюджет.Ссылка,
	|	Бюджет.ВерсияДанных,
	|	Бюджет.ПометкаУдаления,
	|	Бюджет.Номер,
	|	Бюджет.Дата КАК Дата,
	|	Бюджет.Проведен,
	|	Бюджет.Кому,
	|	Бюджет.ОтКого,
	|	Бюджет.Утвержден,
	|	Бюджет.Сумма,
	|	Бюджет.Комментарий
	|ИЗ
	|	Документ.Бюджет КАК Бюджет
	|ГДЕ
	|	Бюджет.Кому = &Кому
	|
	|УПОРЯДОЧИТЬ ПО
	|	Дата";
	
	Запрос.УстановитьПараметр("Кому",ИмяПользователя());
	
	Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Функция PopUpБюджетыНаСервере(Параметр="") Экспорт
	ТД = ПолучитьТаблицуДокументов();
	
	//выводим таблицу
	Стр = "<img src='IMG\documents.png'>"+Символы.ПС;
	Стр = Стр + "<font color=de4d4d>Документы на акцепт:</font>"+Символы.ПС;
	Стр = Стр + "<table bgcolor=#ffffff cellSpacing='0' cellPadding='5' border='0'>"+Символы.ПС;
	Стр = Стр + "<tr bgcolor=#ffffff><td>Документ</td><td>От кого</td><td>Сумма</td><td>Комментарий</td><td>Утвердить</td></tr>"+Символы.ПС;
	Для Каждого СтрТД Из ТД Цикл
		ЧетнаяСтрока = ТД.Индекс(СтрТД)%2;
		checked = ?(СтрТД.Утвержден," checked","");
		Стр = Стр + "<tr bgcolor="""+?(ЧетнаяСтрока,"#ffffff","#f0f0f0")+""">
			|<td>"+СокрЛП(СтрТД.Ссылка)+"</td>
			|<td>"+СокрЛП(СтрТД.ОтКого)+"</td>
			|<td>"+Формат(СтрТД.Сумма,"ЧДЦ=2")+"</td>
			|<td>"+СокрЛП(СтрТД.Комментарий)+"</td>
			|<td><div><input border=0 class='checkbox0' bgcolor=#ffffff type='checkbox' name='Doc"+СтрТД.Номер+"'"+checked+"></div></td>
		|</tr>"+Символы.ПС;
	КонецЦикла;
		
	//добавляем кнопку OK в последнюю строку
	Сообщение = "Покупайте наших слонов...";
	
	Стр = Стр + "<tr bgcolor=#ffffff><td colspan='4'><marquee scrollamount='3'>"+Сообщение+"</marquee></td><td> <input id='Procedure' name='PopUpУтвердить' value='OK' type='Button'> </td></tr>"+Символы.ПС;
	Стр = Стр + "</table>"+Символы.ПС;
	
	Стр = Стр + "Проставьте утвержденные бюджеты и нажмите ОК. Данные в базе изменятся."+Символы.ПС;
	
	//Возврат СокрЛП(ТекущаяДата())+""+Символы.ПС+Стр;
	Возврат Стр;
КонецФункции

Процедура PopUpУтвердитьНаСервере(Параметр="") Экспорт
	//В параметре приходит массив из эленемнов DHTML, примерно такой (разделители = перевод строки и табуляция):
	
	//Doc000000001	checkbox	<INPUT type=checkbox border=0 name=Doc000000001>		
	//Doc000000002	checkbox	<INPUT CHECKED type=checkbox border=0 name=Doc000000002>	1	
	//Doc000000003	checkbox	<INPUT type=checkbox border=0 name=Doc000000003>		
	//accept	button	<INPUT id=Function type=button value=OK name=accept>	OK
	
	ТП = PopUp1CНаСервере.ПараметрВТаблицу(Параметр, 4);
	ТД = PopUp1CНаСервере.ПолучитьТаблицуДокументов();
	
	Для Каждого СтрТП Из ТП Цикл
		Если НРег(СтрТП[1])="checkbox" Тогда
			СтрТД = ТД.Найти(Сред(СтрТП[0],4),"Номер");
			Если СтрТД<>Неопределено Тогда
				Утвержден = ?(СокрЛП(СтрТП[3])="1",Истина,Ложь);
				Если Утвержден<>СтрТД.Утвержден Тогда
					Док = СтрТД.Ссылка.ПолучитьОбъект();
					Док.Утвержден = Утвержден;
					Если Не Док.Проведен Тогда
						Док.Записать(РежимЗаписиДокумента.Запись);
					Иначе
						Док.Записать(РежимЗаписиДокумента.Проведение);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Функция PopUpКалькуляторНаСервере(Параметр="", ПредыдущаяСтрока="", СтрокаРезультат = "") Экспорт
	Стр = "<img src='IMG\calc.png'>"+Символы.ПС;
	
	Если СтрокаРезультат<>"" Тогда
		Стр = Стр + СтрокаРезультат+"";
	КонецЕсли;
	
	Стр = Стр + "Что посчитать: ";
	Стр = Стр + "<input name='TextCalc' type='Text' border='3' value='"+ПредыдущаяСтрока+"'>";
	
	//добавляем кнопку OK
	Стр = Стр + "<input id='Function' name='PopUpCalc' value='OK' type='Button'>"+Символы.ПС;
	
	Стр = Стр + "Введите любую формулу и нажмите ОК. 1С выполнит вычисление и вернет результат или ошибку."+Символы.ПС;
	
	Возврат Стр;
КонецФункции

Функция PopUpCalcНаСервере(Параметр="") Экспорт
	//В параметре приходит массив из эленемнов DHTML, примерно такой (разделители = перевод строки и табуляция):
	
	//TextCalc	text	<INPUT value=10+15 border=3 name=TextCalc>	10+15	
	//PopUpCalc	button	<INPUT id=Function type=button value=OK name=PopUpCalc>	OK
	
	ТП = ПараметрВТаблицу(Параметр, 4);
	
	СтрТП = ТП.Найти("TextCalc",ТП.Колонки[0].Имя);
	ПредыдущаяСтрока = "";
	Результат = "";
	Если СтрТП<>Неопределено Тогда
		ПредыдущаяСтрока = СтрТП[3];
		Попытка
			Результат = Вычислить(СтрТП[3]);
			СтрокаРезультат = ""+СокрЛП(СтрТП[3])+" = "+СокрЛП(Результат)+"";
		Исключение
			Результат = ОписаниеОшибки();
			СтрокаРезультат = ""+СокрЛП(СтрТП[3])+" = "+СокрЛП(Результат)+"";
		КонецПопытки;
	КонецЕсли;
	
	Возврат PopUpКалькулятор(Параметр, ПредыдущаяСтрока, СтрокаРезультат);
КонецФункции
...Показать Скрыть


Тестировал на sql - вроде все отпускается. При непостоянном подключении, действительно, есть проблемы - будем решать, что же делать ;о)))
21. Alexander Vaniev (Kis_s) 28.01.15 16:01
(19) Angry, Никогда не соединялся программно с Webом 1Са .... если есть примеры реализации с открытым кодом, да еще чтобы можно было вызвать глобальные функции (язык не важен) - с радостью посмотрю ... возможно, реализую ....
22. Сергей Боровик (BorovikSV) 28.01.15 21:46
(11) Kis_s, А нельзя скомпилировать так, чтобы не приходилось гуглить библиотеки? Борьба с размером исполняемого файла дело конечно благородное, но не за счет же приобретения дополнительных заморочек. Тем более с современным развитием интернета этот аспект почти неактуален.
23. Angry (Angry) 29.01.15 16:35
(21) Kis_s, Примеры работы с Web сервисами есть на инфостарте. Так же в 8.3 есть и Http сервисы.
У COM соединения есть большие недостатки: ест память, долго грузится и не уверен на счет лицензий.

Кроме способа подключения нашел проблемы:
1) Возврат строкой прост, но мало практичен, не хватает например:
а) Принудительно показать, даже если данные не изменились
б) Изменить размер окна, варианты вроде: конкретный размер в px или avto, для того что бы всё убралось
в) Флажок вроде особо важного, что бы посреди экрана показалось.
г) Изменить периодичность обновлений
д) Запрет перезаписи окна, тут может быть вариант, как с аськой, новое уведомление появляется в новом окне, например выше.
2) Пользователь может утащить окно за край экрана и больше ему "не мешает".
3) Ява скрипт в странице, вроде прочел отключен, но это удобный инструмент для интерактивных действий.
4) Снова вспомню аську, если окно просто информационное, то удобней его прятать простым щелчком в любом свободном месте.
5) Как себя ведет программа если на сервере его грубо выключат?
6) Заметил, что при завершении программы COM клиент выкинул 1С-ное окно подтверждения.
24. Алексей Белоусов (AllexSoft) 29.01.15 17:01
классно! как раз подобное надо мне) думал писать уже, а тут вот подарок ))
ПС: присоединяюсь к комментариям о веб-сервисах.. реально было бы удобнее и проще
25. Alexander Vaniev (Kis_s) 29.01.15 17:08
(22) BorovikSV, Уже ... новая версия именно такая и будет .... получается в сумме около 500 Кб .....
(23) Angry, Спасибо за идеи .... будем воплощать по мере возможности ... Тем более (А ведь никто не сказал!), я лихо промахнулся, и, вместо ComConnector использовал полноценное Com-соединение .... ;о((( .... спать нужно больше ....

На данный момент новый релиз "в процессе отладки" ... есть проблемы с утечкой памяти .... отлавливаю .... как будет готово - выложу.
Сделано:
- Нормальный V8*.ComConnector. Без запуска процесса 1С, через нормальное внешнее соединение... V8*.Application пока оставил ...
- Нормальное поведение и отображение OnLine/OffLine без криков об ощибке соединения и т.д....
- Часы работы, чтобы отцеплялась от базы ...
- 1С обработка для тестирования глобальных процедур с выводом их результата в html и возможностью прямо там покликать по ссылкам ...
- Включаемое самологирование для отладки проблем ...
- Команды Back/Forvard
- Отслеживание изменений элементов пользователем и вопрос при обновлении...
- Нормальная работа демобазы на клиент-серверном варианте..
- Несколько управляющих команд от функций 1Са... (но вот уважаемый Angry набросал еще ;о))))
- Многое по-мелочи ...
26. Angry (Angry) 29.01.15 17:57
Ещё пожелание:
Передать в 1С пользователя, домен и компьютер под которым запущен PopUp1C
Предлагаю использовать для безопасности. Т.к. опознавать пользователя надо, а хранить пароль и логин в ини файле мягко сказать не безопасно, да и в настройке муторно, лучше определение пользователя перевесить на внутренности 1С. А входить в COM под пользователем, который интерактивно запустить 1С не сможет.
27. Николай Корнев (kns77) 30.01.15 13:46
Давно в заявках висит подобное от клиента, никак руки не доходили, надо будет попробовать посмотреть
28. Angry (Angry) 30.01.15 14:57
Хорошо, клиент сервер теперь работает, по скорости по тестируем.
Теперь есть проблемы:
1) Не у всех COM Connector работает, лечится длинными манипуляциями (пока разбираюсь)
2) Не работает от имени ограниченного пользователя, под админом работает.
29. Сергей Галюк (dj_serega) 30.01.15 16:44
Когда будет реализовано через http-сервисы обязательно скачаю =))). COM, имхо, не подходит под данный функционал.
Особенности http можно найти на инфостарте.
+ скорость работы быстрее
+ можно передать через httpответ HTML страничку
+ вроде как не требует лицензии
- нужно публиковать базу
30. A (apxi) 02.02.15 10:59
(29) Вот реализованная как сервер, запускается там где лежит база 1С, по http обрабатывает команды и жрет только одну лицензию http://infostart.ru/public/297399/
31. Сергей Галюк (dj_serega) 02.02.15 16:12
(30) apxi, Так там окно браузера нужно. А тут программка в трее (что очень удобно). Уже знаю где можно использовать данный функционал.

Окно в браузере я могу сделать. Сформировать html-страничку не вопрос. А вот что-то похожее на эту публикацию я сделать не смогу, вот и прошу автора.
32. Марина Чирина (chmv) 03.02.15 10:01
Это то о чем я постоянно думаю
33. Руслан Новиков (ruslan0277) 06.02.15 14:20
(31)dj_serega, а чем данная форточка не браузер? :)
34. Сергей Галюк (dj_serega) 12.02.15 00:10
(33) ruslan0277, Ну так браузер это отдельная прога, где "случайно" можно перейти в одноклассники :) А тут не получится если не напрограмить :)
35. Asmody (Asmody) 17.02.15 11:01
От этой штуки один шаг до стандартного виндового гаджета (которые как виджеты). Или плитки.
36. Константин Киселев (StalkerAkella) 20.03.15 09:47
(2) Kis_s, Доброго времени. Предвидится ли использование данной программы на Андроиде?
37. Сергей Галюк (dj_serega) 08.05.15 12:52
мне чет кажется что разработчик забил на это приложение :(
38. Alexander Vaniev (Kis_s) 08.05.15 23:14
Ребят, сорри, не было в стране .... в ближайшие дни всем отвечу ....
39. Сергей Галюк (dj_serega) 12.07.16 15:19
(38) Kis_s, Привет :)
Ну как там? Очень жду продолжения данной разработки :)
40. Роберт В е р т и н с к и й (v3rter) 12.07.16 15:28
Очень смущает пароль в открытом виде в текстовом файле.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа