Как отобрать данные в универсальном отчете по типу документа-регистратора в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с отчетами в 1С:Предприятии, особенно с теми, которые основываются на регистрах накопления и используют "Универсальный отчет", часто возникает потребность в детализированном отборе данных. Одним из таких специфических требований является фильтрация строк по типу документа-регистратора, то есть по документу, который совершил движение в регистре. Давайте рассмотрим подробнее, как решить такую задачу на примере отчета "Ведомость по товарам на складах" в конфигурации 1С:Управление торговлей 10.3.

Представим ситуацию: у нас есть отчет "Ведомость по товарам на складах", который в своей основе использует "Универсальный отчет" и обращается к регистру остатков. Наша цель — модифицировать его таким образом, чтобы он выводил только те строки, где движение по регистру было сформировано документом типа "Реализация товаров и услуг". Поскольку отчет является самописным (не типовым), у нас есть возможность вносить изменения в его код или структуру.

Для решения этой задачи мы можем использовать несколько подходов, каждый из которых имеет свои особенности и применимость в зависимости от архитектуры отчета и желаемой гибкости.

1. Программное добавление поля с условием для отбора

Этот подход предполагает модификацию кода отчета, который формирует запрос к базе данных или обрабатывает данные "Универсального отчета". Мы можем добавить в запрос или на этапе постобработки данных новое вычисляемое поле, которое будет содержать признак соответствия регистратора нужному типу. Затем по этому полю можно будет установить отбор.

Рассмотрим, как это можно реализовать. Если ваш "Универсальный отчет" формируется программно, вы работаете с объектом типа УниверсальныйОтчет. У этого объекта есть методы для настройки его структуры, в том числе для добавления полей и установки отборов. Однако, чтобы добавить поле с условием, зачастую удобнее всего модифицировать запрос, который "Универсальный отчет" передает в Систему Компоновки Данных (СКД) или исполняет напрямую.

Шаги реализации:

  1. Модификация запроса: Найдите в коде отчета место, где формируется текст запроса к регистру накопления. Добавьте в него вычисляемое поле, которое определяет тип регистратора.
  2. Использование функции ТИПЗНАЧЕНИЯ: В языке запросов 1С существует функция ТИПЗНАЧЕНИЯ(<Поле>), которая возвращает тип значения указанного поля. Мы можем сравнить этот тип с нужным нам типом документа.
  3. Создание флага: На основе сравнения создадим числовое или булево поле-флаг.
  4. Установка отбора: После добавления флага, вы сможете установить отбор по этому полю.

Приведем пример модификации запроса. Предположим, ваш отчет работает с виртуальной таблицей регистра накопления "ТоварыНаСкладахОстаткиИОбороты". Исходный запрос может выглядеть примерно так:


ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.Склад,
    ТоварыНаСкладахОстаткиИОбороты.Регистратор,
    ТоварыНаСкладахОстаткиИОбороты.Период,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты

Для добавления поля-флага "ЭтоРеализация" мы модифицируем запрос следующим образом:


ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.Склад,
    ТоварыНаСкладахОстаткиИОбороты.Регистратор,
    ТоварыНаСкладахОстаткиИОбороты.Период,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
    ВЫБОР
        КОГДА ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОстаткиИОбороты.Регистратор) = ТИП("Документ.РеализацияТоваровУслуг")
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЭтоРеализация
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ГДЕ
    ВЫБОР
        КОГДА ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОстаткиИОбороты.Регистратор) = ТИП("Документ.РеализацияТоваровУслуг")
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ

Обратите внимание, что мы добавили поле ЭтоРеализация и сразу же использовали его в условии ГДЕ. Если же нам нужно, чтобы этот флаг был доступен для пользовательского отбора, мы можем просто добавить его в список полей запроса, а затем программно добавить его в качестве элемента отбора в настройках УниверсальногоОтчета:


// Предполагаем, что УниверсальныйОтчет уже инициализирован
// и к нему подключена схема компоновки данных или запрос

// Добавляем параметр для отбора, если хотим сделать его пользовательским
// Это зависит от того, как УниверсальныйОтчет работает с СКД
// Если же отчет строится напрямую, то добавляем отбор к запросу, как показано выше

// Пример добавления отбора через УниверсальныйОтчет (может варьироваться в зависимости от версии и реализации)
ЭлементОтбора = УниверсальныйОтчет.ДобавитьЭлементОтбора();
ЭлементОтбора.Поле = Новый ПолеКомпоновкиДанных("ЭтоРеализация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Значение = Истина;
ЭЭлементОтбора.Использование = Истина;

// Затем необходимо сформировать отчет
УниверсальныйОтчет.СформироватьОтчет();

Важно помнить, что этот метод требует прямого доступа и модификации кода, формирующего запрос или управляющего объектом УниверсальныйОтчет. В УТ 10.3 чаще всего используется именно такой подход для самописных отчетов, поскольку они не всегда полностью полагаются на возможности пользовательских настроек СКД.

2. Использование поля "Регистратор" и функции "ТИПЗНАЧЕНИЯ" в Системе Компоновки Данных (СКД)

Если ваш отчет, даже будучи самописным, использует Систему Компоновки Данных (СКД) как основу, то наиболее гибким и мощным решением будет использование возможностей самой СКД. СКД позволяет нам добавлять вычисляемые поля и настраивать отборы прямо в схеме компоновки данных, что дает большую гибкость и возможность пользователю настраивать отбор через "Расширенные настройки" отчета.

Шаги реализации в СКД:

  1. Открытие схемы компоновки данных: Откройте схему компоновки данных вашего отчета (обычно это объект "Макет" с типом "СхемаКомпоновкиДанных" в конфигураторе).
  2. Модификация набора данных-запроса: Перейдите на закладку "Наборы данных" и выберите набор данных типа "Запрос".
  3. Добавление вычисляемого поля: В тексте запроса добавьте вычисляемое поле с использованием функции ТИПЗНАЧЕНИЯ().

Пример запроса с добавлением вычисляемого поля:


ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.Склад,
    ТоварыНаСкладахОстаткиИОбороты.Регистратор,
    ТоварыНаСкладахОстаткиИОбороты.Период,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОстаткиИОбороты.Регистратор) КАК ТипРегистратора
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты

Теперь у нас появилось новое поле ТипРегистратора, которое содержит тип документа в виде строки. Затем мы переходим к настройкам СКД:

  1. Закладка "Ресурсы": Если вы собираетесь использовать это поле для группировки или отбора, убедитесь, что оно доступно.
  2. Закладка "Настройки": Перейдите на закладку "Настройки" и добавьте новый элемент отбора.
  3. Выбор поля отбора: В качестве поля для отбора выберите наше новое поле ТипРегистратора.
  4. Условие отбора: Установите условие, например, "Равно", и укажите значение "Документ.РеализацияТоваровУслуг". Обратите внимание, что тип документа указывается в строковом виде.
  5. Параметризация отбора (опционально): Вы также можете создать параметр СКД для типа документа и связать его с полем отбора, чтобы пользователь мог выбирать тип документа прямо на форме отчета. Для этого на закладке "Параметры" создайте новый параметр, например, "ТипДокументаДляОтбора", установите ему тип "Строка" и свяжите его с элементом отбора на закладке "Настройки".

Преимущества этого метода:

3. Прямой отбор по ссылке на тип документа в запросе СКД

Если вам требуется жестко зафиксировать отбор только по одному или нескольким конкретным типам документов, и не предполагается, что пользователь будет его изменять, можно использовать прямой отбор в запросе СКД с помощью оператора ССЫЛКА.

Шаги реализации:

  1. Модификация набора данных-запроса: В схеме компоновки данных перейдите на закладку "Наборы данных" и отредактируйте запрос.
  2. Добавление условия ГДЕ: В секцию ГДЕ запроса добавьте условие, использующее оператор ССЫЛКА.

Пример запроса с прямым отбором:


ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.Склад,
    ТоварыНаСкладахОстаткиИОбороты.Регистратор,
    ТоварыНаСкладахОстаткиИОбороты.Период,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ГДЕ
    ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

Если вам нужно отобрать несколько типов документов, вы можете использовать оператор ИЛИ:


ГДЕ
    ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
    ИЛИ ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя

Важные моменты:

4. Использование "Расширенных настроек" универсального отчета

Для пользователей, которые работают с готовым отчетом, не имея возможности изменять его код, "Расширенные настройки" универсального отчета могут стать инструментом для дополнительной фильтрации. Однако, чтобы этот механизм заработал для отбора по типу регистратора, сама схема компоновки данных (СКД) должна быть соответствующим образом подготовлена.

Как это работает (при условии подготовки СКД):

  1. Открытие отчета: Откройте "Ведомость по товарам на складах".
  2. Переход в настройки: Нажмите кнопку "Настройки..." или "Параметры..." (точное название может отличаться).
  3. Переход в расширенные настройки: Найдите кнопку "Расширенный режим" или "Расширенные настройки" и нажмите её.
  4. Добавление отбора: На закладке "Отборы" нажмите кнопку "Добавить отбор".
  5. Выбор поля "ТипРегистратора": В открывшемся списке полей найдите поле "ТипРегистратора" (если оно было добавлено в схему СКД, как описано в пункте 2).
  6. Установка условия: Установите вид сравнения "Равно" и введите строковое представление типа документа, например, Документ.РеализацияТоваровУслуг.

Почему это может не работать напрямую:

Таким образом, использование "Расширенных настроек" эффективно только в том случае, если разработчик отчета предварительно позаботился о создании поля типа ТипРегистратора в СКД.

5. Расширения для универсального отчета

В экосистеме 1С существует множество готовых расширений и обработок, которые дополняют функциональность стандартных отчетов, включая "Универсальный отчет". Некоторые из них специально разработаны для добавления расширенных возможностей по группировке и отбору данных регистров накопления, включая отбор по типу регистратора. Такие расширения могут быть полезны, если у вас нет возможности или желания изменять код основного отчета.

Принцип работы расширений:

  1. Интеграция: Расширения устанавливаются в конфигурацию и модифицируют поведение типовых или самописных объектов без изменения самой конфигурации (что особенно важно для поддержки).
  2. Добавление функционала: Они могут добавлять на форму отчета дополнительные поля, кнопки, элементы управления, которые позволяют пользователю указать нужный тип регистратора.
  3. Динамическая модификация запроса/СКД: Внутри себя расширение программно модифицирует запрос или настройки СКД отчета, вставляя необходимое условие по типу регистратора, как мы рассматривали в пунктах 1 и 2.

Использование готового расширения может сэкономить время на разработку и тестирование, а также обеспечить более "чистое" решение с точки зрения поддержки конфигурации. Однако, необходимо тщательно выбирать расширения, убеждаясь в их совместимости с вашей версией платформы и конфигурации, а также в их надежности и отсутствии конфликтов.

Заключение

Мы выяснили, что для отбора по типу документа-регистратора в универсальном отчете на базе регистра накопления в 1С:Управление торговлей 10.3 существует несколько рабочих подходов. Выбор конкретного метода зависит от того, насколько глубоко вы готовы модифицировать отчет, используете ли вы СКД и насколько гибкими должны быть настройки для пользователя.

  1. Для самописных отчетов с прямым формированием запроса наиболее эффективным будет программное добавление вычисляемого поля в запрос и установка отбора по нему.
  2. Если отчет базируется на СКД, оптимальным решением является добавление вычисляемого поля ТипРегистратора в схему СКД и настройка отбора через стандартные средства СКД. Это обеспечит максимальную гибкость для пользователя.
  3. Для жестко зафиксированных требований можно использовать прямой отбор по ссылке на тип документа непосредственно в запросе СКД.
  4. "Расширенные настройки" могут быть использованы пользователем, но только при условии, что схема СКД отчета была заранее подготовлена разработчиком.
  5. В качестве альтернативы можно рассмотреть использование готовых расширений, которые уже реализуют подобный функционал.

При работе с самописными отчетами всегда проанализируем текущую архитектуру отчета, чтобы выбрать наиболее подходящий и эффективный способ модификации. Всегда помните о необходимости тестирования после внесения изменений, чтобы убедиться в корректности выводимых данных и стабильности работы отчета.

← На главную