При разработке отчетов в системе 1С:Предприятие 8, особенно в таких конфигурациях, как Управление торговлей 11 или ERP, программисты часто сталкиваются с неприятным визуальным эффектом. При использовании виртуальной таблицы ОстаткиИОбороты с периодичностью Регистратор в отчете появляется пустая строка, где поле регистратора не заполнено, но при этом выведен начальный остаток. Рассмотрим подробно, почему это происходит и как правильно настроить отчет, чтобы данные выглядели корректно.
Для начала разберем природу возникновения проблемы. Виртуальная таблица ОстаткиИОбороты — это мощный инструмент, который «на лету» рассчитывает итоги на начало и конец периода, а также обороты за сам период. Когда мы устанавливаем в параметрах таблицы периодичность Регистратор, мы просим систему детализировать все изменения до конкретного документа.
Проанализируем ситуацию: представим, что на 1 января у нас на остатке числится 10 единиц возвратной тары. В течение января были движения (приходы и расходы). Если мы строим отчет за январь, платформа должна показать нам начальный остаток (10 шт.). Но какой документ-регистратор она должна указать для этой цифры? Те документы, которые сформировали этот остаток, остались в прошлом году, они находятся вне выбранного периода отчета. Поэтому система создает виртуальную строку «начального остатка», в которой поле Регистратор логически равно NULL.
Попытки решить это через ПОЛНОЕ СОЕДИНЕНИЕ нескольких временных таблиц, как это часто делают начинающие разработчики, обычно приводят лишь к усложнению кода и замедлению работы отчета, но не убирают корень проблемы. Нам нужно научить Систему компоновки данных (СКД) правильно интерпретировать эти записи.
Самый правильный и «чистый» способ решения задачи заключается в использовании механизмов самой СКД. Нам не нужно пытаться обмануть запрос, нам нужно правильно расставить роли полей на закладке «Наборы данных».
Выполним следующие шаги:
КоличествоНачальныйОстаток. В колонке «Роль» нажмем на кнопку редактирования.Количество).Партнер и Номенклатура).Регистратор роль не должна содержать признака «Остатки», это должно быть обычное поле или поле периода.При такой настройке СКД понимает: начальный остаток относится к Номенклатуре, а не к Регистратору. В результате в итоговом макете остаток будет выведен в строке группировки по товару, а в детальных записях под ним будут идти только реальные документы с оборотами, и пустая строка исчезнет.
Если мы хотим оставить плоский список или имеем специфические требования к макету, проанализируем возможность использования иерархии в настройках отчета. Рассмотрим, как настроить структуру на вкладке «Настройки» в СКД:
Партнер, затем Номенклатура).Регистратор Заполнено (или Регистратор НЕ ЕСТЬ NULL).Таким образом, остаток будет виден на уровне товара, а пустые строки, не имеющие регистратора, будут просто отсечены фильтром на уровне детальных записей.
В современных конфигурациях на платформе 8.3 для виртуальных таблиц рекомендуется выбирать техническое поле ПериодСекунда. Посмотрим на пример запроса, который будет более корректно обрабатываться СКД:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ТараОстатки.Партнер КАК Партнер,
ТараОстатки.Номенклатура КАК Номенклатура,
ТараОстатки.Регистратор КАК Регистратор,
ТараОстатки.ПериодСекунда КАК ПериодСекунда,
ТараОстатки.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ТараОстатки.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
ТараОстатки.КоличествоПриход КАК КоличествоПринято,
ТараОстатки.КоличествоРасход КАК КоличествоВозвращено
ИЗ
РегистрНакопления.ПереданнаяВозвратнаяТара.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТараОстатки
Обратим внимание на параметр «Периодичность». Вместо жесткого Регистратор мы указали Авто. Это позволяет СКД самостоятельно выбирать нужные периоды. Поле ПериодСекунда в роли поля должно быть помечено как «Период, Номер 1». Это дает системе четкую временную ось, помогая избежать дублирования остатков и появления «фантомных» строк.
Иногда типовых механизмов СКД недостаточно, например, когда нужно вывести остатки по регистратору «Остаток на начало» текстом. В этом случае проанализируем ситуацию с точки зрения чистого SQL/запроса 1С. Мы можем объединить две таблицы:
// Получаем начальные остатки
ВЫБРАТЬ
ТараОстатки.Партнер,
ТараОстатки.Номенклатура,
"Остаток на начало периода" КАК Пояснение,
НЕОПРЕДЕЛЕНО КАК Регистратор,
ТараОстатки.КоличествоОстаток КАК КоличествоНачальныйОстаток,
0 КАК КоличествоПриход,
0 КАК КоличествоРасход
ИЗ
РегистрНакопления.ПереданнаяВозвратнаяТара.Остатки(&НачалоПериода, ) КАК ТараОстатки
ОБЪЕДИНИТЬ ВСЕ
// Получаем обороты с регистраторами
ВЫБРАТЬ
ТараОбороты.Партнер,
ТараОбороты.Номенклатура,
"Движение",
ТараОбороты.Регистратор,
0,
ТараОбороты.КоличествоПриход,
ТараОбороты.КоличествоРасход
ИЗ
РегистрНакопления.ПереданнаяВозвратнаяТара.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ТараОбороты
После этого результат можно сгруппировать в СКД. Этот метод дает 100% контроль над каждой строкой отчета, хотя и требует более внимательного написания запроса для корректного расчета конечного остатка (как суммы начального и оборотов).
Разберем специфику именно этого регистра. Если отчет все равно пустой или данные не сходятся, выясним причину в настройках системы:
Помните, что Регистратор в УТ 11/ERP — это не просто ссылка на документ, это ключ к анализу движений. Если документ помечен на удаление или не проведен, он не попадет в виртуальную таблицу оборотов, но может влиять на остатки, если остались «битые» записи в регистрах. В таких случаях рекомендуется выполнить регламентную операцию «Исправление развернутых остатков» или «Тестирование и исправление».
Подводя итог, отметим: появление пустых регистраторов — это не ошибка программы, а логическое поведение виртуальных таблиц. Использование ролей СКД и правильная иерархия группировок — самый эффективный способ сделать ваш отчет профессиональным и удобным для пользователя.