|   |   | 
| 
 | Запись в поле ввода из перечисления | ☑ | ||
|---|---|---|---|---|
| 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) Денис Александрович, а на такой случай нужно проверки делать и исключения. 
 А вообще, если человек шКодит один в базе, то и никто больше не вставит. Но над чистотой кода не мешало бы поработать... | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |