8.х поле структуры не обнаружено

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем JediAlex, 24 июл 2019.

  1. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    188
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте . В собственной конфигурации запросом выбираю данные из регистра сведений за период:
    Код:
    Функция ВремяПодразделенияПоТабелю(Подразделение,НачалоПериода,КонецПериода)
    ЗапросВремени=Новый Запрос;
    ЗапросВремени.Текст="ВЫБРАТЬ
                        |    ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.ВремяПоТабелю), 0) КАК ВремяПоТабелю,
                        |    ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.ЧасыПоНорме), 0) КАК ВремяПоНорме,
                        |    ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.Сверхурочные), 0) КАК СверхурочноеВремя,
                        |    ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.РаботаВВыходные), 0) КАК РаботаВВыходные,
                        |    ВЫБОР
                        |        КОГДА ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.ВремяПоТабелю), 0) = 0
                        |            ТОГДА 0
                        |        ИНАЧЕ (ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.Сверхурочные), 0) + ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.РаботаВВыходные), 0)) / ЕСТЬNULL(СУММА(ТабельСотрудниковЗаПериод.ВремяПоТабелю), 0)
                        |    КОНЕЦ КАК ДоляСверхурочных
                        |ИЗ
                        |    РегистрСведений.ТабельСотрудниковЗаПериод КАК ТабельСотрудниковЗаПериод
                        |ГДЕ
                        |    ТабельСотрудниковЗаПериод.Подразделение = &Подразделение
                        |    И ТабельСотрудниковЗаПериод.ПериодОтчета >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
                        |    И ТабельСотрудниковЗаПериод.ПериодОтчета <= КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
                        |
                        |СГРУППИРОВАТЬ ПО
                        |    ТабельСотрудниковЗаПериод.Подразделение";
    ЗапросВремени.УстановитьПараметр("Подразделение",Подразделение);
    ЗапросВремени.УстановитьПараметр("НачалоПериода",НачалоПериода);
    ЗапросВремени.УстановитьПараметр("КонецПериода",КонецПериода);
    Результат=ЗапросВремени.Выполнить().Выбрать();
    ТабельноеВремя=Новый структура;
    Пока Результат.Следующий() цикл
    Если Результат.ВремяПоТабелю<>Неопределено тогда
    ТабельноеВремя.Вставить("ВремяПоТабелю",результат.ВремяПоТабелю);
    ТабельноеВремя.Вставить("ВремяПоНорме",результат.ВремяПоНорме);
    ТабельноеВремя.Вставить("СверхурочноеВремя",результат.СверхурочноеВремя);
    ТабельноеВремя.Вставить("РаботаВВыходные",результат.РаботаВВыходные);
    ТабельноеВремя.Вставить("ДоляСверхурочных",результат.ДоляСверхурочных);
    КонецЦикла;
        Возврат ТабельноеВремя;
    КонецФункции
    [CODE]Если ВремяПодразделенияПоТабелю(Стр.Подразделение,Объект.НачалоПериода,Объект.КонецПериода).ВремяПоНорме<>Null тогда
        НовСтр.ВремяПоНорме=ВремяПодразделенияПоТабелю(Стр.Подразделение,Объект.НачалоПериода,Объект.КонецПериода).ВремяПоНорме;
    иначе
    НовСтр.ВремяПоНорме=0;
    КонецЕсли;
    
    В том же модуле вызываю эту функцию например:
    Код:
    Если ВремяПодразделенияПоТабелю(Стр.Подразделение,Объект.НачалоПериода,Объект.КонецПериода).ВремяПоНорме<>Null тогда
        НовСтр.ВремяПоНорме=ВремяПодразделенияПоТабелю(Стр.Подразделение,Объект.НачалоПериода,Объект.КонецПериода).ВремяПоНорме;
    иначе
    НовСтр.ВремяПоНорме=0;
    КонецЕсли;
    
    вот здесь вылетает ошибка, если данных нет за заданный период:
    {ВнешняяОбработка.ОтчетПоЗагрузкеПС.Форма.ФормаОтчета.Форма(530)}: Поле объекта не обнаружено (ВремяПоНорме)
    Если ВремяПодразделенияПоТабелю(Стр.Подразделение,Объект.НачалоПериода,Объект.КонецПериода).ВремяПоНорме<>Null тогда

    Вроде простая ситуация, но не получается условие написать - чтоб если данных нет, то не ошибка вывалилась, а сработало вычисление
    Код:
    иначе
    
    
    НовСтр.ВремяПоНорме=0;

    Что не так делаю? как правильно написать условие? помогите пожалуйста.
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.900
    Симпатии:
    1.035
    Баллы:
    204
    Вы структуру инициализируйте правильно , чтобы, если она не заполнилась в цикле, то содержала необходимые ключи.
  3. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    188
    Симпатии:
    0
    Баллы:
    26
    правильно это как? что я неправильно сделал?
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.900
    Симпатии:
    1.035
    Баллы:
    204
    Вы сделали:
    ТабельноеВремя=Новый структура;

    Далее в цикле добавляются ключи. Если цикл не выполнится, то ключей в структуре не будет - это вызывает ошибку.
    Ваша задача добавить ключи в структуру без цикла.
  5. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    188
    Симпатии:
    0
    Баллы:
    26
    так?
    Код:
    ТабельноеВремя=Новый структура("ВремяПоТабелю","ВремяПоНорме","СверхурочноеВремя","РаботаВВыходные","ДоляСверхурочных");
    ....
    Код:
    Пока Результат.Следующий() цикл
    
    ТабельноеВремя.Вставить("ВремяПоТабелю",результат.ВремяПоТабелю);
    ТабельноеВремя.Вставить("ВремяПоНорме",результат.ВремяПоНорме);
    
    на это та же ошибка выскочила...
  6. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    188
    Симпатии:
    0
    Баллы:
    26
    решил проблему:
    Код:
    ТабельноеВремя=Новый структура("ВремяПоТабелю,ВремяПоНорме,СверхурочноеВремя,РаботаВВыходные,ДоляСверхурочных");
    Пока Результат.Следующий() цикл
    Если Результат.ВремяПоТабелю<>Неопределено тогда
    ТабельноеВремя.ВремяПоТабелю=результат.ВремяПоТабелю;
    Иначе
    ТабельноеВремя.ВремяПоТабелю=0;
    КонецЕсли;
    Если Результат.ВремяПоНорме<>Неопределено тогда
    ТабельноеВремя.ВремяПоНорме=результат.ВремяПоНорме;
    иначе
    ТабельноеВремя.ВремяПоНорме=0;
    КонецЕсли;
    ................................
    
    Спасибо за помощь