Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 07:54

Получение элементов иерархического справочника

Автор dborovsky, 09 авг 2012, 21:13

0 Пользователей и 1 гость просматривают эту тему.

dborovsky

Доброго времени суток Дамы и Господа. Тема наверное избитая уже, но все таки. недавно начал изучать 1с. Мне надо выбрать из иерархического справочника Сотрудники всех работников,  у которых сегодня день рождение. Вначале у меня справочник был без иераррхии и все работало. Как только добавил группы, моя выборка стала пуста. Изменил код, как показано внизу, но безрезультатно. Что ни так в коде? Заранее спасибо за ответ.

Функция СписокИмениннниковПоТекДате() Экспорт
ТД_День = День(ТекущаяДата());  
ТД_Месяц = Месяц(ТекущаяДата());

Массив = Новый Массив();


Выборка =  Справочники.Сотрудники.ВыбратьИерархически();

Пока Выборка.Следующий() Цикл
ДР_День = День(Выборка.ДатаРождения);
ДР_Месяц = Месяц(Выборка.ДатаРождения);


Если ТД_День = ДР_День И ТД_Месяц = ДР_Месяц Тогда
Массив.Добавить(Выборка.Наименование);
КонецЕсли;

КонецЦикла;

Возврат Массив;

  КонецФункции
 

sadovod

Выбрать() и ВыбратьИерархически() возвращают один и тот же список, просто порядок элементов в выборке разный.
Ну, ещё можно внутрь цикла вставить условие
    Если НЕ Выборка.ЭтоГруппа Тогда ...
ведь вы же не заполняли у групп ДатуРождения.
А так, непонятно, почему массив пустой, может на самом деле нет совпадений дат?

dborovsky

Выдает ошибку: {ОбщийМодуль.ОбщийМодуль.Модуль(11)}: Преобразование значения к типу Дата не может быть выполнено
         ДР_День = День(Выборка.ДатаРождения);

sadovod

Цитата: dborovsky от 10 авг 2012, 12:02
Выдает ошибку: {ОбщийМодуль.ОбщийМодуль.Модуль(11)}: Преобразование значения к типу Дата не может быть выполнено
         ДР_День = День(Выборка.ДатаРождения);
Ну правильно, значит ДатаРождения у вас по умолчанию не заполняется, вы добавили группы, и это поле в группах равно null, можете в отладчике посмотреть...
А значение null в Дату в данном случае нельзя преобразовать, вот ошибку и выдает...
Варианты решения такие:
Можно в цикл вставить проверку НЕ Выборка.ЭтоГруппа или, что гораздо лучше, вставить проверку Если ЗначениеЗаполнено(ДатаРождения) Тогда ...
И, кстати, можете ещё оптимизировать свой код. Вместо того, чтобы по отдельности выделять день и месяц для сравнения дат, лучше привести обе даты к началу дня и сравнивать их как даты. Вот так примерно:

        ТД_Дата = НачалоДня(ТекущаяДата());     
       
        Массив = Новый Массив();
       
       
        Выборка =  Справочники.Сотрудники.ВыбратьИерархически();
       
        Пока Выборка.Следующий() Цикл
             Если ЗначениеЗаполнено(Выборка.ДатаРождения) Тогда
                ДР_Дата = НачалоДня(Выборка.ДатаРождения);
       
                Если ТД_Дата = ДР_Дата Тогда
                    Массив.Добавить(Выборка.Наименование);
                КонецЕсли;

            КонецЕсли;

        КонецЦикла;
       
        Возврат Массив;

dborovsky

Я не совсем понимаю, что значит в группах не заполнен реквизит день рождения. Ведь у меня есть объекты в группах, у которых заполнены дни рождения.

sadovod

Цитата: dborovsky от 10 авг 2012, 16:30
Я не совсем понимаю, что значит в группах не заполнен реквизит день рождения. Ведь у меня есть объекты в группах, у которых заполнены дни рождения.
Откройте в конфигураторе объект конфигурации Справочник.Сотрудники. Перейдите на закладку 'Реквизиты', там, где вы добавили реквизит 'ДатаРождения'. Так вот там ещё есть кнопочка 'Стандартные реквизиты', нажмите её.
Вы увидите список реквизитов (в базах данных они называются полями), которые присутствуют у любого элемента справочника Сотрудники. Среди них есть реквизит 'ЭтоГруппа' (может быть или Истина или Ложь). Так вот, является элемент справочника Сотрудники группой или обычным элементом как раз определяется состоянием этого 'флажка'. А больше они ничем не отличаются. Когда добавляете группу, то в справочник добавляется новая запись (строка, если угодно), у которой этот флаг установлен в 'Истину', а когда добавляется обычный элемент - то 'Ложь'.
Дело ещё в том, что все остальные реквизиты, в том числе и добавленная вами 'ДатаРождения' есть и у обычных элементов, и у групп. Если её не устанавливать явно, и не задавать в свойствах значения по умолчанию, то при вводе новой группы(или элемента) остаётся "пустой" (значение null). Попытка преобразовать такое значение в Дату вызывает ошибку.
Чтобы избежать этой ошибки, нужно проверять значение 'ДатаРождения' на заполненность, пример этого я привёл выше...

dborovsky


ivanov660

Используйте запросы, а не объектную модель!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск