1с скд запрос в остатки не попадают движения последней секунды

Обновлено: 06.07.2024

1С 8.1 (8.1.13.41).<br>Регистр накопления, вид регистра Остатки.<br>Измерение Клиент, ресурс Сумма, реквизитов нет.<br><br>Ситуация:<br>10.01.2009 23:59:59, приход, клиент А, 100 руб.<br><br>Запрос:<br>ВЫБРАТЬ<br> ДСОстатки.Клиент<br>ИЗ<br> РегистрНакопления.ДС.Остатки(&НаДату) КАК ДСОстатки<br>ГДЕ<br> BI_ДСОстатки.Клиент = &Клиент<br><br>Результаты выполения запроса:<br>НаДату 10.01.2009 23:59:59 = 0<br>НаДату 11.01.2009 00:00:00 = 100<br>_______________________________________<br><br>Приход ­ был последней секундой 10 янв., но 1С считает что приход был уже 11 янв. Как изменить запрос чтобы получить правильные результаты.<br><br>Очевидные решения вроде вычитания 1 секунды при проведении документа (если дата документа равна концу дня) или прибавление 1 секунды при построении запроса просьба не предлагать, ибо логически это неверно.

Так и делаю. Нужная дата - 10 января, т.к. нужны остатки на конец 10 января. Получаю 0, хотя ожидал получить 100.

"Запрос.УстановитьПараметр("НаДату", новый Граница(КонецДня(НужнаяДата),ВидГраницы.Включая));"

Всё получилось. Большое спасибо.

"Здравствуйте, возникла проблема при использовании границ в параметрах запроса.<br>Помогите, пожалуйста!<br>1С версия 8.2<br><br>В построителе запроса использую следующую конструкцию:<br><br>Построитель.Параметры.Вставить("начПериода", Новый Граница(НачалоДня(НачПериода), ВидГраницы.Включая));<br><br>Во время исполнения возникает ошибка:<br>************************* <br>: Ошибка при получении значения атрибута контекста (Результат)<br> Результат = Построитель.Результат;<br>по причине:<br><br>по причине:<br><(150, 56)>: Неверные параметры в операции сравнения. Нельзя сравнивать поля<br> неограниченной длины и поля несовместимых типов.<br>И ПродажиОбороты2.Регистратор.ДокументОснование.Дата <<?>>>= &начПериода<br>*************************<br><br>Т.о. 1с не дает сравнивать в запросе построителя дату с границей.<br>Пробовала в запросе использовать конструкцию . Дата МЕЖДУ <граница1> <граница2>, при выполнении 1с выдает ту же самую ошибку.<br>"

Всегда в параметры отчета на СКД в выражение для параметра &КонецПериода писал конструкцию:

Тут узнал, что запрос к виртуальной таблице остатков на &КонецПериода не отрабатывает документы, у которых время 23:59:59.

Сделал такую конструкцию:

