Операция не разрешена в предложении выбор 1с
ВЫБРАТЬ
ПланируемыеДвиженияОстатки.ДоговорКонтрагента,
ПланируемыеДвиженияОстатки.Сделка,
ПланируемыеДвиженияОстатки.ДокументРасчетовСКонтрагентом,
ПланируемыеДвиженияОстатки.СтатьяДвиженияДенежныхСредств,
ПланируемыеДвиженияОстатки.Проект,
ПланируемыеДвиженияОстатки.ДокументПланирования КАК ДокументПланирования,
ПланируемыеДвиженияОстатки.ДокументПланирования.СуммаДокумента КАК СуммаДокумента,
ВЫРАЗИТЬ
(ВЫБОР
КОГДА НЕ СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа)=0
ТОГДА СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа)
КОГДА ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов=&ВалютаДокумента
ТОГДА СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов)
КОГДА СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа)=0
И НЕ КурсыДоговоры.Курс=0
И НЕ &КурсДокумента=0
ТОГДА СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов)*КурсыДоговоры.Курс * &КратностьДокумента
/ (&КурсДокумента * КурсыДоговоры.Кратность)
ИНАЧЕ
0
КОНЕЦ КАК ЧИСЛО (15,2)) КАК СуммаПлатежа,
ВЫРАЗИТЬ
(ВЫБОР
КОГДА СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа)=0
ТОГДА КурсыДоговоры.Курс
КОГДА ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов=&ВалютаДокумента
ТОГДА &КурсДокумента
КОГДА НЕ СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа)=0
И НЕ &КурсДокумента=0
И НЕ СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов)= 0
И НЕ &КратностьДокумента=0 Тогда
СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа) * &КурсДокумента * КурсыДоговоры.Кратность
/ (СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов) * &КратностьДокумента)
ИНАЧЕ
0
КОНЕЦ КАК ЧИСЛО (10,4)) КАК КурсВзаиморасчетов,
ВЫРАЗИТЬ
(ВЫБОР
КОГДА ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов=ПланируемыеДвиженияОстатки.ДокументПланирования.ВалютаДокумента
ТОГДА ПланируемыеДвиженияОстатки.ДокументПланирования.КурсДокумента
КОГДА НЕ СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа)=0
И НЕ ПланируемыеДвиженияОстатки.ДокументПланирования.КурсДокумента=0
И НЕ СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов)= 0
И НЕ ПланируемыеДвиженияОстатки.ДокументПланирования.КратностьДокумента=0 Тогда
СУММА(ПланируемыеДвиженияОстатки.СуммаПлатежа) * ПланируемыеДвиженияОстатки.ДокументПланирования.КурсДокумента * КурсыДоговоры.Кратность
/ (СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов) * ПланируемыеДвиженияОстатки.ДокументПланирования.КратностьДокумента)
ИНАЧЕ
0
КОНЕЦ КАК ЧИСЛО (10,4)) КАК КурсВзаиморасчетовПлан,
ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
СУММА(ПланируемыеДвиженияОстатки.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов,
ВЫБОР
КОГДА ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов=&ВалютаДокумента
ТОГДА &КратностьДокумента
ИНАЧЕ
КурсыДоговоры.Кратность
КОНЕЦ КАК КратностьВзаиморасчетов,
ПланируемыеДвиженияОстатки.ДокументПланирования.ДатаПоступления КАК ДатаДвижения
ИЗ (
ВЫБРАТЬ
ПланируемыеОстатки.ДоговорКонтрагента,
ПланируемыеОстатки.Сделка,
ПланируемыеОстатки.ДокументРасчетовСКонтрагентом,
ПланируемыеОстатки.СтатьяДвиженияДенежныхСредств,
ПланируемыеОстатки.Проект,
ПланируемыеОстатки.ДокументПланирования КАК ДокументПланирования,
ПланируемыеОстатки.ДокументПланирования.СуммаДокумента КАК СуммаДокумента,
ПланируемыеОстатки.СуммаОстаток КАК СуммаПлатежа,
ПланируемыеОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетов
ИЗ
РегистрНакопления.ПланируемыеПоступленияДенежныхСредств.Остатки(,( (ДокументПланирования.ВалютаДокумента=&ПустойВалютаДокумента ИЛИ ДокументПланирования.ВалютаДокумента= &ВалютаДокумента)
И (ДокументПланирования.ФормаОплаты=&ПустойФормаОплаты ИЛИ ДокументПланирования.ФормаОплаты В (&ФормаОплаты))
И (ДокументПланирования.БанковскийСчетКасса=&ПустойСчетКасса ИЛИ
ДокументПланирования.БанковскийСчетКасса= &БанковскийСчетКасса ИЛИ
ДокументПланирования.БанковскийСчетКасса= Неопределено)
И (ДокументПланирования.Контрагент=&Контрагент ИЛИ ДокументПланирования.Контрагент=&ПустойКонтрагент)
И ДоговорКонтрагента=&ДоговорКонтрагента
И (СтатьяДвиженияДенежныхСредств=&ПустойСтатьяДвиженияДенежныхС редств ИЛИ СтатьяДвиженияДенежныхСредств=&СтатьяДвиженияДенежныхСредств )
И ДокументПланирования.ВидОперации = &ВидОперации
И (ДокументПланирования.Организация=&ПустойОрганизация ИЛИ ДокументПланирования.Организация=&Организация)
И (Сделка=Неопределено ИЛИ Сделка=&Сделка)))КАК ПланируемыеОстатки)КАК ПланируемыеДвиженияОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаПлатежа, ) КАК КурсыДоговоры
ПО ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов = КурсыДоговоры.Валюта
СГРУППИРОВАТЬ ПО
ПланируемыеДвиженияОстатки.ДоговорКонтрагента,
ПланируемыеДвиженияОстатки.Сделка,
ПланируемыеДвиженияОстатки.ДокументРасчетовСКонтрагентом,
ПланируемыеДвиженияОстатки.СтатьяДвиженияДенежныхСредств,
ПланируемыеДвиженияОстатки.Проект,
ПланируемыеДвиженияОстатки.ДокументПланирования,
КурсыДоговоры.Курс,
КурсыДоговоры.Кратность
<(40, 76)>: Нельзя использовать производные от полей составного типа в выражениях не присутствующих полностью в предложении СГРУППИРОВАТЬ ПО "ПланируемыеДвиженияОстатки.ДокументПланирования.ВалютаДокумента"
КОГДА ПланируемыеДвиженияОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов=>ПланируемыеДвиженияОстатки.ДокументПланирования.ВалютаДокумента
Команда ИТОГИ ПО предназначена для получения итогов по выбранным полям, затем позволяет производить иерархическую выборку результата запроса, а также выгрузку его сразу в ДеревоЗначений.
Обычный же результат выгружается как таблица значений (помимо линейной выборки).
Синтаксис блока ИТОГИ
Пример:
ИТОГИ
МАКСИМУМ(СуммаОборот)
ПО
ОБЩИЕ,
Ссылка ИЕРАРХИЯ
Конструктор запроса
Управление итогами производится на одноименной вкладке «Итоги»
- Доступно выбор группировочного поля
- Типа итогов (Элементы, Элементы и иерархия, Только иерархия)
- Указания наличия/отсутствия общего итога по всей выборке
- Выбор итоговых полей и выражений аналогичных по синтаксису группировке
Иерархия выборки
Выборка запроса по группировкам была рассмотрена в этой статье.
Приведем фрагмент кода:
Тонкости итогов
Если вызвать команду выгрузить с обходом по группировкам, она вернет ДеревоЗначений:
Есть интересный механизм получения аккуратного и компактного дерева через использования ВЫБОР в разделе ИТОГИ
Имя поля в итоге должно совпадать с одним из полей выборки иначе будет ошибка «Невозможно определить поле для записи результата»
Поля в итогах также должны быть в выборке, в противном случае выйдет ошибка: «Поле, по которому рассчитываются итоги, должно присутствовать в списке выборки»
ВЫБРАТЬ
4 КАК Четыре,
3 КАК Три,
2 КАК Два,
1 КАК Один
ИТОГИ
ВЫБОР
КОГДА Два ЕСТЬ NULL
ТОГДА Один
КОГДА Три ЕСТЬ NULL
ТОГДА Два
ИНАЧЕ Три
КОНЕЦ КАК Четыре
ПО
Один,
Два,
Три
На Выходе будет вот такая дерево:
- Осталось удалить лишние колонки и можно сразу выводить на форму
Как описываются машины в рекламных проспектах? “Волнующие”, “эффектные”, “изящные”, “грациозные”, “обтекаемой формы”. Прямо не знаешь, куда их вести — в гараж или в номер мотеля.
— Роберт Орбен
Эти операторы возможно использовать во всех 4 ситуациях, но контекст (окружаемые переменные у них отличаются).
В первых двух случаях условия накладываются на поля выборки, например:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК СпрКонтрагенты ГДЕ СпрКонтрагенты.ИНН<>""
Обращение идет через имя таблицы (в простых запросах может опускаться, но в сложных может вызывать неоднозначность поля).
Данное условие вызывает ограничение выборки (обычно уменьшает ее)
В конструкторе запроса находятся на вкладке условия:
В произвольном варианте пишется текстом, в обычном выбирается поле, оператор сравнения и значение:
ВЫБОР КОГДА
Этот условный оператор используется для преобразования значения, ограничивает же выборку только когда расположен после служебного слова ГДЕ.
Допустимо несколько подчиненных условий. Может находится в полях выборки, полях условий ГДЕ, группировок, итогов (универсальный оператор для сложных условий)
Например, так выглядит вариант преобразования:
ВЫБРАТЬ
ВЫБОР
КОГДА 1 = 2
ТОГДА "Никогда не будет истиной"
КОГДА 1 = 1
ТОГДА "Всегда будет истиной"
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ПолеПредставленияЗначения
Вариант использования в условии ГДЕ, результат выборки должен возвращать булево значение либо сравниваться с чем-то еще
Пример № 1
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = "" ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ
Пример № 2:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = "" ТОГДА "" ИНАЧЕ "Заполнено" КОНЕЦ = "Заполнено"
Параметры виртуальных таблиц
В данном случае оперирование идет с полями таблиц, например ресурсами, измерениями, реквизитами. В этих условиях обращение идет без точки (контекст этого не требует).
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = "RUR")
В конструкторе запроса они находятся вот здесь:
Стоит отметить, что обычно используется ограничение над измерениями, так как иначе условие отнесется к выборке для получения, а не на сам результат (на ресурсы ограничения следует наложить в операторе ГДЕ, чтобы получить ожидаемый результат).
Накладывание условия в запросе на измерения, если нет обращения через точку (как в примере выше), ускоряет выборку: на больших таблицах, это будет визуально заметно; на небольших можно использовать как удобно.
ИМЕЮЩИЕ
Для наложения отбора для результата «группировочных» функции
ВЫБРАТЬ
Контрагенты.ИНН,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1 И
Контрагенты.ИНН <> ""
В данную выборку попадут дубли ИНН, когда оно вообще заполнено.
В конструкторе запроса также находится на вкладке условия
В этой конструкции также возможно использование «группировочных» операторов И,ИЛИ, но сравнивать можно с константами запроса, с функцией или значением, входящим в группировку (другие реквизиты справочника в данном примере не будут доступны для сравнения -> тогда следует использовать ГДЕ).
Делать деньги без рекламы может только монетный двор.
— Томас Маколей
Протестируйте качество нашей работы - получите первую консультацию в подарок.
Конструкцию «РАЗРЕШЕННЫЕ» можно часто увидеть в запросах в системах 1С, в которых используются ограничения доступа на уровне записей. Это достаточно полезный механизм, позволяющий тонко настроить права для пользователей в зависимости от их значений. К примеру, разные менеджеры по продажам должны видеть документы только своих контрагентов. И если они пользуются одним отчетом, то именно использование оператора «РАЗРЕШЕННЫЕ» в запросе поможет избежать ошибки.
Возникновение ошибки
Если по какой-то причине не использовалась конструкция «РАЗРЕШЕННЫЕ», а в запросе выбираются данные пользователями, у которых настроено RLS, возникнет ошибка. Система 1С сообщит нам о том, что у текущего пользователя не хватает прав, чтобы выполнить запрос. При обычной выборке 1С последовательно берет записи из таблицы базы данных и читает их с правами пользователя. Когда попадается строка с данными скрытыми от пользователя с помощью RLS, запрос останавливается с ошибкой.
Рис.1 ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросе 1С 8.3
При добавлении команды «РАЗРЕШЕННЫЕ» после ключевого слова «ВЫБРАТЬ» ошибка уйдет, и наш запрос успешно выполнится независимо от настроек RLS. Помните, что данный оператор добавляется только в выборку верхнего уровня и влияет на весь запрос целиком и вложенные алгоритмы. Многие программисты так и поступают практически в каждом случае, считая это идеальным решением. Конечно, добавить «РАЗРЕШЕННЫЕ» – простейшее действие, но оно имеет существенный недостаток.
Именно поэтому при написании запроса с использованием оператора «РАЗРЕШЕННЫЕ» необходимо помнить про его особенности. Грамотное его применение способно существенно облегчить работу пользователей и убрать лишнюю информацию из их интерфейса. Но и слишком частое его использование приведет к тому, что отдельным сотрудникам может подаваться недостоверная информация. Это означает, что необходимо найти пути отражения ограниченной информации без использования «РАЗРЕШЕННЫЕ» в запросе 1С.
Как можно обойтись без «РАЗРЕШЕННЫЕ»?
После решения о том, что для важных отчетов лучше обойтись без использования конструкции «РАЗРЕШЕННЫЕ», нужно решить, как избежать ошибок. Исходя из вышенаписанного, нам нужно, чтобы при выполнении запроса система выбирала только те записи, права на которые есть у пользователя. Существует два способа получить нужный результат.
Первый заключается в том, чтобы перенести данные с ограничениями во вложенный запрос. Некоторым СУБД вполне хватает этого, чтобы проверка доступа отработала без ошибок и выдала ограниченные записи. Успех зависит от варианта реализации ограничений доступа на этом уровне.
Второй метод заключается в том, чтобы в запросе задать отбор по настройкам для конкретного пользователя. Реализация этого может быть разной – можно использовать соединение с таблицей настроек прав доступа или же задать ограничение при помощи параметра.
Второй вариант наиболее предпочтителен при формировании отчетов, так как достаточно универсален. Пользователи с различными правами могут пользоваться одним отчетом, если правильно выберут контрагента, подразделение или любой другой отбор, фигурирующий в RLS. Если же этого не будет сделано, то выплывет ошибка, информирующая об отсутствии прав на просмотр данных.
Разграничение прав доступа на уровне записей – достаточно сложная и тонкая настройка, особенно в системах с множеством пользователей. Оператор «РАЗРЕШЕННЫЕ» существенно облегчает учет ограничений в запросах. Но подходить к его использованию нужно, предварительно продумав, не возникнет ли впоследствии недопонимания между пользователями. Иногда лучше обязать сотрудников настраивать лишний фильтр, чем выискивать источники несоответствия в будущем.
Работая в программе 1С Предприятие 8.3, при заполнении справочников, документов, отчетов и т.п. мы часто видим перечисление в запросе, который мы открыли, определенных значений. Например:
Рис.1 Ставка НДС
- Группа основных средств, при заполнении элемента справочника
Рис.2 Группа основных средств, при заполнении элемента справочника
- И другие виды перечислений, при заполнении данных
Рис.3 И другие виды перечислений, при заполнении данных
Работа с перечислениями также имеет место при выполнении какого-то действия, например, при выборе печати или создании на основании документа (Рис.4-5) и т.п.
Перечисления представляют собой список данных, который пользователь не может корректировать или изменять, то есть они не меняются в процессе работы, поскольку заложены в конфигурацию и являются объектом метаданных.
Элемент «Перечисление» в конфигураторе программы
Рассмотрим, как выглядит перечисление в Конфигураторе программы 1С. Открыв конфигурацию, в дереве метаданных мы видим блок «Перечисления».
Рис.4 Открыв конфигурацию, в дереве метаданных мы видим блок «Перечисления»
Возникает вопрос, зачем нужны перечисления, если можно сделать выбор тех же значений, используя справочник. Перечисления используются, когда нужно ограничить выбираемые пользователем значения предустановленными, без возможности добавления их в пользовательском режиме. К значению перечисления программа может обращаться напрямую, используя присвоенное ему имя.
Рассмотрим, как выглядят наши перечисления изнутри. Для примера, найдем перечисление «Ставки НДС» и откроем его. На закладке «Основные» указывается имя перечисления и синоним объекта, который используется для описания его в программе, т.е. так, как видит его пользователь.
Рис.5 Для примера, найдем перечисление «Ставки НДС»
На закладке «Данные» мы видим все значения перечисления, которые отображаются нам в форме выбора в программе. С помощью кнопки «Добавить» (зеленый кружок с плюсом), мы можем добавлять значения перечислений.
Рис.6 На закладке «Данные» мы видим все значения перечисления
Лучше это предоставить разработчику программы, ведь все необходимые изменения вносятся обновлением программы, но для нашего примера рассмотрим создание перечислений.
Хотя все ставки уже введены, продолжим на этом примере. Чтобы добавить вариант значения перечисления нажимаем кнопку «Добавить» и в открывшемся окне задаем имя и синоним нового значения.
Рис.7 Добавляем вариант значения перечисления
Задаем значение НашаСтавка (для примера) и видим, что оно появилось в нашем списке. Так можно ввести, например, новые ставки НДС, если у вас не обновлена программа (ставку 20% уж очень хочется видеть в ней).
Рис.8 Задаем значение НашаСтавка
Используя имя перечисления, к нему можно обращаться в коде программы напрямую (перечисления из примера – НДС10, НДС18, БезНДС, НДС0).
Основными параметрами перечисления являются ссылка на объект и порядок его отображения.
Рис.9 Основными параметрами перечисления являются ссылка на объект и порядок его отображения
Формы выбора перечисления представлены формой списка и формой выбора. Каждому перечислению можно задать свою форму выбора и правила формирования списка и выбора перечисления.
Рис.10 Формы выбора перечисления представлены формой списка и формой выбора
Так выглядит перечисление изнутри. Сохраняем наши изменения в «Конфигурация-Сохранить конфигурацию» или просто при закрытии соглашаемся с изменениями.
Рис.11 Так выглядит перечисление изнутри
И далее необходимо обновить конфигурацию базы данных. Или при открытии программы через отладчик, она сама напомнит о том, что данные изменены.
Рис.12 И далее необходимо обновить конфигурацию базы данных
Объект изменен и принимаем предложение об изменении.
Рис.13 Объект изменен и принимаем предложение об изменении
Отражение изменения списка перечисления в 1С
Открываем программу и проверяем, как отразилось наше изменение «Ввод нового значения перечисления ставки НДС». Откроем в документе «Счет» выбор значения ставок. Мы видим, что в значении выбора появилось созданное нами значение «Наша ставка».
Рис.14 Отражение изменения списка перечисления в 1С
Вид выбора значения перечисления
Рассмотрев, как происходит добавление перечисления в список значений, возникает вопрос: почему и как в некоторых формах мы выбираем из предложенного списка, а в некоторых – устанавливаем переключатель, и т.п. Ведь в самой форме настройки перечисления мы этого не увидели.
Если, например, ставки НДС в документе были представлены в виде открывающегося списка для выбора, то в справочнике «Сотрудники», при вводе нового сотрудника, нам предлагается установить переключатель «Пол». Это тоже элемент перечисление, т.к. мы выбираем из определенного списка – Мужской/Женский.
Рис.15 Вид выбора значения перечисления
Если мы посмотрим на перечисление в Конфигураторе, то там увидим эти значения.
Рис.16 Перечисление в Конфигураторе
Для того чтобы посмотреть настройку их отображения, нам нужно обратиться к тому элементу, где это перечисление используется. В данном примере это справочник «Сотрудники». Открыв его, в дереве метаданных программы мы видим все его настройки, в том числе и выбор пола физического лица – ФизлицоПол, и вид – «Поле переключателя». Поэтому в справочнике мы видим его (перечисление) именно в таком виде.
Рис.17 Поле переключателя
Чтобы активировать это окно, в данном случае, мы открыли форму элемента для просмотра.
Рис.18 Откроем форму элемента для просмотра
Сравним, как реализован ввод значения перечисления, которое мы рассматривали в примере – ставки НДС в документе «Счет на оплату покупателю». Для этого также найдем этот элемент в дереве метаданных, но уже в списке документов, и посмотрим форму документа.
Рис.19 Посмотрим форму документа
Как видим, значение вида ставки НДС – Поле ввода. Обратите внимание, что при выборе реквизита, в форме этот элемент обведен синей рамкой (см. % НДС).
Для больших списков перечислений удобна такая настройка, а для перечислений, где выбор состоит из двух значений, более удобна настройка выбора в виде переключателя.
Читайте также: