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