началопериода(добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день")

Она мне не нравится - какая-то некрасивая. А значит, неправильная.
Как сделать нормальную отработку границы в отчете на СКД?

Посмотри 41 и 42 урок Гилева по СКД.
41 - тот же вариант, что и у тебя добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день").

Второй вариант - использовать регистр оборотов и остатков и в нем ввести параметр типа СтандартныйПериод, у него два свойства ДатаНачала и ДатаОкончания вроде. Вот в ДатаОкончания и будет храниться нужный тебе момент, так как он включает в себя все движения за последнюю секунду дня.

user1040665; inlimbo; mirco; Sergey_Borisovi4; idiked; mcgoblin; ivangrant; + 7 – Ответить (1) совершенно верное решение Вам подсказали, параметром может быть
1) Дата
2) МоментВремени
3) Граница
Так уж устроена эта "хитрая" 1С. Типа фишка такая, чтобы всем работа находилась (здесь могла бы быть улыбка) и стимулировались шарики и ролики. В общем, все подробности, как обычно, в СП, цены на который в последнее время существенно снижены. Мне кажется также, что
Граница = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
и
Граница = Новый Граница(КонецДня(Дата)+1, ВидГраницы.Исключая);
- это синонимы, если пространство МоментовВремени считать непрерывным, т.к. разница между этими двумя границами инфинитизимальна.
А может быть и нет))) Можно так
Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(Новый ПараметрКомпоновкиДанных("Период"));
Граница = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
Параметр.Значение = Граница;
Параметр.Использование = Истина; (2) kn, я так понимаю, это надо в отчете свою обработку компоновки делать? А тупо если создать отчет без формы без всего - только изменяя саму схему компоновки, можно работать с границами? Можно не создавать форму отчета, а программно задать параметр СКД Период как написано в (2) в модуле объекта(Отчета) в Процедуре ПриКомпановкеРезультата() началопериода(добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день")

А для чего в этой конструкции НачалоПериода()? КонецПериода(&КонецПериода, "День") вернет 23.59.59, добавив секунду получаем 00.00.00 следующего дня, получив НачалоПериода от 00.00.00 мы получим тоже самое.

"виртуальной таблице остатков" эта таблица предназначена для определения остатков до указанного времени. Не понимаю, зачем её использовать применительно к КонцуПериода. Тогда используйте другую виртуальную таблицу "ОстаткиИОбороты" и заполняйте к ней ПериодОкончания тем значением, которое вам нужно, или продолжайте в запросе пересчитывать КонецПериода добавлением к нему секунды.

Посмотри 41 и 42 урок Гилева по СКД.
41 - тот же вариант, что и у тебя добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день").

Второй вариант - использовать регистр оборотов и остатков и в нем ввести параметр типа СтандартныйПериод, у него два свойства ДатаНачала и ДатаОкончания вроде. Вот в ДатаОкончания и будет храниться нужный тебе момент, так как он включает в себя все движения за последнюю секунду дня.

user1040665; inlimbo; mirco; Sergey_Borisovi4; idiked; mcgoblin; ivangrant; + 7 – Ответить Ну и чем Вам так помог (8), если сами эквивалентное в вопросе написали? А вот (2) - реально Вас просвЯтил насчет границ. Конечно, граница в применении к Дате, а не МоментуВремени - это белиберда, спорить не буду. Вообще, можно было бы для этой трехэтажной конструкции придумать какое-нибудь красивое имя, вроде НачалоРаннегоУтраПрекрасногоЗавтрашнегоДняПрограммиста1С(Дата); (10) agrustny, думаю что правильно использование СтандартныйПериод вместо конструкций при компановке..

(11) AllexSoft, проверил - стандартный период не работает. Т.е. тоже не захватываются движения документов со временем 23:59:59.
(8) adamx, в результате эти способы оказались не верными, вам на заметку :)
(10) agrustny, вы правы, я был вынужден в конце концов остановиться на этом варианте. Моя "конструкция" оказалась не рабочей по той причине, что влияла на другие таблицы. "31.03.2013 23:59:59" она превращает в "01.04.2013 0:00:00", таблица остатков срабатывает верно, а вот "ДвиженияССубконто" начинают цеплять документы со временем "01.04.2013 0:00:00"

Дополнение периодов в системе компоновки данных

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

Для примера, рассмотрим отчет, который выводит остатки и обороты за указанный период.

Данные будем получать при помощи следующего запроса:

Для отчета будем использовать следующие настройки:


Т.е. в отчет будем выдавать группировку по периоду и диаграмму группировкой по периоду в сериях.

Если мы будем получать отчет с группировкой по периоду без дополнения, то результат отчета будет выглядеть следующим образом:


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

Попробуем воспользоваться дополнением периодов, для этого включим у поля группировки тип дополнения День.


Результат отчета с этой настройкой будет выглядеть следующим образом:


В данном результате видно, что остатки выдаются на все дни, даже если в эти дни не было движений.

При необходимости, для поля группировки можно указать интервал, в котором нужно дополнять периоды. Для этого следует ввести даты в колонки "Начальная дата периода" и "Конечная дата периода" поля группировки. При этом дополнение будет происходить не только в интервале дат, полученных из набора данных, но с начальной даты до конечной даты.

Для демонстрации этой возможности воспользуемся отчетом о продажах, в котором будем использовать следующий запрос:

Для примеров будем рассматривать вывод в отчет одной группировки по полю Период.

Результат отчета без дополнения будет выглядеть так:

Результат с дополнением по дням без указания интервала будет выглядеть так:

Т.е. дополнение произошло в интервале, дат, которые были получены из набора данных.

Если у поля группировки установить начальную и конечную дату периода следующим образом:


То дополнение по дням произойдет в указанном интервале и результат отчета будет выглядеть так:

