Условие в отчете 1с
Речь пойдет о назначение расширения языка запросов для описания отборов в СКД и о том как я вижу его применение. Статья для тех кто знаком с СКД. Для новичков рекомендую предварительно ознакомиться с этим: - видео-уроки по СКД (легко ищется в интернете)
Расширение языка запросов для системы компоновки данных
Расширение языка запросов для системы компоновки данных осуществляется при помощи специальных синтаксических инструкций, заключаемых в фигурные скобки и помещаемых непосредственно в текст запроса.
Синтаксические элементы расширения языка запросов системы компоновки данных
ВЫБРАТЬ
В этом предложении описываются поля, которые пользователь сможет выбирать для вывода. После данного ключевого слова через запятую перечисляются псевдонимы полей из основного списка выборки запроса, которые будут доступными для настройки.
После псевдонима поля может находиться комбинация символов «.*», что обозначает возможность использования дочерних полей от данного поля.
Например, запись Номенклатура.* обозначает возможность использования дочерних полей поля «Номенклатура» (например, поля «Номенклатура.Код»). Элемент ВЫБРАТЬ может присутствовать только в первом запросе объединения.
Описываются поля, на которые пользователь сможет накладывать отбор. В данном предложении используются поля таблиц. Использование псевдонимов полей списка выборки недопустимо. Каждая часть объединения может содержать собственный элемент ГДЕ.
Нехитрый пример
Необходимо получить продажи за период + вывести всю номенклатуру, независимо от того были ли продажи или нет. То есть, необходимо выбрать данные из таблицы оборотов регистра Продажи, данные из справочника номенклатура. Опустим вопрос зачем нам нужна вся номенклатура.
Для решения задачи можно составить запрос соединяющий левым соединением номенклатуру и таблицу оборотов Продажи, в результате, для номенклатуры, которая не продавалась в выбранном периоде мы получим значения полей Контрагент, Договор, Количество, Сумма = Null. Такой запрос:
Вот результат:
Контрагент | Договор | Номенклатура | Количество | Сумма |
null | null | _Тест1 | null | null |
ООО "Рога и копыта" | Договор1 | Тапочки | 10 | 1200 |
ОАО "Газпром" | Клевый договор | Сапоги | 5 | 13000 |
null | null | Галоши | null | null |
null | null | Сланцы | null | null |
- в данном примере не было продаж номенклатуры: "Галоши" и "Сланцы"
И все бы ничего, если мы сгруппируем выборку по контрагенту то вся не продаваемая номенклатура попадет в отдельную группировку, где Контрагент = Null, но клиент хочет иметь в отчете произвольный отбор по полю контрагент(естественно имеется ввиду контрагент из регистра Продажи). Как быть? Ведь по сути нам нужно фильтровать только таблицу Продажи. Если мы используем автозаполнение в конструкторе СКД, то в доступные поля отбора попадет поле Контрагент, все вроде бы хорошо, но при исполнении отчета с отбором по контрагенту мы потеряем все записи из соединения с номенклатурой. Например, установим отбор: Контрагент = ООО "Рога и копыта". Результат будет выглядеть так:
Контрагент | Договор | Номенклатура | Количество | Сумма |
ООО "Рога и копыта" | Договор1 | Тапочки | 10 | 1200 |
- совсем не то что нам нужно, правда?
Для решения задачи можно конечно добавить параметр в запрос, например в параметры виртуальной таблицы ПродажиОбороты, но при этом теряется гибкость настройки вида сравнения.
Решение есть: для этого в конструкторе запросов на вкладке Компоновка данных => Таблицы добавим поле-условие в условия виртуальной таблицы ПродажиОбороты и сменим ему псевдоним на КонтрагентОтбор
Для того чтобы не путать пользователя с полями отбора, отключим поле-условие Контрагент и сменим заголовок для поля КонтрагентОтбор
В результате выполнения данной схемы с включенным отбором по полю контрагент результирующий запрос примет вид:
И соответственно результат:
Контрагент | Договор | Номенклатура | Количество | Сумма |
null | null | _Тест1 | null | null |
ООО "Рога и копыта" | Договор1 | Тапочки | 10 | 1200 |
null | null | Сапоги | null | null |
null | null | Галоши | null | null |
null | null | Сланцы | null | null |
_Тест1 - это группа в справочнике Номенклатура, в которой все лежит
К публикации прикреплена схема XML-схема отчета, использовавшегося в публикации. Схему создавал в Комплексной автоматизации, но думаю, все будет прекрасно работать и в УПП и в УТ 10
Подведение итогов
Данный пример показывает каким образом создать свои настройки отборов в СКД и отключить автосоздаваемые, если вы конструируете схему с включенным флагом Автозаполнение.
Если же вы имеете достаточно опыта, чтобы создавать схемы без использования Автозаполнения - то данный совет не имеет смысла.
Всем привет! Помогите настроить отчет. Всю голову сломал. Есть отчет по проживающим в общежитие. Мне надо настроить отчет определенным образом.
Как сейчас:
У меня есть документ "Карточка заселения" где указываются данные
1. "Проживающий"
2. "Дата заселения"
3. "Дата выселения"
Так вот человек заселяется указывается кто он и ставится "Дата заселения" и такой нюанс, что "Дата выселения" ставится только тогда когда он выезжает по факту. ТАК ВОТ
Сейчас сделал отчет который показывает:
Дата выселения ставится в отчете тогда когда, если есть в документе движение с проставленной "Дата выселения" или если нет движения и указывается в отчете "&КонецПериода", то тогда в пустых датах выселения проставляется дата конца периода от чего и считается уже кол дней прожитых.
Вот такой вид имеет:
Теперь к самому главному:
Мне надо как то сделать вид отчета такой.
Человек как видно выше "Иванов Иван Иванович" заселился "02.07.2013" и дата выселения в документе "карточка заселения" не стоит. Прошел месяц с тех пор был сформирован отчет за месяц, который тоже находится выше.
Теперь начинается месяц "Август" и число у нас например "15.08.2013" и человек до сих пор живет. НО мне надо подсчитать, сколько он прожил (Период с "01.08.2013" до "15.08.2013"). Мне в данном отчете нужно, что бы когда я ставлю "Дата начала" и "дату конца", выбрало и добавило в отчет только тех людей у кого не проставлена "Дата выселения" в документе "карточка зеселения" и дата уже отсчета в отчете стояла с "01.08.2013"
А если стоит "Дата выселения" в документе то устанавливалась в отчете его реальная "дата выселения" по документу, но считала опять же количество дней уже исходя из "Начала периода", так как это новый месяц уже и считать количество прожитых дней надо с начало нового месяца.
Как это все сделать просто незнаю и вообще возможно ли. Думал делать закрытия месяца, но это все так трудоемка, так как нужно сделать очень много документов движения. Это сделать выезд проживающего, как будто сдача белья и много дополнительных услуг которые присутствуют в документе и после создать новый с датой первого числа нового месяца.
Подскажите как это можно реализовать в отчете! Уже голова болит. Может у кого есть какие идеи. Спасибо.
(2) У меня такое уже условие стоит на Дата выселения где проставляется дата конца периода. Я же написал в вопросе. Или создать еще один свой реквизит в запросе отчета?
Подскажите Можно как то сделать 2-а движениея в одном документе. Это "Приход" и "Расход" По определным условиям. Например статус. Если стоит статус "выполняется" то приход если закрыт и провести "то расход". Возможно так сделать. что то пробовал не получается.
т.е. мне хочется сделать что бы не делать дополнительный документ выезд проживающего. А поставить дату окончания и статус закрыт. И сделалось движение по документу расход. Что бы было смотришь в регистр сведений и было видно что был приход +, а потом был расход -
У меня дата начало проставляется. Мне надо как то этих людей перенести на следующий месяц получается. Когда я ставлю дату начало периода то в отчет документы не попадают которые были созданы в предыдущем месяце. Мне надо как сделать так что бы люди эти отображались и в следующем месяце по определенным условиям. Статус "выполняется" или "закрыт"
Хочется спросить вообще как то это возможно сделать? Что то мне кажется это не реально сделать в отчете, так как надо даже если поменяется статус на закрыт данный проживающий все равно должен отображаться в этом месяце
(11) а какие движения делает твой документ ?
в отчете идет обращение к регистру или к табличной части самих документов?
и вообще, давай уже текст запроса, а то очень сложно понять твою писанину в (0)
Ребята я с планшета сижу. Инета на работе нет до 1 августа. А собираю я данные не с документов а с регистров тоже. Я походу понял как сделать спасибо за идею asmody по регистру расчетов. Буду пробовать делать. Позже выкину свой запрос
У меня просто организация платит за проживание полностью и оплату за проживание хотя есть и цена за сутки и сумма рассчитывалась уже в отчете поэтому даже не рассматривал оплату и расчет в документе. Если делать оплату по факту тогда будет и движение документов в нужные моменты времени. Думаю должно должно будет получится. Позже отпишу результат как получится
Решил данный вопрос. Сделал в настройках отчета СКД, на НачалоПериода поставил выражение "ДобавитьКДате(&ДатаНачала,"Месяц",-1)" т.е. уже вытягиваю с прошлого месяца людей на следующий месяй по условию статуса документа "Выполняется" после когда сдается отчет в конце месяца. делается как бы закрытие месяца с помощью "Групповой обработки документов" по условиям отбираются люди которые уже выселены и статус стоит "выполняется" ставим им статус "закрыт" и проводим. тем самым. Уже этих людей в следующий месяц не включаем, а кто проживает переносим на следующий месяц. Помогите решить другую проблему у меня в этот отчет выходят одно движение которое должно замещатся другим.
Как сейчас:
Есть документ "Карточка заселения" и из этого документа выходят данные в мой отчет. и Есть документ "перемещение проживающего", где человек перемещается между комнатами и есть отдельные отчет где это отражается. но исходя из этого документа попадают в в мой отчет где идет уже идентичная первой строчки. т.е. происходит задвоение.
Как мне нужно:
Что бы если есть движение о перемещении сотрудника то выходило в отчет строка уже движения по перемещения а не карточка заселения.
Мне нужно как то сделать условие, но не получается почему то , пишет ошибки и ошибки. Может как то не правильно делаю. Свой код запроса отчета прилагаю
////////////////////////////////////////////////////////////
УчетПроживающихОстаткиИОбороты.Проживающий.Подразделение,
УчетПроживающихОстаткиИОбороты.Проживающий.Должность,
УчетПроживающихОстаткиИОбороты.Проживающий.Организация,
ВТ_Данные.ПаспортныеДанные,
Для того чтобы лучше понять этот пример, необходимо прочитать предыдущею статью, в которой я описывал процесс создания отчета с использованием временных таблиц, так как я буду использовать именно его и для решения задач подобного рода без них не обойтись.
И так у нас есть отчет следующего вида.
В него попадают все акты и созданные на их основе счет фактуры, не важно помеченные они на удаление, проведенные или нет, так же в нем будут отображаться акты и счет фактуры не связанные между собой, просто напротив будет пустое поле.
1С СКД использование условий в запросах
Для того чтобы все это реализовать необходимо немного изменить запрос, добавив пару условий. Сначала открываем временную таблицу «Отобранные Акты» в ней мы объединяли поля табличной части и документа. Переходим во вкладку условие и добавляем его.
Дальше точно такое же условие добавляем во временную таблицу «Отобранные СФ».
Теперь в отчет не будут попадать документы которые не проведены либо помечены на удаление.
В открывшемся окне добавляем проверку.
Для поля «Отобранные.СФ» пишем тоже самое.
Так как мы изменили выбранные поля в запросе, их так же необходимо перевыбрать в настройках основной схеме компоновки данных.
В принципе на этом все, можно проверять что получилось. Для начала откроем Акты и скажем один под номером «000000001» не будем проводить.
Далее откроем счет фактуры, тут так же один документ с номером «000000003» не проведем а один с номером «000000004» пометим на удаление.
Вот один пример использования условий в запросах. На самом деле это самый простой пример, на практике будет все намного сложней, но зная эти основы вы легко сможете со всем разобраться, ну а если у вас возникли вопросы то пишите, будем решать их вместе!
Самый простой и быстрый способ создать отчет в 1С это воспользоваться СКД (Системой компоновки данных). Это очень популярный а самое главное очень удобный инструмент, по сути для того чтобы создать отчет с помощью СКД даже не нужно знать 1С программирование. Так как у системы компоновки данных есть графический интерфейс. В сегодняшней статьи поговорим о добавление периодов. Т.е добавим возможность отбора за определенный промежуток времени. Данная возможность должны быть в любом нормальном отчете.
Я хоть и не являюсь гуру программистом 1С, но все же имею кое какой опыт и стараюсь им поделиться в своих небольших статьях, с теми кто в этом нуждается, поэтому рекомендую прочитать следующие статьи.
Добавление периода в СКД
И так добавить отбор по периоду можно в самом запросе, если открыть вкладку «Условия». Нажимаем на плюсик, выбираем дату документа, указываем что условие будет «Между» и пишем названия полей «ДатаНачала» и «ДатаОкончания».
Тоже самое можно сделать просто дописав в запрос вот такую строчку.
ГДЕ
АктОбОказанииУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
АктОбОказанииУслуг.Дата — ваш документ
Для того чтобы период стал доступным для пользователя необходимо во вкладке «Параметры» снять галочки в колонке «Ограничение доступности».
Остается перейти в «Настройки» выбрать «Отчет» и во вкладке «Параметры» настроить добавленный период. Например, если установить галочку то по умолчанию будет производиться отбор по указанной дате. Можно установить по умолчанию необходимое значения «Начало этого дня, недели, месяца и т.д.» или же точную дату.
Теперь если запустить отчет в пользовательском режиме и открыть настройки, можно установить отбор по дате. Для удобства данные параметры можно вынести на форму, для этого жмем на пункт «Показать» и выбираем «Показать в шапке».
Но лучше сделать это в самих настройках СКД.
В этом случае параметры будут отображаться у всех пользователей которые будут открывать отчет.
Вот так добавляется период в СКД. Как сами видите все достаточно просто и понятно, самое главное не торопиться и внимательно читать названия пунктов.
Редко какой отчет в 1С не использует отборы, разве что печатные формы и какие-то специальные отчеты. В большинстве отчетов в 1С требуется возможность выборочного анализа. Поэтому в этой статье мы поговорим про настройку отборов в отчетах, построенных с помощью 1С СКД.
После того как вы добавили наборы, определили ресурсы, задали структуру отчета с помощью группировок , можно приступать к настройке фильтров. В СКД это делается на закладке «Отбор», которая доступна или для всего отчета или для определенной группировки.
Новый элемент в список отбора можно добавить несколькими способами – двойной клик по доступному полю, перетаскивание, клавиша в меню:
При этом только через клавишу в меню можно добавить группу в отбор, которая объединяет элементы внутри этой группы по заданному условию (И, ИЛИ).
По умолчанию если элементы отбора не включены ни в какую группу и объединяются с помощью оператора «И».
Вид сравнения в элементе отбора зависит от типа поля (левого значения):
Операции доступные для числа:
Операции доступные для строки:
Для строки добавлены операции – «содержит», «начинается с», «соответствует шаблону» и те же операции с оператором «Не» (Не содержит и т.д.).
Операции доступные для ссылки:
Далее разберем типовые ситуации при использовании отбора
Самый простой вариант использование отбора – добавить фиксированный отбор, который будет действовать всегда (если конечно пользователь не изменит его в варианте отчета):
Обычно такие отборы имеет смысл переносить в текст запроса. Особенно в том случае, если пользователь не должен его менять вообще ни при каком условии.
Иногда в отчете на 1С СКД возникает необходимость исключить в отчете значения некоторых группировок (колонок или строк). Причем сделать это в запросе не представляется возможным, потому что исключать такие строки возможно только после компоновки.
В этом случае используется возможность СКД накладывать отборы на заданную группировку. Рассмотрим, например, такой отчет:
Допустим нам нужно исключить из отчета все строки, в которых итоговое количество по номенклатуре меньше 15. В запросе мы такое условие применить не можем. Установим для этого отбора для группировки «Номенклатура»:
Получим такой отчет:
Отборы на группировках часто используются в отчетах вида «Ведомость по остаткам»:
При использовании группировки по периоду (регистратору) в таких отчетах появляются строки, отвечающие за начальный остаток при использовании даты начала периода отличной от самой ранней. Чтобы убрать такие строки, можно использовать отбор на группировке по регистратору:
Чтобы убрать отбор, выделенный на рисунке на закладке «Другие настройки» для этой же группировки отключим вывод отбора:
Обычно мы редко используем фиксированные отборы. Чаще нам нужны отборы, которые может изменять пользователь. Можно, чтобы пользователь изменял отборы через функционал 1С СКД «Изменить вариант», но это не совсем верный путь – вариант отчета это скорее постоянный «скелет», который настраивается один раз и потом используется многократно. Отборы же это что-то часто изменяемое, поэтому правильнее редактировать их через механизм пользовательских настроек.
Итак, вернемся к нашему отчету. Допустим нам необходимо добавить в отчет отбор по группе номенклатуры (или по элементу) и чтобы этот отбор был доступен для изменения пользователем.
Добавим для этого отбор на уровне отчета. Вид сравнения по умолчанию сделаем «В группе», отключим по умолчанию использование отбора и в диалоге редактирования пользовательских настроек включим наш отбор в пользовательские настройки.
Перейдем теперь в режим предприятия.
Наш отбор доступен для редактирования на форме. За доступность прямо в форме отчета отвечает «Режим редактирования». Значение «Быстрый доступ» означает, что отбор доступен прямо на форме отчета. Если значение равно «Обычный», отбор доступен через кнопку «Настройки». Как видно на рисунке пользователь может выбирать вариант сравнения, управлять действием (включен / отключен) отбора.
Если вам необходимо установить фиксированный отбор (вид сравнения и правое значение константы), но пользователь должен управлять включением / отключением отбора, тогда вам необходимо заполнить представление отбора в пользовательской настройке:
В этом случае в настройки добавляется только флаг использования отбора, которым может управлять пользователь:
Если вам в отборе нужно изменить представления поля, по которому делается отбор, то для этого есть еще одно представление:
Получается вот так:
Мы можем вывести все отборы для редактирования пользователем. Для этого на уровне отчета вызовем диалог редактирования пользовательских настроек:
То же самое можно сделать на уровне любой группировки, если нужно, чтобы была возможность редактирования отборов для заданной группировки. В режиме предприятия это выглядит следующим образом:
Как известно, в 1С СКД используется не только в отчетах, но и в формах, содержащих динамические списки. У динамического списка есть несколько свойств, которые относятся к СКД. Среди этих свойств имеется свойство «Отбор» с типом «ОтборКомпоновкиДанных». Чтобы установить отбор в динамическом списке есть два способа. Первый способ – передать отборы через параметр формы с одноименным названием – «Отбор». Этот параметр является структурой, в которой ключ ссылается на поле, для которого устанавливается отбор. Значение же содержит данные, с которыми производится сравнение. Можно также передать в качестве правого значения – массив, фиксированный массив, список значений. В этом случае вид сравнения равняется «ВСписке», для одиночного элемента вид сравнения устанавливается как «Равно». Этот способ ограничен в возможностях – с его помощью нельзя накладывать сложные условия с операторами «И» и «ИЛИ», нельзя использовать виды сравнения кроме двух указанных.
Отбор, установленный таким образом, передается в фиксированные настройки компоновщика настроек, связанного с динамическим списком. Он не виден пользователю и недоступен для изменения.
Второй способ – непосредственное редактирование отбора в динамическом списке или в компоновщике. Обычно в типовых конфигурация для этого есть ряд методов и функций для установки таких отборов.
Например, вызов основного метода для установки отбора выглядит так:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, «Ссылка», Параметры.ДобавитьДля, ВидСравненияКомпоновкиДанных.НеРавно);
Данная функция производит поиск существующего элемента отбора, изменяет его если нашла, а если не нашла, то добавляет с помощью такой процедуры:
В форме содержащей динамический список также как в отчете на СКД, возможно настроить пользовательский отбор. Как это можно сделать показано на рисунке:
Также у элемента формы, с которым связан список нужно установить группу пользовательских настроек, в которой будут отображаться настройки для пользователя:
Читайте также: