Постановка задачи
Оформление обновлений в публикации
Программный код
для (внешней) обработки
для конфигурации
Предварительное тестирование
Заключение
Постановка задачи
Эта небольшая статья навеяна следующим. Я дважды внес изменения в свою последнюю публикацию, посвященную Построителю регулярных выражений, и дважды не заметил на сайте никаких признаков изменений после обновления файла обработки. Даже дата обновления на странице публикации не сдвинулась. В третий раз я не менял обработку, но немного изменил раздел "Обновления" в своей публикации, сделал две записи, чтобы отработать предлагаемое в этой статье решение сего маленького недоразумения. И... в этот раз поменялась дата обновления публикации. Опять же, я не увидел свою работу в перечне обновленных публикаций. И мне это не надо, в-общем-то. Но в этом могли бы быть заинтересованы те, кто уже пользуются обработкой. Полагаю, проблема у нас у всех одна: донести наиболее комфортным способом информацию об обновлениях конечным потребителям наших обработок/конфигураций.
Если кто-то из разработчиков уже предлагал свое решение на этом сайте, я его пока что не нашел. Реализация этого не претендует на оригинальность исполнения. Уже годами приложения шлют свои оповещения и обновляются через интернет.
Оформление обновлений в публикации
Перехожу теперь к описанию самого подхода. Для получения информации по обновлениям будет использовано текстовое содержимое вашей публикации на этом ресурсе. В качестве наглядного примера рекомендую использовать публикацию Построитель регулярных выражений. В этой публикации уже организован текстовый блок "Обновления". Сверху этот блок ограничен текстовым маркером „Желаю приятного просмотра!\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, ошибок не выявлено.
Тем не менее, загодя приношу свои дикие извинения, если вдруг что-то не сложилось у вас по моей вине. Знаете, как это бывает: правой рукой исполняешь свои основные обязанности на работе; левой чешешь репу; а ногами выстукиваешь статью на ИнфоСтарт. Чудеса при этом могут случаться.
И отдельные извинения за стиль программирования, который, возможно, не соответствует вашим стандартам.
Писалось из лучших побуждений. Желаю удачи!