Особенность выполнения функции ПОДСТРОКА() языка запросов

Содержание
  1. Функции работы со строками в запросах 1С
  2. Функция ЕСТЬNULL
  3. Функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ
  4. Функции ТИП и ТИПЗНАЧЕНИЯ
  5. Функция ЗНАЧЕНИЕ
  6. Оператор ССЫЛКА
  7. Оператор ВЫРАЗИТЬ
  8. Работа со строками в запросе 1с 8.3
  9. Пустая дата
  10. Пустая ссылка в запросе 1С
  11. Пустая строка
  12. СокрЛП, СокрЛ, СокрП
  13. Лев, Прав, Сред
  14. СтрДлина
  15. Найти
  16. ВРег, НРег, ТРег
  17. СтрЗаменить
  18. Функция ВЫРАЗИТЬ в запросе 1С 8.3
  19. 1. Основное применение функции ВЫРАЗИТЬ в 1С
  20. 2. Дополнительное применение функции ВЫРАЗИТЬ в запросе 1С 8.3 
  21. Конкатенация нескольких текстов запросов в пакет
  22. Многократное выполнение однотипных запросов
  23. Проверка на пустой результат выполнения запроса
  24. Ограничение на использование конструкции “ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ” в запросах
  25. Использование ключевых слов “ОБЪЕДИНИТЬ” и “ОБЪЕДИНИТЬ ВСЕ” в запросах
  26. Упорядочивание результатов запроса
  27. Как получить объект по ссылке?
  28. 1.      Создание объектов и конструктор объектов
  29. 2.      Менеджеры получения объектов системы 1С
  30. ВЫРАЗИТЬ КАК ЧИСЛО в запросе
  31. Для этого используется такой синтаксис:
  32. Общие особенности использования в запросе
  33. Демонстрация использования ВЫРАЗИТЬ в запросе для округления
  34. Преобразование настроек примитивного типа
  35. Преобразование составного типа к одиночному
  36. Как использовать перечисление в запросе 1С 8.2, 8.3
  37. 1. Что такое перечисление в запросе?
  38. 2. Примеры перечисления 1С 8
  39. 3. Перечисление в запросе

Функции работы со строками в запросах 1С

Функций и операторов для работы со строковыми данными в запросах 1С немного.

Во-первых, в запросы можно добавлять строки. Для этого «+» используется оператор «+»:

Запрос.Текст=»ВЫБЕРИТЕ

«»Строка: «» + Source.name

Из Каталога.Источник КАК Источник»;

Во-вторых, вы можете выбрать часть строки. Для этого используется функция SUBSTRING. Функция аналогична функции СРЕДА() встроенного языка 1С. Он имеет три варианта:

  1. Исходная строка.
  2. Номер символа, с которого должна начинаться выбранная строка.
  3. Подписать.

Запрос.Текст=»ВЫБЕРИТЕ

SUBSTRING(«»Строка: «», 4, 3) КАК результат»;// Результат: ок

И, наконец, есть оператор, позволяющий сравнивать строку с определенным шаблоном. Это оператор LIKE. О его использовании читайте в нашей статье о параметрах и операторах сравнения в запросах 1С.

Функция ЕСТЬNULL

NULL — это специальный тип данных на платформе «1С:Предприятие». Это также единственное возможное значение этого типа. NULL может появляться в запросах в нескольких случаях: при подключении к источникам запросов, если соответствующее значение не было найдено ни в одной из таблиц; при доступе к сведениям о несуществующем объекте; если в списке полей поиска было указано NULL (например, при объединении результатов выборки из нескольких таблиц) и т д

Поскольку NULL не является ни null, ни пустой строкой, ни даже значением Undefined, часто полезно заменить его более полезным типом данных. Вот для чего предназначена функция ISNULL.

Он имеет два варианта:

  1. Стоит проверить.
  2. Значение для замены первого параметра, если он равен NULL.

Запрос.Текст=»ВЫБЕРИТЕ

ISNULL(Source.Remainder, 0) AS Remainder»;// Если в результате запроса поле остаток=NULL,
// то он будет заменен на 0 и с ним можно будет производить математические операции

Функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ

Эти функции предназначены для получения строковых представлений различных значений. То есть они преобразуют ссылки, числа, логические значения и т д в обычный текст. Отличие между ними в том, что функция ПРЕДСТАВЛЕНИЕ преобразует все типы данных в текст (строку), а функция ПРЕДСТАВЛЕНИЕССЫЛКА преобразует только ссылки, а остальные значения возвращаются как есть, не преобразованные.

Запрос.Текст=»ВЫБЕРИТЕ

