Введение
Совсем недавно у меня возникла необходимость выводить все производимые изменения в конфигурации для каждого пользователя, чтобы они следили за последними новшествами. С удовольствием делюсь своим способом решения данной задачи.
Решение
Первым делом создадим новый справочник и назовем его "Новости". Добавим в него два реквизита: "Полное наименование" - строка и "ДатаНовости" - дата. В этом справочнике будут храниться наши новости.
Теперь нам необходимо создать форму в которой будут отображаться наши новости. Создадим ее - общие формы-ФормаНовостей. Добавим в нее 3 поля: "ЗаголовокНовости" (Вид - Поле надписи, ПутьКДанным - реквизит "ЗаголовокНовости"), "ДатаНовости" (Вид - Поле надписи, ПутьКДанным - реквизит "ДатаНовости") и "ОписаниеНовости" (Вид - Поле надписи, ПутьКДанным - реквизит "ОписаниеНовости") и две кнопки "Вперед" и "Назад". Также создадим еще 4 дополнительных реквизита:
- ДатаНовостиОтбор (тип - Дата) - понадобится нам для отбора новостей в запросе;
- КоличествоЗаписей (тип - Число) - будет необходимо для навигации по записям;
- ТекущаяЗапись (тип - Число) - так же как и КоличествоЗаписей будет задействован в навигации;
- ТаблицаНовостей (тип - ТаблицаЗначений, 1-я колонка "Наименование" тип - строка, 2-я - "ПолноеНаименование" тип - строка и 3-я "ДатаНовости" тип -дата)
Теперь приступим непосредственно к написанию кода. Для нашей формы создадим событие ПриСозданииНаСервере и добавим туда следующий код:
&НаСервере ПроцедураПриСозданииНаСервере(Отказ,СтандартнаяОбработка)
ПеремНоваяСтрока,КодПоследнейНовости,ТекПользовательСсылка,ТекПользовательОбъект;
ТекПользовательСсылка=ОМПользователи.ПолучитьСсылкуТекущегоПользователя(); ДатаНовостиОтбор=ТекПользовательСсылка.Новость.ДатаНовости;
Запрос=НовыйЗапрос; Запрос.Текст= "ВЫБРАТЬ | Новости.Код КАК Код, | Новости.Наименование КАК Наименование, | Новости.ПолноеНаименование КАК ПолноеНаименование, | Новости.ДатаНовости КАК ДатаНовости |ИЗ | Справочник.Новости КАК Новости |ГДЕ | Новости.ДатаНовости > &ДатаНовостиОтбор | |УПОРЯДОЧИТЬ ПО | ДатаНовости";
Запрос.УстановитьПараметр("ДатаНовостиОтбор",ДатаНовостиОтбор); Результат=Запрос.Выполнить(); ВыборкаДетальныеЗаписи=Результат.Выбрать();
//Заполним Таблицу значений ПокаВыборкаДетальныеЗаписи.Следующий() Цикл
НоваяСтрока=ТаблицаНовостей.Добавить(); НоваяСтрока.Наименование=ВыборкаДетальныеЗаписи.Наименование; НоваяСтрока.ПолноеНаименование=ВыборкаДетальныеЗаписи.ПолноеНаименование; НоваяСтрока.ДатаНовости=ВыборкаДетальныеЗаписи.ДатаНовости; КодПоследнейНовости=ВыборкаДетальныеЗаписи.Код;
КонецЦикла;
//Заполнение реквизитов необходимых для навигации ТекущаяЗапись= 0; КоличествоЗаписей=ВыборкаДетальныеЗаписи.Количество() - 1; ЭтаФорма.Элементы.Назад.Доступность=Ложь; ЕслиВыборкаДетальныеЗаписи.Количество() = 1 Тогда ЭтаФорма.Элементы.Вперед.Доступность= Ложь; //Покажем самую первую запись ПоказатьЗапись(ТекущаяЗапись); ИначеЕслиВыборкаДетальныеЗаписи.Количество()= 0 Тогда //Если нет новостей, то и открывать форму не будем Отказ= Истина; Иначе //Покажем самую первую запись ПоказатьЗапись(ТекущаяЗапись); КонецЕсли;
//Запишем последнюю новость которую просмотрел пользователь //чтобы при следующем открытии ее и предыдущие новости не показывать ЕслиВыборкаДетальныеЗаписи.Количество() > 0 Тогда ТекПользовательОбъект=ТекПользовательСсылка.ПолучитьОбъект(); ТекПользовательОбъект.Новость=Справочники.Новости.НайтиПоКоду(КодПоследнейНовости); ТекПользовательОбъект.Записать(); КонецЕсли;
КонецПроцедуры Теперь добавим нашим кнопкам по событию:
&НаКлиенте ПроцедураВперед(Команда)
ТекущаяЗапись=ТекущаяЗапись+ 1; ПоказатьЗапись(ТекущаяЗапись); ЕслиТекущаяЗапись=КоличествоЗаписейТогда ЭтаФорма.Элементы.Вперед.Доступность= Ложь; КонецЕсли;
ЭтаФорма.Элементы.Назад.Доступность= Истина;
КонецПроцедуры
&НаКлиенте ПроцедураНазад(Команда)
ТекущаяЗапись=ТекущаяЗапись- 1; ПоказатьЗапись(ТекущаяЗапись); ЕслиТекущаяЗапись= 0 Тогда ЭтаФорма.Элементы.Назад.Доступность= Ложь; КонецЕсли;
ЭтаФорма.Элементы.Вперед.Доступность= Истина;
КонецПроцедуры и создадим функцию которая будет загружать нужную нам новость на форму из таблицы значений "ТаблицаНовостей":
&НаСервере ПроцедураПоказатьЗапись(НомерЗаписи)
ПеремСтрокаДляЧтения;
СтрокаДляЧтения=ТаблицаНовостей.Получить(НомерЗаписи); ДатаНовости=СтрокаДляЧтения.ДатаНовости; ЗаголовокНовости=СтрокаДляЧтения.Наименование; ОписаниеНовости=СтрокаДляЧтения.ПолноеНаименование;
КонецПроцедуры
Наконец последний штрих. Нам необходимо, чтобы эта форма загружалась при запуске программы. Для этого воспользуемся модулем управляемого приложения:
в котором создадим процедуру ПриНачалеРаботыСистемы:
ПроцедураПриНачалеРаботыСистемы()
ФормаНовостей=ПолучитьФорму("ОбщаяФорма.ФормаНовостей"); Попытка ФормаНовостей.Открыть(); Исключение КонецПопытки;
КонецПроцедуры
Запускаем и любуемся результатом:
Источник: http://alsproject.ru/publ/primery/sozdanie_formy_novostej/4-1-0-17 |