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

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 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20242    dimanich70    81    

145

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

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

1 стартмани

18.03.2024    4100    3    John_d    11    

57

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

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

12.02.2024    18205    atdonya    24    

57

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

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

30.11.2023    5511    ke.92@mail.ru    16    

65

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

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

28.08.2023    14777    YA_418728146    7    

166

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

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

2 стартмани

22.08.2023    3594    57    progmaster    8    

4

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

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18499    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 03.01.13 11:34 Сейчас в теме
Ну и хрень! :) Чеслово, но забавная!
2. akomar 458 03.01.13 12:56 Сейчас в теме
Номер недели в месяце, или день недели, чтото я запутался.
5. INTECH1 381 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 381 04.01.13 19:39 Сейчас в теме
(3) Hany, в общем, пользуясь вашей идеей, наверное, окончательный вариант будет:
ВЫБРАТЬ
Календарь.ДатаКалендаря КАК Дата,
ВЫРАЗИТЬ(ДЕНЬ(Календарь.ДатаКалендаря) / 7 + 0.4 КАК ЧИСЛО(15, 0)) КАК НомерДняВМесяце,
ДЕНЬНЕДЕЛИ(Календарь.ДатаКалендаря) КАК ДеньНедели
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
Календарь.ДатаКалендаря МЕЖДУ &Дата1 И &Дата2

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