|
Запись в поле ввода из перечисления | ☑ | ||
---|---|---|---|---|
0
Mitka90
18.01.18
✎
14:39
|
Всем добрый день! Возникла такая проблема: при новой записи в справочнике "Абоненты" не сохраняется в поле ввода значение, которое автоматически ставится при нажатии на кнопку "Запись", но при новом запуске поле с перечислениями становится пустым. Или если вместо поля ввода в коде "СтатусДоговораНаТО2" можно прописать "СправочникОбъект.СтатусДоговораНаТО", но тогда вовсе ничего не вставляется автоматически, правда, с ним все успешно добавляется при использовании без перечислений (но это не нужно в данном случае, только с использованием готовых перечислений):
Процедура ПередЗаписью(Отказ) СправочникОбъект.ДоговорТОНомер = СокрЛП(СправочникОбъект.ДоговорТОНомер); СправочникОбъект.Наименование = СформироватьНаименование(); ЭлементыФормы.Наименование.Значение = СправочникОбъект.Наименование; СправочникОбъект.ПоследнееИзменениеПользователь = ИмяПользователя(); СправочникОбъект.ПоследнееИзменениеДата = ТекущаяДата(); если ЗначениеЗаполнено(ФИО)=Ложь Тогда Сообщить("Введите ФИО"); Отказ=Истина; КонецЕсли; Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.Действует Иначе СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.НеДействует; КонецЕсли; Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО._; КонецЕсли; КонецПроцедуры |
|||
1
vicof
18.01.18
✎
15:08
|
Что такое СправочникОбъект и зачем он нужен?
|
|||
2
Mitka90
18.01.18
✎
15:23
|
(1) СправочникОбъект - данные, которые вводятся и сохраняются именно для текущего для редактирования договора (т.е. с ними можно проводить любые действия). Также он возвращает непосредственно конкретный созданный объект Справочник<такой-то> для работы с ним: удалить элемент, редактировать, прочитать свойства, обработать события.
|
|||
3
lapinio
18.01.18
✎
15:28
|
Я че то понять не могу. Если человек записывает в форме. Зачем лезть в объект справочника. У тебя не управляемы интерфейс ???
|
|||
4
lapinio
18.01.18
✎
15:29
|
Если обычный интерфейс. Смотрел поле связано с реквизитом справочника. Или это реквизит формы ???
|
|||
5
ximik33rus
18.01.18
✎
15:38
|
(0) ЯННП ))
Поправьте если не правильно понял. Вы перед записью отите что то присвоить в "Поле ввода"? В элемент формы? Или все же в реквизит объекта, отражением которого на форме является это самое "Поле ввода"? ЭлементыФормы.Наименование.Значение = СправочникОбъект.Наименование; - вот это вообще ничего Вам не сохранит) |
|||
6
vicof
18.01.18
✎
15:50
|
(2) Гкод детектед. Выкидывайте свой СправочникОбъект нахрен.
|
|||
7
ximik33rus
18.01.18
✎
15:57
|
(0) Обращайся и пиши данные в РЕКВИЗИТЫ ОБЪЕКТА.
Напр.: Объект.ИМЯ_РЕКВИЗИТА = "Тарам пам пам"; или Объект.ИМЯ_РЕКВИЗИТА = КакаятоПеременная; или если Объект.ИМЯ_РЕКВИЗИТА<>Неопределено Тогда Сообщить("Введите ФИО"); Отказ=Истина; КонецЕсли; И все в таком духе. Работай только с ними. И все у тебя взлетит и запишется. |
|||
8
Mitka90
19.01.18
✎
08:17
|
Тут проблема как раз с тем, что запись происходит, а при повторном открытии ничего не сохраняется. Т.е. не происходит корректная работа выполнения условий о том, что если дата окончания договора ранее текущей, то выводится в поле вводе "Не действует", а если позже - "Действует". Если данные начала и окончания договора не указаны, то выводится прочерк в поле ввода под названием "СтатусДоговораНаТО2".
|
|||
9
Mitka90
19.01.18
✎
08:25
|
С этой процедурой также связана ещё одна:
Процедура ФИОПриИзменении(Элемент) ПередЗаписью(Отказ); //////////////////////// проверка уникальности если ЭтоНовый() Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Абоненты.Ссылка, // | Абоненты.ФИО | Абоненты.ЛицевойСчетМРГ |ИЗ | Справочник.Абоненты КАК Абоненты |ГДЕ // | Абоненты.ФИО = &НаимТекПользователя | Абоненты.ЛицевойСчетМРГ = &НаимТекПользователя | И Абоненты.Ссылка <> &СсылкаТекПользователя"; Запрос.УстановитьПараметр("СсылкаТекПользователя", Ссылка); // Запрос.УстановитьПараметр("НаимТекПользователя", фио); Запрос.УстановитьПараметр("НаимТекПользователя", ЛицевойСчетМРГ); Если НЕ Запрос.Выполнить().Пустой() Тогда Форма=Справочники.Абоненты.ПолучитьФормуСписка(); Форма.Заголовок="Выбор абонента"; //Форма.Отбор.фио.Использование=Истина; //Форма.Отбор.фио.ВидСравнения=ВидСравнения.Равно; //Форма.Отбор.фио.Значение=фио; Форма.Отбор.ЛицевойСчетМРГ.Использование=Истина; Форма.Отбор.ЛицевойСчетМРГ.ВидСравнения=ВидСравнения.Равно; Форма.Отбор.ЛицевойСчетМРГ.Значение=ЛицевойСчетМРГ; Форма.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр=Ложь; Если Форма.Открыта() Тогда Форма.Закрыть(); КонецЕсли; //если есть дубли, в выборке будут данные //Если не ЭтоНовый() Тогда // Отказ = Истина; // Сообщение = Новый СообщениеПользователю; // Сообщение.КлючДанных = Справочники.Абоненты; // Сообщение.Поле = "ЛицевойСчетМРГ"; // Сообщение.Текст = "Лицевой счёт с таким Id уже существует"; // Сообщение.Сообщить(); //КонецЕсли; ВыбранноеЗначение=Форма.ОткрытьМодально(); //Сообщить("ФИО " + фио + " не уникально"); // Отказ = Истина; //если Форма. КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
10
ximik33rus
19.01.18
✎
10:24
|
"Тут проблема как раз с тем, что запись происходит, а при повторном открытии ничего не сохраняется." - значит не происходит запись.
Слушай, из твоего кода не очень то понятно что ты хочешь сделать. Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.Действует Иначе СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.НеДействует; КонецЕсли; Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО._; КонецЕсли; Из кода выше СтатусДоговораНаТО2 = это переменная. А где ты присваиваешь значение переменной СтатусДоговораНаТО2 чему то? Реквизиту например? У тебя переменная получила значение и все. Никому его не передала. |
|||
11
Mitka90
19.01.18
✎
11:33
|
В общем, если использовать простые поля ввода без перечислений, то всё заносится легко. А вот с помощью перечислений - так вовсе ничего.
СтатусДоговораНаТО2 - это просто единственный случай того, что как-то вытаскиваются значения из перечислений, исходя из условия. При использовании СправочникОбъект.СтатусДоговораНаТО вместо СтатусДоговораНаТО2 без перечислений значения через кавычки заносится всё как надо, но в данном случае нужно, чтобы именно через перечисления выводились и сохранялись значения при записи. |
|||
12
ximik33rus
19.01.18
✎
11:41
|
(11) Ответь на простые вопросы.
1.КУДА ты пытаешься записать? 2.Что "ОНО" из себя представляет? Реквизит объекта, реквизит формы, элемент формы(раз уж на то пошло). 3.Какой у этого "ОНО" тип данных? 4."ЧТО" ты пытаешься записать и какое значение и тип данных у этого "ЧТО"? Все, мне больше ничего не нужно что бы понять. ) |
|||
13
Mitka90
22.01.18
✎
14:39
|
Ура! Получилось! Всё дело было в том, что данные нужно было взять не из самого поля ввода, а из реквизита "СтатусДоговораНаТО" СправочникОбъект (т.е. из справочника "Абоненты")
И вот правильный код: Процедура ПередЗаписью(Отказ) СправочникОбъект.ДоговорТОНомер = СокрЛП(СправочникОбъект.ДоговорТОНомер); СправочникОбъект.Наименование = СформироватьНаименование(); ЭлементыФормы.Наименование.Значение = СправочникОбъект.Наименование; СправочникОбъект.ПоследнееИзменениеПользователь = ИмяПользователя(); СправочникОбъект.ПоследнееИзменениеДата = ТекущаяДата(); если ЗначениеЗаполнено(ФИО)=Ложь Тогда Сообщить("Введите ФИО"); Отказ=Истина; КонецЕсли; Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.Действует Иначе СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.НеДействует; КонецЕсли; Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО._; КонецЕсли; КонецПроцедуры |
|||
14
Mitka90
22.01.18
✎
14:40
|
Тьфу, не то. Вот правильный код:
Процедура ПередЗаписью(Отказ) // СправочникОбъект.ДоговорТОНомер = СокрЛП(СправочникОбъект.ДоговорТОНомер); СправочникОбъект.Наименование = СформироватьНаименование(); ЭлементыФормы.Наименование.Значение = СправочникОбъект.Наименование; СправочникОбъект.ПоследнееИзменениеПользователь = ИмяПользователя(); СправочникОбъект.ПоследнееИзменениеДата = ТекущаяДата(); СписокЗначений = Новый СписокЗначений; //----- если ЗначениеЗаполнено(ФИО)=Ложь Тогда Сообщить("Введите ФИО"); Отказ=Истина; КонецЕсли; //----- Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СправочникОбъект.СтатусДоговораНаТО = Перечисления.СтатусДоговораНаТО[0]; Иначе СправочникОбъект.СтатусДоговораНаТО = Перечисления.СтатусДоговораНаТО[1]; КонецЕсли; Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СправочникОбъект.СтатусДоговораНаТО = Перечисления.СтатусДоговораНаТО[2]; КонецЕсли; КонецПроцедуры |
|||
15
ximik33rus
22.01.18
✎
17:34
|
(14) Эврика!
|
|||
16
breezee
22.01.18
✎
18:50
|
(14) Вот это очень плохо. Что будет с вашим кодом, когда кто-то вставит еще 1 значение перечисления?
|
|||
17
ximik33rus
23.01.18
✎
09:48
|
(16) Денис Александрович, а на такой случай нужно проверки делать и исключения.
А вообще, если человек шКодит один в базе, то и никто больше не вставит. Но над чистотой кода не мешало бы поработать... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |