Вход | Регистрация

1С:Предприятие ::

Метки: 

Запись в поле ввода из перечисления

Я
   Mitka90
 
18.01.18 - 14:39
Всем добрый день! Возникла такая проблема: при новой записи в справочнике "Абоненты" не сохраняется в поле ввода значение, которое автоматически ставится при нажатии на кнопку "Запись", но при новом запуске поле с перечислениями становится пустым. Или если вместо поля ввода в коде "СтатусДоговораНаТО2" можно прописать "СправочникОбъект.СтатусДоговораНаТО", но тогда вовсе ничего не вставляется автоматически, правда, с ним все успешно добавляется при использовании без перечислений (но это не нужно в данном случае, только с использованием готовых перечислений):

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

    Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.Действует
    Иначе СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.НеДействует;   
    КонецЕсли;
    
    Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО._;
    КонецЕсли;
КонецПроцедуры
 
  Рекламное место пустует
   vicof
 
1 - 18.01.18 - 15:08
Что такое СправочникОбъект и зачем он нужен?
   Mitka90
 
2 - 18.01.18 - 15:23
(1) СправочникОбъект - данные, которые вводятся и сохраняются именно для текущего для редактирования договора (т.е. с ними можно проводить любые действия). Также он возвращает  непосредственно конкретный созданный объект Справочник<такой-то> для работы с ним: удалить элемент, редактировать, прочитать свойства, обработать события.
   lapinio
 
3 - 18.01.18 - 15:28
Я че то понять не могу. Если человек записывает в форме. Зачем лезть в объект справочника. У тебя не управляемы интерфейс ???
   lapinio
 
4 - 18.01.18 - 15:29
Если обычный интерфейс. Смотрел поле связано с реквизитом справочника. Или это реквизит формы ???
   ximik33rus
 
5 - 18.01.18 - 15:38
(0) ЯННП ))
Поправьте если не правильно понял.
Вы перед записью отите что то присвоить в "Поле ввода"? В элемент формы? Или все же в реквизит объекта, отражением которого на форме является это самое "Поле ввода"?

ЭлементыФормы.Наименование.Значение = СправочникОбъект.Наименование; - вот это вообще ничего Вам не сохранит)
   vicof
 
6 - 18.01.18 - 15:50
(2) Гкод детектед. Выкидывайте свой СправочникОбъект нахрен.
   ximik33rus
 
7 - 18.01.18 - 15:57
(0) Обращайся и пиши данные в РЕКВИЗИТЫ ОБЪЕКТА.

Напр.: Объект.ИМЯ_РЕКВИЗИТА = "Тарам пам пам";

или Объект.ИМЯ_РЕКВИЗИТА = КакаятоПеременная;

или 
если Объект.ИМЯ_РЕКВИЗИТА<>Неопределено Тогда 
        Сообщить("Введите ФИО");
        Отказ=Истина;    
КонецЕсли;

И все в таком духе.

Работай только с ними. И все у тебя взлетит и запишется.
   Mitka90
 
8 - 19.01.18 - 08:17
Тут проблема как раз с тем, что запись происходит, а при повторном открытии ничего не сохраняется. Т.е. не происходит корректная работа выполнения условий о том, что если дата окончания договора ранее текущей, то выводится в поле вводе "Не действует", а если позже - "Действует". Если данные начала и окончания договора не указаны, то выводится прочерк в поле ввода под названием "СтатусДоговораНаТО2".
   Mitka90
 
9 - 19.01.18 - 08:25
С этой процедурой также связана ещё одна:

Процедура ФИОПриИзменении(Элемент)
    ПередЗаписью(Отказ);
    //////////////////////// проверка уникальности

    если ЭтоНовый() Тогда     
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    Абоненты.Ссылка,
//        |    Абоненты.ФИО

        |    Абоненты.ЛицевойСчетМРГ
        |ИЗ
        |    Справочник.Абоненты КАК Абоненты
        |ГДЕ
//        |    Абоненты.ФИО = &НаимТекПользователя

        |    Абоненты.ЛицевойСчетМРГ = &НаимТекПользователя
        |    И Абоненты.Ссылка <> &СсылкаТекПользователя";
        Запрос.УстановитьПараметр("СсылкаТекПользователя", Ссылка);
//        Запрос.УстановитьПараметр("НаимТекПользователя", фио);

        Запрос.УстановитьПараметр("НаимТекПользователя", ЛицевойСчетМРГ);        
        Если НЕ Запрос.Выполнить().Пустой() Тогда
            Форма=Справочники.Абоненты.ПолучитьФормуСписка();
            Форма.Заголовок="Выбор абонента";
            //Форма.Отбор.фио.Использование=Истина;

            //Форма.Отбор.фио.ВидСравнения=ВидСравнения.Равно;

            //Форма.Отбор.фио.Значение=фио;  

            Форма.Отбор.ЛицевойСчетМРГ.Использование=Истина;
            Форма.Отбор.ЛицевойСчетМРГ.ВидСравнения=ВидСравнения.Равно;
            Форма.Отбор.ЛицевойСчетМРГ.Значение=ЛицевойСчетМРГ;  
            Форма.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр=Ложь;
            Если Форма.Открыта() Тогда
                Форма.Закрыть();
            КонецЕсли;
            //если есть дубли, в выборке будут данные

