Дни рождения пациентов по периоду

1. user1645882 12.08.21 16:56 Сейчас в теме
Нужно создать внешний отчет. Суть: Пользователь выбирает период (дата1, дата2), нажимает "Сформировать", получает таблицу с ФИО людей, у которых день рождения в этот период. То есть не учитывается год рождения, а только месяц и день.
Например, период на вход с 10.08.2021 по 12.08.2021. В отчете будут все люди у которых день рождения с 10.08 по 12.08.
Условие: Обработку по периоду нужно сделать по СКД и языку запросов.
Как создать запрос, который будет учитывать период?
ВЫБРАТЬ
	ДанныеПациентов.Пациент КАК Пациент,
	ДанныеПациентов.ДатаРождения КАК ДатаРождения,
	ЕСТЬNULL(КонтактнаяИнформацияПациента.Представление, "Нет контактов") КАК Представление
ИЗ
	РегистрСведений.ДанныеПациентов КАК ДанныеПациентов
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформацияПациента КАК КонтактнаяИнформацияПациента
		ПО ДанныеПациентов.Пациент = КонтактнаяИнформацияПациента.Пациент
Показать
По теме из базы знаний
Найденные решения
20. Release 13.08.21 13:38 Сейчас в теме
(17)
ВЫБОР
    КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода) 
        ТОГДА ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -ГОД(&НачалоПериода)) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -ГОД(&КонецПериода))
    КОГДА ГОД(&КонецПериода)-ГОД(&НачалоПериода) = 1 
        ТОГДА ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -ГОД(&НачалоПериода)) И ДАТАВРЕМЯ(1,12,31)
                ИЛИ ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДАТАВРЕМЯ(1,1,1) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -ГОД(&КонецПериода))
    ИНАЧЕ ИСТИНА
КОНЕЦ

Не-не, так не работает. Проверьте: НачалоПериода = 29.12.2020 0:00:00, КонецПериода = 03.01.2021 0:00:00, ДатаРождения = 31.10.2020 0:00:00. Результат будет ложно положительным, а не должен. Все из-за того, что год "затирается" в ноль, чего в 1С не может быть, и всете годом сбрасывается месяц в 1.
Нужно -ГОД(Дата), заменить на -(ГОД(Дата)-1), т.е.

	ВЫБОР
		КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода)
			ТОГДА ДОБАВИТЬКДАТЕ(&ДатаРождения, ГОД, -(ГОД(&ДатаРождения)-1)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -(ГОД(&НачалоПериода)-1)) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -(ГОД(&КонецПериода)-1))
		КОГДА ГОД(&КонецПериода) - ГОД(&НачалоПериода) = 1
			ТОГДА ДОБАВИТЬКДАТЕ(&ДатаРождения, ГОД, -(ГОД(&ДатаРождения)-1)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -(ГОД(&НачалоПериода)-1)) И ДАТАВРЕМЯ(1, 12, 31)
					ИЛИ ДОБАВИТЬКДАТЕ(&ДатаРождения, ГОД, -(ГОД(&ДатаРождения)-1)) МЕЖДУ ДАТАВРЕМЯ(1, 1, 1) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -(ГОД(&КонецПериода)-1))
		ИНАЧЕ ИСТИНА
	КОНЕЦ
FatPanzer; +1 Ответить
7. Ivanov_OM 38 12.08.21 17:37 Сейчас в теме
ВЫБРАТЬ
	ФизическиеЛица.Ссылка КАК Ссылка,
	ДОБАВИТЬКДАТЕ(ФизическиеЛица.ДатаРождения, ГОД, РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &Дата2, ГОД)) КАК ДеньРождения
ИЗ
	Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
	ДОБАВИТЬКДАТЕ(ФизическиеЛица.ДатаРождения, ГОД, РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &Дата2, ГОД)) МЕЖДУ &Дата1 И &Дата2