Отметим, что в качестве начальных и конечных дат периода можно использовать не только даты, но и перечисление ТипДополненияПериодаКомпоновкиДанных, а также поле компоновки данных. Для выбора типа следует очистить содержимое поля и воспользоваться кнопкой выбора типа.


Если в качестве начальной и/или конечной дат периода используется поле, то дополнение будет осуществляться до даты, полученной из этого поля. Заметим, что в качестве полей, значение которых будет использоваться для указания начальной или конечной даты периода, можно использовать только поля - параметры и поля отчета - владельца (в случае если дополнение происходит во вложенном отчете). Для примера, воспользуемся в качестве начальной даты полем - параметром - начало периода, а в качестве конечной даты - параметром - конец периода. При этом результат будет дополняться в том периоде, который указан в параметрах данных отчета.


Как видно в данном примере, дополнение произошло в интервале, указанном в параметрах данных.

Если в качестве границы интервала используется тип ТипДополненияПериодаКомпоновкиДанных, то дополнение будет осуществляться до ближайшей границы выбранного типа периода. Так, если в качестве начальной и конечной дат периода выбрать Месяц, то дополнение будет осуществляться с начала месяца первой даты, присутствующей в группировке и до конца месяца последней даты, присутствующей в группировке. Если выбрать в качестве границ выбрать значение Неделя, то периоды будут дополняться с начала недели и до конца недели. Другие типы дополнения отрабатываются аналогично.


Данная возможность особенно полезна для создания отчетов, в которых группировка по периоду вложена в группировку по объемлющему периоду.

Рассмотрим следующую настройку:


В отчет будут выдаваться периоды, сгруппированные по месяцам.

Если для группировки по периоду установить в качестве начальной и конечной даты конкретные даты, то дополнение произойдет в рамках указанного периода, т.е. в отчет выведутся периоды, которые вовсе не находятся в текущей группировке по месяцам.

При дополнении в периоде 01.01.2002 - 31.03.2002 результат может выглядеть следующим образом:

Как видно, группировка по периоду была дополнена в указанном интервале, и в результат попали строки, которые вовсе не относятся к месяцу группировки.

Для того, чтобы в рамках группировки по месяцу дополнение группировки - период происходило только в интервале этого месяца, укажем в качестве начальной и конечной дат дополнения периода тип дополнения периода - Месяц.

Результат будет выглядеть так:

Как видно, дополнение внутри группировки по месяцу произошло только в рамках месяца, что и требовалось.

В качестве примера выбран регистр "Расчеты с клиентами" (Управление торговлей 11, в.11.1.2). Необходимо вывести корректные конечные остатки по этому регистру на конец каждого месяца, причем даже если не было движений в течение определенного месяца. Задача "в лоб" не решается (можете проверить) - указав в качестве периода отчета, например, текущий год и выбрав в отборе клиента, у которого нет движений за этот год, но есть начальный остаток, мы увидим только первый и последний месяцы с корректным конечным остатком, остальные месяцы "провалились":


В инете можно найти рекомендации, как добиться желаемого.

Первое - помимо исходной таблицы остатков (не остатки и обороты, поскольку в данном случае меня интересуют только конечные остатки) надо добавить таблицу со всеми датами. Т.е., если меня интересует этот год, то надо получить список дат на конец каждого месяца этого года - 31 января 23:59:59, 28 февраля 23:59:59 . 31 декабря 23:59:59. Данная таблица с датами соединяется (НЕ объединяется) с основной таблицей (ИсходныеДанные).


В основной таблице добавляем реквизит &Период (у меня это Месяц) как на рисунке, не забываем его же вставить в параметры виртуальной таблицы. Соответственно, для вывода отчета "Период" (он же "Месяц") - это Измерение,


а для связи 2-х таблиц - это Параметр:


Здесь все "переменные" названы по-разному, чтобы не запутаться прежде всего самому, что к чему относится. Также обратите внимание, что здесь ВАЖЕН порядок связи: сначала таблица с датами, потом таблица с исходными данными (не забываем - в СКД связь на данной закладке ЛЕВАЯ).

ЗЫ. Ради интереса проверьте, что будет, если их переставить местами.

Окончательный вариант дает именно то, чего и добивались:


PS. Спасибо Мисте за код запроса, собирающего даты.

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

Читайте также: