Форум программистов, компьютерный форум, киберфорум
Maks
Войти
Регистрация
Восстановить пароль

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

Запись от Maks размещена 07.04.2026 в 22:05. Обновил(-а) Maks 12.04.2026 в 09:50
Показов 1839 Комментарии 0

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
&НаСервереБезКонтекста
Функция ПроверкаДатыДоговора(Договор) 
    Результат = Ложь;
    // запрос на получение срока договора
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ДоходныеДоговоры.СрокДействияКонец КАК СрокДействия
        |ИЗ
        |   Справочник.ДоходныеДоговоры КАК ДоходныеДоговоры
        |ГДЕ
        |   ргДоходныеДоговоры.Ссылка = &Договор";   
    Запрос.УстановитьПараметр("Договор", Договор);    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка= РезультатЗапроса.Выбрать();
    ТекДата = ТекущаяДата();
    Если Выборка.Следующий() Тогда  
        // сравниваем даты и устанавливаем значение для возврата
        мДата = Выборка.СрокДействия;
        Если мДата < ТекДата Тогда  
            Результат = Истина;
        КонецЕсли;
    КонецЕсли;
    // возвращаем значение
    Возврат Результат;
КонецФункции
Вариант функции с запросом из регистра сведений, по которому можно настроить движение справочника "Договоры", ранее опубликованным методом:
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
&НаСервереБезКонтекста
Функция ПроверкаДатыДоговора(Договор)
    Результат = Ложь; 
    // Запрос на получение срока договора
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ДоходныеДоговоры.СрокДействияКонец КАК СрокДействия
        |ИЗ
        |   РегистрСведений.ДоходныеДоговоры.СрезПоследних(&ДатаСреза, Ссылка = &Договор) КАК ДоходныеДоговоры
        | 
        |СГРУППИРОВАТЬ ПО
        |   ДоходныеДоговоры.СрокДействия";
    ТекДата = ТекущаяДатаСеанса();
    Запрос.УстановитьПараметр("Договор", Договор);
    Запрос.УстановитьПараметр("ДатаСреза", ТекДата);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Если Выборка.Следующий() Тогда  
        // Сравниваем даты и устанавливаем значение для возврата
        мДата = Выборка.СрокДействия;
        Если мДата < ТекДата Тогда  
            Результат = Истина;
        КонецЕсли;
    КонецЕсли;
    // Возвращаем значение
    Возврат Результат;
КонецФункции
В данном варианте, в параметрах запроса, указывается именно "Ссылка", а не "Регистратор", поскольку Справочник не может быть регистратором для регистров сведений.
Далее, обрабатываем условие в процедуре "ОбработкаВыбора" согласно полученного при помощи функции результата:
1C
1
2
3
4
5
6
7
8
9
10
11
12
&НаКлиенте
Процедура ДоговорОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Обращаемся к функции и проверяем условие
    Если ПроверкаДатыДоговора(Объект.Договор) Тогда
        СтандартнаяОбработка = Ложь;
        // Вызываем отказ и выводим сообщение пользователю
        ЭтаФорма.ТекущийЭлемент = ЭтаФорма.Элементы.Договор;
        ОчиститьСообщения();
        Сообщить("Срок действия выбранного договора истек!");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры
В результате, пользователь не сможет использовать договор с истёкшим сроком действия.

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
// Определение прав доступа и запись соответствующего значения в реквизит "мПрава"
&НаСервере
Процедура ИсключитьРоль() 
    Если РольДоступна("ДиректорФилиала") ИЛИ РольДоступна("ПолныеПрава") Тогда
        мПрава = Истина;
    Иначе
        мПрава = Ложь;    
    КонецЕсли;     
КонецПроцедуры 
 
// Получение помеченных "флагом" договоров
&НаСервереБезКонтекста
Функция ПроверкаЗначДоговора(Договор)
    Результат = Ложь;
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ДоходныеДоговоры.Флаг КАК Флаг
        |ИЗ
        |   Справочник.ДоходныеДоговоры КАК ДоходныеДоговоры
        |ГДЕ
        |   ДоходныеДоговоры.Ссылка = &Ссылка
        |   И ДоходныеДоговоры.Флаг" ; 
    Запрос.УстановитьПараметр("Ссылка", Договор);  
    РезультатЗапроса = Запрос.Выполнить();
    Выборка= РезультатЗапроса.Выбрать();      
    Если Выборка.Следующий() Тогда  
         Результат = Истина;
    КонецЕсли;
    Возврат Результат;  
КонецФункции
 
&НаКлиенте
Процедура ДоговорОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Проверяем соответствие выбранного договора на предмет наличия "Флага"
    Если ПроверкаЗначДоговора(Объект.Договор) Тогда
        СтандартнаяОбработка = Ложь;
        // Проверяем наличие соответствующих прав
        Если мПрава = Ложь Тогда
            ЭтаФорма.ТекущийЭлемент = ЭтаФорма.Элементы.Договор;
            ОчиститьСообщения();
            Сообщить("Выбранный договор не предназначен для работы по заявкам!");
            Отказ = Истина; 
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры 
 
// Вызываем процедуру проверки наличия прав
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ИсключитьРоль();
КонецПроцедуры 
 
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ИсключитьРоль();
КонецПроцедуры
Таким образом, пользователь без соответствующих прав доступа и при выборе договора, который недопустимо использовать в текущем документе, получит соответствующее уведомление.

3. Очистка табличной части документа при изменении договора.

И в заключении, реализуем алгоритм очистки табличной части всё того же документа "ЗаявкаНаРаботу" при изменении договора.
1C
1
2
3
4
5
6
7
&НаКлиенте
Процедура ДоговорПриИзменении(Элемент)
    // Очищаем ТЧ документа, если она имеет записи
    Если Объект.ВыполненныеРаботы.Количество() > 0 Тогда
        Объект.ВыполненныеРаботы.Очистить();
    КонецЕсли; 
КонецПроцедуры
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru