Номер дня недели в месяце

03.01.13

Разработка - Универсальные функции

В продолжение темы "Добавить к дате рабочие дни в запросе" (http://infostart.ru/public/166349/) - у клиента была самописная конфигурация, в которой график посещения торговой точки указывался в виде дней недели (например, вторник и пятница), а нужно было сделать так, чтобы указывался ещё и номер этого дня в месяце (например, третий четверг).

Бывает в самописных конфигурациях делают некое расписание, например, посещения торговых точек. Простейшим расписанием может быть, например, указание дня недели и какого-то ещё номера - номера недели в месяце или номера дня недели в месяце.

Первый вариант реализуется в запросе на проверку попадания торговой точки в расписание очень просто - решается формулой типа НЕДЕЛЯ(ТекущаяДата) - НЕДЕЛЯ(НАЧАЛОПЕРИОДА(ТекущаяДата, МЕСЯЦ)) + 1. Тогда описание расписания будет типа "понедельник первой недели и пятница третей недели". Но на слух, без просмотра календаря, такое расписание воспринимается не очень хорошо - например, первая неделя января начинается со вторника, т.е. понедельника в ней просто нет, а всего недель в месяце может быть аж 6, при этом в двух неделях будет по одному и по два дня. Такое решение просто будет путать пользователя.

Более понятно будет, если указать номер дня недели в месяце, тогда расписание будет звучать типа "первый понедельник и третья пятница". Вот для этого случая написал запрос. Собственно, цели статьи: 1. не ломать голову над этой задачей другому, 2. может быть кто-то предложит более красивое решение. 

В запрос добавлена таблица с названиями дней недели. Параметр &Дата1 должен начинаться с начала месяца. 

 

ВЫБРАТЬ
	"Понедельник" КАК Название,
	1 КАК Номер
ПОМЕСТИТЬ НазванияДней

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Вторник",
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Среда",
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Четверг",
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Пятница",
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Суббота",
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Воскресенье",
	7
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Календарь.ДатаКалендаря КАК Дата,
	ДЕНЬНЕДЕЛИ(Календарь.ДатаКалендаря) КАК ДеньНедели,
	НазванияДней.Название,
	СУММА(1) КАК НомерДняВМесяце
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь1
		ПО (Календарь.ДатаКалендаря МЕЖДУ &Дата1 И &Дата2)
			И (Календарь1.ДатаКалендаря МЕЖДУ &Дата1 И &Дата2)
			И (ДЕНЬНЕДЕЛИ(Календарь.ДатаКалендаря) = ДЕНЬНЕДЕЛИ(Календарь1.ДатаКалендаря))
			И Календарь.ДатаКалендаря >= Календарь1.ДатаКалендаря
			И (НАЧАЛОПЕРИОДА(Календарь.ДатаКалендаря, МЕСЯЦ) = НАЧАЛОПЕРИОДА(Календарь1.ДатаКалендаря, МЕСЯЦ))
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазванияДней КАК НазванияДней
		ПО (ДЕНЬНЕДЕЛИ(Календарь.ДатаКалендаря) = НазванияДней.Номер)

СГРУППИРОВАТЬ ПО
	Календарь.ДатаКалендаря,
	НазванияДней.Название

УПОРЯДОЧИТЬ ПО
	Дата
 
 
Ну и кусок результата:
 
       
Дата ДеньНедели Название НомерДняВМесяце  
01.12.2012 6 Суббота 1  
02.12.2012 7 Воскресенье 1  
03.12.2012 1 Понедельник 1  
04.12.2012 2 Вторник 1  
05.12.2012 3 Среда 1  
06.12.2012 4 Четверг 1  
07.12.2012 5 Пятница 1  
08.12.2012 6 Суббота 2  
09.12.2012 7 Воскресенье 2  
10.12.2012 1 Понедельник 2  
11.12.2012 2 Вторник 2  
12.12.2012 3 Среда 2  
13.12.2012 4 Четверг 2  
14.12.2012 5 Пятница 2  
15.12.2012 6 Суббота 3  
16.12.2012 7 Воскресенье 3  
17.12.2012 1 Понедельник 3  
18.12.2012 2 Вторник 3  
19.12.2012 3 Среда 3  
20.12.2012 4 Четверг 3  
21.12.2012 5 Пятница 3  
22.12.2012 6 Суббота 4  
23.12.2012 7 Воскресенье 4  
 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3767    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    7075    DeerCven    15    

60

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    50833    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7484    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    64225    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9361    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 03.01.13 11:34 Сейчас в теме
Ну и хрень! :) Чеслово, но забавная!
2. akomar 461 03.01.13 12:56 Сейчас в теме
Номер недели в месяце, или день недели, чтото я запутался.
5. INTECH1 390 04.01.13 10:37 Сейчас в теме
(2) akomar, привет, ну если вкратце - говорим типа "третий вторник месяца" - вот и нужно узнать, какой это вторник по некой дате.
3. Hany 03.01.13 17:28 Сейчас в теме
ОПА! Классная задачка! Спасибо! Встряхнула в сонные дни новогодних праздников...

Посоревнуемся?:)

У меня запрос меньше:)

ВЫБРАТЬ
	Календарь.ДатаКалендаря КАК Дата,
	(ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Календарь.ДатаКалендаря, МЕСЯЦ), Календарь.ДатаКалендаря, ДЕНЬ) + 1) / 7 - 0.6 КАК ЧИСЛО(15, 0))) + 1 КАК НомерДняВМесяце,
	ДЕНЬНЕДЕЛИ(Календарь.ДатаКалендаря) КАК ДеньНедели
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь

ГДЕ
	Календарь.ДатаКалендаря МЕЖДУ &Дата1 И &Дата2

УПОРЯДОЧИТЬ ПО
	Дата
Показать


П.С. Названия дней недели я не выводила для наглядности, и так ясно, что для этого, как у вас нужно соединить с вашей временной таблицей "НазванияДней" по полю ДеньНедели.
Акент делаю на вычисление поля НомерДняВМесяце без внутренних соединений.
user774630; Serj1C; +2 Ответить
6. INTECH1 390 04.01.13 19:39 Сейчас в теме
(3) Hany, в общем, пользуясь вашей идеей, наверное, окончательный вариант будет:
ВЫБРАТЬ
Календарь.ДатаКалендаря КАК Дата,
ВЫРАЗИТЬ(ДЕНЬ(Календарь.ДатаКалендаря) / 7 + 0.4 КАК ЧИСЛО(15, 0)) КАК НомерДняВМесяце,
ДЕНЬНЕДЕЛИ(Календарь.ДатаКалендаря) КАК ДеньНедели
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
Календарь.ДатаКалендаря МЕЖДУ &Дата1 И &Дата2

УПОРЯДОЧИТЬ ПО
Дата
user774630; Hany; +2 Ответить
4. INTECH1 390 04.01.13 10:33 Сейчас в теме
Hany, да, здорово, победила!!! Хорошо, что выложил задачку, не подумал бы её по другому решать.
7. Boroda 90 18.01.13 11:00 Сейчас в теме
Спасибо! Интересно! Думаю, в работе пригодится....
8. mchammer4 245 15.05.13 16:52 Сейчас в теме
а неделя месяца как будет?
9. INTECH1 390 15.05.13 17:01 Сейчас в теме
(8) mchammer4, Неделя(Дата) - Неделя(НачалоПериода(Дата, Месяц)), как-то так
10. NAKIS 5 18.12.13 17:21 Сейчас в теме
Чем только люди не занимаются, чтобы не работать (с)
Интересная статья - может и пригодиться) Надо взять на заметку))
Для отправки сообщения требуется регистрация/авторизация