Архив метки: запрос

Проверка типа в запросе

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

Пример текста запроса с проверкой типа документа:

Использование оператора ССЫЛКА в запросе

Использование оператора ССЫЛКА в запросе

Условия в запросах

12885391788FrYU9Пришлось немного поломать голову над составлением условий в запросах, на платформе 7.7. Проблема была в том, что текст запроса строился динамически и необходимо было иметь возможность гибко настраивать сложные условия, т.е. когда на одну переменную запроса нужно наложить несколько условий.

К примеру, в запросе есть переменная “Субконто”, в ней элементы справочника, есть несколько групп справочника: Группа1, Группа2, и т.п., нужно было дать возможность наложить условие на выбор:

  • Субконто входит в одну из указанных групп: (Субконто В Группа1) ИЛИ (Субконто В Группа2) и т.д.
  • Субконто не входит ни в одну из указанных групп: НЕ(Субконто В Группа1) И НЕ(Субконто В Группа2) …

В ходе экспериментов оказалось, что конструкции запроса:

УСЛОВИЕ ((Субконто В Группа1) ИЛИ (Субконто В Группа2)); – работает

УСЛОВИЕ (НЕ(Субконто В Группа1) И НЕ(Субконто В Группа2)); – не работает, т.е. результат запроса пуст

Вторую конструкцию пришлось реализовывать последовательным наложением условий и в таком варианте все замечательно заработало:

УСЛОВИЕ (НЕ(Субконто В Группа1));

УСЛОВИЕ (НЕ(Субконто В Группа2));

Замечание: для единичного запроса вполне подошла бы конструкция такого вида: УСЛОВИЕ (НЕ(Субконто В СписокГрупп)); где в список групп можно внести нужные группы, но только в моем случае заранее не было известно ни количество запросов, ни количество условий, поэтому пришлось возиться с И/ИЛИ.

Null <> Неопределено

С непривычки, может показаться, что понятия “Неопределено” и “Null” – синонимы в языке 1С, как, например, “Пока” и “While”. На самом деле это два разных типа. Значения типа Null в основном встречаются в результатах запроса, при объединении таблиц или в значениях группировок, когда запрос строится с итогами по группировкам, а значения некоторых реквизитов запроса попадают не во все группировки.

Вот описание типов из документации:

Значение типа Неопределено используется прежде всего как значение по умолчанию (незаданное значение) для полей с составным типом. Например, если есть реквизит, который имеет составной тип, включающий СправочникСсылка.Товары и СправочникСсылка.Материалы, то значением реквизита по умолчанию будет Неопределено. Так же это значение используется и в других случаях для обозначения неуказанного значения.

Значение типа Null используется при работе с таблицами прикладных объектов. Оно обозначает отсутствие значения поля в выборке. Прежде всего оно используется в результатах запросов выполняющих левое или правое соединение. Поля невыбранных записей таблиц участвующих в таких соединениях будут иметь значение Null. Кроме того, значение типа Null будет иметь, например, реквизит иерархического справочника для элементов-групп, если в метаданных указано, что этот реквизит используется только для элементов не являющихся группами.

Наглядный пример, когда одновременно понадобилось использовать оба типа:

2011-05-30_115347

В этом примере “Обороты” – выборка из запроса, “СписокТочек” – список значений, одно и то же значение из выборки нужно проверить пустое или нет и принадлежит списку значений или нет. Т.е. обращаясь к результату запроса, сравниваем с Null, а проверяя результат поиска в списке, сравниваем с Неопределено.

Произвольный запрос в списке справочника

Сегодня рассказ о том, как я боролся с очень занимательной штукой в 1С 8.2: формирование списка справочника по произвольному запросу. Что это такое? Раньше, в версии 7.7, когда нужно было в списке справочника отобразить вычисляемое поле, например цену из подчиненного справочника или остаток, мы вставляли в поле списка функцию, которая динамически вычислялась при выводе строк. Это жутко тормозило вывод строк, особенно при работе в сети. Теперь у разработчика есть возможность описать для списка справочника запрос, который будет определять состав списка и, самое главное, запрос будет выполнен на сервере перед выдачей списка клиенту. В этом запросе как раз и есть возможность вставлять вычисляемые поля.

Читать далее

Левые запросы

Выполняя запрос в 1С7.7 можно было одним ключевым словом ВСЕ включить в отчет остатков, например, не только те товары, которые есть на остатке, а вобще все товары из справочника товаров. Казалось-бы удобно. Если сравнить с запросом в 8.1 создается впечатление, что стало намного сложнее: необходимо указать источники данных, в случае с остатками это Справочник товаров и Регистр партий, а затем указать параметр их соединения. Но если разобраться, то на самом деле механизм выполнения запроса стал более прозрачным: легко представить две таблицы, имеющие поля с одинаковыми данными и задание соединить их по этим полям, а параметр ЛЕВОЕ или ПРАВОЕ определяет, с какой стороны брать все записи, а с какой только совпадающие. Просто? Вот пример, отчет по остаткам товаров с выводом всех товаров и указанием остатка для тех, у которых он есть:

2009-06-19_190959