//Если не ЭтоНовый() Тогда
//  Отказ = Истина;

//  Сообщение = Новый СообщениеПользователю;
//  Сообщение.КлючДанных = Справочники.Абоненты;

//  Сообщение.Поле = "ЛицевойСчетМРГ";
//  Сообщение.Текст = "Лицевой счёт с таким Id уже существует";

//  Сообщение.Сообщить();
//КонецЕсли;

            ВыбранноеЗначение=Форма.ОткрытьМодально();
            //Сообщить("ФИО " + фио + " не уникально");

            //    Отказ = Истина;

            //если Форма.

        КонецЕсли; 
    КонецЕсли;
КонецПроцедуры
   ximik33rus
 
10 - 19.01.18 - 10:24
"Тут проблема как раз с тем, что запись происходит, а при повторном открытии ничего не сохраняется." - значит не происходит запись.

Слушай, из твоего кода не очень то понятно что ты хочешь сделать.

    Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.Действует
    Иначе СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.НеДействует;   
    КонецЕсли;
    
    Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО._;
    КонецЕсли;

Из кода выше СтатусДоговораНаТО2 = это переменная.
А где ты присваиваешь значение переменной СтатусДоговораНаТО2 чему то? Реквизиту например? У тебя переменная получила значение и все. Никому его не передала.
 
 
   Mitka90
 
11 - 19.01.18 - 11:33
В общем, если использовать простые поля ввода без перечислений, то всё заносится легко. А вот с помощью перечислений - так вовсе ничего.
СтатусДоговораНаТО2 - это просто единственный случай того, что как-то вытаскиваются значения из перечислений, исходя из условия.
При использовании СправочникОбъект.СтатусДоговораНаТО вместо СтатусДоговораНаТО2 без перечислений значения через кавычки заносится всё как надо, но в данном случае нужно, чтобы именно через перечисления выводились и сохранялись значения при записи.
   ximik33rus
 
12 - 19.01.18 - 11:41
(11) Ответь на простые вопросы.

1.КУДА ты пытаешься записать?
2.Что "ОНО" из себя представляет? Реквизит объекта, реквизит формы, элемент формы(раз уж на то пошло).
3.Какой у этого "ОНО" тип данных?
4."ЧТО" ты пытаешься записать и какое значение и тип данных у этого "ЧТО"?

Все, мне больше ничего не нужно что бы понять. )
   Mitka90
 
13 - 22.01.18 - 14:39
Ура! Получилось! Всё дело было в том, что данные нужно было взять не из самого поля ввода, а из реквизита "СтатусДоговораНаТО" СправочникОбъект (т.е. из справочника "Абоненты") 

И вот правильный код:

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

    Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.Действует
    Иначе СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО.НеДействует;   
    КонецЕсли;
    
    Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СтатусДоговораНаТО2 = Перечисления.СтатусДоговораНаТО._;
    КонецЕсли;
КонецПроцедуры
   Mitka90
 
14 - 22.01.18 - 14:40
Тьфу, не то. Вот правильный код:

Процедура ПередЗаписью(Отказ)
    //

    СправочникОбъект.ДоговорТОНомер = СокрЛП(СправочникОбъект.ДоговорТОНомер);
    СправочникОбъект.Наименование = СформироватьНаименование();
    ЭлементыФормы.Наименование.Значение = СправочникОбъект.Наименование;
    СправочникОбъект.ПоследнееИзменениеПользователь = ИмяПользователя();
    СправочникОбъект.ПоследнееИзменениеДата = ТекущаяДата();
    СписокЗначений = Новый СписокЗначений;
    //-----

    если ЗначениеЗаполнено(ФИО)=Ложь Тогда 
        Сообщить("Введите ФИО");
        Отказ=Истина;    
    КонецЕсли;
    //-----

    Если СправочникОбъект.ДоговорТОДата < ТекущаяДата() И ТекущаяДата() < СправочникОбъект.ДоговорТОДатаОкончания Тогда СправочникОбъект.СтатусДоговораНаТО = Перечисления.СтатусДоговораНаТО[0];
        Иначе СправочникОбъект.СтатусДоговораНаТО = Перечисления.СтатусДоговораНаТО[1];        
    КонецЕсли;
    Если СправочникОбъект.ДоговорТОДата = Дата(1,1,1) И СправочникОбъект.ДоговорТОДатаОкончания = Дата(1,1,1) Тогда СправочникОбъект.СтатусДоговораНаТО = Перечисления.СтатусДоговораНаТО[2];
    КонецЕсли;
 КонецПроцедуры
   ximik33rus
 
15 - 22.01.18 - 17:34
(14) Эврика!
   breezee
 
16 - 22.01.18 - 18:50
(14) Вот это очень плохо. Что будет с вашим кодом, когда кто-то вставит еще 1 значение перечисления?
   ximik33rus
 
17 - 23.01.18 - 09:48
(16) Денис Александрович, а на такой случай нужно проверки делать и исключения.
А вообще, если человек шКодит один в базе, то и никто больше не вставит. Но над чистотой кода не мешало бы поработать...


Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует