Оповещение об изменении публикации: обработки/конфигурации.

Публикация № 600373

Программирование - Практика программирования

21
Вы опубликовали на этом ресурсе законченное решение - обработку или конфигурацию. Вы намерены в будущем развивать его, улучшать, снова публиковать. Как оповестить пользователей об изменениях? Речь об этом...

Постановка задачи

Оформление обновлений в публикации

Программный код

для (внешней) обработки

для конфигурации

Предварительное тестирование

Заключение



Постановка задачи

Эта небольшая статья навеяна следующим. Я дважды внес изменения в свою последнюю публикацию, посвященную Построителю регулярных выражений, и дважды не заметил на сайте никаких признаков изменений после обновления файла обработки. Даже дата обновления на странице публикации не сдвинулась. В третий раз я не менял обработку, но немного изменил раздел "Обновления" в своей публикации, сделал две записи, чтобы отработать предлагаемое в этой статье решение сего маленького недоразумения. И... в этот раз поменялась дата обновления публикации. Опять же, я не увидел свою работу в перечне обновленных публикаций. И мне это не надо, в-общем-то. Но в этом могли бы быть заинтересованы те, кто уже пользуются обработкой. Полагаю, проблема у нас у всех одна: донести наиболее комфортным способом информацию об обновлениях конечным потребителям наших обработок/конфигураций.

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

Оформление обновлений в публикации

Перехожу теперь к описанию самого подхода. Для получения информации по обновлениям будет использовано текстовое содержимое вашей публикации на этом ресурсе. В качестве наглядного примера рекомендую использовать публикацию Построитель регулярных выражений. В этой публикации уже организован текстовый блок "Обновления".  Сверху этот блок ограничен текстовым маркером Желаю приятного просмотра!\s*Обновления. Снизу маркером Скачать файлы. Для описания маркеров здесь я использовал шаблон регулярного выражения, заключенный в „“. На роль маркеров подходит любая комбинация символов, удовлетворяющая требованию уникальности в рамках публикации. Если есть какие-то сомнения насчет уникальности, можно использовать один и тот же уникальный идентификатор для обоих маркеров, разместив его на странице публикации в начале и в конце тестового блока обновлений. А чтобы маркеры были не видны, указать белый цвет текста на белом фоне. Я не ограничиваю фантазию авторов на этот счет... 

Каждое сообщение об обновлении публикации начинается с даты обновления в жестком формате ДД.ММ.ГГГГ ЧЧ:ММ, как в примере. После чего следует текст, описывающий обновление. Количество сообщений не ограничивается, естественно.

Вот и все описание организации обновлений на странице публикации.

Перейти к оглавлению

Программный код

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

В конфигурациях чтение и обработка информации со страницы публикации, требующие ощутимого времени, осуществляются в фоновом режиме.

Использование же фонового режима в обработках, без предварительной подготовки, невозможно. Это требует таки общего серверного модуля...

Программный код для (внешней) обработки

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

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

Обработчик показать/скрыть
&НаКлиенте
Процедура СтатьяНаИнфоСтартНажатие(Элемент)
	
	Меню = Новый СписокЗначений;
	Меню.Добавить(1, "Читать статью");
	Меню.Добавить(2, "Проверить обновления");
	Меню.Добавить(3, "Получить обновления");
	
	Пункт = ВыбратьИзМеню(Меню, Элементы.СтатьяНаИнфоСтарт);
	
	Если Пункт = Неопределено  Тогда
		Возврат;
	КонецЕсли;
	
	Пункт = Пункт.Значение;
	Если Пункт = 1 Тогда
		ЗапуститьПриложение("//infostart.ru/public/" + ПараметрыОбновлений.НомерПубликации);
		
	ИначеЕсли Пункт = 2 Тогда
		ПроверитьОбновления();
		
	ИначеЕсли Пункт = 3 Тогда
		
		Адрес = "//infostart.ru/public/" + ПараметрыОбновлений.НомерПубликации;
		Если НЕ ПустаяСтрока(ПараметрыОбновлений.ЯкорьОбновлений) Тогда
			Адрес = Адрес + "/#" + ПараметрыОбновлений.ЯкорьОбновлений;
		КонецЕсли;
		ЗапуститьПриложение(Адрес);
		
	КонецЕсли;
	
КонецПроцедуры


Создаете три рабочих реквизита формы, значения их сохраняете в настройках формы:

  • ДатаТекущегоОбновления
  • ДатаПоследнейПроверкиОбновлений
  • КвоОбновлений

В модуль формы включаете блок процедур/функций:

Блок показать/скрыть
&НаКлиенте 
Перем	ПараметрыОбновлений;


&НаКлиенте 
Процедура НастройкаОбновлений()
	
	//СтатьяНаИнфоСтарт - декорация формы, гиперссылка
	//ДатаТекущегоОбновления - дата, реквизит формы
	//ДатаПоследнейПроверкиОбновлений - дата, реквизит формы
	//КвоОбновлений - число, реквизит формы
	
	
	//Настраиваемые параметры обновлений...
	ПараметрыОбновлений = Новый Структура;
	
	ПараметрыОбновлений.Вставить("НомерПубликации", "592108");
	ПараметрыОбновлений.Вставить("ЯкорьОбновлений", "L26");
	ПараметрыОбновлений.Вставить("НачальнаяМетка", "Желаю приятного просмотра!" + "\s*" + "Обновления");
	ПараметрыОбновлений.Вставить("КонечнаяМетка", "Скачать файлы");
	
	ПараметрыОбновлений.Вставить("ДатаТекущегоОбновления", '201703141300');
	ПараметрыОбновлений.Вставить("ПроверятьОбновленияЧерезДней", 7);
	//Конец настройке.
	
	Если ДатаТекущегоОбновления <> ПараметрыОбновлений.ДатаТекущегоОбновления  Тогда
		ДатаПоследнейПроверкиОбновлений = ТекущаяДата();
		ДатаТекущегоОбновления = ПараметрыОбновлений.ДатаТекущегоОбновления;
		КвоОбновлений = 0;
	КонецЕсли;
	
	Если ПараметрыОбновлений.ПроверятьОбновленияЧерезДней <> 0  Тогда
		ПрошлоДней = (ТекущаяДата() - Макс(ДатаПоследнейПроверкиОбновлений, ПараметрыОбновлений.ДатаТекущегоОбновления)) / 86400;
		ДавноНеПроверяли = (ПрошлоДней > ПараметрыОбновлений.ПроверятьОбновленияЧерезДней);
	Иначе
		ДавноНеПроверяли = Ложь;
	КонецЕсли;
	
	Если КвоОбновлений <> 0 ИЛИ ДавноНеПроверяли  Тогда
		Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru (" + Формат(КвоОбновлений, "ЧДЦ=") + ?(ДавноНеПроверяли, "?", "") + ")";
		Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(255, 0, 0);
	Иначе
		Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru";
		Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(0, 127, 0);
	КонецЕсли;
	
КонецПроцедуры



&НаКлиенте
Процедура ПроверитьОбновления()
	
	Попытка
		Соединение = Новый HTTPСоединение("infostart.ru",,,,Неопределено,Ложь);
		Запрос = Новый HTTPЗапрос("public/" + ПараметрыОбновлений.НомерПубликации + "/");
		Ответ = Соединение.Получить(Запрос);
		Тело = Ответ.ПолучитьТелоКакСтроку();
		
		Чтение = Новый ЧтениеHTML;
		Чтение.УстановитьСтроку(Тело);
		
		ПостроительDOM = Новый ПостроительDOM;
	    ДокументHTML   = ПостроительDOM.Прочитать(Чтение);
		ТекстПубликации = ДокументHTML.Тело.ТекстовоеСодержимое;
	Исключение
		ТекстПубликации = "";
	КонецПопытки;
	
	Если ПустаяСтрока(ТекстПубликации) Тогда
		КвоОбновлений = 0;
		Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru (?)";
		Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(127, 127, 127);
		Возврат;
	КонецЕсли;
	
	СписокОбновлений = ПолучитьСписокОбновлений(ТекстПубликации);
	
	ДатаТекущегоОбновления = ПараметрыОбновлений.ДатаТекущегоОбновления;
	КвоОбновлений = ОпределитьКвоНовыхОбновлений(СписокОбновлений);
	ДатаПоследнейПроверкиОбновлений = ТекущаяДата();
	Если КвоОбновлений <> 0  Тогда
		Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru (" + КвоОбновлений + ")";
		Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(255, 0, 0);
	Иначе
		Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru";
		Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(0, 127, 0);
	КонецЕсли;
	