11. Release 12.08.21 20:10 Сейчас в теме
Что-то вроде такого:
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(&НачалоПериода) - 1), ДЕНЬ, ДЕНЬ(&НачалоПериода) - 1) КАК НачальнаяДата,
	ВЫБОР
		КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода)
			ТОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(&НачалоПериода) - 1), ДЕНЬ, ДЕНЬ(&НачалоПериода) - 1)
		ИНАЧЕ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2, 1, 1), МЕСЯЦ, МЕСЯЦ(&НачалоПериода) - 1), ДЕНЬ, ДЕНЬ(&НачалоПериода) - 1)
	КОНЕЦ КАК КонечнаяДата
ПОМЕСТИТЬ втПериод
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДанныеПациентов.Пациент КАК Пациент,
	ДанныеПациентов.ДатаРождения КАК ДатаРождения
ИЗ
	РегистрСведений.ДанныеПациентов КАК ДанныеПациентов
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформацияПациента КАК КонтактнаяИнформацияПациента
		ПО ДанныеПациентов.Пациент = КонтактнаяИнформацияПациента.Пациент,
	втПериод КАК втПериод
ГДЕ
	(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(ДанныеПациентов.ДатаРождения) - 1), ДЕНЬ, ДЕНЬ(ДанныеПациентов.ДатаРождения) - 1) МЕЖДУ втПериод.НачальнаяДата И втПериод.КонечнаяДата
			ИЛИ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2, 1, 1), МЕСЯЦ, МЕСЯЦ(ДанныеПациентов.ДатаРождения) - 1), ДЕНЬ, ДЕНЬ(ДанныеПациентов.ДатаРождения) - 1) МЕЖДУ втПериод.НачальнаяДата И втПериод.КонечнаяДата)
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. digiboy 4 12.08.21 17:02 Сейчас в теме
Добавь условие {Где ДанныеПациентов.ДатаРождения Между &ДатаНачало и &ДатаКонец}, на вкладке параметры появятся нужные параметры. Можно сделать параметр с типом период и настроить что ДатаНАчало и ДатаКонец буду заполняться из периода, так будет визуально более удобно на форме отчета.
3. user1645882 12.08.21 17:16 Сейчас в теме
(2)Окей, но есть момент. Будет ли это правильно работать? Представь, между 11.08.2021 и 12.08.2021, а день рождения у человека стоит всегда начальной датой. То есть преположим: 11.08.1997 года.
Тогда он попадет в список?
4. Sashares 35 12.08.21 17:34 Сейчас в теме
(3)Если период будет в пределах одного года, то можно пересобрать дату рождения с годом от даты начала.
ДатаВремя(Год(&ДатаНачало),Месяц(ДанныеПациентов.ДатаРождения), День(ДанныеПациентов.ДатаРождения))  Между &ДатаНачало и &ДатаКонец
8. user1645882 12.08.21 17:48 Сейчас в теме
(4) Пробовал. ДатаВремя не хочет работать с Месяц(), Год() и т.д.
{(10, 12)}: Неверные параметры "ДАТАВРЕМЯ"
ДатаВремя(<<?>>Год(&ДатаНачало),Месяц(ДанныеПациентов.ДатаРождения), День(ДанныеПациентов.ДатаРождения))  Между &ДатаНачало и &ДатаКонец
5. soft_wind 12.08.21 17:35 Сейчас в теме
а попробуйте такое условие подставить, при условии что Дата1 и Дата2 в пределах одного года

Где
ДеньГода(ДанныеПациентов.ДатаРождения) между ДеньГода(&Дата1) и ДеньГода(&Дата2)
6. Sashares 35 12.08.21 17:35 Сейчас в теме
(5)а если год високосный был?)
7. Ivanov_OM 38 12.08.21 17:37 Сейчас в теме
ВЫБРАТЬ
	ФизическиеЛица.Ссылка КАК Ссылка,
	ДОБАВИТЬКДАТЕ(ФизическиеЛица.ДатаРождения, ГОД, РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &Дата2, ГОД)) КАК ДеньРождения
ИЗ
	Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
	ДОБАВИТЬКДАТЕ(ФизическиеЛица.ДатаРождения, ГОД, РАЗНОСТЬДАТ(ФизическиеЛица.ДатаРождения, &Дата2, ГОД)) МЕЖДУ &Дата1 И &Дата2
9. user1645882 12.08.21 17:55 Сейчас в теме
(7)Да, это работает, но в пределах года. А если кто-то введет дату с 30.12.2020 по 02.01.2021?
13. Ivanov_OM 38 13.08.21 08:49 Сейчас в теме
(9) Сработает и в этом диапазоне.
10. user790708 12.08.21 18:40 Сейчас в теме
Формируете запрос програмно анализируя введенный интервал
Потом скармливаете таблицузначений СКД как источник данных, пример (в адресе убрать пробелы): http :// 1c8xx.ru/skdtzof.php


ПериодНачало  = '20201201'; // берется из параметров СКД
ПериодКонец  =  '20210115'; // берется из параметров СКД

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

Запрос.УстановитьПараметр("ПустаяДата", '00010101');
Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить();

ТаблДляСКД = Результат.Выгрузить();
Показать
12. user1645882 12.08.21 20:10 Сейчас в теме
(10)Это то понятно, спасибо. Но суть вопроса стояла именно получать отбор через СКД без использования внешних процедур и обработчиков. То, что вы предложили, был чуть ли не первый вариант.
11. Release 12.08.21 20:10 Сейчас в теме
Что-то вроде такого:
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(&НачалоПериода) - 1), ДЕНЬ, ДЕНЬ(&НачалоПериода) - 1) КАК НачальнаяДата,
	ВЫБОР
		КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода)
			ТОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(&НачалоПериода) - 1), ДЕНЬ, ДЕНЬ(&НачалоПериода) - 1)
		ИНАЧЕ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2, 1, 1), МЕСЯЦ, МЕСЯЦ(&НачалоПериода) - 1), ДЕНЬ, ДЕНЬ(&НачалоПериода) - 1)
	КОНЕЦ КАК КонечнаяДата
ПОМЕСТИТЬ втПериод
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДанныеПациентов.Пациент КАК Пациент,
	ДанныеПациентов.ДатаРождения КАК ДатаРождения
ИЗ
	РегистрСведений.ДанныеПациентов КАК ДанныеПациентов
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформацияПациента КАК КонтактнаяИнформацияПациента
		ПО ДанныеПациентов.Пациент = КонтактнаяИнформацияПациента.Пациент,
	втПериод КАК втПериод
ГДЕ
	(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(ДанныеПациентов.ДатаРождения) - 1), ДЕНЬ, ДЕНЬ(ДанныеПациентов.ДатаРождения) - 1) МЕЖДУ втПериод.НачальнаяДата И втПериод.КонечнаяДата
			ИЛИ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2, 1, 1), МЕСЯЦ, МЕСЯЦ(ДанныеПациентов.ДатаРождения) - 1), ДЕНЬ, ДЕНЬ(ДанныеПациентов.ДатаРождения) - 1) МЕЖДУ втПериод.НачальнаяДата И втПериод.КонечнаяДата)
Показать
14. soft_wind 13.08.21 10:26 Сейчас в теме
получился какой-то такой монстр, пока не понял как его оптимизировать
но все равно есть ограничения по периоду, пока такая интервал/длина периода не должна превышать год (тогда просто все ДР можно показывать)
а вот для периода в одном году или на смене годов, такое условие получилось

