1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран договор с истекшим сроком действия (справочник Договоры).
При помощи функции с запросом получаем срок действия договора и возращаем результат:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| &НаСервереБезКонтекста
Функция ПроверкаДатыДоговора(Договор)
// запрос на получение срока договора
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоходныеДоговоры.СрокДействияКонец КАК СрокДействия
|ИЗ
| Справочник.ДоходныеДоговоры КАК ДоходныеДоговоры
|ГДЕ
| ргДоходныеДоговоры.Ссылка = &Договор";
Запрос.УстановитьПараметр("Договор", Договор);
РезультатЗапроса = Запрос.Выполнить();
Выборка= РезультатЗапроса.Выбрать();
ТекДата = ТекущаяДата();
Пока Выборка.Следующий() Цикл
// сравниваем даты и устанавливаем значение для возврата
мДата = Выборка.СрокДействия;
Если мДата < ТекДата Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
КонецЦикла;
// возвращаем значение
Возврат Результат;
КонецФункции |
|
Вариант функции с запросом из регистра сведений, по которому можно настроить движение справочника "Договоры", ранее опубликованным методом:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| &НаСервереБезКонтекста
Функция ПроверкаДатыДоговора(Договор)
// Запрос на получение срока договора
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоходныеДоговоры.СрокДействияКонец КАК СрокДействия
|ИЗ
| РегистрСведений.ДоходныеДоговоры.СрезПоследних(&ДатаСреза, Ссылка = &Договор) КАК ДоходныеДоговоры
|
|СГРУППИРОВАТЬ ПО
| ДоходныеДоговоры.СрокДействия";
ТекДата = ТекущаяДатаСеанса();
Запрос.УстановитьПараметр("Договор", Договор);
Запрос.УстановитьПараметр("ДатаСреза", ТекДата);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Сравниваем даты и устанавливаем значение для возврата
мДата = Выборка.СрокДействия;
Если мДата < ТекДата Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
КонецЦикла;
// Возвращаем значение
Возврат Результат;
КонецФункции |
|
В данном варианте, в параметрах запроса, указывается именно "Ссылка", а не "Регистратор", поскольку Справочник не может быть регистратором для регистров сведений.
Далее, обрабатываем условие в процедуре "ОбработкаВыбора" согласно полученного при помощи функции результата:
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
| &НаКлиенте
&НаКлиенте
Процедура ДоговорОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Обращаемся к функции и проверяем условие
Если ПроверкаДатыДоговора(Объект.Договор) Тогда
СтандартнаяОбработка = Ложь;
// Вызываем отказ и выводим сообщение пользователю
ЭтаФорма.ТекущийЭлемент = ЭтаФорма.Элементы.Договор;
ОчиститьСообщения();
Сообщить("Срок действия выбранного договора истек!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры |
|
В результате, пользователь не сможет использовать договор с истёкшим сроком действия.
2. Доступность значения справочника согласно ролям
Аналогично первому варианту решена задача по исключению определенных договоров для доступности использования в том же документе "ЗаявкаНаРаботу".
Для начала создается реквизит "Флаг" (типа "Булево") в справочнике "ДоходныеДоговоры", данный реквизит будет помечать договоры, которые нельзя использовать в указанном выше документе.
Далее, в документе создается реквизит формы "мПрава"(типа "Булево").
Необходимость данного реквизита заключается в том, что мы не можем использовать одну глобальную переменную, поскольку в данном случае она будеть вызываться как в серверных процедурах, так и в клиентских.
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| // Определение прав доступа и запись соответствующего значения в реквизит "мПрава"
&НаСервере
Процедура ИсключитьРоль()
Если РольДоступна("ДиректорФилиала") ИЛИ РольДоступна("ПолныеПрава") Тогда
мПрава = Истина;
Иначе
мПрава = Ложь;
КонецЕсли;
КонецПроцедуры
// Получение помеченных "флагом" договоров
&НаСервереБезКонтекста
Функция ПроверкаЗначДоговора(Договор)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоходныеДоговоры.Флаг КАК Флаг
|ИЗ
| Справочник.ДоходныеДоговоры КАК ДоходныеДоговоры
|ГДЕ
| ДоходныеДоговоры.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Договор);
РезультатЗапроса = Запрос.Выполнить();
Выборка= РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Флаг Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ДоговорОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Проверяем соответствие выбранного договора на предмет наличия "Флага"
Если ПроверкаЗначДоговора(Объект.Договор) Тогда
СтандартнаяОбработка = Ложь;
// Проверяем наличие соответствующих прав
Если мПрава = Ложь Тогда
ЭтаФорма.ТекущийЭлемент = ЭтаФорма.Элементы.Договор;
ОчиститьСообщения();
Сообщить("Выбранный договор не предназначен для работы по заявкам!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Вызываем процедуру проверки наличия прав
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ИсключитьРоль();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИсключитьРоль();
КонецПроцедуры |
|
Таким образом, пользователь без соответствующих прав доступа и при выборе договора, который недопустимо использовать в текущем документе, получит соответствующее уведомление.
3. Очистка табличной части документа при изменении договора.
И в заключении, реализуем алгоритм очистки табличной части всё того же документа "ЗаявкаНаРаботу" при изменении договора.
| 1C | 1
2
3
4
5
6
7
| &НаКлиенте
Процедура ДоговорПриИзменении(Элемент)
// Очищаем ТЧ документа, если она имеет записи
Если Объект.ВыполненныеРаботы.Количество() > 0 Тогда
Объект.ВыполненныеРаботы.Очистить();
КонецЕсли;
КонецПроцедуры |
|
|