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

Помогите вывести список сотрудников (день рождения на сегодня)

Автор Алексей_1985_06, 09 мая 2020, 14:43

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

Алексей_1985_06

Знатоков прошу помочь! Конфигурация самописная 8.3 Создана обработка в которой необходимо выводить список всех, у кого на сегодняшнюю дату Дни рождения, помогите с установкой параметра, не пойму как это сделать. Реализовал пока так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Военнослужащие.Очистить(); // реквизит ТЗ

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЛичныйСостав.Ссылка,
| ЛичныйСостав.Телефон,
| ЛичныйСостав.ВоинскоеЗвание,
| ЛичныйСостав.ПодразделениеДляЗапроса
|ИЗ
| Справочник.ЛичныйСостав КАК ЛичныйСостав";


РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Сегодня = ТекущаяДата();
КонецПроцедуры


antoneus

Не знаю, где в вашей самописке хранится день рождения, предполагаю, что это реквизит справочника ЛичныйСостав и называется ДатаРождения, тип реквизита - дата, состав - дата. Исходя из этих предположений предлагаю такой способ:

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

Алексей_1985_06

Цитата: antoneus от 09 мая 2020, 18:37
Не знаю, где в вашей самописке хранится день рождения, предполагаю, что это реквизит справочника ЛичныйСостав и называется ДатаРождения, тип реквизита - дата, состав - дата. Исходя из этих предположений предлагаю такой способ:

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


Да, Вы все верно поняли, так и есть, вот только не получается выводить список, функция НачалоДня возращает же дату и время начала дня - для указанной даты с годом, поэтому список лиц с днем рождения будет выводиться если дата рождения=текущей дате без учета года, поэтому сейчас результат запроса пустой..
Знаете как это можно подправить?

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Военнослужащие.Очистить(); // реквизит с типом ТЗ.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ЛичныйСостав.Ссылка,
               | ЛичныйСостав.Телефон,
               | ЛичныйСостав.ВоинскоеЗвание,
               | ЛичныйСостав.ПодразделениеДляЗапроса
               |ИЗ
               | Справочник.ЛичныйСостав КАК ЛичныйСостав
               |ГДЕ
               | ЛичныйСостав.ДатаРождения = &Сегодня";

Запрос.УстановитьПараметр("Сегодня", НачалоДня(ТекущаяДата()));

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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


antoneus

Блин, старею)

    |ГДЕ
    |    МЕСЯЦ(ЛичныйСостав.ДатаРождения) = &Месяц И
    |    ДЕНЬ(ЛичныйСостав.ДатаРождения) = &День

Запрос.УстановитьПараметр("Месяц", Месяц(ТекущаяДата()));
Запрос.УстановитьПараметр("День", День(ТекущаяДата()));


Да, вот так просто)

Алексей_1985_06

Цитата: antoneus от 09 мая 2020, 21:45
Блин, старею)

    |ГДЕ
    |    МЕСЯЦ(ЛичныйСостав.ДатаРождения) = &Месяц И
    |    ДЕНЬ(ЛичныйСостав.ДатаРождения) = &День

Запрос.УстановитьПараметр("Месяц", Месяц(ТекущаяДата()));
Запрос.УстановитьПараметр("День", День(ТекущаяДата()));


Да, вот так просто)

Огромное Вам спасибо!!!
Добавлено: 10 мая 2020, 18:54


Цитата: Алексей_1985_06 от 09 мая 2020, 22:20
Цитата: antoneus от 09 мая 2020, 21:45
Блин, старею)

    |ГДЕ
    |    МЕСЯЦ(ЛичныйСостав.ДатаРождения) = &Месяц И
    |    ДЕНЬ(ЛичныйСостав.ДатаРождения) = &День

Запрос.УстановитьПараметр("Месяц", Месяц(ТекущаяДата()));
Запрос.УстановитьПараметр("День", День(ТекущаяДата()));


Да, вот так просто)

Огромное Вам спасибо!!!


Уважаемый Аntoneus, вынужден опять к Вам обратиться, подскажите что я намудрил с условиями (Думаю ошибка в логическом выражении И). .. Совершенствуюсь, так сказать дальше и хочу сделать так, чтоб список дней рождений сотрудников выводился исходя из выбранного периода дат... При таком варианте как сейчас не корректно работает... Подскажите что исправить в условии?

&НаСервере
Процедура ЗаполнитьТаблицуСПериодом()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЛичныйСостав.Ссылка,
| ЛичныйСостав.Телефон,
| ЛичныйСостав.ВоинскоеЗвание,
| ЛичныйСостав.ДатаРождения,
| ЛичныйСостав.Должность
|ИЗ
| Справочник.ЛичныйСостав КАК ЛичныйСостав
|ГДЕ
| ДЕНЬ (ЛичныйСостав.ДатаРождения) >= &НачДень
| И МЕСЯЦ (ЛичныйСостав.ДатаРождения) >= &НачМесяц
| И ДЕНЬ (ЛичныйСостав.ДатаРождения) <= &КонДень
| И МЕСЯЦ (ЛичныйСостав.ДатаРождения) <= &КонМесяц    
|УПОРЯДОЧИТЬ ПО
| ЛичныйСостав.ДатаРождения";

Запрос.УстановитьПараметр("НачДень", День(Объект.НачальнаяДата));
Запрос.УстановитьПараметр("НачМесяц", Месяц(Объект.НачальнаяДата));

Запрос.УстановитьПараметр("КонДень", День(Объект.КонечнаяДата));
Запрос.УстановитьПараметр("КонМесяц", Месяц(Объект.КонечнаяДата));
...........

КонецПроцедуры

antoneus

|ГДЕ
|    ДОБАВИТЬКДАТЕ(ЛичныйСостав.ДатаРождения, ГОД, &ТекущийГод - ГОД(ЛичныйСостав.ДатаРождения)) МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ТекущийГод", Год(Период.ДатаНачала));
Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);


Но если начало и конец периода в разных годах - например выбран декабрь-январь - работать может криво, надо еще подумать)

Алексей_1985_06

Цитата: antoneus от 10 мая 2020, 22:46
|ГДЕ
|    ДОБАВИТЬКДАТЕ(ЛичныйСостав.ДатаРождения, ГОД, &ТекущийГод - ГОД(ЛичныйСостав.ДатаРождения)) МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ТекущийГод", Год(Период.ДатаНачала));
Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);


Но если начало и конец периода в разных годах - например выбран декабрь-январь - работать может криво, надо еще подумать)

Спасибо Вам за помощь! Пока не получается, выходит ошибка... Что не так не пойму.:dfbbdrfb::dfbbdrfb::dfbbdrfb:

&НаСервере
Процедура ЗаполнитьТаблицуСПериодом()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЛичныйСостав.Ссылка,
| ЛичныйСостав.Телефон,
| ЛичныйСостав.ВоинскоеЗвание,
| ЛичныйСостав.ДатаРождения,
| ЛичныйСостав.Должность
|ИЗ
| Справочник.ЛичныйСостав КАК ЛичныйСостав
|ГДЕ
|ДОБАВИТЬКДАТЕ(ЛичныйСостав.ДатаРождения, ГОД, &ТекущийГод - ГОД(ЛичныйСостав.ДатаРождения)) МЕЖДУ &ДатаНачала И &ДатаОкончания"    
|УПОРЯДОЧИТЬ ПО
| ЛичныйСостав.ДатаРождения";

Запрос.УстановитьПараметр("ТекущийГод", Год(Период.НачальнаяДата));
Запрос.УстановитьПараметр("ДатаНачала", Период.НачальнаяДата);
Запрос.УстановитьПараметр("ДатаОкончания", Период.КонечнаяДата);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Если РезультатЗапроса.Пустой() Тогда
Сообщить("В указанный период не найдено ни одного сотрудника!")
КонецЕсли;

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


Ошибка:
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(122,13)}: Обнаружено логическое завершение исходного текста модуля
   КонецЦикла;<<?>> (Проверка: Сервер)
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(95,2)}: Ожидается ключевое слово 'КонецПроцедуры' ('EndProcedure')
   <<?>>|УПОРЯДОЧИТЬ ПО (Проверка: Тонкий клиент)
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(108,38)}: Ошибка в выражении
   РезультатЗапроса = Запрос.Выполнить(<<?>>); (Проверка: Тонкий клиент)
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(122,13)}: Обнаружено логическое завершение исходного текста модуля
   КонецЦикла;<<?>> (Проверка: Тонкий клиент)

antoneus


Алексей_1985_06

Цитата: antoneus от 11 мая 2020, 00:49
Кавычка закралась.

Блин, не думал что это будет так сложно, теперь такая ошибка выскочила:
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(98,46)}: Переменная не определена (Период)
   Запрос.УстановитьПараметр("ТекущийГод", Год(<<?>>Период.НачальнаяДата)); (Проверка: Сервер)
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(99,42)}: Переменная не определена (Период)
   Запрос.УстановитьПараметр("ДатаНачала", <<?>>Период.НачальнаяДата); (Проверка: Сервер)
{Обработка.ДниРожденияСотрудников.Форма.Форма.Форма(100,45)}: Переменная не определена (Период)
   Запрос.УстановитьПараметр("ДатаОкончания", <<?>>Период.КонечнаяДата); (Проверка: Сервер)
Код:
&НаСервере
Процедура ЗаполнитьТаблицуСПериодом()
Объект.Военнослужащие.Очистить();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЛичныйСостав.Ссылка,
| ЛичныйСостав.Телефон,
| ЛичныйСостав.ВоинскоеЗвание,
| ЛичныйСостав.ДатаРождения,
| ЛичныйСостав.Должность
|ИЗ
| Справочник.ЛичныйСостав КАК ЛичныйСостав
|ГДЕ
| ДОБАВИТЬКДАТЕ(ЛичныйСостав.ДатаРождения, ГОД, &ТекущийГод - ГОД(ЛичныйСостав.ДатаРождения)) МЕЖДУ &ДатаНачала И &ДатаОкончания   
|УПОРЯДОЧИТЬ ПО
| ЛичныйСостав.ДатаРождения";

Запрос.УстановитьПараметр("ТекущийГод", Год(Период.НачальнаяДата));
Запрос.УстановитьПараметр("ДатаНачала", Период.НачальнаяДата);
Запрос.УстановитьПараметр("ДатаОкончания", Период.КонечнаяДата);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Если РезультатЗапроса.Пустой() Тогда
Сообщить("В указанный период не найдено ни одного сотрудника!")
КонецЕсли;

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

antoneus

Так период, за который днюхи надо выводить, вы как задаете? Вот от него начальную и конечную дату пихайте в запрос.

Теги:

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

Рейтинг@Mail.ru

Поиск