Где
	Выбор 
		//вариант когда интервал в пределах Года
		Когда Месяц(&Дата1) <= Месяц(&Дата2) 
		Тогда Месяц(ДР) между Месяц(&Дата1) и Месяц(&Дата2)
		и Выбор 
			Когда Месяц(ДР) = Месяц(&Дата1) и День(ДР) < День(&Дата1) Тогда Ложь
			Когда Месяц(ДР) = Месяц(&Дата2) и День(ДР) > День(&Дата2) Тогда Ложь
			Иначе Истина
		  Конец
		//интервал в разных годах
	    Иначе Месяц(ДР) >= Месяц(&Дата1) или Месяц(ДР) <=  Месяц(&Дата2) 
		и Выбор 
			Когда Месяц(ДР) = Месяц(&Дата1) и День(ДР) < День(&Дата1) Тогда Ложь
			Когда Месяц(ДР) = Месяц(&Дата2) и День(ДР) > День(&Дата2) Тогда Ложь
			Иначе Истина
		  Конец
	  Конец
Показать
15. soft_wind 13.08.21 11:15 Сейчас в теме
(11) упс, а что-то у меня тест не проходит
условия

НачалоПериода -- 16.10.2020 0:00:00
КонецПериода -- 01.02.2021 0:00:00
ДР -- ДатаВремя(2000,10,15)

ДР не должна попадать в результат, а она попадает
16. soft_wind 13.08.21 11:27 Сейчас в теме
(11) наверно опечатка была, при таком коде работает

  ТОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ, МЕСЯЦ(&КонецПериода) - 1), ДЕНЬ, ДЕНЬ(&КонецПериода) - 1)
        ИНАЧЕ ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2, 1, 1), МЕСЯЦ, МЕСЯЦ(&КонецПериода) - 1), ДЕНЬ, ДЕНЬ(&КонецПериода) - 1)
19. Release 13.08.21 13:09 Сейчас в теме
(16) Да, виноват, это ошибка копипасты. Неудобно писать, когда реальной конфы с ее объектами нет.
Я там, в примере, и поле пропустил из соединения:
ЕСТЬNULL(КонтактнаяИнформацияПациента.Представление, "Нет контактов") КАК Представление
17. FatPanzer 13.08.21 11:42 Сейчас в теме
ВЫБОР
	КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода) 
		ТОГДА ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -ГОД(&НачалоПериода)) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -ГОД(&КонецПериода))
	КОГДА ГОД(&КонецПериода)-ГОД(&НачалоПериода) = 1 
		ТОГДА ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -ГОД(&НачалоПериода)) И ДАТАВРЕМЯ(1,12,31)
				ИЛИ ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДАТАВРЕМЯ(1,1,1) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -ГОД(&КонецПериода))
	ИНАЧЕ ИСТИНА
КОНЕЦ				
Показать
20. Release 13.08.21 13:38 Сейчас в теме
(17)
ВЫБОР
    КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода) 
        ТОГДА ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -ГОД(&НачалоПериода)) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -ГОД(&КонецПериода))
    КОГДА ГОД(&КонецПериода)-ГОД(&НачалоПериода) = 1 
        ТОГДА ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -ГОД(&НачалоПериода)) И ДАТАВРЕМЯ(1,12,31)
                ИЛИ ДОБАВИТЬКДАТЕ(ДатаРождения, ГОД, -ГОД(ДатаРождения)) МЕЖДУ ДАТАВРЕМЯ(1,1,1) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -ГОД(&КонецПериода))
    ИНАЧЕ ИСТИНА
КОНЕЦ

