Имя: Пароль:
1C
1С v8
Запись в поле ввода из перечисления
,
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) Денис Александрович, а на такой случай нужно проверки делать и исключения.
А вообще, если человек шКодит один в базе, то и никто больше не вставит. Но над чистотой кода не мешало бы поработать...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.