ПРИСУТСТВУЕТ(ИСТИНА) КАК логическое значение,

ПРЕДСТАВЛЕНИЕ (4) КАК ЧИСЛО,

ПРИСУТСТВУЕТ(Источник.Ссылка) КАК Ссылка,

ПРЕДСТАВЛЕНИЕ(ДАТАВРЕМЯ(2016,10,07)) КАК Дата»;
// Boolean = «Да», Number = «4», Reference = «Документ кассового чека #. от…»
// Date=»07.10.2016 00:00:00″Query.Text=»SELECT

ССЫЛОЧНОЕ ПРЕДСТАВЛЕНИЕ (ИСТИНА) КАК логическое значение,

ССЫЛОЧНОЕ ПРЕДСТАВЛЕНИЕ (4) КАК Номер,

ПРЕДСТАВЛЕНИЕССЫЛКА(Источник.Ссылка) КАК Ссылка,

ССЫЛОЧНОЕ ПРЕДСТАВЛЕНИЕ(ДАТАВРЕМЯ(2016,10,07)) КАК Дата»;
// Boolean = TRUE, Number = 4, Ref = «Документ Кассовый чек #. от…»
// Дата=07.10.2016 0:00:00

Функции ТИП и ТИПЗНАЧЕНИЯ

Функция ТИП возвращает тип данных платформы «1С:Предприятие.

Запрос.Текст=»ВЫБЕРИТЕ

ТИП (номер) ,

ТИП(строка),

ТИП (Документ. Исходящий кассовый ордер)»;

Функция VALUETYPE возвращает тип переданного ей значения.

Запрос.Текст=»ВЫБЕРИТЕ

VALUETYPE(5) КАК номер,

ТИП («Строка») КАК Строка,

ТИП(Источник.Ссылка) КАК Ссылка

Из Каталога.Источник КАК Источник»;
//Число=Число, Строка=Строка, Каталог = СсылкаСправочника.Источник

Эти функции удобно использовать, например, когда нужно определить, является ли полученное в запросе поле значением какого-либо типа. Например, контактную информацию контрагентов мы получим из реестра контактной информации (там хранятся контакты не только контрагентов, но и организаций, физических лиц и так далее):

Запрос.Текст=»ВЫБЕРИТЕ

Контактная информация. Просмотр

ОТ

Реестр информации Контактная информация AS Контактная информация

КУДА

ЗНАЧЕНИЕ ТИП(Контактная Информация.Объект) = ТИП(Каталог.Счета)»;

Функция ЗНАЧЕНИЕ

Функция значения позволяет использовать объекты конфигурации 1С в запросе напрямую, без использования параметров запроса.

Дополним предыдущий пример еще одним условием. Вам просто нужно получить телефоны контрагентов.

Запрос.Текст=»ВЫБЕРИТЕ

Контактная информация. Просмотр

ОТ

Реестр информации Контактная информация AS Контактная информация

КУДА

ЗНАЧЕНИЕ ТИП(Контактная информация.Объект) = ТИП(Каталог.Счет)

AND ContactInformation.Type = VALUE(Перечисление.ТипыContactInformation.Телефон)»;

Обратите внимание, что эту функцию можно использовать только с предопределенными значениями, т.е со значениями, к которым можно получить доступ непосредственно из конфигуратора. То есть функцию ЗНАЧ нельзя использовать с созданными пользователем элементами словаря, но можно работать с перечислениями, с предопределенными элементами словаря, со значениями EmptyReference.

Оператор ССЫЛКА

Оператор REFERENCE предназначен для проверки значений, полученных запросом, на принадлежность к определенному ссылочному типу. Ту же задачу можно выполнить с помощью функций TYPE и VALUETYPE (имеющих более широкую область применения и рассмотренных выше).

Например, задачу подбора контактной информации для контрагентов можно решить следующим образом:

Запрос.Текст=»ВЫБЕРИТЕ

Контактная информация. Просмотр

ОТ

Реестр информации Контактная информация AS Контактная информация

КУДА

Контактная информация.Объект ССЫЛКА Каталог.Контрагенты»;

Оператор ВЫРАЗИТЬ

Оператор EXPRESS используется в запросах 1С в двух случаях:

  • когда нужно изменить свойства примитивного типа;
  • когда необходимо создать поле с одним типом из поля с составным типом данных.

К примитивным типам данных относятся: число, строка, дата, логическое значение. Некоторые из этих типов данных имеют дополнительные свойства. Тип Number имеет длину и точность, тип String имеет длину или неограничен.