Не-не, так не работает. Проверьте: НачалоПериода = 29.12.2020 0:00:00, КонецПериода = 03.01.2021 0:00:00, ДатаРождения = 31.10.2020 0:00:00. Результат будет ложно положительным, а не должен. Все из-за того, что год "затирается" в ноль, чего в 1С не может быть, и всете годом сбрасывается месяц в 1.
Нужно -ГОД(Дата), заменить на -(ГОД(Дата)-1), т.е.

	ВЫБОР
		КОГДА ГОД(&НачалоПериода) = ГОД(&КонецПериода)
			ТОГДА ДОБАВИТЬКДАТЕ(&ДатаРождения, ГОД, -(ГОД(&ДатаРождения)-1)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -(ГОД(&НачалоПериода)-1)) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -(ГОД(&КонецПериода)-1))
		КОГДА ГОД(&КонецПериода) - ГОД(&НачалоПериода) = 1
			ТОГДА ДОБАВИТЬКДАТЕ(&ДатаРождения, ГОД, -(ГОД(&ДатаРождения)-1)) МЕЖДУ ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, -(ГОД(&НачалоПериода)-1)) И ДАТАВРЕМЯ(1, 12, 31)
					ИЛИ ДОБАВИТЬКДАТЕ(&ДатаРождения, ГОД, -(ГОД(&ДатаРождения)-1)) МЕЖДУ ДАТАВРЕМЯ(1, 1, 1) И ДОБАВИТЬКДАТЕ(&КонецПериода, ГОД, -(ГОД(&КонецПериода)-1))
		ИНАЧЕ ИСТИНА
	КОНЕЦ
FatPanzer; +1 Ответить
22. FatPanzer 13.08.21 13:59 Сейчас в теме
(20) А, ну да, года 0 же не бывает. Я имел ввиду, что надо тупо убрать год (привести все даты к единому году), и анализировать только период в пределах заданных дат, или два периода за их пределами.
Спасибо за поправку.
18. Dимыч 13.08.21 12:17 Сейчас в теме
Добавлю свой вариант в копилку монструозных решений (((
ВЫБРАТЬ
	0 КАК Цифра
ПОМЕСТИТЬ ВТЦифры

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	9
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра КАК Дней
ПОМЕСТИТЬ ВТСписокДней
ИЗ
	ВТЦифры КАК Тысячи,
	ВТЦифры КАК Сотни,
	ВТЦифры КАК Десятки,
	ВТЦифры КАК Единицы
ГДЕ
	Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(&НачалоПериода, МЕСЯЦ, ВТСписокДней.Дней) КАК Период
ПОМЕСТИТЬ ВТПериоды
ИЗ
	ВТСписокДней КАК ВТСписокДней
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ФизическиеЛица.Ссылка КАК ФизЛицо,
	ФизическиеЛица.ДатаРождения КАК ДатаРождения,
	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, ГОД(ВТПериоды.Период) - 1), МЕСЯЦ, МЕСЯЦ(ФизическиеЛица.ДатаРождения) - 1), ДЕНЬ, ДЕНЬ(ФизическиеЛица.ДатаРождения) - 1) КАК ДеньРожденияВПериоде
ПОМЕСТИТЬ ВТДниРожденияВПериоде
ИЗ
	Справочник.ФизическиеЛица КАК ФизическиеЛица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды
		ПО (МЕСЯЦ(ВТПериоды.Период) = МЕСЯЦ(ФизическиеЛица.ДатаРождения))
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДниРожденияВПериоде.ФизЛицо КАК ФизЛицо,
	ВТДниРожденияВПериоде.ДатаРождения КАК ДатаРождения,
	ВТДниРожденияВПериоде.ДеньРожденияВПериоде КАК ДеньРожденияВПериоде
ИЗ
	ВТДниРожденияВПериоде КАК ВТДниРожденияВПериоде
ГДЕ
	ВТДниРожденияВПериоде.ДеньРожденияВПериоде МЕЖДУ &НачалоПериода И &КонецПериода
	
УПОРЯДОЧИТЬ ПО
	ДеньРожденияВПериоде
;

////////////////////////////////////////////////////////////­////////////////////
УНИЧТОЖИТЬ ВТЦифры
;

////////////////////////////////////////////////////////////­////////////////////
УНИЧТОЖИТЬ ВТСписокДней
;

////////////////////////////////////////////////////////////­////////////////////
УНИЧТОЖИТЬ ВТПериоды
;

////////////////////////////////////////////////////////////­////////////////////
УНИЧТОЖИТЬ ВТДниРожденияВПериоде
Показать
AlexDKam; +1 Ответить
21. Release 13.08.21 13:39 Сейчас в теме
(18) Легких путей мы не ищем. :)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот