gifts2017

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

Опубликовал Дмитрий К (ll13) в раздел Программирование - Практика программирования

В этой статье рассмотрены некоторые особенности настройки периода при использовании Системы Компоновки Данных (СКД), проблемы которые возникают из-за различия в понятии периода между рядовым пользователем и системой 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 8
.rar 2,63Kb
16.06.15
8
.rar 2,63Kb Скачать

См. также

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

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

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

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

ЕСЛИ Пользователь ИДИОТ ТОГДА //и ставит значение ДатаНач больше ДатаКон
ему пора подумать о смене профессии
ИНАЧЕ
Пользователь не зря получает зар. плату
КОНЕЦЕСЛИ;
Прикрепленные файлы:
15. Дмитрий К (ll13) 10.01.12 10:52
(14)Прочитай статью 15 раз, особенно её вступительную часть, которая касается восприятия информации пользователями ...
16. Вячеслав (Borunmeert) 07.02.14 13:09
Не работает условие, что то не то!
SashaSashaSashka; gorin; pass_developer; +3 Ответить
17. Игорь Фелькер (Brawler) 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) 09.07.15 12:41
Та же ерунда, 8.3.5.1482, когда очищаю дату начала - вылетает ошибка:
Ошибка исполнения отчета
по причине:
Параметр не найден "Период.ДатаНачала"
19. Анянов Михаил (insurgut) 09.07.15 12:46
Что-то вообще тут ничего не работает, дата окончания пустая - а все равно конец 3999 года не берется...
20. Анянов Михаил (insurgut) 09.07.15 13:19
Непонятно, за что плюсы понаставили. Чтобы работало, необходимо условие по дате в фигурные скобки взять просто и никаких условий на дату начала и окончания не устанавливать прото...

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


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

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

Причем не заполняется параметр с выражением "&СтандартныйПериод.ДатаОкончания", а параметр с выражением "&СтандартныйПериод.ДатаОкончания" заполняется исправно
23. Анянов Михаил (insurgut) 24.10.15 07:52
(22) RomanRomans, платформа тут ни при чем, прочтите мой комментарий
24. V М (killstrike) 15.01.16 13:02
То есть скопипастил (источник хоть указал и то дело), а здесь выложил за 2 sm? Однако.