Оператор EXPRESS позволяет изменить не тип данных, а дополнительные свойства. Например, он может создать строку конечной длины из строки неограниченной длины. Это полезно, если вы хотите сгруппировать результаты поиска по такому полю. Группировка по полям неограниченной длины невозможна, поэтому преобразуем ее в строку длиной 200 символов.

Запрос.Текст=»ВЫБЕРИТЕ

КОЛИЧЕСТВО (различный ДОХОД ТОВАРОВ/УСЛУГ.REF) КАК REF

ОТ

Документ Получение товаров/услуг АС Получение товаров/услуг

ГРУППА

EXPRESS(Входящие товары/услуги. Комментарий AS A STRING(200))»;

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

Запрос.Текст=»ВЫБЕРИТЕ

ЭКСПРЕСС(Движение Товарооборотов.Заказ КАК Документ.Заказ Клиента).Дата КАКДатаЗаказа,

Движение товарооборота Номенклатура

ОТ

Регистр накопления Движение товаров Оборот АС Движение товаров Оборот

КУДА

Движение продаж товаров. Заказать документ по ССЫЛКЕ. Заказ клиента»;

Работа со строками в запросе 1с 8.3

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

!  Как поставить запятую на клавиатуре компьютера или ноутбука?

Значение NULL возвращается, когда атрибут просто не существует. Тип в этом случае также будет NULL. Например, вы объединяете две таблицы с помощью левого соединения. В случае, если значение для левой таблицы в правой не найдено, будет возвращено NULL.

Проверить это значение можно с помощью конструкции «IS NULL» и «». В первом случае возвращается True или False. Во втором случае можно сразу установить другое значение в случае, когда возвращается NULL.

Приведенный ниже запрос 1С 8.3 вернет список контактных лиц для тех партнеров, у которых не задан сегмент.

Пустая дата

