Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
1

Запрет на выбор реквизита

11.05.2016, 10:48. Просмотров 1167. Ответов 15
Метки нет (Все метки)

Здравствуйте, нужна помощь. Есть документ Договор, в нем присутствует реквизит Бригада(ссылка на другой документ), нужно запретить выбирать Бригаду, если она уже была выбрана в другом договоре. Подскажите, как справится с этой задачей.

Вот пример того, что смог сделать:
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
Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
 
    // регистр СостояниеДоговора
    Движения.СостояниеДоговора.Записывать = Истина;
    Движение = Движения.СостояниеДоговора.Добавить();
    Движение.Клиент = Клиент;
    Движение.Состояние = Состояние;
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ 
    
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ДоговорПодряда.Бригада
        |ИЗ
        |   Документ.ДоговорПодряда КАК ДоговорПодряда
        |
        |СГРУППИРОВАТЬ ПО
        |   ДоговорПодряда.Бригада";
   
    РезультатЗапроса = Запрос.Выполнить();
   
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ВыборкаДетальныеЗаписи.Группировка() = Бригада Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Вы не можете выбрать данную бригаду";
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
   
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
 
КонецПроцедуры
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2016, 10:48
Ответы с готовыми решениями:

Запрет повторяющихся значений реквизита справочника
Существует справочник Клиенты с реквизитом Телефон. Как можно запретить дублирование данного...

Выбор значения реквизита документа по условию
Здравствуйте. В собственной конфигурации 1с 8.3 потребовалось сделать такую логику: справочник...

выбор реквизита склад в ТЧ
Здравствуйте! я решил в 1с 7.7 космплексная конфа 4,5 сделать что бы реквизит склад в документах...

Выбор реквизита-перечисления на форме документа
Добрый день! Лично я не вижу проблем, но пользователи требуют что-нибудь придумать... В...

Запрет на выбор складов
1с 7.7 Предприятие. Перемещаем материалы. Есть реквизит диалога, привязан сам справочник...

15
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
11.05.2016, 13:16 2
Цитата Сообщение от egor_22rus Посмотреть сообщение
нужно запретить выбирать Бригаду, если она уже была выбрана в другом договоре
Передайте в запрос через параметр ссылку на бригаду, которую надо проверить, и отбирайте договора только с этой бригадой.
Если результат запроса НЕ пустой, значит, эта бригада уже фигурирует в каком-то договоре, соответствующее сообщение пользователю и отказ.
Иначе (если результат запроса пустой) можно проводить документ.
0
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 13:25  [ТС] 3
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ДоговорПодряда.Бригада
        |ИЗ
        |   Документ.ДоговорПодряда КАК ДоговорПодряда
        |ГДЕ
        |   ДоговорПодряда.Бригада = &Бригада
        |
        |СГРУППИРОВАТЬ ПО
        |   ДоговорПодряда.Бригада";
    Запрос.УстановитьПараметр("Бригада", Бригада);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда 
      Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Вы не можете выбрать данную бригаду";
            Сообщение.Сообщить();
            Отказ = Истина; 
    КонецЕсли;
Сделал как вы сказали, но никаких результатов
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 13:40 4
Цитата Сообщение от egor_22rus Посмотреть сообщение
Сделал как вы сказали, но никаких результатов
Если НЕ РезультатЗапроса.Пустой()
0
12.05.2016, 13:40
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 13:53  [ТС] 5
И так, и так, не дает проводить документ, даже если создать новую бригаду.

Добавлено через 9 минут
alex1248, вообщем изменил маленько запрос,

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ДоговорПодряда.Бригада
        |ИЗ
        |   Документ.ДоговорПодряда КАК ДоговорПодряда,
        |   Документ.ФормированиеБригады КАК ФормированиеБригады
        |ГДЕ
        |   ФормированиеБригады.Ссылка = &Бригада
        |
        |СГРУППИРОВАТЬ ПО
        |   ДоговорПодряда.Бригада";
    Запрос.УстановитьПараметр("Бригада", Бригада);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если НЕ РезультатЗапроса.Пустой() Тогда 
      Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Вы не можете выбрать данную бригаду";
            Сообщение.Сообщить();
            Отказ = Истина; 
    КонецЕсли;
как вы и сказали, ссылку на бригаду, которую надо проверить, но к сожалению результат не изменился
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 14:22 6
Лучший ответ Сообщение было отмечено egor_22rus как решение

Решение

egor_22rus, запрос пусть останется тот же, только надо добавить условие, что ДоговорПодряда.Ссылка <> &Ссылка. Потому и отказывает, что видит текущий документ.
1
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 14:37  [ТС] 7
alex1248, Спасибо, действительно помогли. Есть еще один вопрос, в договоре есть реквизит: "Статус". У статуса 2 значения: в работе, закрыт. Хочу сделать следующее: при смене статуса на закрыт, освобождать бригаду, т.е. чтобы ее снова можно было вбирать. Я так понимаю нужно дописать условие, если статус = в работе, тогда сообщение и отказ, иначе проводить. Как обратится к значнию реквизита из модуля?
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 14:53 8
Лучший ответ Сообщение было отмечено egor_22rus как решение

Решение

Цитата Сообщение от egor_22rus Посмотреть сообщение
при смене статуса на закрыт, освобождать бригаду
Добавьте в этот же запрос соответствующее условие.

Добавлено через 12 минут
Цитата Сообщение от egor_22rus Посмотреть сообщение
Как обратится к значнию реквизита из модуля?
А в каком документе этот реквизит?
0
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 15:01  [ТС] 9
Дописал
1C
1
ДоговорПодряда.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостояниеДоговора.ВРаботе
в запрос, сработало. Еще раз спасибо.

Добавлено через 6 минут
alex1248, странно, но срабатывает почему то через раз.

Реквизит в договоре.
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 15:04 10
Цитата Сообщение от egor_22rus Посмотреть сообщение
срабатывает почему то через раз
выложите весь запрос.
0
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 15:06  [ТС] 11
alex1248,
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
 Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ДоговорПодряда.Бригада,
        |   ДоговорПодряда.Состояние
        |ИЗ
        |   Документ.ДоговорПодряда КАК ДоговорПодряда
        |ГДЕ
        |   ДоговорПодряда.Бригада = &Бригада
        |   И ДоговорПодряда.Ссылка <> &Ссылка
        |   И ДоговорПодряда.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостояниеДоговора.ВРаботе)
        |
        |СГРУППИРОВАТЬ ПО
        |   ДоговорПодряда.Бригада,
        |   ДоговорПодряда.Состояние";
    Запрос.УстановитьПараметр("Бригада", Бригада);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если НЕ РезультатЗапроса.Пустой() Тогда 
      Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Вы не можете выбрать данную бригаду";
            Сообщение.Сообщить();
            Отказ = Истина; 
    КонецЕсли;
т.е. Состояние это реквизит Договора, оно берется из перечислений. У состояние 2 реквизита: в работе и закрыт.
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 15:23 12
Лучший ответ Сообщение было отмечено egor_22rus как решение

Решение

Цитата Сообщение от egor_22rus Посмотреть сообщение
Состояние это реквизит Договора, оно берется из перечислений. У состояние 2 реквизита: в работе и закрыт.
Возможно, есть доки с незаполненным реквизитом, и проверять лучше по равенству значению "Закрыт"?
1
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 15:29  [ТС] 13
alex1248, спасибо, поменял на ДоговорПодряда.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостояниеДоговора.Закрыт)
, сработало. Есть еще вопрос по схожей теме, если у вас есть время, хотелось бы, чтобы вы помогли. Вам удобнее здесь ответить, или мне создать новую тему?
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 15:40 14
Цитата Сообщение от egor_22rus Посмотреть сообщение
поменял на ДоговорПодряда.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостояниеДоговора.Закрыт)
Странно, что "<>" на него же и поменяли, это же получилось почти обратное условие. Ну, если что, посмотрите варианты.
Цитата Сообщение от egor_22rus Посмотреть сообщение
Есть еще вопрос по схожей теме, если у вас есть время, хотелось бы, чтобы вы помогли. Вам удобнее здесь ответить, или мне создать новую тему?
Мне всё равно.
0
egor_22rus
2 / 2 / 1
Регистрация: 05.04.2014
Сообщений: 78
12.05.2016, 16:02  [ТС] 15
alex1248, когда поставил =, ничего не поменялось, вернул обратно на <> и сработало.

Добавлено через 3 минуты
alex1248, в общем вопрос такой: есть договор(этот же) на его основании создается акт приема-передачи, а на основании этого акта создается счет фактура. У счет фактуры есть реквизит Акт приема-передачи. Нужно сделать так, чтобы при создании счет фактуры состояние созданного договора менялось на "Закрыт". К сожалению проще рассказать не получится.
0
alex1248
122 / 66 / 26
Регистрация: 08.03.2016
Сообщений: 173
12.05.2016, 18:00 16
Цитата Сообщение от egor_22rus Посмотреть сообщение
есть договор(этот же) на его основании создается акт приема-передачи, а на основании этого акта создается счет фактура. У счет фактуры есть реквизит Акт приема-передачи. Нужно сделать так, чтобы при создании счет фактуры состояние созданного договора менялось на "Закрыт"
Создать реквизит Акта, содержащий ссылку на договор, на основании которого Акт создан. При создании счета-фактуры изменяем нужный реквизит договора, ссылка на который содержится в новом реквизите Акта.
Только при удалении актов/счетов-фактур могут проблемы возникнуть, наверное. Надо посмотреть, и при необходимости обрабатывать эти ситуации.
0
12.05.2016, 18:00
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2016, 18:00

Запрет на выбор подгруппы справочника
Здравствуйте уважаемые форумчани. Есть документ Оказание услуги, в табличной части документа есть...

Установка определенного значения реквизита в зависимости от значения предыдущего реквизита
Здравствуйте, я новичок, учебная задача, своя конфигурация. Имею дело с пошивом одежды. Есть...

Ограничить выбор реквизита (документа) в табличной части
Добрый день. Платформа 8,3 Бухгалтерия 3.0, внешняя обработка. Есть табличная часть, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.