В конфигурации 1С:Управление торговлей 10.3 отчет «Ведомость товаров на складах» является одним из ключевых инструментов для анализа складских остатков. Однако начинающие разработчики часто сталкиваются с трудностью: при попытке изучить код отчета в Конфигураторе они не находят привычного текста запроса в схеме компоновки данных или в модуле. Разберем подробно, как работает этот отчет, из каких регистров он извлекает информацию и как получить его итоговый текст запроса.
Для начала проанализируем архитектуру этого отчета. В отличие от современных конфигураций на управляемых формах, где используется Система компоновки данных (СКД), в УТ 10.3 большинство типовых отчетов построено на базе Универсального отчета. Этот механизм использует объект ПостроительОтчета, который формирует текст запроса динамически в момент выполнения или инициализации.
Если мы откроем модуль объекта отчета ВедомостьТоварыНаСкладах, мы не увидим там длинного текста запроса. Вместо этого мы обнаружим вызовы процедур, которые передают имя регистра. Основная логика скрыта в процедуре УстановитьНачальныеНастройкиУпр(). Именно здесь программно назначается источник данных. Выясним причину такого подхода: это позволяет системе гибко добавлять поля свойств, категорий и различные группировки, не переписывая запрос вручную.
Отвечая на главный вопрос — откуда берутся данные — рассмотрим основной регистр накопления. Отчет строится по данным регистра накопления ТоварыНаСкладах. Это регистр остатков, который хранит информацию в количественном выражении в следующих разрезах:
Важно понимать, что этот отчет показывает именно физическое наличие товара. Если вам необходима информация о себестоимости или финансовых показателях, необходимо обращаться к другому отчету — «Ведомость по партиям товаров на складах», который работает с регистром ПартииТоваровНаСкладах.
Поскольку запрос формируется программно, его текст можно «перехватить» в коде или посмотреть на примере уже сформированного построителем варианта. Рассмотрим структуру типового запроса, который генерирует УниверсальныйОтчет для данного случая. В нем используются виртуальные таблицы ОстаткиИОбороты.
Ниже приведен пример текста запроса, который формируется системой:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ИсточникДанных.Склад КАК Склад,
ПРЕДСТАВЛЕНИЕ(ИсточникДанных.Склад) КАК СкладПредставление,
ИсточникДанных.Номенклатура КАК Номенклатура,
ИсточникДанных.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ИсточникДанных.КоличествоПриход КАК КоличествоПриход,
ИсточникДанных.КоличествоРасход КАК КоличествоРасход,
ИсточникДанных.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
// Вычисление данных в разных единицах измерения
ИсточникДанных.КоличествоНачальныйОстаток * ИсточникДанных.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК КоличествоЕдиницОтчетовНачальныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор {&Периодичность},, {Склад.*, Номенклатура.*}) КАК ИсточникДанных
Проанализируем этот код. Обратите внимание на блоки в фигурных скобках {}. Это расширения языка запросов для ПостроителяОтчета. Они позволяют пользователю в режиме 1С:Предприятие самостоятельно выбирать поля, накладывать фильтры и определять группировки. Если пользователь добавит отбор по складу, построитель автоматически подставит его в параметры виртуальной таблицы для оптимизации производительности.
Разберем подробнее, как отчет работает с коэффициентами. В запросе мы видим математические операции с полями Коэффициент. В УТ 10.3 товар может учитываться в разных единицах измерения:
Отчет динамически пересчитывает количество, умножая остаток на коэффициент единицы хранения и деля на коэффициент единицы отчетов. Это позволяет видеть одну и ту же ведомость как в штуках, так и в упаковках, просто переключив настройки в интерфейсе.
Если вам нужно внести изменения или добавить новое поле, выполним следующие шаги в Конфигураторе:
ВедомостьТоварыНаСкладах.УстановитьНачальныеНастройкиУпр.УниверсальныйОтчет.ИмяРегистра = "ТоварыНаСкладах";.УниверсальныйОтчет.УстановитьИменаРегистров("ТоварыНаСкладах");.Именно установка свойства ИмяРегистра заставляет универсальный механизм «подтянуть» метаданные регистра и сформировать базовый запрос. Если вы хотите увидеть итоговый текст запроса во время выполнения программы, можно воспользоваться точкой останова на строке ПостроительОтчета.Выполнить() (внутри общего модуля УниверсальныйОтчет) и вычислить выражение ПостроительОтчета.Текст.
Выясним причину, почему иногда данные в отчете могут не совпадать с ожиданиями пользователя. В УТ 10.3 существует несколько похожих регистров:
В типовом отчете «Ведомость товаров на складах» разработчики 1С предусмотрели объединение данных по разным типам складов. В тексте запроса часто можно встретить конструкцию ОБЪЕДИНИТЬ ВСЕ, где собираются данные из регистра ТоварыНаСкладах и ТоварыВРознице, чтобы предоставить пользователю полную картину по всей компании.
Рассмотрим ситуацию, когда отчет не показывает нужные данные. Важно проверить настройки параметров:
КонечныйОстаток.//ПОЛЯ_СВОЙСТВА), убедитесь, что у объектов метаданных заполнены соответствующие дополнительные реквизиты.Таким образом, мы проанализировали, что отчет является сложным динамическим конструктором. Его фундамент — регистр ТоварыНаСкладах, а инструмент извлечения — Построитель отчета в составе Универсального отчета. Понимание этой структуры позволяет разработчику быстро находить причины расхождения данных и кастомизировать отчет под нужды бизнеса.