Система оповещений Пользователей (универсальная) Для одного проекта пришлось сделать простую систему оповещений!
Она состоит из:
Общая форма
Общий модуль
Регистр Сведений
Общая Форма
На ней поле HTML Документа и Кнопка Ознакомлен (подтверждение что пользователь это видел)
Код 1C v 8.х Перем ТекДата, ТипСсылки, ТекСсылка;
Процедура ПриОткрытии()
ТекДата = Дата;
ЭлементыФормы. ПолеHTMLДокумента. УстановитьТекст( Текст) ;
КонецПроцедуры
Процедура ОзнакомленНажатие(Элемент)
Если ЗначениеЗаполнено( ТекДата) Тогда
НаборЗаписей = РегистрыСведений. МЕ_Оповещения. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Отбор. Получатель. Установить( Пользователь) ;
НаборЗаписей. Отбор. Период. Установить( ТекДата) ;
НаборЗаписей. Прочитать( ) ;
НовыйНомер = НаборЗаписей[0 ];
НовыйНомер. ДатаОзнакомления = ТекущаяДата( ) ;
НаборЗаписей. Записать( ) ;
Если ЗначениеЗаполнено( НовыйНомер. ТипСсылки) Тогда
ТекСсылка = НовыйНомер. Ссылка;
ТипСсылки = НовыйНомер. ТипСсылки;
КонецЕсли ;
КонецЕсли ;
Парам = Новый Структура;
Парам. Вставить( "ТипСсылки" , ТипСсылки) ;
Парам. Вставить( "ТекСсылка" , ТекСсылка) ;
ЭтаФорма. Закрыть( Парам) ;
КонецПроцедуры
Процедура ПолеHTMLДокументаonclick(Элемент, pEvtObj)
pEvtObj. returnValue = Ложь ;
Если ВРег( pEvtObj. srcElement. tagName) = "A" Тогда
СсылкаТекст = Сред( pEvtObj. srcElement. href, 4 ) ;
Ссылка = ЗначениеИзСтрокиВнутр( СсылкаТекст) ;
Если Ссылка. Пустая( )
Или Ссылка. ПолучитьОбъект( ) = Неопределено Тогда
Предупреждение( "Ошибка открытия объекта." , , "Ошибка" ) ;
Возврат ;
Иначе
ОткрытьЗначение( Ссылка) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
В общем Модуле:
Код 1C v 8.х Процедура СоздатьОповещение(Получатель,ТекстОповещения, ТипСсылки=Неопределено, Ссылка=Неопределено) Экспорт
НаборЗаписей = РегистрыСведений. МЕ_Оповещения. СоздатьНаборЗаписей( ) ;
НовЗапись = НаборЗаписей. Добавить( ) ;
НовЗапись. Период = ТекущаяДата( ) ;
НовЗапись. Получатель = Получатель;
НовЗапись. ТекстОповещения = ТекстОповещения;
Если НЕ ТипСсылки= Неопределено Тогда
НовЗапись. ТипСсылки = ТипСсылки;
КонецЕсли ;
Если НЕ Ссылка= Неопределено Тогда
НовЗапись. Ссылка = Ссылка;
КонецЕсли ;
НаборЗаписей. Записать( Ложь ) ;
КонецПроцедуры
Процедура ПоказатьОповещение(ТекстОповещения)
формОповещ = ПолучитьОбщуюФорму( "МЕ_Оповещения" ) ;
формОповещ. текст= ТекстОповещения;
Если Не формОповещ. Открыта( ) Тогда
формОповещ. ОткрытьМодально( ) ;
КонецЕсли ;
КонецПроцедуры
Регистр сведений (для хранения сообщений):
Думаю что все поля понятны из названия, только ТипСсылки - Строка 35
Проверка непрочитанных сообщений и вызов окна:
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| МЕ_Оповещения.Период КАК Период,
| МЕ_Оповещения.Получатель,
| МЕ_Оповещения.ТекстОповещения,
| МЕ_Оповещения.ДатаОзнакомления
|ИЗ
| РегистрСведений.МЕ_Оповещения КАК МЕ_Оповещения
|ГДЕ
| МЕ_Оповещения.ДатаОзнакомления = &ДатаОзнакомления
| И МЕ_Оповещения.Получатель = &Получатель
|
|УПОРЯДОЧИТЬ ПО
| Период" ;
Запрос. УстановитьПараметр( "ДатаОзнакомления" , Дата( "01.01.0001 0:00:00" ) ) ;
Запрос. УстановитьПараметр( "Получатель" , ПараметрыСеанса. ТекущийПользователь) ;
Результат = Запрос. Выполнить( ) . Выбрать( ) ;
Пока Результат. Следующий( ) Цикл
формОповещ = ПолучитьОбщуюФорму( "МЕ_Оповещения" ) ;
формОповещ. дата= Результат. период;
формОповещ. пользователь= Результат. Получатель;
формОповещ. текст= Результат. ТекстОповещения;
Если Не формОповещ. Открыта( ) Тогда
Структ = формОповещ. ОткрытьМодально( ) ;
Если Структ = Неопределено Тогда
Иначе
Если СокрЛП( Структ. ТипСсылки) = "ОбработкаЦен" Тогда
Обр = Обработки. ОбработкаЦен. Создать( ) ;
Обр. Счет = Структ. ТекСсылка;
Обр. ПолучитьФорму( ) . Открыть( ) ;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Пример добавления сообщения:
Код 1C v 8.х МЕ_Оповещения. СоздатьОповещение( ТекДоговорКИзменению. Менеджер, "Ваш Договор №" + СокрЛП( ТекДоговорКИзменению. Номер) +
" - Отклонен!!! - " + ИмяПользователя( ) + "!" + Символы. ПС+ " Исправьте его учитывая Комментарии и запустите на Согласование!" , "" , ТекДоговорКИзменению. Ссылка) ;
или
Текст = "" + ПараметрыСеанса. ТекущийПользователь+ ": Необходимо Доработать цены:<br> <b>" + Счет. Ссылка+ "</b>" ;
МЕ_Оповещения. СоздатьОповещение( СнабженецПоследнееИзменение, Текст, "ОбработкаЦен" , Счет. Ссылка) ;
Категория:
Полезные, Универсальные Функции Универсальная функция для чтения данных из Excel в 1С Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект( ПутьДоExcel) ;
Исключение
Сообщить( "Произошла ошибка при обращение к Excel:" + Символы. ПС + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
ЗакрытьФормуИндиктаора = Ложь ;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина ;
ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. Открыть( ) ;
КонецЕсли ;
ФормаИндикатора. КомментарийЗначения = "Загрузка данных из Excel..." ;
ТЗ = Новый ТаблицаЗначений( ) ;
Страница = Док. Sheets( НомерСтраницы) ;
МакСтрок = Страница. UsedRange. Rows. Count;
МакСтолб = Страница. UsedRange. Columns. Count;
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница. Cells( 1 , Столбец) . Value;
ИмяСтолбца = СокрЛП( ИмяСтолбца) ;
ИмяСтолбца = СтрЗаменить( ИмяСтолбца, " " , "_" ) ;
КонецЕсли ;
ТЗ. Колонки. Добавить( ИмяСтолбца, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
НачальнаяСтрока = 1 ;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2 ;
КонецЕсли ;
Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ. Добавить( ) ;
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница. Cells( НомСтрока, НомСтолбец) . Value;
СтрТЗ[НомСтолбец- 1 ] = Данные;
КонецЦикла ;
ФормаИндикатора. ЭлементыФормы. Индикатор. Значение = НомСтрока/ МакСтрок * 100 ;
КонецЦикла ;
Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора. Закрыть( ) ;
КонецЕсли ;
Возврат ТЗ;
КонецФункции
Пример вызова:
Код 1C v 8.х ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. НаименованиеОбработкиДанных = "Загрузка данных..." ;
ФормаИндикатора. Открыть( ) ;
ТЗ = ИзExcelВТаблицу( ФайлExcel, 1 , Истина , ФормаИндикатора) ;
Если ТЗ = Неопределено тогда
ФормаИндикатора. Закрыть( ) ;
Возврат ;
КонецЕсли ;
ФормаИндикатора. Закрыть( ) ;
или
Код 1C v 8.х ТЗ = ИзExcelВТаблицу( ФайлExcel) ;
Если ТЗ = Неопределено тогда
Возврат ;
КонецЕсли ;
Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х
Функция ЭлементСправочника(ИмяСправочника = "" ,ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить( "Укажите имя спрачоника - ЭлементСправочника()" ) ;
Возврат Неопределено ;
КонецЕсли ;
Если ПустаяСтрока( ИмяЭлемента) тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = Неопределено ;
Если ИмяРодителя < > Неопределено тогда
ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника]. ПустаяСсылка( ) ;
Пока НЕ ПустаяСтрока( ОбрабатИмяРодителя) цикл
ПозРазделителя = Найти( ОбрабатИмяРодителя, "\\" ) ;
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред( ОбрабатИмяРодителя, 1 , ПозРазделителя- 1 ) ;
ОбрабатИмяРодителя = Сред( ОбрабатИмяРодителя, ПозРазделителя+ 2 ) ;
КонецЕсли ;
ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник." + ИмяСправочника+ " КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа" ;
ЗапросРодителя = Новый Запрос( ТексЗапроса) ;
ЗапросРодителя. УстановитьПараметр( "Родитель" , РодительГруппы) ;
ЗапросРодителя. УстановитьПараметр( "Наименование" , ИмяГруппы) ;
РезультатРодителя = ЗапросРодителя. Выполнить( ) . Выгрузить( ) ;
Если РезультатРодителя. Количество( ) < > 0 тогда
РодительГруппы = РезультатРодителя[0 ]. Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника]. СоздатьГруппу( ) ;
ОбъектРодитель. Родитель = РодительГруппы;
ОбъектРодитель. Наименование = ИмяГруппы;
ОбъектРодитель. Записать( ) ;
РодительГруппы = ОбъектРодитель. Ссылка;
КонецЕсли ;
КонецЦикла ;
Родитель = РодительГруппы;
КонецЕсли ;
Элемент = Справочники[ИмяСправочника]. НайтиПоНаименованию( ИмяЭлемента) ;
ОбъектЭлемент = Неопределено ;
Если Элемент. Пустая( ) тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника]. СоздатьЭлемент( ) ;
ОбъектЭлемент. Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли ;
Иначе
ОбъектЭлемент = Элемент. ПолучитьОбъект( ) ;
КонецЕсли ;
Если ОбъектЭлемент < > Неопределено тогда
Если Параметры < > Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр. Ключ] = СтрПараметр. Значение;
КонецЦикла ;
КонецЕсли ;
Если Родитель < > Неопределено тогда
ОбъектЭлемент. Родитель = Родитель;
КонецЕсли ;
ОбъектЭлемент. Записать( ) ;
Элемент = ОбъектЭлемент. Ссылка;
КонецЕсли ;
Возврат Элемент;
КонецФункции
Автор:
borismor Категория:
Работа с Microsoft Office и OpenOffice Принудительная установка пароля пользователям, работающим без пароля! Чтоб заставить всех, кто работает без пароля, установить пароль. Можно применить программный ограничитель. Для этого в модуле приложения добавляем функцию:
Код 1C v 8.х
Функция ПроверитьИзменитьПарольПользователя()
ТекПользовательИБ = ПользователиИнформационнойБазы. ТекущийПользователь( ) ;
Если Не ТекПользовательИБ. ПарольУстановлен Тогда
ФВП = ПолучитьОбщуюФорму( "ФормаВводаПароля" ) ;
ФВП. Заголовок = "Установите пароль на вход в 1С (не менее 6 симв.)" ;
ФВП. ОткрытьМодально( ) ;
Если ЗначениеЗаполнено( ФВП. Пароль) Тогда
Пароль1 = ФВП. Пароль;
Если СтрДлина( Пароль1 ) < 6 Тогда
Предупреждение( "Длина пароля должна быть не менее 6 символов!" ) ;
Возврат Ложь ;
КонецЕсли ;
ФВП = ПолучитьОбщуюФорму( "ФормаВводаПароля" ) ;
ФВП. Заголовок = "Повторите новый пароль" ;
ФВП. ОткрытьМодально( ) ;
Если ЗначениеЗаполнено( ФВП. Пароль) Тогда
Пароль2 = ФВП. Пароль;
Если Пароль1 < > Пароль2 Тогда
Предупреждение( "Не совпадают пароли!" ) ;
Возврат Ложь ;
Иначе
ТекПользовательИБ. Пароль = Пароль1 ;
ТекПользовательИБ. Записать( ) ;
Возврат Истина ;
КонецЕсли ;
Иначе
Возврат Ложь ;
КонецЕсли ;
Иначе
Возврат Ложь ;
КонецЕсли ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
и в предопредленной процедуре ПриНачалеРаботыСистемы (мы не можем использовать ПередНачаломРаботыСистемы т.к. в ней еще не существует окна программы и нет возможности открыть общую форму ввода пароля) делаем вызов
Код 1C v 8.х
Если Не ПроверитьИзменитьПарольПользователя( ) Тогда
ЗавершитьРаботуСистемы( Ложь ) ;
Возврат ;
КонецЕсли ;
источник Категория:
Администрирование Форма ~ Универсальная Форма Вопроса для Пользователя При написании программ, часто возникает ситуация, когда необходимо спросить у пользователя, какие данные он хочет получить.
В данной статье описан пример создания универсальной Формы Вопроса для Пользователя:
1. Создадим в общих формах новую форму "ФормаВопроса", добавим на ней две Надписи (ПЕРВАЯ= Имя: НадписьВыМожете, Заголовок: "Вы можете:" , ВТОРАЯ= Имя: НадписьТекстВопроса), добавим три кнопки (ПЕРВАЯ= Имя: КнопкаДействие1, Заголовок: "Действие1, События Нажатие: КнопкаДействие1, ВТОРАЯ= Имя: КнопкаДействие2, Заголовок: "Действие2, События Нажатие: КнопкаДействие2, ТРЕТЬЯ= Имя: КнопкаДействие3, Заголовок: "Действие3, События Нажатие: КнопкаДействие3) и добавим картику знака вопроса, для красоты.
В свойствах формы,
обязательно снять галочку "Разрешить закрытие" , иначе пользователь сможет нажать на крестик в правом верхнем углу и ответа на вопрос не произойдет
.
2. В модуле опишем действия заданных Событий:
Код 1C v 8.х
Процедура КнопкаДействие1(Элемент)
Закрыть( "1" ) ;
КонецПроцедуры
Процедура КнопкаДействие2(Элемент)
Закрыть( "2" ) ;
КонецПроцедуры
Процедура КнопкаДействие3(Элемент)
Закрыть( "3" ) ;
КонецПроцедуры
Все, форма готова!
Использовать ее, можно с помощью кода:
Код 1C v 8.х
Форма = ПолучитьОбщуюФорму( "ФормаВопроса" ) ;
Форма. Заголовок = "Выберите как сформировать проводки" ;
Форма. ЭлементыФормы. НадписьТекстВопроса. Заголовок = "Сформировать проводки по всем видам начислений или выбрать виды начислений и списка:" ;
Форма. ЭлементыФормы. КнопкаДействие1 . Заголовок = "По всем видам" ;
Форма. ЭлементыФормы. КнопкаДействие2 . Заголовок = "Выбрать виды из списка" ;
Форма. ЭлементыФормы. КнопкаДействие3 . Видимость = ложь ;
Результат = Форма. ОткрытьМодально( ) ;
Если Результат = "1" тогда
СформироватьВсе( ) ;
иначеесли Результат = "2" тогда
СформироватьВыбор( ) ;
КонецЕсли ;
Пользователь увидит вопрос:
Автор:
Евгений Мигачев Категория:
Работа с Формой (Диалог) и её элементами Универсальная форма для выбора пользователем значения из списка значений В данной статье описан пример создания универсальной Формы работы со списком значений:
1. Создадим в общих формах новую форму "ФормаРаботыСоСпискомЗначений", добавим на ней Табличное поле (Имя - СписокЗначений) и КоманднаяПанельСписокЗначений
На закладке Реквизиты, появится реквизит СписокЗначений
2. Привяжем КоманднаяПанельСписокЗначений к Источнику действий - СписокЗначений
3. В свойствах табличного поля пропишем События - Выбор и ПередНачаломДобавления
4. В модуле Формы пропишем обработку событий
Код 1C v 8.х Процедура ОсновныеДействияФормыВыбрать(Кнопка)
ТекущаяСтрока = ЭлементыФормы. СписокЗначений. ТекущиеДанные;
Если ТекущаяСтрока < > Неопределено Тогда
Закрыть( ТекущаяСтрока) ;
КонецЕсли ;
КонецПроцедуры
Процедура СписокЗначенийПередНачаломДобавления(Элемент, Отказ, Копирование)
Отказ = Истина ;
КонецПроцедуры
Процедура СписокЗначенийВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекущаяСтрока = ЭлементыФормы. СписокЗначений. ТекущиеДанные;
Если ТекущаяСтрока < > Неопределено Тогда
Закрыть( ТекущаяСтрока) ;
КонецЕсли ;
КонецПроцедуры
Процедура ЗакрытьФорму(Кнопка) //процедура действия кнопки закрыть
Закрыть( ) ;
КонецПроцедуры
Все, форма создана
Использовать ее для выбора значения, можно с помощью кода:
Код 1C v 8.х
Массив = ТаблицаНачислений. ВыгрузитьКолонку( "Видрасчета" ) ;
Список = Новый СписокЗначений;
Список. ЗагрузитьЗначения( Массив) ;
ФормаРаботыСоСпискомЗначений = ПолучитьОбщуюФорму( "ФормаРаботыСоСпискомЗначений" ) ;
ФормаРаботыСоСпискомЗначений. СписокЗначений = Список;
ЭлементСписка = ФормаРаботыСоСпискомЗначений. ОткрытьМодально( ) ;
Если ЭлементСписка < > Неопределено Тогда
ВидРасчета= ЭлементСписка. Значение;
иначе
СписокВидовРасчетов = ФормаРаботыСоСпискомЗначений. СписокЗначений;
КонецЕсли ;
Пользователь увидит окно выбора значения:
Категория:
Работа с Списком Значений