Для одного проекта пришлось сделать простую систему оповещений!
Она состоит из:
Общая форма
Общий модуль
Регистр Сведений
Общая Форма
На ней поле HTML Документа и Кнопка Ознакомлен (подтверждение что пользователь это видел)
Код 1C v 8.х Перем ТекДата, ТипСсылки, ТекСсылка;
Процедура ПриОткрытии()
ТекДата = Дата;
ЭлементыФормы. ПолеHTMLДокумента. УстановитьТекст( Текст) ;
КонецПроцедуры
Процедура ОзнакомленНажатие(Элемент)
Если ЗначениеЗаполнено( ТекДата) Тогда
НаборЗаписей = РегистрыСведений. МЕ_Оповещения. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Отбор. Получатель. Установить( Пользователь) ;
НаборЗаписей. Отбор. Период. Установить( ТекДата) ;
НаборЗаписей. Прочитать( ) ;
НовыйНомер = НаборЗаписей[0 ];
НовыйНомер. ДатаОзнакомления = ТекущаяДата( ) ;
НаборЗаписей. Записать( ) ;
Если ЗначениеЗаполнено( НовыйНомер. ТипСсылки) Тогда
ТекСсылка = НовыйНомер. Ссылка;
ТипСсылки = НовыйНомер. ТипСсылки;
КонецЕсли ;
КонецЕсли ;
Парам = Новый Структура;
Парам. Вставить( "ТипСсылки" , ТипСсылки) ;
Парам. Вставить( "ТекСсылка" , ТекСсылка) ;
ЭтаФорма. Закрыть( Парам) ;
КонецПроцедуры
Процедура ПолеHTMLДокументаonclick(Элемент, pEvtObj)
pEvtObj. returnValue = Ложь ;
Если ВРег( pEvtObj. srcElement. tagName) = "A" Тогда
СсылкаТекст = Сред( pEvtObj. srcElement. href, 4 ) ;
Ссылка = ЗначениеИзСтрокиВнутр( СсылкаТекст) ;
Если Ссылка. Пустая( )
Или Ссылка. ПолучитьОбъект( ) = Неопределено Тогда
Предупреждение( "Ошибка открытия объекта." , , "Ошибка" ) ;
Возврат ;
Иначе
ОткрытьЗначение( Ссылка) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
В общем Модуле:
Код 1C v 8.х Процедура СоздатьОповещение(Получатель,ТекстОповещения, ТипСсылки=Неопределено, Ссылка=Неопределено) Экспорт
НаборЗаписей = РегистрыСведений. МЕ_Оповещения. СоздатьНаборЗаписей( ) ;
НовЗапись = НаборЗаписей. Добавить( ) ;
НовЗапись. Период = ТекущаяДата( ) ;
НовЗапись. Получатель = Получатель;
НовЗапись. ТекстОповещения = ТекстОповещения;
Если НЕ ТипСсылки= Неопределено Тогда
НовЗапись. ТипСсылки = ТипСсылки;
КонецЕсли ;
Если НЕ Ссылка= Неопределено Тогда
НовЗапись. Ссылка = Ссылка;
КонецЕсли ;
НаборЗаписей. Записать( Ложь ) ;
КонецПроцедуры
Процедура ПоказатьОповещение(ТекстОповещения)
формОповещ = ПолучитьОбщуюФорму( "МЕ_Оповещения" ) ;
формОповещ. текст= ТекстОповещения;
Если Не формОповещ. Открыта( ) Тогда
формОповещ. ОткрытьМодально( ) ;
КонецЕсли ;
КонецПроцедуры
Регистр сведений (для хранения сообщений):
Думаю что все поля понятны из названия, только ТипСсылки - Строка 35
Проверка непрочитанных сообщений и вызов окна:
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| МЕ_Оповещения.Период КАК Период,
| МЕ_Оповещения.Получатель,
| МЕ_Оповещения.ТекстОповещения,
| МЕ_Оповещения.ДатаОзнакомления
|ИЗ
| РегистрСведений.МЕ_Оповещения КАК МЕ_Оповещения
|ГДЕ
| МЕ_Оповещения.ДатаОзнакомления = &ДатаОзнакомления
| И МЕ_Оповещения.Получатель = &Получатель
|
|УПОРЯДОЧИТЬ ПО
| Период" ;
Запрос. УстановитьПараметр( "ДатаОзнакомления" , Дата( "01.01.0001 0:00:00" ) ) ;
Запрос. УстановитьПараметр( "Получатель" , ПараметрыСеанса. ТекущийПользователь) ;
Результат = Запрос. Выполнить( ) . Выбрать( ) ;
Пока Результат. Следующий( ) Цикл
формОповещ = ПолучитьОбщуюФорму( "МЕ_Оповещения" ) ;
формОповещ. дата= Результат. период;
формОповещ. пользователь= Результат. Получатель;
формОповещ. текст= Результат. ТекстОповещения;
Если Не формОповещ. Открыта( ) Тогда
Структ = формОповещ. ОткрытьМодально( ) ;
Если Структ = Неопределено Тогда
Иначе
Если СокрЛП( Структ. ТипСсылки) = "ОбработкаЦен" Тогда
Обр = Обработки. ОбработкаЦен. Создать( ) ;
Обр. Счет = Структ. ТекСсылка;
Обр. ПолучитьФорму( ) . Открыть( ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Пример добавления сообщения:
Код 1C v 8.х МЕ_Оповещения. СоздатьОповещение( ТекДоговорКИзменению. Менеджер, "Ваш Договор №" + СокрЛП( ТекДоговорКИзменению. Номер) +
" - Отклонен!!! - " + ИмяПользователя( ) + "!" + Символы. ПС+ " Исправьте его учитывая Комментарии и запустите на Согласование!" , "" , ТекДоговорКИзменению. Ссылка) ;
или
Текст = "" + ПараметрыСеанса. ТекущийПользователь+ ": Необходимо Доработать цены:<br> <b>" + Счет. Ссылка+ "</b>" ;
МЕ_Оповещения. СоздатьОповещение( СнабженецПоследнееИзменение, Текст, "ОбработкаЦен" , Счет. Ссылка) ;
Надумал когда-то задачу себе: выгрузить содержимое табличного документа в
Google Document . Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.
Для написания функционала использовалась информация про
google document API . Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.
Функция получения маркера следующая:
Код 1C v 8.х Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
АдресКлиентЛогин = "https://www.google.com/accounts/ClientLogin" ;
Если ВидСервиса = "Таблица" Тогда
Сервис = "wise" ;
ИначеЕсли ВидСервиса = "Документ" Тогда
Сервис = "writely" ;
КонецЕсли ;
Попытка
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , АдресКлиентЛогин, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" ) ;
ХМЛХТТП. Send( "Email=" + ПараметрыПользователя. Логин + "&Passwd=" + ПараметрыПользователя. Пароль + "&service=" + Сервис + "&source=Gulp-CalGulp-1.05" ) ;
Исключение
Сообщить( "Ошибка:" + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Если ХМЛХТТП. Status = 200 Тогда
Маркер = ХМЛХТТП. ResponseText;
Маркер = Прав( Маркер, СтрДлина( Маркер) - СтрДлина( "Auth=" ) - Найти( Маркер, "Auth=" ) + 1 ) ;
Возврат Маркер;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.
Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Маркер = ПолучитьМаркер( "Таблица" ) ;
Если Маркер = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Адрес = "https://spreadsheets.google.com/feeds/spreadsheets/private/full" ;
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "GET" , Адрес, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( Null ) ;
Если ХМЛХТТП. Status = 200 Тогда
ОтветСервера = ХМЛХТТП. ResponseText;
ДеревоXML = ПрочитатьResponseTextXML( ОтветСервера) ;
СписокТаблиц = Новый СписокЗначений;
ТаблицаСсылка = "" ;
НазваниеТаблицы = "" ;
Для Каждого Строка Из ДеревоXML. Строки[0 ]. Строки Цикл
Если Строка. ИмяXMLЭлементаДанных = "entry" Тогда
Для Каждого ТекАтрибут Из Строка. Строки Цикл
Если ТекАтрибут. ИмяXMLЭлементаДанных = "link" Тогда
ТекРел = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "rel" ) ;
Если ТекРел. представление = "http://schemas.google.com/spreadsheets/2006#worksheetsfeed" Тогда
ТекСсылка = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "href" ) ;
ТаблицаСсылка = ТекСсылка. Представление;
ТаблицаСсылка = СтрЗаменить( ТаблицаСсылка, "https://" , "http://" ) ;
КонецЕсли ;
КонецЕсли ;
Если ТекАтрибут. ИмяXMLЭлементаДанных = "title" Тогда
НазваниеТаблицы = ТекАтрибут. ЗначениеXMLЭлементаДанных;
КонецЕсли ;
КонецЦикла ;
Если ЗначениеЗаполнено( ТаблицаСсылка) И ЗначениеЗаполнено( НазваниеТаблицы) Тогда
СписокТаблиц. Добавить( ТаблицаСсылка, НазваниеТаблицы) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокТаблиц;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
ТекстСоздания = "
| " + ИДЛиста + "/R" + Строка( Строка) + "C" + Строка( Колонка) + "
| + ИДЛиста + " / R"+ Строка(Строка) + " C" + Строка(Колонка)+"" " / >
| + Строка(Строка) + "" " col="" " + Строка(Колонка)+ "" " inputValue="" " + Значение+"" "/>
| ";
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , ИДЛиста, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml;type=feed" ) ;
ХМЛХТТП. SetRequestHeader( "X-If-No-Redirect" , "true" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( ТекстСоздания) ;
Если ХМЛХТТП. Status = 201 Тогда
Возврат Истина ;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Ложь ;
КонецЕсли ;
КонецФункции
Источник