Значение проверяется на пустую дату путем сравнения его с конструкцией DATETIME(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:

Пустая ссылка в запросе 1С

В случае, когда возвращаемый атрибут имеет ссылочный тип, например, это элемент какого-либо каталога, документ и т д., используется следующая конструкция: ЗНАЧЕНИЕ(Каталог.ИмяКаталога.ПустойСсылка).

В приведенном ниже примере запрос выбирает всех партнеров, для которых не указан бизнес-регион.

Для проверки «ValueFilled» нужно выполнить обратное условие:

Partners.BusinessRegion <> VALUE(Catalog.BusinessRegions.EmptyReference)

Пустая строка

Для проверки типов строк он сравнивается с другим шаблоном. В таком случае – «».

Приведенный ниже запрос выберет всех партнеров с пустым именем.

Несовместимые типы «ЭКСПРЕСС» — такое сообщение появляется при попытке программиста 1С 8.2 или 8.3 сравнить два разных типа.

Функция экспресс() позволяет преобразовать значение поля запроса 1С к определенному типу. Это может понадобиться в двух случаях:

1. Получить требуемую разрядность числа или требуемое количество символов в строковом значении. Количество символов для полей неограниченного типа должно быть ограничено в силу определенных особенностей.

Получите 267 часов видео 1С бесплатно:

Например:

EXPRESS(Номенклатура.Комментарий AS STRING(300))

EXPRESS(Товар.Цена КАК ЧИСЛО(15, 2)) КАК СУММА

2. Преобразуйте поле составного типа в поле одного типа. Это может быть необходимо для целей. Если в типизированное поле входит значение другого типа, система вернет NULL, поэтому всегда необходимо ставить дополнительное условие в части «ГДЕ» и ограничивать его оператором ССЫЛКА.

Например:

ВЫБРАТЬ

ЭКСПРЕСС(Продажи.Регистратор КАК Документ.Продажи)

ОТ

ГДЕ Продажи.Регистратор ССЫЛКА Документ.Осуществление

СокрЛП, СокрЛ, СокрП

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

Abbrl(«Пробелы с обеих сторон будут удалены») // «Пробелы с обеих сторон будут удалены»

Abbr(«Пробел с обеих сторон будет удален») // «Пробел слева будет удален »

Abbr(«Пробелы с обеих сторон будут удалены») // «Пробелы справа будут удалены»

Лев, Прав, Сред

Эти функции позволяют отрезать часть строки. Функция Lion() вернет часть строки слева от указанной длины. Функция «Право()» аналогична, но обрезка выполняется справа. Функция «Ср()» позволяет указать количество символов, из которых должна быть выбрана строка, и ее длину.

Lion(«String variable», 4) // возвращает «Strow»

Right(«Строковая переменная», 7) // возвращает «переменная»

Avg(«String variable», 2, 5)// возвращает «troco»

СтрДлина

Функция определяет количество символов, содержащихся в строковой переменной.

StrLength(«Word») // результатом выполнения будет число 5

Найти

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

Обратите внимание, что поиск чувствителен к регистру. Если в исходной строке есть более одного вхождения искомой подстроки, функция вернет начало первого вхождения.

Find(«раз, два, раз, два, три», «два») // функция вернет число 6

ВРег, НРег, ТРег

Эти функции очень полезны при сравнении и преобразовании строковых переменных. «Vreg()» вернет исходную строку в верхнем регистре, «HReg()» — в нижнем регистре, а «TReg()» отформатирует ее так, чтобы первый символ каждого слова был в верхнем регистре, а все последующие символы — в нижнем.

VReg(«ГЕНЕРАЛЬНЫЙ ДИРЕКТОР») // возвращаемое значение — «ГЕНЕРАЛЬНЫЙ ДИРЕКТОР»

HReg(«ГЕНЕРАЛЬНЫЙ ДИРЕКТОР») // возвращаемое значение — «ГЕНЕРАЛЬНЫЙ ДИРЕКТОР»

TReg(«ГЕНЕРАЛЬНЫЙ ДИРЕКТОР») // возвращаемое значение — «Генеральный директор»

СтрЗаменить

Эта функция аналогична замене в текстовых редакторах. Он позволяет заменить один символ или набор символов другим в строковых переменных.

StrReplace(«красный, белый, желтый», «,», «;») // возвращает «красный; белый; желтый»

Функция ВЫРАЗИТЬ в запросе 1С 8.3

1. Основное применение функции ВЫРАЗИТЬ в 1С

Основное применение функции ЭКСПРЕСС() в запросе 1С:Предприятия — извлечение значения требуемого типа из значений составного типа.

Синтаксис функции следующий:

1.png

Если преобразованное выражение имеет тип значения, отличный от того, к которому вы хотите привести, функция вернет NULL.

Проблема выглядит так: при попытке получить данные через точку из полей составного типа происходит соединение со всеми таблицами объектов 1С, входящими в составной тип. А если не у всех регистраторов есть нужные реквизиты или реквизиты имеют разные названия? В таких ситуациях рекомендуется сообщить системе, к какой таблице объектов 1С мы хотим обратиться, чтобы оптимизировать запрос.

Например, допустим, что когда мы выбирали данные из реестра «Оплата счетов в 1С 8.3», нам нужно было получить сумму документа регистратора. Мы столкнулись с ситуацией, что в документе «Списание с расчетного счета» есть реквизит «Сумма документа», а в документе «Операция» этот реквизит называется «Сумма операции». Здесь нам поможет следующий запрос 1С Предприятия:

2.png

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

Но у функции EXPRESS() есть несколько других применений.  

2. Дополнительное применение функции ВЫРАЗИТЬ в запросе 1С 8.3 

1. Для строковых типов:

· Если вам нужно получить подстроку слева (аналог функции Lion()). Приведение строкового типа к «более короткому» строковому типу приводит к усечению «неподходящей» правой части строки.

3.png

· Преобразование неограниченной строки в строку фиксированной длины. Строки неограниченной длины нельзя обрабатывать в запросах 1С:Предприятия при сравнении значений, группировке, если вы хотите получить ДРУГОЕ. Чтобы обойти эти ограничения, преобразуйте неограниченную строку в ограниченную:

4.png

2. Для числовых типов:

Округление числовых значений в запросе до определенного символа:

5.png

Обратите внимание, что EXPRESS() не является функцией преобразования типов. И хотя EXPRESS() имеет английский синоним Cast, не дайте себя обмануть, это не эквивалентно неявному преобразованию типов в SQL. Например, система выдаст ошибку при попытке преобразовать тип из числа в строку.

Конкатенация нескольких текстов запросов в пакет

Не правильно

ЗапросТекст = » «;

Если используетсяУпаковка Da

Текст Запроса =

«ВЫБРАТЬ

| Упаковка.Ссылка КАК Ссылка

| ОТ

| Håndbok.Packaging AS Упаковка;

|/////////////////////////////////////////////////////////////

|»;

Конец о;

Текст Запроса = Текст Запроса +

«ВЫБРАТЬ

| Номенклатура. Справочник AS Справочник

| ОТ

| Каталог. Номенклатура АС «Номенклатура»;

Правильно

ЗапросТекст = » «;

Если используетсяУпаковка Da

Текст Запроса =

«ВЫБРАТЬ

| Упаковка.Ссылка КАК Ссылка

| ОТ

| Håndbok.Packaging AS Pakking»;

Текст Запроса = Текст Запроса +

«

|;

|/////////////////////////////////////////////////////////////

|»;

Конец о;

!  Как закрепить строку и столбец в Excel при прокрутке

Текст Запроса = Текст Запроса +

«ВЫБРАТЬ

| Номенклатура. Справочник AS Справочник

| ОТ

| Справочник.Номенклатура АС «Номенклатура»;

Или же

Разделитель =

«

|;

|/////////////////////////////////////////////////////////////

|»;

PackageRequestTexts = новый массив;

Текст Запроса =

«ВЫБРАТЬ

| Упаковка.Ссылка КАК Ссылка

| ОТ

| Håndbok.Packaging AS Pakking»;

PackageRequestTexts.Добавить(ТекстЗапроса);

Текст Запроса =

«ВЫБРАТЬ

| Номенклатура. Справочник AS Справочник

| ОТ

| Каталог. Номенклатура АС Номенклатура «;

PackageRequestTexts.Добавить(ТекстЗапроса);

RequestText = StrConnect(PackageRequestTexts, Разделитель);

Многократное выполнение однотипных запросов

Рекомендуется получать все необходимые данные одного типа в одном запросе, а не выполнять серию запросов. 
Правильно:

// BanksToProcess — содержит массив банков, счета которых необходимо обработать 
ОбщийЗапрос = НовыйЗапрос(» 
  |ВЫБЕРИТЕ 
  | Банковские счета Привязать счет AS 
  | ОТ 
  | Directory.Bank Accounts AS Банковские счета 
  |ГДЕ 
  | Банковские счета. Банк в(&BanksToProcess)»); 
GeneralRequest.SetParameter(«JarsForProcessing», BanksForProcessing); 
SamplingAccounts = GeneralRequest.Execute().Select(); 
Цикл WhileAccountsFetch.Next 
  ProcessAccountsInBank(SelectionAccounts.Account); 
Конец цикла;

Не правильно:

// BanksToProcess — содержит массив банков, счета которых необходимо обработать 
ЧастныйЗапрос = НовыйЗапрос(» 
  |ВЫБЕРИТЕ 
  | Банковские счета Привязать счет AS 
  | ОТ 
  | Directory.Bank Accounts AS Банковские счета 
  |ГДЕ 
  | БанкСчета.Банк = &Банк»); 
За каждую банку от банки до цикла обработки 
  PrivateRequest.SetParameter(«Банк», Банк); 
  AccountsFetch = PrivateQuery.Execute().Select(); 
  Цикл WhileAccountsFetch.Next 
    ProcessAccountsInBank(SelectionAccounts.Account); 
  Конец цикла; 
Конец цикла;

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

1. Проверка отсутствия строк в результатах поиска должна выполняться с помощью метода Empty. Так как будет потрачено дополнительное время на получение выборки из результатов поиска (загрузку ее в таблицу значений. 
Не правильно:

Выбор = Запрос.Выполнить().Выбрать(); 
Если Выделение.Далее() Тогда 
  Вернуть истину; 
Еще 
  Вернуть ложь; 
Конец о;

Правильно:

Вернуть НЕ Запрос.Выполнить().Пустой()

2. При этом, если необходимо выбрать (или удалить) результат запроса, предварительный вызов метода Empty не требуется.
Например, вместо:

РезультатЗапроса = Запрос.Выполнить(); 
Если НЕ QueryResult.Empty(), то // избыточный вызов
  Выбор = РезультатЗапроса.Выбрать(); 
  Пока цикл Selection.Next
……..

  правильно:

Выбор = Запрос.Выполнить().Выбрать(); 
Пока цикл Selection.Next

Ограничение на использование конструкции “ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ” в запросах

1.1. При разработке текстов запросов следует помнить, что при работе в клиент-серверном варианте, когда в качестве СУБД используется PostgreSQL, значительно снижается производительность выполнения запросов с конструкцией FULL OUTER JOIN. Это особенно верно, когда в запросе встречается две или более таких конструкций. Поэтому обычно не рекомендуется использовать конструкцию FULL OUTER JOIN в запросах. А в тех случаях, когда это возможно, рекомендуется переписать текст исходного запроса без использования этой конструкции. Например, следующий запрос:

ВЫБРАТЬ
 ISNULL(План продаж.Номенклатура, ФактическийПродажи.Номенклатура) КАК Номенклатура,
 IS NULL(SalesPlan. Сумма, 0) AS AmountPlan,
 ISNULL(ActualSales.Sum, 0) AS SumAct
ОТ
 План продаж AS План продаж
  ПОЛНОЕ СОЕДИНЕНИЕ ActualSales AS ActualSales
  План продаж ПО.Номенклатура = Фактические продажи.Номенклатура

Может быть реализован без конструкции FULL OUTER JOIN следующим образом

ВЫБРАТЬ
 ПланФактПродажи. Номенклатура AS Номенклатура,
 SUM(PlanActSales.AmountPlan) AS SumPlan,
 SUM(PlanFactSales.SumFact) AS SumFact
ОТ
 (ВЫБРАТЬ
  План продаж Номенклатура АС Номенклатура,
  План продаж. Белёп А.С. Суммарный план,
  0 КАК SumFact
 ОТ
  План продаж AS План продаж
  ОБЪЕДИНЯЙТЕ ВСЕХ
  ВЫБРАТЬ
  Фактические продажи.номенклатура,
  0,
  Фактические продажи. Сумма
 ОТ
  ActualSales AS ActualSales) AS PlanActSalesGROUP BY
 ПланФактПродажи.Номенклатура

1.2. Исключение составляют случаи, когда текст исходного запроса нельзя переписать без использования конструкции FULL OUTER JOIN по объективным причинам. Следует помнить, что при выполнении данной конструкции на СУБД PostgreSQL она автоматически заменяется платформой 1С:Предприятие на аналог, который может выполняться в СУБД PostgreSQL. При этом сохраняются все атрибуты запроса, такие как модификаторы FIRST, DIFFERENT и ORDER BY. В таких случаях не следует «механически» заменять конструкцию FULL OUTER JOIN только для того, чтобы избавиться от нее в тексте поиска.

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

2. Не допускается одновременное использование конструкции FULL JOIN и доступ к табличным частям из части SELECT.

Это требование продиктовано особенностью выполнения таких запросов на СУБД PostgreSQL и необходимостью переносимости прикладных решений на эту СУБД.

Использование ключевых слов “ОБЪЕДИНИТЬ” и “ОБЪЕДИНИТЬ ВСЕ” в запросах

Как правило, при объединении результатов нескольких запросов в один запрос следует использовать конструкцию JOIN ALL вместо JOIN. Так как во втором варианте при объединении запросов полностью идентичные строки заменяются одной, что требует дополнительного времени, даже в тех случаях, когда в запросах не может быть одинаковых строк.

ВЫБРАТЬ 
Получение товаров, услуг. Соединять 
ОТ 
Документ Получение товаров/услуг АС Получение товаров/услуг 
ОБЪЕДИНЯЙТЕ ВСЕХ 
ВЫБРАТЬ 
Реализация товаров и услуг. Соединять 
ОТ 
Документ Продажа товаров/услуг КАК Реализация товаров/услуг

Не правильно:

ВЫБРАТЬ 
Получение товаров, услуг. Соединять 
ОТ 
Документ Получение товаров/услуг АС Получение товаров/услуг 
ОБЪЕДИНЯЙТЕ 
ВЫБРАТЬ 
Реализация товаров и услуг. Соединять 
ОТ 
Документ Продажа товаров/услуг КАК Реализация товаров/услуг

Упорядочивание результатов запроса

1.1. Если алгоритм обработки результатов запроса зависит от порядка записей в запросе или если результат обработки запроса предоставляется пользователю в той или иной форме, в теле запроса следует использовать предложение ORDER BY. В отсутствие предложения ORDER BY невозможно сделать никаких предположений о порядке, в котором записи будут отображаться в результатах поиска.

Типичные примеры проблем, которые могут возникнуть (даже при работе на одной и той же СУБД в непредсказуемое время):

  • разный порядок строк в табличной части при заполнении по результатам запроса;
  • различный порядок вывода данных (строк, столбцов) в отчетах;
  • различное наполнение движений документов по результатам запроса (*).

Вероятность получения разных результатов при выполнении одних и тех же действий увеличивается 

  • при миграции информационной базы на другую СУБД
  • при смене версии СУБД
  • при изменении параметров СУБД

* Примечание: упорядочивание результатов запросов, формирующих движения, оправдано только в том случае, если упорядочивание является частью алгоритма формирования движений (например, списание остатка по отгрузкам товаров по ФИФО). В остальных случаях записи не следует упорядочивать, так как дополнительное упорядочивание создаст слишком большую нагрузку на СУБД.

1.2. При сортировке поля запроса, которое потенциально может содержать NULL, следует учитывать, что порядок сортировки для этого поля может различаться в разных СУБД.

Не правильно:

ВЫБРАТЬ
  Ссылка на номенклатуру каталога Ссылка на номенклатуру AS,
  InventoryRemains.QuantityRemaining AS QuantityRemaining
ОТ
  Номенклатура каталога АС Номенклатура каталога
    ЛЕВОЕ СОЕДИНЕНИЕ
    Программное обеспечение (ЗапасыОстатки.Номенклатура = СправочникНоменклатура.Справочник)
СОРТИРОВАТЬ ПО
  Баланс количества

Правильно:

ВЫБРАТЬ
  Ссылка на номенклатуру каталога Ссылка на номенклатуру AS,
  ISNULL(InventoryRemains.QuantityRemaining, 0) AS QuantityRemaining
ОТ
  Номенклатура каталога АС Номенклатура каталога
    ЛЕВОЕ СОЕДИНЕНИЕ
    Программное обеспечение (ЗапасыОстатки.Номенклатура = СправочникНоменклатура.Справочник)
СОРТИРОВАТЬ ПО
  Баланс количества

1.3. Если результаты поиска должны каким-то образом отображаться пользователю, то

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

В противном случае порядок строк покажется пользователю случайным (необъяснимым).

1.4. Отсутствие предложения по ПОРЯДКУ оправдано только в тех случаях, когда

  • алгоритм обработки результатов поиска не зависит от конкретного порядка записей
  • результат обработки выполненного запроса не отображается пользователю
  • результат запроса, очевидно, одна запись
!  Как посчитать процент от числа и долю в Эксель

В таких случаях рекомендуется не включать предложение ORDER BY в тело запроса, так как это приводит к дополнительным затратам времени на выполнение запроса.

Как получить объект по ссылке?

1.      Создание объектов и конструктор объектов

Привет коллеги! В данной статье будет рассмотрена работа с объектами и ссылками в 1С 8.3, в том числе как получить объект по ссылке и наоборот — ссылку с объекта.

Не секрет, что в системе 1С очень многое упирается в привязку разных типов данных, так как основная задача языка 1С — обработка данных, которые были получены посредством запроса.

Чаще всего в 1С данные представлены в виде объектов, хотя бывают случаи, когда данные работают как таблица. Например, рассмотрим объект «Каталог.ИмяКаталога»: он регулирует работу с определенным справочником, но сам объект тоже имеет свойства (в данном случае это поле данных), а также методы.

Объект в системе 1С создается с помощью специального оператора «Создать», после чего для создания объектов используется соответствующий конструктор. Если тип объекта может иметь несколько конструкторов, конструктор для создания объекта будет выбран с использованием параметров, как показано в строке кода ниже:

1s-получить-объект-по-ссылке.png

Рис. 1 Выбор конструктора объектов для создания объектов 

2.      Менеджеры получения объектов системы 1С

Если необходимо создать объект 1С, который будет иметь связь с базой данных, используются специальные менеджеры, а не оператор «Новый».

Для всех типов метаданных существует соответствующий обработчик объектов 1С, который получает значение из базы данных на основе признака, либо создает новую базу данных. Пример кода для создания объекта через менеджер показан ниже:

1s-получить-объект.png

Рис. 2 Создание объекта менеджера в 1С  

ВЫРАЗИТЬ КАК ЧИСЛО в запросе

Встроенная функция запроса EXPRESS() используется не только для приведения, но и для округления чисел.

Для этого используется такой синтаксис:

ЭКСПРЕСС(ЧИСЛО (.))

Общие особенности использования в запросе

Если в качестве параметра передается нечисловое значение, это может не привести к сбою запроса, но значение не будет обработано корректно:

Например, если передано значение NULL или если оно было сгенерировано объединением таблиц, выходные данные останутся NULL:

Демонстрация использования ВЫРАЗИТЬ в запросе для округления

ВЫБРАТЬ 1,56 КАК НОМЕР Пример, ВЫРАЖАТЬ (1,56 КАК ЧИСЛО (15, 0)) КАК ЧИСЛО, ВЫРАЖАТЬ (1,56 — 0,5 КАК ЧИСЛО (15, 0)) КАК INTELE ВНИЗ, ВЫРАЖАТЬ (1,56 КАК ЧИСЛО (15, 0)) 4

Половина денег, потраченных на рекламу, тратится впустую; а как узнать какая половина?

— Уильям Хескет Ливер

capitally.ru

Преобразование настроек примитивного типа

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

ВЫБЕРИТЕ ЭКСПРЕСС(Квитанция.Комментарий КАК СТРОКА(300)) КАК Комментарий, КОЛИЧЕСТВО(Квитанция.Ссылка) КАК Ссылка ИЗ Документа.Квитанция КАК КвитанцияГРУППА ПО

    EXPRESS(Incoming.Comment AS A STRING(300))

Другая ситуация, когда в запросе используются вычисления, на выходе мы можем получить число с большим количеством знаков после запятой (1100.001568794). Чтобы не обрабатывать это число после выполнения запроса, его можно сразу урезать до нужной длины, но важно понимать, что число усекается, а не округляется. Пример:

ВЫБЕРИТЕ Sales.Item, EXPRESS (Sales.Quantity * Sales.Price AS NUMBER (15, 2)) AS SumFOR

    Регистр накопления.Продажи AS Salg

Преобразование составного типа к одиночному

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

Допустим, вы хотите получить номер каждого регистратора из PH Sales, напишите запрос:

ВЫБЕРИТЕ ДРУГОЙ Sales.Registrar.Number FROM

    Регистр накопления.Продажи AS Salg

Действительно, нет ничего проще. Только 1С на этапе выполнения конвертирует этот запрос без каких-либо подключений в запрос с таким количеством подключений, сколько у нас есть возможных регистраторов. Если в этот регистр записано 20 документов, мы получим SQL-запрос с 20 оставшимися соединениями. Почему это происходит? Потому что встроенный оптимизатор 1С не очень хорошо обрабатывает поля, полученные через точку, в данном случае это атрибут Число. Это куки, если мы хотим часто получать номер документа, то разумнее всего включить его в реквизиты реестра или использовать оператор ЭКСПРЕСС, но в ущерб краткости:

ВЫБЕРИТЕ РАЗЛИЧНЫЕ Sales.Registrar.Number, ВЫБЕРИТЕ КОГДА Sales.Registrar REF Document.Invoice THEN EXPRESS(Sales.Registrar AS Document.Invoice) ELSE SELECT WHEN Sales.Registrar REF Document.Sales THEN EXPRESS(Sales.Registrar AS Document.Invoice) END… ЗАКОНЧИВАТЬСЯ ЧИСЛОМ

    Регистр накопления.Продажи AS Salg

Теперь в левом участии будет участвовать одна конкретная таблица.

В общем случае следует внимательно обращаться к данным через точку, т.к. 1С в этом случае использует левое соединение в SQL-запросе, что может существенно повлиять на производительность. Это один из пунктов оптимизации.

Как использовать перечисление в запросе 1С 8.2, 8.3

Данная статья призвана помочь освоить такой объект конфигурации 1С, как перечисление. Расскажем, как его использовать в тексте заявки 1С.

1. Что такое перечисление в запросе?

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

Неизменяемость данных — основное преимущество, отличающее «Перечисление» от «Справочника». Так как в справочнике 1С 8.2, 8.3 у пользователя есть возможность удалить определенное значение или заменить название, что может «сломать» программу, т.к для работы необходимы конкретные значения, для дальнейшего использования в коде программы.

2. Примеры перечисления 1С 8

Рассмотрим пример перечисления 1С 8 в нашей базе.

В базе данных создан перечень «Качество товаров». Он включает такие значения, как: «Высокий/Нормальный/Низкий»:

1.png

Перечисления можно использовать в различных других объектах в конфигураторе, например в справочнике или документе в 1С 8.3 (например, возьмем товарный документ). Для этого типа атрибута 1С необходимо указать «ПеречисленияСсылка»:

2.png

Поэтому при заполнении данного документа в пользовательском режиме 1С у нас будет возможность выбрать необходимое значение из существующего списка (в поле «Качество товара»):

3.png

3. Перечисление в запросе

Рассмотрим запрос, который включает в себя выбор элементов и качества из документа. Особенность использования значений перечисления 1С в запросе 1С заключается в том, что для этого нужно использовать функцию «Значение»:

    4.png

При таком выполнении запроса 1С в поле «Качество товара» отображаются только товары со значением «Обычное»:

5.png

Источники

  • https://chel1c.ru/querry_functions/
  • https://pc-optimize.ru/rabota-so-strokami-v-zaprose-1s-8-3/
  • https://www.koderline.ru/expert/instruktsii/article-funktsiya-vyrazit-v-zaprose-1s-8-3/
  • https://master1c8.ru/platforma-1s-predpriyatie-8/sistema-standartov-i-metodik-razrabotki/5509/
  • https://www.koderline.ru/expert/instruktsii/article-kak-poluchit-obekt-po-ssylke/
  • https://adelite.ru/stati-1s/1s-vyrazit-v-zaprose-kak-chislo.html
  • [https://spb.koderline.ru/expert/instruktsii/article-kak-ispolzovat-perechislenie-v-zaprose-1s-8-2-8-3/]

Оцените статью
Про ПК