Проблемы со взятием остатков на конец периода в отчете на СКД
Всегда в параметры отчета на СКД в выражение для параметра &КонецПериода писал конструкцию:
КонецПериода(&КонецПериода, "ДЕНЬ")
Тут узнал, что запрос к виртуальной таблице остатков на &КонецПериода не отрабатывает документы, у которых время 23:59:59.
Сделал такую конструкцию:
началопериода(добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день")
Она мне не нравится - какая-то некрасивая. А значит, неправильная.
Как сделать нормальную отработку границы в отчете на СКД?
КонецПериода(&КонецПериода, "ДЕНЬ")
Тут узнал, что запрос к виртуальной таблице остатков на &КонецПериода не отрабатывает документы, у которых время 23:59:59.
Сделал такую конструкцию:
началопериода(добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день")
Она мне не нравится - какая-то некрасивая. А значит, неправильная.
Как сделать нормальную отработку границы в отчете на СКД?
По теме из базы знаний
- Способы распределения затрат - прямой, пошаговый и с помощью СЛАУ
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Управляемая консоль отчетов – новый функциональный инструмент для работы с запросами и СКД в управляемых формах
- Отчеты по остаткам и движению денежных средств для 1С:Бухгалтерии
- Отчеты по расчетам с контрагентами для 1С:Бухгалтерии
Найденные решения
Посмотри 41 и 42 урок Гилева по СКД.
41 - тот же вариант, что и у тебя добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день").
Второй вариант - использовать регистр оборотов и остатков и в нем ввести параметр типа СтандартныйПериод, у него два свойства ДатаНачала и ДатаОкончания вроде. Вот в ДатаОкончания и будет храниться нужный тебе момент, так как он включает в себя все движения за последнюю секунду дня.
41 - тот же вариант, что и у тебя добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день").
Второй вариант - использовать регистр оборотов и остатков и в нем ввести параметр типа СтандартныйПериод, у него два свойства ДатаНачала и ДатаОкончания вроде. Вот в ДатаОкончания и будет храниться нужный тебе момент, так как он включает в себя все движения за последнюю секунду дня.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) совершенно верное решение Вам подсказали, параметром может быть
1) Дата
2) МоментВремени
3) Граница
Так уж устроена эта "хитрая" 1С. Типа фишка такая, чтобы всем работа находилась (здесь могла бы быть улыбка) и стимулировались шарики и ролики. В общем, все подробности, как обычно, в СП, цены на который в последнее время существенно снижены. Мне кажется также, что
Граница = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
и
Граница = Новый Граница(КонецДня(Дата)+1, ВидГраницы.Исключая);
- это синонимы, если пространство МоментовВремени считать непрерывным, т.к. разница между этими двумя границами инфинитизимальна.
А может быть и нет)))
1) Дата
2) МоментВремени
3) Граница
Так уж устроена эта "хитрая" 1С. Типа фишка такая, чтобы всем работа находилась (здесь могла бы быть улыбка) и стимулировались шарики и ролики. В общем, все подробности, как обычно, в СП, цены на который в последнее время существенно снижены. Мне кажется также, что
Граница = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
и
Граница = Новый Граница(КонецДня(Дата)+1, ВидГраницы.Исключая);
- это синонимы, если пространство МоментовВремени считать непрерывным, т.к. разница между этими двумя границами инфинитизимальна.
А может быть и нет)))
Можно так
Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(Новый ПараметрКомпоновкиДанных("Период"));
Граница = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
Параметр.Значение = Граница;
Параметр.Использование = Истина;
Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(Новый ПараметрКомпоновкиДанных("Период"));
Граница = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
Параметр.Значение = Граница;
Параметр.Использование = Истина;
началопериода(добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день")
А для чего в этой конструкции НачалоПериода()? КонецПериода(&КонецПериода, "День") вернет 23.59.59, добавив секунду получаем 00.00.00 следующего дня, получив НачалоПериода от 00.00.00 мы получим тоже самое.
"виртуальной таблице остатков" эта таблица предназначена для определения остатков до указанного времени. Не понимаю, зачем её использовать применительно к КонцуПериода. Тогда используйте другую виртуальную таблицу "ОстаткиИОбороты" и заполняйте к ней ПериодОкончания тем значением, которое вам нужно, или продолжайте в запросе пересчитывать КонецПериода добавлением к нему секунды.
Посмотри 41 и 42 урок Гилева по СКД.
41 - тот же вариант, что и у тебя добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день").
Второй вариант - использовать регистр оборотов и остатков и в нем ввести параметр типа СтандартныйПериод, у него два свойства ДатаНачала и ДатаОкончания вроде. Вот в ДатаОкончания и будет храниться нужный тебе момент, так как он включает в себя все движения за последнюю секунду дня.
41 - тот же вариант, что и у тебя добавитькдате(КонецПериода(&КонецПериода, "ДЕНЬ"), "секунда", 1), "день").
Второй вариант - использовать регистр оборотов и остатков и в нем ввести параметр типа СтандартныйПериод, у него два свойства ДатаНачала и ДатаОкончания вроде. Вот в ДатаОкончания и будет храниться нужный тебе момент, так как он включает в себя все движения за последнюю секунду дня.
Ну и чем Вам так помог (8), если сами эквивалентное в вопросе написали? А вот (2) - реально Вас просвЯтил насчет границ. Конечно, граница в применении к Дате, а не МоментуВремени - это белиберда, спорить не буду. Вообще, можно было бы для этой трехэтажной конструкции придумать какое-нибудь красивое имя, вроде НачалоРаннегоУтраПрекрасногоЗавтрашнегоДняПрограммиста1С(Дата);
(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"
Итого, мой рабочий вариант:
(8) adamx, в результате эти способы оказались не верными, вам на заметку :)
(10) agrustny, вы правы, я был вынужден в конце концов остановиться на этом варианте. Моя "конструкция" оказалась не рабочей по той причине, что влияла на другие таблицы. "31.03.2013 23:59:59" она превращает в "01.04.2013 0:00:00", таблица остатков срабатывает верно, а вот "ДвиженияССубконто" начинают цеплять документы со временем "01.04.2013 0:00:00"
Итого, мой рабочий вариант:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ПараметрКонецПериодаД = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериодаД"));
ПараметрКонецПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
Если ПараметрКонецПериодаД <> Неопределено
И ПараметрКонецПериода <> Неопределено Тогда
ПараметрКонецПериода.Значение =
Новый Граница(КонецДня(ПараметрКонецПериодаД.Значение.Дата), ВидГраницы.Включая);
КонецЕсли;
КонецПроцедуры
Показать
(12) Kutuzov,
Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине:
{ВнешнийОтчет.tДвижение_10_90.МодульОбъекта(8)}: Поле объекта не обнаружено (Дата)
ПараметрКонецПериода.Значение = Новый Граница(КонецДня(ПараметрКонецПериода.Значение.Дата), ВидГраницы.Включая);
ПараметрКонецПериода.Значение = Новый Граница(КонецДня(ПараметрКонецПериода.Значение.Дата), ВидГраницы.Включая);
Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине:
{ВнешнийОтчет.tДвижение_10_90.МодульОбъекта(8)}: Поле объекта не обнаружено (Дата)
ПараметрКонецПериода.Значение = Новый Граница(КонецДня(ПараметрКонецПериода.Значение.Дата), ВидГраницы.Включая);
:))
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ПараметрКонецПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
Если ТипЗнч(ПараметрКонецПериода.Значение) = Тип("СтандартнаяДатаНачала") Тогда
ПараметрКонецПериода.Значение = Новый Граница(КонецДня(ПараметрКонецПериода.Значение.Дата), ВидГраницы.Включая);
КонецЕсли;
КонецПроцедуры
Использование виртуальной таблицы Остатки в СКД проблематично из-за того что нет возможности нормально установить границу периода. Используйте в СКД ОстаткиИОбороты с настройкой метода дополнения "ДвиженияИГраницыПериода".
Если у вас типовая, то в Параметрах СКД добавляем параметр (пусть у него будет имя ПериодГраница), с типом дата. В выражении прописываем так КомпоновкаДанныхСервер.ГраницаПериода(КОНЕЦПЕРИОДА(&Период.ДатаОкончания, "ДЕНЬ"), "Включая"), и потом указываем его использование в запросе где получение остатков. (в этом примере &Период - имеет тип СтандартныйПериод)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот