При разработке отчетов на базе Системы Компоновки Данных (СКД) часто возникает задача корректного получения остатков на конкретный момент времени. Неверная настройка параметров может приводить к расхождениям данных с типовыми отчетами, такими как Оборотно-сальдовая ведомость. Давайте разберем, как избежать ошибок и правильно настроить получение данных.
Когда мы используем виртуальные таблицы остатков, например ХозрасчетныйОстатки, система 1С ожидает параметр типа Дата или Граница. Основная сложность заключается в том, как именно система интерпретирует конец указанного дня. Если вы просто передаете дату, существует риск того, что данные на конец суток будут обработаны неполно.
Для корректного получения данных рекомендуется использовать объект Граница. Если вы работаете в коде запроса, можно программно сформировать границу, включающую нужный момент времени:
Функция ГраницаПериода(Дата, ВидГраницыИмяЗначения) Экспорт
Возврат Новый Граница(Дата, ВидГраницы[ВидГраницыИмяЗначения]);
КонецФункции
В самой СКД, чтобы не добавлять лишние секунды вручную, мы можем использовать встроенные функции выражений. Например, для параметра периода можно использовать следующее выражение:
ДобавитьКДате(КонецПериода(&Период, "День"), "Секунда", 1)
Однако будьте внимательны: добавление секунды может привести к попаданию проводок следующего дня в ваш отчет. В большинстве случаев достаточно использовать стандартный тип СтандартныйПериод в настройках параметров СКД.
Самым надежным и профессиональным способом является использование типа данных СтандартныйПериод. Это позволяет пользователю гибко управлять интервалом, а разработчику — точно определять начало и конец выборки.
ПериодОтчета с типом СтандартныйПериод.НачалоПериода укажите выражение &ПериодОтчета.ДатаНачала.КонецПериода укажите выражение &ПериодОтчета.ДатаОкончания.ПериодОтчета.Такой подход исключает ошибки округления времени и делает отчет совместимым с типовыми механизмами платформы 1С v8.3.
Если вы заметили, что итоговые суммы в вашем отчете отличаются от типовых, первой причиной часто становятся дубли в данных. Это происходит, когда вложенные запросы возвращают несколько записей для одного элемента номенклатуры при левом соединении.
Рассмотрим, как проанализировать причину дублей:
РеализацияТоваровУслуг.Товары) нескольких записей с одинаковой номенклатурой для одного контрагента.ПЕРВЫЕ 1 вместе с УПОРЯДОЧИТЬ ПО, чтобы выбрать только самое актуальное значение (например, самую позднюю продажу).ЛЕВОЕ СОЕДИНЕНИЕ.Пример оптимизации подзапроса:
ВЫБРАТЬ ПЕРВЫЕ 1
РеализацияТовары.Ссылка,
РеализацияТовары.Цена
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
РеализацияТовары.Номенклатура = &ТекущаяНоменклатура
УПОРЯДОЧИТЬ ПО
РеализацияТовары.Ссылка.Дата УБЫВ
Для того чтобы ваш отчет всегда показывал верные данные, придерживайтесь следующих правил:
ОСВ убедитесь, что вы отбираете данные по тем же счетам и субконто, что и типовой отчет.ЛЕВОЕ СОЕДИНЕНИЕ с регистрами только после того, как убедились в уникальности записей в соединяемой выборке.СтандартныйПериод для всех отчетов, где важна временная точность.Соблюдение этих простых принципов поможет вам создавать точные и производительные отчеты, которые не будут вызывать вопросов у пользователей и бухгалтеров.