Добрый день!
Есть ли у кого-то кусочек кода,
как сделать выборку из справочника "Клиенты"
по дате рождения, полу, дате регистрации и пр.
Для рассылки уведомлений по е-mail ?
Напишу пример. Чтобы заработал нужно немного подкорректировать.
Спр. СоздатьОбьект("Справочник.Соирудники;);
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
Если Спр.Пол ="м" тогда
продолдить; //не выбираем мужчин
КонецЕсли;
Если Спр.ДатаРегистрации>(ТекущаяДата()-10) тогда
Продолжить; //пропускаем недавно зарегистрированных (менее 10 дней)
КонецЕсли;
// тут пишем текст что делать для оставшихся сотрудников
КонецЦикла;
volodya1122 @ Сегодня, 15:17 ,
Смысл понятен, а как с днями рождения?
Интервал дат.
с днями рождения посложнее.
Может ктото придумал вариант попроще.
У меня была задача менять летнее время на зимнее и обратно.
Я проверяю даты (конец марта/начало апреля и если еще в этом периоде не поменяно, то изменяю
Вот мой код. Если разберетесь в нем то можете использовать.
МесяцТекущаяДата=ДатаМесяц(ТекущаяДата());
ЧислоТекущаяДата=ДатаЧисло(ТекущаяДата());
ГодТекущаяДата=ДатаГод(ТекущаяДата());
Если (МесяцТекущаяДата=3) или (МесяцТекущаяДата=4) Тогда
Если НомерДняНедели(Дата(ГодТекущаяДата,3,31))=7 тогда
ДатаПерехНаЛетнее=Дата(ГодТекущаяДата,3,31);
Иначе
ДатаПерехНаЛетнее=Дата(ГодТекущаяДата,3,31)-НомерДняНедели(Дата(ГодТекущаяДата,3,31));
КонецЕсли;
Если МесяцТекущаяДата=3 Тогда
Если ЧислоТекущаяДата>20 Тогда
Если ТекущаяДата()>=ДатаПерехНаЛетнее Тогда
Если Константа.ЛетнееВремя =0 Тогда
Константа.ЛетнееВремя =1;
// Сообщить("Змінили константу ЛетнееВремя в Березні !");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если МесяцТекущаяДата=4 Тогда
Если ЧислоТекущаяДата<15 Тогда
Если Константа.ЛетнееВремя =0 Тогда
Константа.ЛетнееВремя =1;
// Сообщить("Змінили константу ЛетнееВремя в Квітні !");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
и где оно все ("дата рождения, пол, дата регистрации и пр.") лежит? и какие условия при выборке должны соблюдаться?
прим.: ответ ожидается в виде "дата рождения лежи в реквизите <ИмяРеквизита> Справочника <ВидСправочника>, в выборку должны попадать только удолетворяющие условию <УсловиеХотяБыСвоимиСловами>
Cthulhu @ 15.08.16, 16:12 ,
Все данные находятся в справочнике "Клиенты"
Создаем внешнюю обработку.
Как в ней перебрать все условия /по ДР, Полу, и пр/?
Процедура Сформировать()
ТЗ = СоздатьОбъект ("ТаблицаЗначений");
ТЗ.НоваяКолонка("ФИО","строка");
ТЗ.НоваяКолонка("МобТел","Строка");
ТЗ.НоваяКолонка("Почта","строка");
ТЗ.НоваяКолонка("Просрочка","Дата");
ТЗ.НоваяКолонка("ДР","Дата");
ТЗ.НоваяКолонка("ПолМ","");
ТЗ.НоваяКолонка("ПолЖ","");
Спр = СоздатьОбъект ("Справочник.Клиенты");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Муж = 1 Тогда
ТЗ.НоваяСтрока();
ТЗ.ПолМ = Спр.Пол.Мужской;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ИначеЕсли Просрочка = 2 Тогда
ТЗ.НоваяСтрока();
ТЗ.Просрочка = СокрЛП(Спр.ДатаУвольнения);
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ИначеЕсли Жен = 3 Тогда
ТЗ.НоваяСтрока();
ТЗ.ПолЖ = Спр.Пол.Женский;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ИначеЕсли ДР = 4 Тогда
ТЗ.ДР = Спр.Дата_рождения;
Если ТЗ.ДР = ТекущаяДата() Тогда
ТЗ.НоваяСтрока();
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТЗ.Сортировать(СокрЛП("ФИО"));
ТЗ.Выгрузить(СписокКлиентов);
КонецПроцедуры
что неверно в коде
1. Значение переключателей вказано неверно.
Если вказано для одного из них "первый в группе, то во всех условиях проверять именно его (Муж=1, Муж=2.....)
Если нет, То тогда (Муж=1, Жен=1, Просрочка=1... ) - в смысле так как и флажок
Какое значение у каждого флажка можете проверить ппрописав в формуле этого флажка (Сообщить("муж="+муж)) .... Сообщить("жен="+жен))
2. Пол не в ТЗ не нужно разделять, так как один и тот же человек не может быть одновременно и М и Ж......
(если верить вашему коду то пол у вас прописан в Перечислениях. Тогда нужно писать ТЗ.ПолЖ = Спр.Пол;
3. Выбор лучше сделать флажком а не переключателем.
4. По 4-му условию у вас попадут в выборку только те кто родился именно сегодня, а не те у кого день рождения попадает на сегоднешнюю дату, но на другой год..
И ТЗ.ДР = Спр.Дата_рождения; тут лишнее, вернее стоит не на своем месте (нужно переместить во внутреннее условие.).
5. Не совсем понятен смысл реквизита прострочка. Судя по коду это дата увольнения. Какой ее сакральный смысл в данной задаче?
Если для уволенных сотрудников ненужно отправлять сообщения, то нужно вписать условие на эту проверку
Заключение: Вы точно программист?
Судя по коду свой отчет вы закончите не скоро......
logist @ Вчера, 16:08 ,
Это вы еще мой аватар не видели )
Процедура Сформировать()
//Сбор информации о пользователях
ТЗ = СоздатьОбъект ("ТаблицаЗначений");
ТЗ.НоваяКолонка("ФИО","строка");
ТЗ.НоваяКолонка("МобТел","Строка");
ТЗ.НоваяКолонка("Почта","строка");
ТЗ.НоваяКолонка("Просрочка","Дата");
ТЗ.НоваяКолонка("ДР","Дата");
ТЗ.НоваяКолонка("Пол","");
Спр = СоздатьОбъект ("Справочник.Клиенты");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
Если Отбор = 1 Тогда //Муж
ТЗ.Пол = Спр.Пол;
Если ТЗ.Пол = Перечисление.Пол.Мужской Тогда
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
КонецЕсли;
ИначеЕсли Отбор = 2 Тогда //Просрочка
Если ТЗ.Просрочка = Спр.ДатаУвольнения Тогда
ТЗ.Пол = Спр.Пол;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
КонецЕсли;
ИначеЕсли Отбор = 3 Тогда //жен
ТЗ.Пол = Спр.Пол;
Если ТЗ.Пол = Перечисление.Пол.Женский Тогда
ТЗ.НоваяСтрока();
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
КонецЕсли;
ИначеЕсли Отбор = 4 Тогда //всем
ТЗ.Пол = Спр.Пол;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
ИначеЕсли Отбор = 5 Тогда //ДР
ДЧТ = ДатаЧисло(ТекущаяДата());
ДМТ = ДатаМесяц(ТекущаяДата());
ДЧС = ДатаЧисло (Спр.Дата_рождения);
ДМС = ДатаМесяц(Спр.Дата_рождения);
Если (ДЧТ = ДЧС)
И (ДМТ = ДМС) тогда
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР= Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
Иначе
Сообщить("сегодня нет именинников");
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТЗ.Сортировать(СокрЛП("ФИО"));
ТЗ.Выгрузить(СписокКлиентов);
КонецПроцедуры // СоставитьСписок
В предыдущем коде не все так гладко.
Если проверяли, то Таб. значений выводит пустые строки.
Допустим у нас 5 жен. и 2 муж., то по выборке
только муж. будет еще 5 пустых строк.
Вот нормальный код.
Тему можно закрывать. Спасибо.
Процедура ПриОткрытии()
Отбор = 1;
КонецПроцедуры // ПриОткрытии
Процедура Сформировать()
//Сбор информации о пользователях
ТЗ = СоздатьОбъект ("ТаблицаЗначений");
ТЗ.НоваяКолонка("ФИО","строка");
ТЗ.НоваяКолонка("МобТел","Строка");
ТЗ.НоваяКолонка("Почта","строка");
ТЗ.НоваяКолонка("Просрочка","Дата");
ТЗ.НоваяКолонка("ДР","Дата");
ТЗ.НоваяКолонка("Пол","");
Спр = СоздатьОбъект ("Справочник.Клиенты");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
Если Отбор = 1 Тогда //Муж
ТЗ.Пол = Спр.Пол;
Если ТЗ.Пол = Перечисление.Пол.Мужской Тогда
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
ИначеЕсли ТЗ.Пол = Перечисление.Пол.Женский Тогда
ТЗ.УдалитьСтроку();
КонецЕсли;
ИначеЕсли Отбор = 2 Тогда //Просрочка
Если ТЗ.Просрочка = Спр.ДатаУвольнения Тогда
ТЗ.Пол = Спр.Пол;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ИначеЕсли ТЗ.Просрочка <> Спр.ДатаУвольнения тогда
ТЗ.УдалитьСтроку();
КонецЕсли;
ИначеЕсли Отбор = 3 Тогда //жен
ТЗ.Пол = Спр.Пол;
Если ТЗ.Пол = Перечисление.Пол.Женский Тогда
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
ИначеЕсли ТЗ.Пол = Перечисление.Пол.Мужской Тогда
ТЗ.УдалитьСтроку();
КонецЕсли;
ИначеЕсли Отбор = 4 Тогда //всем
ТЗ.Пол = Спр.Пол;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР = Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
ИначеЕсли Отбор = 5 Тогда //ДР
ДЧТ = ДатаЧисло(ТекущаяДата());
ДМТ = ДатаМесяц(ТекущаяДата());
ДЧС = ДатаЧисло (Спр.Дата_рождения);
ДМС = ДатаМесяц(Спр.Дата_рождения);
Если (ДЧТ = ДЧС)
И (ДМТ = ДМС) тогда
ТЗ.Пол = Спр.Пол;
ТЗ.ФИО = СокрЛП(Спр.Фамилия+" "+Спр.Имя+" "+Спр.Отчество);
ТЗ.МобТел = СокрЛП(Спр.Моб_Тел);
ТЗ.Почта = СокрЛП(Спр.ЭлектроннаяПочта);
ТЗ.ДР= Спр.Дата_рождения;
ТЗ.Просрочка = Спр.ДатаУвольнения;
Иначе
ТЗ.УдалитьСтроку();
Сообщить("сегодня нет именинников");
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
ТЗ.Сортировать(СокрЛП("ФИО"));
ТЗ.Выгрузить(СписокКлиентов);
КонецПроцедуры // СоставитьСписок
SvitlaChek @ Сегодня, 10:59 ,
Браво!!!!!!!!!!!
Конешно этот код можна оптимизировать но и так сойдет. Главное что работает правильно.
p.s.
В этом куске кода не правильно/ (поработайте еще с ним)
ИначеЕсли Отбор = 2 Тогда //Просрочка
...................................
.................................
и еще если человек уже уволен. нужно ли чтоб он попадал в списки (по условиям 1, 3, 4, 5). Также подумайте над этим.
SvitlaChek @ 19.08.16, 14:13 ,
Вот так будет быстрее, да и читабельность полегче:
Процедура СоставитьСписок()
лпТекДата = ТекущаяДата();
лпТекстЗапроса = "
|Клиент = Справочник.Клиенты.ТекущийЭлемент;
|Фамилия = Справочник.Клиенты.Фамилия;
|Имя = Справочник.Клиенты.Имя;
|Отчество = Справочник.Клиенты.Отчество;
|Пол = Справочник.Клиенты.Пол;
|ДР = Справочник.Клиенты.Дата_рождения;
|Почта = Справочник.Клиенты.ЭлектроннаяПочта;
|МобТел = Справочник.Клиенты.Моб_Тел;
|Просрочка = Справочник.Клиенты.ДатаУвольнения;
|Группировка Клиент без групп;";
Если Отбор <> 4 Тогда
Если (Отбор = 1) или (Отбор = 3) Тогда//отбор мужчины/женщины
ВыбПол = ?(Отбор = 1,Перечисление.Пол.Мужской,Перечисление.Пол.Женский)
лпТекстЗапроса = лпТекстЗапроса+РазделительСтрок+"Условие(Пол = ВыбПол);";
КонецЕсли;
Если Отбор = 5 Тогда//Дни рождения
лпДатаМесяц = ДатаМесяц(лпТекДата);
лпДатаПлюсДень = лпТекДата+1;
Если лпДатаМесяц = ДатаМесяц(лпДатаПлюсДень) Тогда
лпТекстЗапроса = лпТекстЗапроса+РазделительСтрок+"Условие(ДР = лпТекДата);";
Иначе
лпТекстЗапроса = лпТекстЗапроса+РазделительСтрок+"Условие((ДР >= лпТекДата) и (ДР < лпДатаПлюсДень));";
КонецЕсли;
КонецЕсли;
Если Отбор = 2 Тогда//НЕ уволенные
лпТекстЗапроса = лпТекстЗапроса+РазделительСтрок+"Условие(Просрочка < лпТекДата);";
КонецЕсли;
КонецЕсли;
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(лпТекстЗапроса) = 0 Тогда
Предупреждение("Ошибка в запросе !",10);
Возврат;
КонецЕсли;
ТЗ = СоздатьОбъект ("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ,1,0);
//Для просмотра результата
ТЗ.ВыбратьСтроку();
КонецПроцедуры // СоставитьСписок
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua