Имя: Пароль:
1C
1С v8
Выборка частично пустая
0 Iater
 
10.06.15
22:02
Всем привет!

Вопрос, наверное, как всегда тупой, но очень прошу разъяснить один момент в использовании запросов:

Допустим, я в запросе читаю табличную часть документа. Например, ФИО, телефон, адрес. И в обработке проведения хочу записать эти данные в справочник. Так вот, если значения реквизитов табличной части будут пустыми, то как запретить перезапись справочника? (на случай, если телефон уже был указан, а в Акте он пустой - чтоб не затер)

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(АктОПриемеНаРаботу.Телефон, 0) КАК Телефон,
    |    ЕСТЬNULL(АктОПриемеНаРаботу.ФИО, 0) КАК ФИО,
    |    ЕСТЬNULL(АктОПриемеНаРаботу.Адрес, 0) КАК Адрес
    |ПОМЕСТИТЬ ВременнаяТаблица
    |ИЗ
    |    Документ.АктОПриемеНаРаботу КАК АктОПриемеНаРаботу
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВременнаяТаблица.Телефон,
    |    ВременнаяТаблица.ФИО,
    |    ВременнаяТаблица.Адрес
    |ИЗ
    |    ВременнаяТаблица КАК ВременнаяТаблица";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Спр = Справочники.Сотрудники.НайтиПоНаименованию(Строка(ФИО)).ПолучитьОбъект();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
            Спр.Телефон = ВыборкаДетальныеЗаписи.Телефон;
            Спр.ФИО = ВыборкаДетальныеЗаписи.ФИО;
            Спр.Адрес = ВыборкаДетальныеЗаписи.Адрес;     
                
    КонецЦикла;     
    
    Спр.Записать();
    
КонецПроцедуры



Есть ли какой-то элегантный способ проверки на нулевое значение, кроме как перебирать каждый реквизит по отдельности?
Если ВыборкаДетальныеЗаписи.Адрес = Неопределенно Тогда
Если ВыборкаДетальныеЗаписи.Телефон = Неопределенно Тогда
1 zenik
 
11.06.15
00:50
Нарисовать отдельную процедуру - через которую устанавливать значения реквизитов в случае изменения. т.е. Все проверки сделать один раз в одной процедуре и вызывать ее для каждого реквизита справочника.
2 Cyberhawk
 
11.06.15
07:20
СписокРеквизитовДляПроверки = Новый СписокЗначений;
СписокРеквизитовДляПроверки.Добавить("Адрес");
СписокРеквизитовДляПроверки.Добавить("Телефон");

Для каждого ЭлементСпискаЗначений Из СписокРеквизитовДляПроверки Цикл

ИмяРеквизита = ЭлементСпискаЗначений.Значение;
Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи[ИмяРеквизита]) Тогда ... КонецЕсли;

КонецЦикла;
3 bootini
 
11.06.15
12:44
"ВЫБРАТЬ
    |    ЕСТЬNULL(АктОПриемеНаРаботу.Телефон, 0) КАК Телефон,
    |    ЕСТЬNULL(АктОПриемеНаРаботу.ФИО, 0) КАК ФИО,
    |    ЕСТЬNULL(АктОПриемеНаРаботу.Адрес, 0) КАК Адрес
    |ПОМЕСТИТЬ ВременнаяТаблица
    |ИЗ
    |    Документ.АктОПриемеНаРаботу КАК АктОПриемеНаРаботу
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ВременнаяТаблица.Телефон,
    |    ВременнаяТаблица.ФИО,
    |    ВременнаяТаблица.Адрес
    |ИЗ
    |    ВременнаяТаблица КАК ВременнаяТаблица
    ГДЕ
    ВременнаяТаблица.Телефон <> 0
    И ВременнаяТаблица.Адрес <> 0     ";
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший