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

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

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

В наличии

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

Категория:

Описание

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

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

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

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

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

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

Заключение



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обработчик показать/скрыть
&НаКлиенте
Процедура СтатьяНаИнфоСтартНажатие(Элемент)
	
	Меню = Новый СписокЗначений;
	Меню.Добавить(1, "Читать статью");
	Меню.Добавить(2, "Проверить обновления");
	Меню.Добавить(3, "Получить обновления");
	
	Пункт = ВыбратьИзМеню(Меню, Элементы.СтатьяНаИнфоСтарт);
	
	Если Пункт = Неопределено  Тогда
		Возврат;
	КонецЕсли;
	
	Пункт = Пункт.Значение;
	Если Пункт = 1 Тогда
		ЗапуститьПриложение("//sale.itcity.ru/public/" + ПараметрыОбновлений.НомерПубликации);
		
	ИначеЕсли Пункт = 2 Тогда
		ПроверитьОбновления();
		
	ИначеЕсли Пункт = 3 Тогда
		
		Адрес = "//sale.itcity.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), указываю, что это гиперссылка. Никаких меню в обработчике. Если есть обновления на сайте, — переход на блок обновлений по нажатию гиперссылки, иначе открывается статья на чтение с самого начала.

    Обработчик показать/скрыть
    	
    	Адрес = "//sale.itcity.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, ошибок не выявлено.

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

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

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

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

      has been added to your cart:
      Оформление заказа