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

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  
 

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

См. также

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

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

14.05.2025    3299    DeerCven    8    

44

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

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

21.05.2024    40507    dimanich70    83    

157

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

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

1 стартмани

18.03.2024    5986    6    John_d    11    

57

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

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

12.02.2024    48310    atdonya    30    

65

Универсальные функции Программист 1С v8.3 Бесплатно (free)

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

30.11.2023    7746    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    20855    YA_418728146    8    

174

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    6092    92    progmaster    17    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 03.01.13 11:34 Сейчас в теме
Ну и хрень! :) Чеслово, но забавная!
2. akomar 458 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 25 15.05.13 16:52 Сейчас в теме
а неделя месяца как будет?
9. INTECH1 390 15.05.13 17:01 Сейчас в теме
(8) mchammer4, Неделя(Дата) - Неделя(НачалоПериода(Дата, Месяц)), как-то так
10. NAKIS 5 18.12.13 17:21 Сейчас в теме
Чем только люди не занимаются, чтобы не работать (с)
Интересная статья - может и пригодиться) Надо взять на заметку))
Для отправки сообщения требуется регистрация/авторизация