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

24.03.17

Интеграция - WEB-интеграция

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

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

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

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

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

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

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

Заключение



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

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

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

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

Перехожу теперь к описанию самого подхода. Для получения информации по обновлениям будет использовано текстовое содержимое вашей публикации на этом ресурсе. В качестве наглядного примера рекомендую использовать публикацию Построитель регулярных выражений. В этой публикации уже организован текстовый блок "Обновления".  Сверху этот блок ограничен текстовым маркером Желаю приятного просмотра!\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, ошибок не выявлено.

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

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

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

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

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15729    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17545    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16353    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25736    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88576    160    215    

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

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