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