IE2017

Некоторые особенности настройки периода в СКД

Программирование - Практика программирования

В этой статье рассмотрены некоторые особенности настройки периода при использовании Системы Компоновки Данных (СКД), проблемы которые возникают из-за различия в понятии периода между рядовым пользователем и системой 1С, а так же предложены пути их решения.

 

Некоторые особенности настройки периода в СКД.

Большинство отчетов, которые разрабатываются при помощи Системы компоновки Данных (СКД) требуют от пользователя ввода периода, за который будет построен отчет.

Как правило, в СКД ввод периода организован через параметры, с помощью следующей конструкции см. Рис.1 Этот способ ввода периода считается "классическим", он описан в статье на ИТС и другой литературе, посвященной разработке в 1С, поэтому возьмём его за основу. Рассмотрим в качестве примера простой запрос, получающий все документы РеализацияТоваровУслуг за заданный период см. Рис.2

 

При использовании этого отчета пользователь задает период через параметры см. Рис.3 Вроде бы все корректно…, НО есть маленькая проблема:

Все дело в том, что подавляющее большинство пользователей «понимают» период не так как его «понимает» 1С, примеры:

1).  Рассмотрим Рис.3

С точки зрения пользователя период не задан, то есть НЕ ОГРАНИЧЕН, то есть в отчет должны попасть ВСЕ документы без ограничения по дате.

«С точки зрения» системы 1С параметр-период задан и … обе его границы равны 01.01.0001 и в отчет, попадут только документы с пустой датой, что на практике означает, не попадет ни одного документа.

2). Рассмотрим Рис. 4

С точки зрения пользователя в отчет должны попасть все документы начиная с даты 28.01.2010.

«С точки зрения» 1С период  28.01.2010 – 01.01.0001 вызовет исключение.

Можно конечно попытаться объяснить пользователю, почему отчет не выводит те документы, которые он ожидает увидеть и как период представляется с "точки зрения" 1С, но неблагодарное это дело, да и неправильное. Хорошая программа должна быть, прежде всего, удобна пользователю, потому как программа существует для пользователя, а не наоборот, посему придется «научить» 1С понимать период так как его понимает пользователь, а именно:

1). НачалоПериода и ОкончаниеПериода не заданы -> все документы.

2). Задано только НачалоПериода –> все документы начиная с НачалаПериода

3). Кроме того будем проверять что бы ОкончаниеПериода >= НачалоПериода, и если это не выполняется то будем считать что ОкончаниеПериода не задано, т.е. 2).

Исходя из всего вышесказанного выражение для параметра ДатаОкончания :

 

ВЫБОР

  КОГДА &Период.ДатаОкончания=ДАТАВРЕМЯ(1,1,1)

    ТОГДА ДАТАВРЕМЯ(3999,12,31) ДАТАВРЕМЯ(3999,12,31,23,59,59)

  ИНАЧЕ

    ВЫБОР

      КОГДА &Период.ДатаОкончания<&Период.ДатаНачала

         ТОГДА ДАТАВРЕМЯ(3999,12,31) ДАТАВРЕМЯ(3999,12,31,23,59,59)

      ИНАЧЕ

         &Период.ДатаОкончания

    КОНЕЦ

КОНЕЦ

Окончательный вид нашей конструкции выбора периода представлен на Рис.5

 

Источник: http://www.obrabotki.com/1s-period-skd/

Скачать файлы

Наименование Файл Версия Размер
SKD_Period_1s.rar
.rar 2,63Kb
16.06.15
11
.rar 2,63Kb 11 Скачать

См. также

Комментарии
1. Алексей (alex_art) 14 28.01.10 19:33 Сейчас в теме
хорошая мысль .... вы думаете СКД дольше 4000-х тясячного года не протянет ? :))))
2. Дмитрий К (ll13) 740 28.01.10 21:20 Сейчас в теме
(1) Я оптимист и конечно же уверен, что СКД протянет дольше 4000-х тясячного года, да вот беда - максимальная дата которую возвращает функция ДАТАВРЕМЯ - это 31.12.3999 :(
то есть ДАТАВРЕМЯ(3999,12,31) вернет 31.12.3999, а вот ДАТАВРЕМЯ(4000,1,1) - уже вызовет ошибку :)
SunShinne; +1 Ответить
3. Владислав Рожевский (vvr908) 364 29.01.10 00:11 Сейчас в теме
Спасибо, четко и по делу. Удобно сделать все это в рамках СКД и не заморачиваться на переделку периода в форме отчета.
4. marta (rostova.it@gmail.com) 03.02.10 14:31 Сейчас в теме
и на какой ерунде люди только плюсы не рубят....
DmitrySinichnikov; Герасим; kuzyara; Spacer; +4 Ответить
5. Евгения Тихомирова (e-tixom) 84 04.02.10 14:31 Сейчас в теме
Не плохо было бы еще научить 1С понимать, что время окончания периода это 23:59:59, а не 00:00:00.
6. Дмитрий К (ll13) 740 04.02.10 14:47 Сейчас в теме
(5) В СКД, при использовании типа СтандартныйПериод,
ДатаНачала - имеет время 00:00:00, а ДатаОкончания - 23:59:59
Учите матчасть :D
7. Евгения Тихомирова (e-tixom) 84 04.02.10 15:34 Сейчас в теме
(6)Да уж понятно, что речь идет не о стандартном периоде, не тормозите!
8. Дмитрий К (ll13) 740 04.02.10 16:03 Сейчас в теме
(7) А..., Вас наверное смущает ДАТАВРЕМЯ(3999,12,31) ?
Если вы столь щепетильны используйте ДАТАВРЕМЯ(3999,12,31,23,59,59) или КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(3999,12,31), "ДЕНЬ"))
9. Евгения Тихомирова (e-tixom) 84 05.02.10 08:24 Сейчас в теме
(8) Спасибо, что подсказали!. А смущает не меня, а пользователя, мы ведь собственно для них делаем. :D
10. Алексей Панков (Hron) 19.02.10 20:17 Сейчас в теме
Спасибо, очень полезная вещь, теперь не будут смущать пустые отчеты при не указанном периоде ;)
11. Андрей Д. (detec) 128 20.03.10 00:22 Сейчас в теме
Что мешает программисту в закладке "Параметры" указать какое-нибудь значение стандартного периода? Например, прошлый месяц? Оно потом подставляется у пользователя в режиме Предприятие.

Лично я всегда прописываю дату начала как НАЧАЛОПЕРИОДА(&Период.ДатаНачала, "ДЕНЬ"), и по аналогии - дату конца.
12. Дмитрий К (ll13) 740 20.03.10 00:39 Сейчас в теме
А что мешает программисту НЕ указывать "какое-нибудь значение стандартного периода? Например, прошлый месяц? " что бы оно потом НЕ подставлялось у пользователя в режиме Предприятие ?
13. Артур Аюханов (artbear) 877 09.10.10 11:08 Сейчас в теме
(0) Что исправил в статье?
14. Сергей (sant78) 09.01.12 12:51 Сейчас в теме
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.Дата КАК Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
{ГДЕ
(РеализацияТоваровУслуг.Дата >= &ДатаНач),
(РеализацияТоваровУслуг.Дата <= &ДатаКон)}

УПОРЯДОЧИТЬ ПО
Дата,
Ссылка

Это текст запроса, без всяких заморочек.

ЕСЛИ Пользователь ИДИОТ ТОГДА //и ставит значение ДатаНач больше ДатаКон
ему пора подумать о смене профессии
ИНАЧЕ
Пользователь не зря получает зар. плату
КОНЕЦЕСЛИ;
Прикрепленные файлы:
15. Дмитрий К (ll13) 740 10.01.12 10:52 Сейчас в теме
(14)Прочитай статью 15 раз, особенно её вступительную часть, которая касается восприятия информации пользователями ...
16. Вячеслав Першин (Borunmeert) 8 07.02.14 13:09 Сейчас в теме
Не работает условие, что то не то!
SashaSashaSashka; gorin; pass_developer; +3 Ответить
17. Игорь Фелькер (Brawler) 314 29.06.15 10:57 Сейчас в теме
Сегодня словил ситуевину на 8.3.6.2076, может и раньше было не знаю, никто не жаловался ибо пока только к 8.3.6 готовлюсь, перелопачивают вешние обработки чтобы работали под БСП 2.3.1.

в общем есть простой отчет на СКД, параметры заданы как на первом фото этой публикации, и не пашет)))
на 8.3.5 пашет, а на 8.3.6.2076 нет)) с потугами качаю 8.3.6.2100 (инет еле жив), может 1С исправили это дело, а пока наблюдаю сообщение "Не установлено значение параметра "Начало периода""
18. Анянов Михаил (insurgut) 164 09.07.15 12:41 Сейчас в теме
Та же ерунда, 8.3.5.1482, когда очищаю дату начала - вылетает ошибка:
Ошибка исполнения отчета
по причине:
Параметр не найден "Период.ДатаНачала"
19. Анянов Михаил (insurgut) 164 09.07.15 12:46 Сейчас в теме
Что-то вообще тут ничего не работает, дата окончания пустая - а все равно конец 3999 года не берется...
20. Анянов Михаил (insurgut) 164 09.07.15 13:19 Сейчас в теме
Непонятно, за что плюсы понаставили. Чтобы работало, необходимо условие по дате в фигурные скобки взять просто и никаких условий на дату начала и окончания не устанавливать прото...

Пример запроса СКД:
ВЫБРАТЬ
	ЧекККМСкидки.СкидкаНаценка,
	ЧекККМСкидки.Ссылка,
	ЧекККМСкидки.Сумма
ИЗ
	Документ.ЧекККМ.Скидки КАК ЧекККМСкидки
{ГДЕ
	(ЧекККМСкидки.Ссылка.Дата >= &ДатаНачала),
	(ЧекККМСкидки.Ссылка.Дата <= &ДатаОкончания)}
...Показать Скрыть


В параметрах ДатаНачала = &Период.ДатаНачала, а ДатаОкончания = &Период.ДатаОкончания (обращаю внимание, что никаких КонецПериода использовать не надо при использовании стандартного периода).

Все просто и никаких заморочек.
lemilk; nick_krsk; SuhoffGV; kostyaomsk; okulus; Spacer; ShootNICK; Craig; +8 Ответить 1
21. Айрат (Craig) 179 16.08.15 16:39 Сейчас в теме
(20) insurgut, А вот за пояснение для чего нужны {} скобки отдельное спасибо!!!
22. Роман Зиборов (RomanRomans) 24.10.15 00:05 Сейчас в теме
(17) Brawler, пробовал на 8.3.6.2299 - тот же результат 'Не установлено значение параметра "Конец периода" '.

Причем не заполняется параметр с выражением "&СтандартныйПериод.ДатаОкончания", а параметр с выражением "&СтандартныйПериод.ДатаОкончания" заполняется исправно
23. Анянов Михаил (insurgut) 164 24.10.15 07:52 Сейчас в теме
(22) RomanRomans, платформа тут ни при чем, прочтите мой комментарий
24. V М (killstrike) 15.01.16 13:02 Сейчас в теме
То есть скопипастил (источник хоть указал и то дело), а здесь выложил за 2 sm? Однако.
25. Максим *** (premier) 136 31.01.17 15:02 Сейчас в теме
(0) 3). "Кроме того будем проверять что бы ОкончаниеПериода >= НачалоПериода, и если это не выполняется то будем считать что ОкончаниеПериода не задано, т.е. 2)."

И что получится? Пользователь захотел сформировать отчет за определенный период позапрошлого года, ошибся в дате окончания (установил меньше даты начала) и сидит, ждёт пока его отчет сформируется за период с позапрошлого года по текущую дату. Безо всяких предупреждений со стороны программы. Тоже, как мне кажется, "неблагодарное это дело, да и неправильное". В СКД есть флаг запрета незаполненных значений, на некорректно заданный период тоже выводится ошибка формирования, так что пару-тройку раз пользователь ошибку "словит", и в дальнейшем уже будет очень внимательно подходить к заполнению параметров отчета.
Оставьте свое сообщение