КонецПроцедуры



&НаКлиенте
Функция ОпределитьКвоНовыхОбновлений(СписокОбновлений)
	
	Кво = 0;
	Для каждого Элем Из СписокОбновлений Цикл
		Если Элем.Значение > ПараметрыОбновлений.ДатаТекущегоОбновления  Тогда
			Кво = Кво + 1;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Кво;
	
КонецФункции


&НаКлиенте
Функция ПолучитьСписокОбновлений(ТекстПубликации)
	
	//	Выражение = <Проверка обновлений>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Проверка обновлений> = <НачальнаяМетка><ПС><Текст обновлений><ПС><КонечнаяМетка>
	//	+-	<Текст обновлений> = (?:.*(?:<ПС>.*)*?)
	//	+-	<ПС> = \s*
	//	+-	<Начальная метка> = НачальнаяМетка
	//	+-	<Конечная метка> = КонечнаяМетка
	
	idПС = "\s*";
	idНачальнаяМетка = ПараметрыОбновлений.НачальнаяМетка;
	idКонечнаяМетка = ПараметрыОбновлений.КонечнаяМетка;
	idТекстОбновлений = "(?:.*(?:" + idПС + ".*)*?)";
	idПроверкаОбновлений = idНачальнаяМетка + idПС + idТекстОбновлений + idПС + idКонечнаяМетка;
	idPattern = idПроверкаОбновлений;
	
	RegExpLocal = Новый COMОбъект("VBScript.RegExp");
	
	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;
	
	Найдено = RegExpLocal.Execute(ТекстПубликации);
	Для каждого Стр Из Найдено Цикл
		
		Начало = Стр.FirstIndex;
		Длина = Стр.Length;
		ТекстОбновлений = Стр.Value;
		
		Прервать;
		
	КонецЦикла;	
	
	
	СписокОбновлений = Новый СписокЗначений;
	
	
		
	//	Выражение = <Текущее обновление>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Текущее обновление> = (?:^<Дата обновления><ПС><Текст текущего обновления><ПС>)(?=(?:^(?:\d\d\.\d\d\.\d\d\d\d \d\d:\d\d))|(?:<Конечная метка>))
	//	+-	<Дата обновления> = (?:<День>\.<Месяц>\.<Год> <Часы>:<Минуты>)
	//	++	<Текст текущего обновления> = ((?:.|\s)*?)
	//	+-	<Конечная метка> = КонечнаяМетка
	//	+-	<ПС> = \s*
	//	++	<День> = (\d\d)
	//	++	<Месяц> = (\d\d)
	//	++	<Год> = (\d\d\d\d)
	//	++	<Часы> = (\d\d)
	//	++	<Минуты> = (\d\d)


	idМинуты = "(\d\d)";
	idЧасы = "(\d\d)";
	idГод = "(\d\d\d\d)";
	idМесяц = "(\d\d)";
	idДень = "(\d\d)";
	idКонечнаяМетка = ПараметрыОбновлений.КонечнаяМетка;
	idТекстТекущегоОбновления = "((?:.|\s)*?)";
	idПС = "\s*";
	idДатаОбновления = "(?:" + idДень + "\." + idМесяц + "\." + idГод + " " + idЧасы + ":" + idМинуты + ")";
	idТекущееОбновление = "(?:^" + idДатаОбновления + idПС + idТекстТекущегоОбновления + idПС + ")(?=(?:^(?:\d\d\.\d\d\.\d\d\d\d \d\d:\d\d))|(?:" + idКонечнаяМетка + "))";
	idPattern = idТекущееОбновление;
		
	RegExpLocal = Новый COMОбъект("VBScript.RegExp");
		
	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;
		
	Найдено = RegExpLocal.Execute(ТекстОбновлений);
	Для каждого Стр Из Найдено Цикл

		Начало = Стр.FirstIndex;
		Длина = Стр.Length;
		Значение = Стр.Value;
			
		vidДень = Стр.SubMatches(0);
		vidМесяц = Стр.SubMatches(1);
		vidГод = Стр.SubMatches(2);
		vidЧасы = Стр.SubMatches(3);
		vidМинуты = Стр.SubMatches(4);
		vidТекстТекущегоОбновления = Стр.SubMatches(5);
			
		СписокОбновлений.Добавить(Дата(vidГод+vidМесяц+vidДень+vidЧасы+vidМинуты), vidТекстТекущегоОбновления);
		
	КонецЦикла;	
	
	Возврат СписокОбновлений;
	
КонецФункции

В процедуре НастройкаОбновлений указываете свои параметры текущей обработки (публикации):

  • НомерПубликации - из публикации;
  • ЯкорьОбновлений - можно не указывать, но если указан, то будет осуществлен переход по указанной ссылке при чтении обновлений (см.код обработчика СтатьяНаИнфоСтартНажатие);
  • НачальнаяМетка, КонечнаяМетка - из публикации, ограничивают блок обновлений;
  • ДатаТекущегоОбновления - последняя дата обновления;
  • ПроверятьОбновленияЧерезДней - через сколько дней напоминать пользователю, что не мешало бы проверить обновления. В особенности, если ожидаются изменения в обработке. При нулевом значении параметра, напоминалка выключается.

И ,последнее, в событие ПриОткрытии вставляете строку:

Событие показать/скрыть
&НаКлиенте
Процедура ПриОткрытии(Отказ)

	НастройкаОбновлений();

КонецПроцедуры


Действующий пример включен в обработку Построитель регулярных выражений

Перейти к оглавлению

Программный код для конфигурации

Собственно, можно было бы ограничиться и описанными выше алгоритмами, но душа просит чего-то более современного. А нечто более современное мне видится таким:

  • при старте конфигурации запускается фоновое задание, загружающее информацию по обновлениям;
  • по результатам его работы, формируется важное оповещение пользователю;
  • потом через Центр оповещений запускается на исполнение связанное с обновлением действие.

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

Запускаю фоновое задание при старте обработки  и через какое-то время результат запроса обновлений отображаю на форме. А дальше все как и в случае обработки, описанной выше. Но есть небольшие отличия.

На форме обработки создаю декорацию с именем  СтатьяНаИнфоСтарт (Статья на infostart.ru), указываю, что это гиперссылка. Никаких меню в обработчике. Если есть обновления на сайте, - переход на блок обновлений по нажатию гиперссылки, иначе открывается статья на чтение с самого начала.

Обработчик показать/скрыть
	
	Адрес = "//infostart.ru/public/" + ПараметрыОбновлений.НомерПубликации;
	
	Если Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(255, 0, 0) Тогда
		Если НЕ ПустаяСтрока(ПараметрыОбновлений.ЯкорьОбновлений) Тогда
			Адрес = Адрес + "/#" + ПараметрыОбновлений.ЯкорьОбновлений;
		КонецЕсли;
	КонецЕсли;
	
	ЗапуститьПриложение(Адрес);
	

В модуль формы включаете блок процедур/функций:

Блок показать/скрыть
&НаКлиенте 
Перем	ПараметрыОбновлений;

&НаКлиенте 
Процедура НастройкаОбновлений()
	
	//СтатьяНаИнфоСтарт - декорация формы, гиперссылка
	
	//Проверить обновления...
	ПараметрыОбновлений = Новый Структура;
	ПараметрыОбновлений.Вставить("НомерПубликации", "592108");
	ПараметрыОбновлений.Вставить("ЯкорьОбновлений", "L26");
	ПараметрыОбновлений.Вставить("НачальнаяМетка", "Желаю приятного просмотра!" + "\s*" + "Обновления");
	ПараметрыОбновлений.Вставить("КонечнаяМетка", "Скачать файлы");
	
	ПараметрыОбновлений.Вставить("ДатаТекущегоОбновления", '00010101');
	
	
	ВызовСервера.ЗапуститьФоновоеЗадание(ПараметрыОбновлений);
	ПодключитьОбработчикОжидания("ПосчитатьКвоНовыхОбновлений", 10, Истина);
	
	Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru";
	Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(0, 127, 0);
	
КонецПроцедуры


&НаКлиенте
Функция ПосчитатьКвоНовыхОбновлений()
	
	СписокОбновлений = ВызовСервера.ПолучитьИзХранилища();
	
	Если СписокОбновлений <> Неопределено  Тогда
		Кво = 0;
		Для каждого Элем Из СписокОбновлений Цикл
			Если Элем.Значение > ПараметрыОбновлений.ДатаТекущегоОбновления  Тогда
				Кво = Кво + 1;
			КонецЕсли;
		КонецЦикла;
		
		Если Кво <> 0  Тогда
			Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru (" + Кво + ")";
			Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(255, 0, 0);
		КонецЕсли;
	Иначе
		Элементы.СтатьяНаИнфоСтарт.Заголовок = "Статья на infostart.ru (?)";
		Элементы.СтатьяНаИнфоСтарт.ЦветТекста = Новый Цвет(127, 127, 127);
	КонецЕсли;
	
КонецФункции

Такая деталь: после запуска фонового задания, через 10 секунд я однократно опрашиваю результат. Полагаю, для примера этого достаточно. А там уже у кого на сколько фантазии хватит.

В событие ПриОткрытии вставляете строку:

Событие показать/скрыть
&НаКлиенте
Процедура ПриОткрытии(Отказ)

	НастройкаОбновлений();

КонецПроцедуры


Серверный общий модуль с именем ВызовСервера:

ВызовСервера показать/скрыть
Процедура ЗапуститьФоновоеЗадание(ПараметрыОбновлений) Экспорт 
	
	Массив = Новый Массив;
	Массив.Добавить(ПараметрыОбновлений);
	ФоновоеЗадание = ФоновыеЗадания.Выполнить("ВызовСервера.ПолучитьОбновления", Массив, "ОбновлениеПубликации");
	
КонецПроцедуры


Процедура ПолучитьОбновления(ПараметрыОбновлений) Экспорт
	
	Попытка
		Соединение = Новый HTTPСоединение("infostart.ru",,,,Неопределено,Ложь);
		Запрос = Новый HTTPЗапрос("public/" + ПараметрыОбновлений.НомерПубликации + "/");
		Ответ = Соединение.Получить(Запрос);
		Тело = Ответ.ПолучитьТелоКакСтроку();
		
		Чтение = Новый ЧтениеHTML;
		Чтение.УстановитьСтроку(Тело);
		
		ПостроительDOM = Новый ПостроительDOM;
	    ДокументHTML   = ПостроительDOM.Прочитать(Чтение);
		ТекстПубликации = ДокументHTML.Тело.ТекстовоеСодержимое;
		
		СписокОбновлений = ПолучитьСписокОбновлений(ТекстПубликации, ПараметрыОбновлений);
	Исключение
		СписокОбновлений = Неопределено;
	КонецПопытки;
	
	ВХранилище = Новый ХранилищеЗначения(СписокОбновлений);
	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = XMLСтрока(ВХранилище);
	Сообщение.Сообщить();
	
КонецПроцедуры


Функция ПолучитьСписокОбновлений(ТекстПубликации, ПараметрыОбновлений)
	
	//	Выражение = <Проверка обновлений>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Проверка обновлений> = <НачальнаяМетка><ПС><Текст обновлений><ПС><КонечнаяМетка>
	//	+-	<Текст обновлений> = (?:.*(?:<ПС>.*)*?)
	//	+-	<ПС> = \s*
	//	+-	<Начальная метка> = НачальнаяМетка
	//	+-	<Конечная метка> = КонечнаяМетка
	
	idПС = "\s*";
	idНачальнаяМетка = ПараметрыОбновлений.НачальнаяМетка;
	idКонечнаяМетка = ПараметрыОбновлений.КонечнаяМетка;
	idТекстОбновлений = "(?:.*(?:" + idПС + ".*)*?)";
	idПроверкаОбновлений = idНачальнаяМетка + idПС + idТекстОбновлений + idПС + idКонечнаяМетка;
	idPattern = idПроверкаОбновлений;
	
	RegExpLocal = Новый COMОбъект("VBScript.RegExp");
	
	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;
	
	Найдено = RegExpLocal.Execute(ТекстПубликации);
	Для каждого Стр Из Найдено Цикл
		
		Начало = Стр.FirstIndex;
		Длина = Стр.Length;
		ТекстОбновлений = Стр.Value;
		
		Прервать;
		
	КонецЦикла;	
	
	
	СписокОбновлений = Новый СписокЗначений;
	
	
		
	//	Выражение = <Текущее обновление>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Текущее обновление> = (?:^<Дата обновления><ПС><Текст текущего обновления><ПС>)(?=(?:^(?:\d\d\.\d\d\.\d\d\d\d \d\d:\d\d))|(?:<Конечная метка>))
	//	+-	<Дата обновления> = (?:<День>\.<Месяц>\.<Год> <Часы>:<Минуты>)
	//	++	<Текст текущего обновления> = ((?:.|\s)*?)
	//	+-	<Конечная метка> = КонечнаяМетка
	//	+-	<ПС> = \s*
	//	++	<День> = (\d\d)
	//	++	<Месяц> = (\d\d)
	//	++	<Год> = (\d\d\d\d)
	//	++	<Часы> = (\d\d)
	//	++	<Минуты> = (\d\d)


	idМинуты = "(\d\d)";
	idЧасы = "(\d\d)";
	idГод = "(\d\d\d\d)";
	idМесяц = "(\d\d)";
	idДень = "(\d\d)";
	idКонечнаяМетка = ПараметрыОбновлений.КонечнаяМетка;
	idТекстТекущегоОбновления = "((?:.|\s)*?)";
	idПС = "\s*";
	idДатаОбновления = "(?:" + idДень + "\." + idМесяц + "\." + idГод + " " + idЧасы + ":" + idМинуты + ")";
	idТекущееОбновление = "(?:^" + idДатаОбновления + idПС + idТекстТекущегоОбновления + idПС + ")(?=(?:^(?:\d\d\.\d\d\.\d\d\d\d \d\d:\d\d))|(?:" + idКонечнаяМетка + "))";
	idPattern = idТекущееОбновление;
		
	RegExpLocal = Новый COMОбъект("VBScript.RegExp");
		
	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;
		
	Найдено = RegExpLocal.Execute(ТекстОбновлений);
	Для каждого Стр Из Найдено Цикл

		Начало = Стр.FirstIndex;
		Длина = Стр.Length;
		Значение = Стр.Value;
			
		vidДень = Стр.SubMatches(0);
		vidМесяц = Стр.SubMatches(1);
		vidГод = Стр.SubMatches(2);
		vidЧасы = Стр.SubMatches(3);
		vidМинуты = Стр.SubMatches(4);
		vidТекстТекущегоОбновления = Стр.SubMatches(5);
			
		СписокОбновлений.Добавить(Дата(vidГод+vidМесяц+vidДень+vidЧасы+vidМинуты), vidТекстТекущегоОбновления);
		
	КонецЦикла;	
	
	Возврат СписокОбновлений;
	
КонецФункции


Функция ПолучитьИзХранилища() Экспорт
	
	Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Ключ", "ОбновлениеПубликации"));
	
	Если Задания.Количество() <> 0  Тогда
		Задание = Задания[0];
		Сообщения = Задание.ПолучитьСообщенияПользователю(Истина);
		
		Если Сообщения.Количество() <> 0  Тогда
			СписокОбновлений = XMLЗначение(Тип("ХранилищеЗначения"), Сообщения[0].Текст).Получить();
			Возврат СписокОбновлений;
		Иначе
			Возврат Неопределено;
		КонецЕсли;
		
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

Перейти к оглавлению

Предварительное тестирование

Для пущей уверенности, что все сделано правильно, текстовые метки блока обновлений прописаны верно, - можно протестировать публикацию, записанную в черновик. Текст ее перенесите в Построитель регулярных выражений, а само выражение восстановите в Построителе на закладке Код 1С из процедуры ПолучитьСписокОбновлений (особо не задумываясь, можно перенести туда полный текст процедуры). Как это делается, подробно описано в Построителе регулярных выражений. И я настойчиво советую тем из вас, кто скачал Построитель регулярных выражений до опубликования этой статьи, - предварительно обновить его на последнюю версию, в которой есть важные изменения и применительно к обсуждаемой теме.

Значения параметров <Начальная метка> и <Конечная метка> установите такие же, что и в процедуре НастройкаОбновлений.

Потом запустите на выполнение выражение <Проверка обновлений>. Если текстовый блок обновлений из публикации выбран правильно, включая ограничители, - все хорошо.

Я бы порекомендовал проделывать это хотя бы в первый раз, при организации блока обновлений на странице вашей публикации.
Перейти к оглавлению

Заключение

Оба примера проверены мной в работе на 1С 8.3.7.1873 под Win'7, ошибок не выявлено.

Тем не менее, загодя приношу свои дикие извинения, если вдруг что-то не сложилось у вас по моей вине. Знаете, как это бывает: правой рукой исполняешь свои основные обязанности на работе; левой чешешь репу; а ногами выстукиваешь статью на ИнфоСтарт. Чудеса при этом могут случаться.

И отдельные извинения за стиль программирования, который, возможно, не соответствует вашим стандартам.

Писалось из лучших побуждений. Желаю удачи!

Перейти к оглавлению

21

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. MaxS 1603 24.03.17 14:16 Сейчас в теме
Спасибо за оформление публикации, полезная информация. ))
Вопрос скорее к функционалу сайта. Когда появится механизм, позволяющий простым запросом без анализа текста сайта получить небольшой текст-информацию об обновлении? Об этом спрашивалось несколько лет назад.
Сейчас есть удобный механизм не заходя в редактирование публикации обновить файл публикации.
Лично я лишний раз не рискую заходить в редактирование публикации, т.к. не знаю чего ожидать - то вдруг она заблокируется и отправится на модерацию, то вдруг испортятся наименования файлов, то ещё что-нибудь, что не сразу заметишь.
Поэтому хотелось бы ещё получить аналогичный функционал по загрузке некоторой дополнительной информации не переходя в режим редактирования.
2. romasna 246 24.03.17 14:27 Сейчас в теме
(1)Наверное, этот вопрос уместней вынести на форум. :) Но как я уже вскользь упомянул в статье, рассчитывать на то, что разработчики сайта удовлетворят всех нас и все наши интересы не приходится, в силу невозможности. По-любому, чтобы они не предложили, придется за этим зайти на сайт. А предлагаемый в статье подход исключает такую необходимость для конечного потребителя программного продукта. Зайдут на сайт по прямой ссылке тогда, когда появится обновление. Как-то так...
3. MaxS 1603 24.03.17 14:55 Сейчас в теме
(2) Вопрос где-то в авторском разделе висит уже не помню где.
Про пользователей всё понятно. Хочется ещё и удобства автору разработки, чтобы тоже лишний раз не ходить на сайт, а программно отправить запрос на обновление информации на сайте.
Наверное это не критично, но Инфостарт продаёт свои обработки через партнеров... Внимательный покупатель заметит, что купил/скачал на одном сайте, а за обновлением обработка стучится на другой. )) Как это разрулить я сам не знаю.
4. romasna 246 24.03.17 15:05 Сейчас в теме
(3)Для учета партнеров пришлось бы напрячь как-то покупателей. Например, в меню, связанном с гиперссылкой на форме, предлагать выбор этого самого партнера. Дальше дело техники. В плане реализации как-бы не сложно, но... захочет ли покупатель сообщить эти данные в настройке? Можно, правда, принудить его при первой попытке проверить обновления... Надо только иметь полный список партнеров или озаботиться о его закачке с какого-то ресурса ИнфоСтарта. В-общем, решение может быть.
5. adapter 503 27.03.17 15:32 Сейчас в теме
хорошо было бы добавить RSS ленту к публикации. Клиенты могут подписаться, программно можно читать.

Ну и самый нормальный вариант - дать автору управляемую рассылку по вариантам "скачавшие", "купившие", "проголосовавшие" и т.д.
6. romasna 246 27.03.17 15:54 Сейчас в теме
(5)Наверное, решение задачи в такой постановке ближе разработчикам этого сайта. Пока что сделал то, что смог, на основе имеющихся возможностей и умений.
Оставьте свое сообщение