Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 сен 2024, 06:41

Запрет редактирования поля по условию

Автор Анна Анисимова, 23 мая 2020, 21:38

0 Пользователей и 2 гостей просматривают эту тему.

Анна Анисимова

Здравствуйте,
Не могли бы вы пожалуйста подсказать мне, как сделать, чтобы в форме документа определенное поле (норма на время работы трактора) было доступно для ввода при определенном значении другого поля (тип транспорта).
Поле должно быть доступно для редактирования, если реквизит справочника «Автотранспорт», «Тип транспорта» равен перечислению «Трактор».

antoneus

Привязываем обработчик события элемента формы Автотранспорт ПриИзменении:

&НаКлиенте
Процедура АвтотранспортПриИзменении(Элемент)
    АвтотранспортПриИзмененииНаСервере()
КонецПроцедуры

&НаСервере
Процедура АвтотранспортПриИзмененииНаСервере()
    Элементы.НормаНаВремяРаботыТрактора.Доступность = Объект.Автотранспорт.ТипТранспорта = Перечисление.ТипыТранспорта.Трактор
КонецПроцедуры

Анна Анисимова

Цитата: antoneus от 23 мая 2020, 23:31
Привязываем обработчик события элемента формы Автотранспорт ПриИзменении:
Спасибо!
Добавлено: 24 мая 2020, 00:16


Нет, не работает.
Сначала была ошибка, что значение "Перечисление" не найдено.
Я обратилась к перечислению через "ПредопределенноеЗначение", но ничего не изменилось

&НаКлиенте
Процедура ДопРеквТипАвтотранспортаПриИзменении(Элемент)
ДопРеквТипАвтотранспортаПриИзмененииНаСервере()
КонецПроцедуры

&НаСервере
Процедура ДопРеквТипАвтотранспортаПриИзмененииНаСервере()
Элемент.НормаВремя.Доступность = Объект.Автотранспорт.ДанныеТранспорта.ТипАвтотранспорта = ПредопределенноеЗначение("Перечисление.ТипАвтотранспорта.Трактор")
КонецПроцедуры


Потом я сделала так, но тоже не вышло:

Процедура ДопРеквТипАвтотранспортаПриИзмененииНаСервере()
Если Объект.ДопРекв.ТипАвтотранспорта = ПредопределенноеЗначение("Перечисление.ТипАвтотранспорта.Трактор") Тогда
Объект.НормаВремя.Доступность=Истина;
КонецЕсли
КонецПроцедуры


Единственный недовариант, который "работает" - это вывод предупреждения при редактировании поля.

antoneus

Прошу прощения, Перечисления, конечно же)

&НаСервере
Процедура АвтотранспортПриИзмененииНаСервере()
    Элементы.НормаНаВремяРаботыТрактора.Доступность = Объект.Автотранспорт.ТипТранспорта = Перечисления.ТипыТранспорта.Трактор
КонецПроцедуры


А ваш код не работает потому, что условие стоит на равенство вида транспорта трактору. Если оно выполняется - элемент становится доступным. Если не выполняется - ничего не происходит, если элемент до этого был доступным, он таковым и остается.

Анна Анисимова

Ничего не происходит.
Я попыталась всунуть это в другую процедуру ПриИзменении:

&НаКлиенте
Процедура ТранспортПриИзменении(Элемент)
ТранспортПриИзмененииНаСервере();
КонецПроцедуры

&НаСервере
Процедура ТранспортПриИзмененииНаСервере()
Объект.ДопРекв.Очистить();
Для каждого Об Из Объект.Транспорт.ДанныеТранспорта Цикл
НСтр=Объект.ДопРекв.Добавить();
НСтр.ГосНомер=Об.ГосНомер;
НСтр.Марка=Об.Автотранспорт;
НСтр.Топливо=Об.ТипТоплива;
НСтр.ТипАвтотранспорта=Об.ТипАвтотранспорта;
    Если Об.ТипАвтотранспорта = Перечисления.ТипАвтотранспорта.Трактор Тогда
Объект.НормаВремя.Доступность=Истина;
КонецЕсли
КонецЦикла;
КонецПроцедуры


Ставила и убирала доступность поля в свойствах. Нужного эффекта не дало, кроме ошибки "Значение не является значением объектного типа (Доступность)" при выборе транспорта с типом "трактор".

Я понимаю, что решение должно быть простым, но не могу до него дойти :dfbsdfbsdf:

antoneus

Цитата: Анна Анисимова от 25 мая 2020, 00:50

    Объект.НормаВремя.Доступность=Истина;


Почему вы упорно игнорируете мой код? При чем здесь объект, если мы управляем доступностью элемента формы? Ладно, напишу в третий раз.

Элементы.НормаВремя.Доступность = Объект.Транспорт.ТипТранспорта = Перечисления.ТипыТранспорта.Трактор

Анна Анисимова

Я не игнорирую, просто при использовании вашего кода ничего не происходит. Поле остается доступным для ввода при любом значении реквезита табличной части "ТипАвтотранспорта".

Я еще раз напишу, что мне нужно, но подробнее.
Существует документ "НормыТоплива". В этом документе есть ряд реквезитов и табличная часть. При изменении реквезита "Транспорт" меняются все реквезиты табличной части "ДопРекв", среди которых: "ГосНомер", "Марка", "Топливо" и "ТипАвтотранспорта", которые доступны только для просмотра, вручную данные там не изменяются, только подставляются из табличной части "ДанныеТранспорта" справочника "Автотранспорт". Это все у меня сделано.
В документе "НормыТоплива" есть реквезит "НормаВремя", который должен быть доступен для заполнения ТОЛЬКО если "ТипАвтотранспорта" это трактор. Именно это мне и нужно реализовать.
Все типы транспорта записаны в перечислении "ТипАвтотранспорта". Данное перечисление используется для заполнения одноименного реквезита табличной части справочника "Автотранспорт".

antoneus

Я прекрасно понимаю, что вам нужно сделать. Как сейчас выглядят все эти процедуры ПриИзмененииТранспорта?

Анна Анисимова

Цитата: antoneus от 25 мая 2020, 16:28
Я прекрасно понимаю, что вам нужно сделать. Как сейчас выглядят все эти процедуры ПриИзмененииТранспорта?

&НаКлиенте
Процедура ТранспортПриИзменении(Элемент)
ТранспортПриИзмененииНаСервере();
КонецПроцедуры

&НаСервере
Процедура ТранспортПриИзмененииНаСервере()

Объект.ДопРекв.Очистить();
Для каждого Об Из Объект.Транспорт.ДанныеТранспорта Цикл
НСтр=Объект.ДопРекв.Добавить();
НСтр.ГосНомер=Об.ГосНомер;
НСтр.Марка=Об.Автотранспорт;
НСтр.Топливо=Об.ТипТоплива;
НСтр.ТипАвтотранспорта=Об.ТипАвтотранспорта;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ДопРеквТипАвтотранспортаПриИзменении(Элемент)
    ДопРеквТипАвтотранспортаПриИзмененииНаСервере()
КонецПроцедуры

&НаСервере
Процедура ДопРеквТипАвтотранспортаПриИзмененииНаСервере()
Элементы.НормаВремя.Доступность = Объект.ДанныеТранспорта.ТипАвторанспорта = Перечисления.ТипыТранспорта.Трактор
КонецПроцедуры


antoneus

Почему. Вы. Игнорируете. Мой. Код? Вот этот:

Цитата: antoneus от 23 мая 2020, 23:31
Привязываем обработчик события элемента формы Автотранспорт ПриИзменении:

&НаКлиенте
Процедура АвтотранспортПриИзменении(Элемент)
    АвтотранспортПриИзмененииНаСервере()
КонецПроцедуры

&НаСервере
Процедура АвтотранспортПриИзмененииНаСервере()
    Элементы.НормаНаВремяРаботыТрактора.Доступность = Объект.Автотранспорт.ТипТранспорта = Перечисления.ТипыТранспорта.Трактор
КонецПроцедуры


Процедура проверки должна вызываться из процедуры изменения реквизита, а не табличной части ДопРекв. Просто допишите эту строчку в процедуру ТранспортПриИзмененииНаСервере. В общем, вот.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск