Особливість виконання функції підрядка(). Особливість виконання функції підрядка() 1с пошук у запиті


Інші розглянемо зараз.

Функції роботи з рядками у запитах 1С

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

По-перше, рядки у запитах можна складати. Для цього використовується оператор «+»:

Запит. Текст = "ВИБРАТИ
Рядок: " + Джерело.Найменування
;

По-друге, можна виділити частину рядка. Для цього використовується функція ПІДСТРОКУ.Функція аналогічна до вбудованої мови 1С. Має три параметри:

  1. Рядок-джерело.
  2. Номер символу, з якого повинен починатися рядок, що виділяється.
  3. Кількість символів.

Запит. Текст = "ВИБРАТИ
ПІДСТРОКУ("
Рядок: ", 4, 3) ЯК Результат"; // Результат: ока

Функція Є NULL

NULL - особливий тип даних на платформі 1С: Підприємство. Він є єдиним можливим значенням цього. NULL може виникати в запитах у кількох випадках: при з'єднаннях джерел запиту, якщо не було знайдено відповідного значення в одній таблиці; при зверненні до реквізитів неіснуючого об'єкта; якщо NULL було вказано у списку полів запиту (наприклад при об'єднанні результатів вибірки з кількох таблиць) тощо.

Оскільки NULL не є ні нулем, ні порожнім рядком, ні навіть значенням НЕ визначено,його часто буває корисно замінювати на якийсь корисніший тип даних. Для цього і призначено функцію Є NULL.

Вона має два параметри:

  1. Перевірене значення.
  2. Значення, на яке потрібно замінити перший параметр, якщо він дорівнював NULL.

Запит. Текст = "ВИБРАТИ
Є NULL (Джерело. Залишок, 0) ЯК Залишок"
; // Якщо в результаті запиту поле залишок = NULL,
// воно заміниться на 0, і з ним можна буде виконувати математичні дії

Функції ПРЕДСТАВЛЕННЯі ПОДАННЯ ПОСИЛАННЯ

Ці функції призначені для отримання рядкових уявлень різних значень. Тобто, вони перетворять посилання, числа, бульова тощо. у звичайний текст. Різниця між ними в тому, що функція ПРЕДСТАВЛЕННЯперетворює на текст (рядок) будь-які типи даних, а функція ПОДАННЯ ПОСИЛАННЯ— лише посилання, а решта значень повертає як є, не перетвореними.

Запит. Текст = "ВИБРАТИ
ПРЕДСТАВЛЕННЯ (ІСТИНА) ЯК Бульово,
ПОДАННЯ (4) ЯК Число,
ПОДАННЯ (Джерело.Посилання) ЯК Посилання,
ПРЕДСТАВЛЕННЯ(ДАТАЧАС(2016,10,07)) ЯК Дата"
;
// Бульово = "Так", Число = "4", Посилання = "Документ Видатковий касовий ордер № ... від ..."
// Дата="07.10.2016 0:00:00"

Запит. Текст = "ВИБРАТИ
ПОДАННЯ ПОСИЛАННЯ (ІСТИНА) ЯК Бульово,
ПОДАННЯ ПОСИЛАННЯ (4) ЯК Число,
ПОДАННЯ ПОСИЛАННЯ (Джерело.Посилання) ЯК Посилання,
ПОДАННЯ ПОСИЛАННЯ (ДАТАЧАС(2016,10,07)) ЯК Дата"
;
// Бульово = ІСТИНА, Число = 4, Посилання = "Документ Видатковий касовий ордер № ... від ..."
// Дата=07.10.2016 0:00:00

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

Функція ТИПповертає тип даних платформи 1С:Підприємство.

Запит. Текст = "ВИБРАТИ
ТИП (Число),
ТИП (Рядок),
ТИП (Документ. Витратний Касовий Ордер)
;

Функція ТИЗНАЧЕННЯповертає тип переданого до неї значення.

Запит. Текст = "ВИБРАТИ
ТИПЗНАЧЕННЯ (5) ЯК Число,
ТИП ("
"Рядок" ") ЯК Рядок,
ТИП (Джерело.Посилання) ЯК Довідник
З Довідник.Джерело ЯК Джерело"
;
// Число = Число, Рядок = Рядок, Довідник = Довідник Посилання.

Ці функції зручно застосовувати, наприклад, коли потрібно з'ясувати, чи є отримане в запиті поле значенням якогось типу. Наприклад, отримаємо контактну інформацію контрагентів з регістру відомостей Контактна інформація (там зберігаються контакти не тільки контрагентів, а й організацій, фізичних осіб тощо):

Запит. Текст = "ВИБРАТИ

З

ДЕ
ТИПЗНАЧЕННЯ(КонтактнаІнформація.Об'єкт) = ТИП(Довідник.Контрагенти)"
;

Функція ЗНАЧЕННЯ

Функція Значеннядозволяє використовувати в запиті конфігураційні об'єкти 1С безпосередньо, без застосування .

Доповнимо попередній приклад ще однією умовою. Необхідно отримати лише телефони контрагентів.

Запит. Текст = "ВИБРАТИ
Контактна Інформація.
З
РеєстрДовідок.КонтактнаІнформація ЯК КонтактнаІнформація
ДЕ
ТИПЗНАЧЕННЯ(КонтактнаІнформація.Об'єкт) = ТИП(Довідник.Контрагенти)
І КонтактнаІнформація.Тип = ЗНАЧЕННЯ(Перерахування.ТипиКонтактноїІнформації.Телефон)"
;

Слід зазначити, що цю функцію можна використовувати з певними значеннями, тобто. зі значеннями, яких можна звернутися безпосередньо з конфігуратора. Тобто функція ЗНАЧЕННЯне можна використовувати з елементами довідників, створеними користувачами, але може працювати з перерахуваннями, з визначеними елементами довідників, зі значеннями ПорожнєПосилання.

Оператор ПОСИЛАННЯ

Оператор ПОСИЛАННЯпризначений для перевірки значень, одержуваних запитом, на належність до певного типу посилань. Це завдання можна виконати за допомогою функцій ТИПі ТИЗНАЧЕННЯ(які мають більш широку сферу застосування та були розглянуті вище).

Наприклад, завдання вибору контактної інформації контрагентів можна було й так:

Запит. Текст = "ВИБРАТИ
Контактна Інформація.
З
РеєстрДовідок.КонтактнаІнформація ЯК КонтактнаІнформація
ДЕ
КонтактнаІнформація.Об'єкт ПОСИЛАННЯ Довідник.Контрагенти"
;

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

Оператор ВИРАЗИТИвикористовується у запитах 1С у двох випадках:

  • коли необхідно змінити характеристики примітивного типу;
  • коли потрібно з поля зі складеним типом даних зробити поле з одиночним типом.

До примітивних типів даних належать: число, рядок, дата, бульова.Деякі з цих типів даних мають додаткові характеристики. Тип Числомає довжину та точність, тип Рядокдовжину чи необмеженість.

Оператор ВИРАЗИТИдозволяє змінювати тип даних, саме додаткові характеристики. Наприклад, він може з рядка з необмеженою довжиною зробити рядок з обмеженою довжиною. Це буває корисним, якщо потрібно згрупувати результати запиту по такому полю. Виконувати угруповання по полях з необмеженою довжиною не можна, тому ми його перетворимо на рядок із довжиною 200 символів.

Запит. Текст = "ВИБРАТИ
КІЛЬКІСТЬ (РІЗНІ ВСТУП ТОВАРІВ Послуг. Посилання) ЯК Посилання
З
Документ.Надходження ТоварівПослуг ЯК НадходженняТоварівПослуг
ЗГРУПУВАТИ ПО
ВИРАЗИТИ(НадходженняТоварівПослуг.Коментар ЯК РЯДКУ(200))"
;

У ряді випадків запити до полів зі складовим типом даних можуть оброблятися платформою 1С неоптимально. Це призводить до збільшення часу виконання запитів, тому корисно заздалегідь перетворити складовий тип в одиночний.

Запит. Текст = "ВИБРАТИ
ВИРАЗИТИ(Рух ТоварівОбороти.Розпорядження ЯК Документ.ЗамовленняКлієнта).Дата ЯК ДатаЗамовлення,
Рух ТоварівОбороти.Номенклатура
З
РегістрНакопичення.Рух Товарів.Обороти ЯК РухТоварівОбороти
ДЕ
Рух ТоварівОбороти.Розпорядження ПОСИЛАННЯ Документ.ЗамовленняКлієнта"
;

Оператори ВИБІРі Є NULL

Оператор ВИБІРаналогічний оператору ЯКЩОу вбудованій мові 1С, але має дещо урізаний функціонал.

Допустимо ми хочемо отримати контактні дані з регістру відомостей Контактна Інформація і при цьому в окремому полі запиту вказати, чи вони належать контрагенту або фізичній особі.

Запит. Текст = "ВИБРАТИ
Контактна Інформація.
ВИБІР
КОЛИ ТИПЗНАЧЕННЯ(КонтактнаІнформація.Об'єкт) = ТИП(Довідник.Контрагенти)
ТОДИ
Контрагент "
Інакше ВИБІР
КОЛИ ТИПЗНАЧЕННЯ (Контактна Інформація. Об'єкт) = ТИП (Довідник. Фізичні Особи)
ТОДИ
Фіз особа"
Інакше " Хтось інший "
КІНЕЦЬ
КІНЕЦЬ ЯК Власник
З
РеєстрВідомостей.КонтактнаІнформація ЯК КонтактнаІнформація"
;

Як видно з прикладу, у конструкції ВИБІРзавжди є умова після слова КОЛИ;значення, яке застосовується, якщо умова виконується, після слова ТОДІі значення, яке застосовується, якщо умова не виконується, після слова Інакше.Усі три елементи конструкції ВИБІРє обов'язковими. Опустити елемент Інакше, так само, як це робиться при використанні оператора ЯКЩОу вбудованій мові 1С, не можна. Також у оператора ВИБІРвідсутній аналог конструкції Інакше, Зате можна вкласти один ВИБІРв іншій, як і було зроблено у нашому прикладі.

Оператор Є NULLвикористовується в конструкції ВИБІРпорівняння поля запиту з типом NULL.

Запит. Текст = "ВИБРАТИ
ВИБІР
КОЛИ Значення Є NULL ТОДІ 0
Інакше значення
КІНЕЦЬ"
;

Крім того, оператор Є NULLможна використовувати в умовах запиту, наприклад, у пропозиції ДЕ.

У мові запитів 1С:Підприємства функція ПІДСТРОКУ()в форматі ПІДСТРОКУ(<Исходная строка>, <Начало>, <Длина>) може застосовуватися до даних рядкового типу та дозволяє виділити фрагмент<Исходной строки>, що починається з номер символ<Начало>(символи в рядку нумеруються з 1) та довжиною<Длина>символів. Результат обчислення функції ПІДСТРОКУ() має рядковий тип змінної довжини, причому довжина буде вважатися необмеженою, якщо<Исходная строка>має необмежену довжину та параметр<Длина>не є константою чи перевищує 1024.

Обчислення функції ПІДСТРОКУ() на SQL сервері:
У клієнт-серверному варіанті роботи функція ПІДСТРОКУ() реалізується за допомогою функції SUBSTRING() відповідного оператора SQL, що передається серверу баз даних SQL Server, який обчислює тип результату функції SUBSTRING() за складними правилами залежно від типу та значень її параметрів, а так ж у залежності від контексту, в якому вона використовується.

У більшості випадків ці правила не впливають на виконання запиту 1С:Підприємства, однак є випадки, коли для виконання запиту істотна максимальна довжина рядка результату, обчислена SQL Server. Важливо мати на увазі, що в деяких контекстах використання функції ПІДСТРОКУ() максимальна довжина її результату може бути рівною максимальної довжині рядка обмеженої довжини, яка в SQL Server дорівнює 4000 символів. Це може призвести до несподіваного завершення запиту.

Наприклад, запит:
Код 1C v 8.х ВИБРАТИ
ВИБІР

Інакше NULL
КІНЕЦЬ ЯК Подання,
ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
ТОДИ ПІДСТРОКУ(Уявлення, 0, 200)
Інакше NULL
КІНЕЦЬ ЯК Подання1
З
ВПОРЯДКУВАТИ ЗА
Подання,
Подання1
завершується аварійно з повідомленням Помилка СУБД:
Microsoft OLE DB Provider для SQL Server: Warning: Processor Processor не може виконати потрібний план з optimizer, тому що загальний рівень всіх columnів в GROUP BY або ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618

Це відбувається тому, що обчислена Microsoft SQL Server максимальна довжина рядка, яка є результатом виразу:
Код 1C v 8.х ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
ТОДИ ПІДСТРОКУ(Уявлення, 0, 200)
Інакше NULL
КІНЕЦЬ ЯК Подання,
дорівнює 4000 символів. Тому довжина запису, що складається з двох таких полів, перевищує 8000 байт, дозволені для виконання операції сортування.

У зв'язку з описаною особливістю виконання функції SUBSTRING() на SQL Server використання функції ПІДСТРОКУ() з метою приведення рядків необмеженої довжини до рядків обмеженої довжини не рекомендується. Замість неї краще використовувати операцію наведення типу ВИРАЗИТИ(). Зокрема, наведений приклад можна переписати у вигляді:
Код 1C v 8.х ВИБРАТИ
ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
Інакше NULL
КІНЕЦЬ ЯК Подання,
ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
ТОДИ ВИРАЗИТИ(Уявлення ЯК Рядок(200))
Інакше NULL
КІНЕЦЬ ЯК Подання1
З
РеєстрДовідок.КонтактнаІнформація ЯК КонтактнаІнформація
ВПОРЯДКУВАТИ ЗА
Подання,
Подання1

Мова запитів у 1С 8 — це спрощений аналог широко відомої «структурованої мови програмування» (як найчастіше її називають SQL). Але в 1С він використовується тільки для читання даних, зміни даних застосовується об'єктна модель даних.

Ще одна цікава відмінність – російський синтаксис. Хоча насправді можна використовувати і англомовні конструкції.

Приклад запиту:

ВИБРАТИ
Банки.
Банки.КоррРахунок
З
Довідник. Банки ЯК Банки

Даний запит дозволить побачити нам інформацію про найменування та кореспондентський рахунок усіх існуючих у базі даних банків.

Мова запитів – найпростіший та найефективніший спосіб отримання інформації. Як очевидно з прикладу вище, у мові запитів необхідно апелювати іменами метаданих ( – це перелік об'єктів системи, у тому числі складається конфігурація, тобто довідники, документи, регістри тощо.).

Опис конструкцій мови запитів

Структура запитів

Для отримання даних достатньо використовувати конструкції «ВИБРАТИ» ​​(select) та «З» (from). Найпростіший запит має такий вигляд:

ВИБРАТИ * З Довідники.Номенклатура

Де "*" означає вибір всіх полів таблиці, а Довідники. Номенклатура - ім'я таблиці в базі даних.

Розглянемо складніший і загальний приклад:

ВИБРАТИ
<ИмяПоля1>ЯК<ПредставлениеПоля1>,
Сума(<ИмяПоля2>) ЯК<ПредставлениеПоля2>
З
<ИмяТаблицы1>ЯК<ПредставлениеТаблицы1>
<ТипСоединения>З'ЄДНАННЯ<ИмяТаблицы2>ЯК<ПредставлениеТаблицы2>
ПЗ<УсловиеСоединениеТаблиц>

ДЕ
<УсловиеОтбораДанных>

ЗГРУПУВАТИ ПО
<ИмяПоля1>

ВПОРЯДКУВАТИ ЗА
<ИмяПоля1>

ПІДСУМКИ
<ИмяПоля2>
ПЗ
<ИмяПоля1>

У даному запиті ми вибираємо дані полів «Ім'яПоля1» та «Ім'яПоля1» з таблиць «Ім'яТаблиці1» та «Ім'яТаблиці», присвоюємо полям синоніми за допомогою оператора «КАК», з'єднуємо їх за умовою «УмоваЗ'єднанняТаблиць».

З отриманих даних ми відбираємо тільки дані, що відповідають умові з «ДЕ» «Умова Відбору Даних». Далі ми групуємо запит по полю «Ім'яПоля1», при цьому підсумовуючи «Ім'яПоля2».

Останньою дією ми сортуємо запит за допомогою конструкції «ПОРЯДОЧИТИ ПО».

Загальні конструкції

Розглянемо загальні конструкції мови запитів 1С 8.2.

ПЕРШІn

За допомогою цього оператора можна отримати n кількість перших записів. Порядок записів визначається порядком запиту.

ВИБРАТИ ПЕРШІ 100
Банки.
Банки.КОД ЯК БІК
З
Довідник. Банки ЯК Банки
ВПОРЯДКУВАТИ ЗА
Банки.Найменування

Запитом буде отримано перші 100 записів довідника «Банки», впорядкованих за абеткою.

ДОЗВОЛЕНІ

Ця конструкція актуальна для роботи з механізмом. Суть механізму обмеження читання (та інших дій) користувачам для конкретних записів у таблиці бази даних, а чи не таблиці загалом.

Якщо користувач намагається за допомогою запиту прочитати записи, недоступні йому, він отримає повідомлення про помилку. Щоб цього уникнути, слід використовувати конструкцію «ДОЗВОЛЕНІ», тобто запит читатиме лише дозволені йому записи.

ВИБРАТИ ДОЗВОЛЕНІ
СховищеДодатковоїІнформації.Посилання
З
Довідник.СховищеДодатковоїІнформації

РІЗНІ

Використання «РІЗНІ» дозволить виключити попадання рядків-дублів у результат запиту 1С. Дублювання означає збіг всіх полів запиту.

ВИБРАТИ ПЕРШІ 100
Банки.
Банки.КОД ЯК БІК
З
Довідник. Банки ЯК Банки

ПорожняТаблиця

Ця конструкція використовується дуже рідко для об'єднання запитів. При об'єднанні може виникнути потреба вказати в одній із таблиць порожню вкладену таблицю. Для цього якраз підійде оператор «Порожня Таблиця»

Приклад із довідки 1С 8:

ВИБРАТИ Посилання.Номер, ПОРОЖНЯТАБЛИЦЯ.(Ном, Тов, Кол) ЯК Склад
З Документ.
ОБ'ЄДНАТИ ВСЕ
ВИБРАТИ Посилання.Номер, Склад.(НомерРядки, Товар, Кількість)
З Документ.РозхНакл Документ.ВидатковаНакладна.Склад.*

Є NULL

Дуже корисна функція, яка дозволяє уникнути багатьох помилок. ЄNULL() дозволяє замінити значення NULL на потрібне. Дуже часто використовується у перевірках на наявність значення у приєднаних таблицях, наприклад:

ВИБРАТИ
НоменклатураСпр.Посилання,
ЄNULL(ЗалишкиТовара.КількістьЗалишок,0) ЯК КількістьЗалишок
З


Можна використати і по-іншому. Наприклад, якщо для кожного рядка не відомо, у якій таблиці існує значення:

ЄNULL(РахунокФактураОтриманий.Дата, РахунокФактураВиданий.Дата)

ЯК – оператор, який дозволяє нам присвоїти ім'я (синонім) таблиці чи полю. Приклад використання ми бачили вище.

Дані конструкції дуже схожі - вони дозволяють отримати рядкове уявлення потрібного значення. Єдина відмінність у тому, що УЯВАННЯ перетворює будь-які значення в рядковий тип, а ПРЕДСТАВЛЕННЯ ПОСИЛАННЯ - тільки посилання. ПОДАННЯ ПОСИЛАННЯ рекомендується застосовувати в запитах системи компонування даних для оптимізації, якщо, звичайно, поле посилальних даних не планується використовувати у відборах .

ВИБРАТИ
Подання (Посилання) // рядок, наприклад «Авансовий звіт №123 від 10.10.2015
Подання(ПоміткаВидалення) ЯК ПоміткаВидаленняТекст, //рядок, «Так» або «Ні»
ПоданняПосилання(ПоміткаВидалення) ЯК ПоміткаВидаленняБулеве //булево, Істина або Брехня
З
Документ.АвансовийЗвіт

ВИРАЗИТИ

Виразити дозволяє конвертувати значення поля до потрібного типу даних. Можна перетворити значення як до примітивного типу, і до посилального типу.

Виразити для посилання типу використовується для обмеження запитуваних типів даних в полях складового типу, часто використовується для оптимізації роботи системи. Приклад:

ВИРАЗИТИ(ТаблицяВитрат.Субконто1 ЯК Довідник.СтаттіВитрат).ВідДіяльностіДля ПодатковогоОблікуВитрат

Для примітивних типів ця функція часто використовується для обмеження кількості символів на полях необмеженої довжини (з такими полями не можна порівнювати). Щоб уникнути помилки « Неправильні параметри операції порівняння. Не можна порівнювати поля
необмеженої довжини та поля несумісних типів
», необхідно виразити такі поля наступним чином:

ВИРАЗИТИ(Коментар ЯК Рядок(150))

РІЗНІСТЬДАТ

Отримайте 267 відеоуроків з 1С безкоштовно:

Приклад використання Є NULL у запиті 1С:

ВИБРАТИ * З
Спр
ЛІВОЕ З'ЄДНАННЯ РеєстрНакопичення.ТовариНаСкладах.Залишки ЯК ЗалишкиТовара
ПО НоменклатураСпр.Посилання = РеалізованіТовариКомітентівЗалишки.Номенклатура
ДЕ НЕ ЗалишкиТовара.КількістьЗалишок Є NULL

Тип даних у запиті можна визначити таким чином: за допомогою функцій ТИП() та ТИПЗНАЧЕННЯ() або за допомогою логічного оператора ПОСИЛАННЯ. Ці дві функції аналогічні.

Зумовлені значення

Крім використання у запитах переданих параметрів у мові запитів 1С можна використовувати визначені значення або . Наприклад, перерахування, зумовлені довідники, плани рахунків тощо. Для цього використовується конструкція «Значення()».

Приклад використання:

Де Номенклатура.ВидНоменклатури = Значення(Довідник.ВидиНоменклатури.Товар)

ДЕ Контрагенти.ВидКонтактноїІнформації = Значення(Перерахування.ВидиКонтактноїІнформації.Телефон)

ДЕ ЗалишкиПорахунків.РахунокОбліку = Значення(ПланРахунків.Госпрозрахунковий.ПрибуткиЗбитки)

З'єднання

З'єднання бувають 4 типи: ЛІВОЕ, ПРАВО, ПОВНЕ, ВНУТРІШНЄ.

ЛІВОЕ І ПРАВОЕ З'ЄДНАННЯ

З'єднання використовуються для зв'язку двох таблиць за певною умовою. Особливість при ЛІВОМУ З'ЄДНАННІу тому, що ми беремо першу вказану таблицю повністю та прив'язуємо за умовою другу таблицю. Поля другої таблиці, які вдалося прив'язати за умовою, заповнюються значенням NULL.

Наприклад:

Поверне всю таблицю Контрагентів і заповнить поле “Банк” лише тих місцях, де буде дотримуватися умова “Контрагенти.Найменування = Банки.Наименование”. Якщо умови не дотримуються, у полі Банк буде встановлено NULL.

ПРАВА З'ЄДНАННЯ в мові 1Сабсолютно аналогічно ЛІВОМУ з'єднанню, за винятком однієї відзнаки – у ПРАВОМУ З'ЄДНАННІ"Головна" таблиця - друга, а не перша.

ПОВНЕ З'ЄДНАННЯ

ПОВНЕ З'ЄДНАННЯвідрізняється від лівого та правого тим, що виводить усі записи з двох таблиць, з'єднує лише ті, які може з'єднати за умовою.

Наприклад:

З

ПОВНЕ З'ЄДНАННЯ
Довідник. Банки ЯК Банки

ПЗ

Мова запитів поверне обидві таблиці лише за виконаною умовою з'єднати записи. На відміну від лівого/правого з'єднання можлива поява NULL у двох полях.

ВНУТРІШНЯ З'ЄДНАННЯ

ВНУТРІШНЯ З'ЄДНАННЯвідрізняється від повного тим, що виводить ті записи, які змогли з'єднати за заданою умовою.

Наприклад:

З
Довідник.Контрагенти ЯК Клієнти

ВНУТРІШНЯ З'ЄДНАННЯ
Довідник. Банки ЯК Банки

ПЗ
Клієнти. Найменування = Банки. Найменування

Цей запит поверне лише рядки, в яких банк і контрагент мають однакову назву.

Об'єднання

Конструкція Об'єднати і об'єднати ВСЕ об'єднує два результати в один. Тобто. результат виконання двох буде «злитий» в один, загальний.

Тобто система працює так само, як і звичайні, тільки для тимчасової таблиці.

Як використовувати ІНДЕКСУВАТИ ПО

Проте слід зважити на один момент. Побудова індексу тимчасової таблиці також потребує часу виконання. Тому доцільно використовувати конструкцію ” ”, лише якщо точно відомо, що у часовій таблиці буде не 1-2 записи. В іншому випадку ефект може бути зворотним - швидкодія від індексованих полів не компенсує часу побудови індексу.

ВИБРАТИ
Валюта ЯК Валюта,
Курси Валют Зріз Останніх. Курс
ПОМІСТИТИ КурсиВалют
З
РеєстрВідомостей.КурсиВалют.ЗрізОстанніх(&Період,) ЯК КурсиВалютЗрізОстанніх
ІНДЕКСУВАТИ ПО
Валюта
;
ВИБРАТИ
ЦіниНоменклатури.
ЦіниНоменклатури.Ціна,
ЦіниНоменклатури.Валюта,
Курси Валют.Курс
З
РеєстрВідомостей.ЦіниНоменклатури.Зріз Останніх(&Період,
Номенклатура В (&Номенклатура) І ТипЦен = &ТипЦен) ЯК ЦіниНоменклатури
ЛІВОЕ З'ЄДНАННЯ Курси Валют ЯК Курси Валют
ПО ЦіниНоменклатури.Валюта = КурсиВалют.Валюта

Угруповання

Мова запитів 1С дозволяє використовувати спеціальні агрегатні функції для групування результатів запитів. Угруповання можна використовувати без агрегатних функцій, для «усунення» дублів.

Існують такі функції:

Сума, Кількість, Кількість різних, Максимум, Мінімум, Середня.

Приклад №1:

ВИБРАТИ
Реалізація ТоварівПослугТовари.Номенклатура,
СУМА(РеалізаціяТоварівПослугТовари.Кількість) ЯК Кількість,
СУМА(РеалізаціяТоварівПослугТовари.Сума) ЯК Сума
З

ЗГРУПУВАТИ ПО
Реалізація ТоварівПослугТовари.Номенклатура

Запит отримує всі рядки з товарами та підсумовує їх за кількістю та сумами у розрізі номенклатури.

Приклад №2

ВИБРАТИ
Банки.
КІЛЬКІСТЬ(РІЗНІ Банки.Посилання) ЯК КількістьДублей
З
Довідник. Банки ЯК Банки
ЗГРУПУВАТИ ПО
Банки.

Даний приклад відобразить список БІКів довідника «Банки» та покаже, скільки дублів існує по кожному з них.

Підсумки

Підсумки – спосіб отримання даних із системи з ієрархічною структурою. Для підсумкових полів можуть використовуватися агрегатні функції, як угруповань.

Один із найпопулярніших способів використання підсумків у практиці – партійне списання товарів.

ВИБРАТИ




З
Документ.РеалізаціяТоварівПослуг.Товари ЯК РеалізаціяТоварівПослугТовари
ВПОРЯДКУВАТИ ЗА

ПІДСУМКИ
СУМА(Кількість),
СУМА(Сума)
ПЗ
Номенклатура

В результаті запиту вийде наступне ієрархічне:

Загальні підсумки

Якщо необхідно отримати підсумки з усіх «підсумків», використовуйте оператор «ЗАГАЛЬНІ».

ВИБРАТИ
Реалізація ТоварівПослугТовари.Номенклатура ЯК Номенклатура,
Реалізація ТоварівПослугТовари.Посилання ЯК Документ,
Реалізація ТоварівПослугТовари.Кількість ЯК Кількість,
Реалізація ТоварівПослугТовари.Сума ЯК Сума
З
Документ.РеалізаціяТоварівПослуг.Товари ЯК РеалізаціяТоварівПослугТовари
ВПОРЯДКУВАТИ ЗА
Реалізація ТоварівПослугТовари.Посилання.Дата
ПІДСУМКИ
СУМА(Кількість),
СУМА(Сума)
ПЗ
ЗАГАЛЬНІ,
Номенклатура

В результаті виконання запиту отримаємо наступний результат:

У якому 1 рівень угруповання – агрегування всіх корисних полів.

Упорядкування

Оператор ПОРЯДОЧИТИ ПО використовується для сортування результату запиту.

Сортування для примітивних типів (рядок, число, бульова) відбувається за звичайними правилами. Для полів типів посилань сортування відбувається за внутрішнім поданням посилання (унікальний ідентифікатор), а не за кодом або за поданням посилання.

ВИБРАТИ

З
Довідник Номенклатура ЯК Номенклатура
ВПОРЯДКУВАТИ ЗА
Найменування

Запит виведе список найменувань довідника номенклатури, відсортованого за абеткою.

Автоупорядкування

Результат запиту без сортування є хаотично представлений набір рядків. Розробники платформи 1С не гарантують виведення рядків у однаковій послідовності під час виконання однакових запитів.

Якщо потрібно виводити записи таблиці в постійному порядку, необхідно використовувати конструкцію «Автоупорядкування».

ВИБРАТИ
Номенклатура.Найменування ЯК Найменування
З
Довідник Номенклатура ЯК Номенклатура
Автоупорядкування

Віртуальні таблиці

Віртуальні таблиці в 1С – це унікальна особливість мови запитів 1С, якої немає інших аналогічних синтаксисах. Віртуальна таблиця – швидкий спосіб отримання профільної інформації з регістрів.

Для кожного з типів регістрів свій набір віртуальних таблиць може відрізнятися залежно від налаштувань регістру.

  • зріз перших;
  • зріз останніх.
  • залишки;
  • обороти;
  • залишки та обороти.
  • рухи із субконто;
  • обороти;
  • обороти Дт Кт;
  • залишки;
  • залишки та обороти
  • субконто.
  • база;
  • дані графіка;
  • фактичний період дії.

Для розробника рішення дані беруться з однієї (віртуальної) таблиці, але насправді платформа 1С бере з безлічі таблиць, перетворюючи в потрібний вид.

ВИБРАТИ
ТовариНа СкладахЗалишкиІОбороти.Номенклатура,
ТовариНа СкладахЗалишкиІОбороти.КількістьПочатковийЗалишок,
ТовариНа СкладахЗалишкиІОбороти.КількістьОборот,
ТовариНа СкладахЗалишкиІОбороти.КількістьПрихід,
ТовариНа СкладахЗалишкиІОбороти.КількістьВитрата,
ТовариНа СкладахЗалишкиІОбороти.КількістьКінцевийЗалишок
З
РеєстрНакопичення.ТовариНаСкладах.ЗалишкиІОбороти ЯК ТовариНаСкладахЗалишкиІОбороти

Такий запит дозволяє швидко отримати велику кількість даних.

Параметри віртуальних таблиць

Дуже важливим аспектом роботи з віртуальними таблицями є використання параметрів. Параметри віртуальних таблиць – спеціалізовані параметри для відбору та налаштування.

Для таких таблиць вважається неправильним використання відбору конструкції «ДЕ». Крім того, що запит стає не оптимальним, можливе отримання неправильних даних.

Приклад використання таких параметрів:

Реєстр Накопичення.

Алгоритм роботи віртуальних таблиць

Наприклад, найбільш використовувана віртуальна таблиця типу «Залишки» зберігає дані двох фізичних таблиць – залишків та рухів.

При використанні віртуальної таблиці система виконує такі маніпуляції:

  1. Отримуємо найближче за датою та вимірами розраховане значення у таблиці підсумків.
  2. «Додаємо» суму з таблиці руху до суми з таблиці підсумків.


Такі прості дії можуть суттєво підвищити продуктивність системи загалом.

Використання конструктора запитів

Конструктор запитів- Інструмент, вбудований в систему 1С підприємство, істотно полегшує розробку запитів до бази даних.

Конструктор запиту має досить простий інтуїтивно зрозумілий інтерфейс. Проте розглянемо застосування конструктора запиту докладніше.

Запуск конструктора тексту запиту здійснюється контекстним меню (правою кнопкою миші) у потрібному місці програмного коду.

Опис конструктора запиту 1С

Розглянемо кожну вкладку конструктора докладніше. Виняток – вкладка Побудовальник, це тема для окремої розмови.

Вкладка Таблиці та поля

На цій вкладці вказується джерело даних та поля, які необхідно виводити до звіту. Насправді тут описуються конструкції ВИБРАТИ.. ІЗ.

Як джерело може бути фізична таблиця бази даних, віртуальна таблиця регістрів, тимчасові таблиці, вкладені запити тощо.

У контекстному меню віртуальних таблиць можна задати параметри віртуальної таблиці:

Вкладка Зв'язку

Вкладка служить для опису з'єднань кількох таблиць, створює конструкції зі словом З'ЄДНАННЯ.

Вкладка Угруповання

На цій вкладці система дозволяє групувати та підсумовувати потрібні поля результату таблиці. Описується використання конструкцій ЗГРУПУВАТИ ПО, СУМУ, МІНІМУМ, СЕРЕДНЕ, МАКСИМУМ, КІЛЬКІСТЬ, КІЛЬКІСТЬ РІЗНИХ.

Вкладка Умови

Відповідає за все, що йде в тексті запиту після конструкції ДЕ, тобто за всі умови, що накладаються на отримані дані.

Вкладка Додатково

Вкладка Додатковорясніє всілякими параметрами, які є дуже важливими. Розглянемо кожну з властивостей.

Угруповання Вибірка записів:

  • Перші N– параметр, який повертає у запит лише N записів (оператор ПЕРШІ)
  • Без повторюваних– забезпечує унікальність отриманих записів (оператор РІЗНІ)
  • Дозволені– дозволяє вибирати тільки записи, які дозволяє вибрати система з урахуванням (конструкція ДОЗВОЛЕНІ)

Угруповання Тип запитувизначає, який буде тип запиту: вибірка даних, створення тимчасової таблиці або знищення тимчасової таблиці.

Нижче є прапор Блокувати отримані дані для подальшої зміни. Він дозволяє включити можливість встановлення блокування даних, що забезпечує збереження даних від моменту їх читання до зміни (актуально лише для Автоматичного режиму блокувань, конструкція ДЛЯ ЗМІНИ).

Вкладка Об'єднання/Псевдоніми

На цій вкладці конструктора запитів встановлюється можливість поєднання різних таблиць та псевдонімів (конструкція ЯК). У лівій частині зазначаються таблиці. Якщо встановити прапори навпроти таблиці, використовуватиметься конструкція ОБ'ЄДНАТИ, інакше – ОБ'ЄДНАТИ ВСЕ (відмінності двох способів). У правій частині вказуються відповідності полів у різних таблицях, якщо відповідність не вказана, запит повертатиме NULL.

Вкладка Порядок

Тут вказується порядок сортування значень (ПОРЯДОЧИТИ ПО) – за спаданням (УБУВАННЯ) або зростання (ВІР).

Також є цікавий прапор – Автоупорядкування(у запиті – АВТОУпорядкування). За замовчуванням система 1С виводить дані у “хаотичному” порядку. Якщо встановити цей прапор, система сортуватиме дані за внутрішніми даними.

Вкладка Пакет запитів

На вкладці конструктора запитів можна створювати нові та використовувати її в ролі навігації. У тексті запиту пакети поділяються символом “;” (кома).

Кнопка “Запит” у конструкторі запитів

У нижньому лівому куті конструктора запиту є кнопка Запит, за допомогою якого можна в будь-який момент переглянути текст запиту:

У цьому вікні можна внести корективи до запиту та виконати його.


Використання консолі запитів

Консоль запитів – простий та зручний спосіб для налагодження складних запитів та швидкого отримання інформації. У цій статті я спробую описати, як користуватися консоллю запитів, і дам посилання для завантаження консолі запитів.

Розглянемо цей інструмент докладніше.

Завантажити консоль запитів 1С

Насамперед, щоб почати роботу з консоллю запитів, її потрібно звідкись завантажити. Обробки зазвичай поділяються на два види - на керованих формах і звичайних (або іноді їх називають на 8.1 і на 8.2/8.3).

Я постарався об'єднати ці два види в одній обробці - у потрібному режимі роботи відкривається потрібна форма (у режимі, що керується, консоль працює тільки в товстому режимі).

Опис консолі запитів 1С

Почнемо розгляд консолі запитів із опису головної панелі обробки:

У шапці консолі запитів можна побачити час виконання останнього запиту з точністю до мілісекунди, що дозволяє порівнювати різні конструкції за продуктивністю.

Перша група кнопок командної панелі відповідає за збереження поточних запитів у зовнішньому файлі. Це дуже зручно, ви завжди зможете повернутися до написання складного запиту. Або, наприклад, зберігати список типових прикладів тих чи інших конструкцій.

Ліворуч, у полі “Запит”, можна створювати нові запити та зберігати їх у деревоподібній структурі. Друга група кнопок відповідає за управління списком запитів. За допомогою неї можна створити, скопіювати, видалити, перемістити запит.

  • Виконатизапит- Просте виконання та отримання результату
  • Виконати пакет– дозволяє переглянути всі проміжні запити у пакеті запитів
  • Перегляд тимчасових таблиць– дозволяє побачити результати, які повертають тимчасові запити у таблиці

Параметри запиту:

Дозволяє встановити поточні параметри для запиту.

У вікні параметрів запиту цікаво наступне:

  • Кнопка Отримати із запитуавтоматично знаходить усі параметри у запиті для зручності розробника.
  • Прапор Єдині параметри для всіх запитів– під час встановлення його обробка не очищає параметри під час переходу від запиту на запит у загальному списку запитів.

Задати параметр списку значеньдуже просто, достатньо при виборі значення параметра натиснути кнопку очищення значення (хрестик), система запропонує вибрати тип даних, де треба вибрати “Список значення”:

Також у верхній панелі є кнопка виклику налаштувань консолі запитів:

Тут можна вказати параметри автозбереження запитів та параметри виконання запиту.

У полі запиту консолі входить текст запиту. Зробити це можна простим набором тесту запиту або викликом спеціального інструменту – конструктора запитів.

Конструктор запиту 1С8 викликається з контекстного меню (права кнопка миші) при натисканні на полі введення:

Також у цьому меню є такі корисні функції, як очищення або додавання в запит символів перенесення рядка (“|”) або отримання коду запиту ось у такому зручному вигляді:

Запит = Новий Запит;
Запит. Текст = ”
| ВИБРАТИ
| Валюти.

| Довідник. Валюти ЯК Валюти”;
РезультатЗапиту = Запит.Виконати();

У нижньому полі консолі запитів відображається поле результату запиту, заради чого і створена ця обробка:



Також консоль запитів, крім списку, вміє відображати дані у вигляді дерева — для запитів, що містять підсумки.

Оптимізація запитів

Одним із найважливіших пунктів у підвищенні продуктивності роботи 1С підприємства 8.3 є оптимізаціязапитів. Цей пункт також дуже важливий у здачі атестації. Нижче йтиметься про типові причини не оптимальної роботи запитів та способи оптимізації.

Відбори у віртуальній таблиці за допомогою конструкції ДЕ

Накладати фільтри на реквізити віртуальної таблиці необхідно лише за параметрами ВТ. У жодному разі для відбору у віртуальній таблиці не можна використовувати конструкцію ДЕ, це груба помилка з погляду оптимізації. У разі відбору за допомогою ДЕ за фактом система отримає ВСІ записи і потім відбере потрібні.

ПРАВИЛЬНО:

ВИБРАТИ

З
Регістр Накопичення. Взаєморозрахунки З Депонентами Організацій. Залишки (
,
Організація = &Організація
І Фізособа = &Фізособа) ЯК ВзаєморозрахункиЗДепонентамиОрганізаційЗалишки

НЕПРАВИЛЬНО:

ВИБРАТИ
ВзаєморозрахункиЗ ДепонентамиОрганізаційЗалишки.СумаЗалишок
З
Регістр Накопичення.
ДЕ
ВзаєморозрахункиЗ ДепонентамиОрганізаційЗалишки.Організація = &Організація
І Взаєморозрахунки З Депонентами Організацій Залишки. Фізособа = & Фізособа

Отримання значення поля складеного типу через точку

При отриманні даних складеного типу у запиті через точку система з'єднує лівим з'єднанням рівно стільки таблиць, скільки типів можливо в полі складеного типу.

Наприклад, украй небажано для оптимізації звертатися до поля запису регістру – реєстратор. Реєстратор має складовий тип даних, серед яких усі можливі типи документів, які можуть писати дані у регістр.

НЕПРАВИЛЬНО:

ВИБРАТИ
НабірЗаписів.Реєстратор.Дата,
НабірЗаписів.Кількість
З
РеєстрНакопичення.ТовариОрганизации ЯК НабірЗаписів

Тобто за фактом такий запит буде звертатися не до однієї таблиці, а до 22 таблиць бази даних (у цього регістру 21 тип реєстратора).

ПРАВИЛЬНО:

ВИБРАТИ
ВИБІР
КОЛИ ТовариОрг.Реєстратор ПОСИЛАННЯ Документ.РеалізаціяТоварівПослуг
ТОДИ ВИРАЗИТИ(ТовариОрг.Реєстратор ЯК Документ.РеалізаціяТоварівПослуг).Дата
КОЛИ ТовариОрг.Реєстратор ПОСИЛАННЯ Документ.НадходженняТоварівПослуг
ТОДИ ВИРАЗИТИ (ТовариОрг.Реєстратор ЯК Документ.Надходження ТоварівПослуг).Дата
КІНЕЦЬ ЯК Дата,
ТовариОрг.Кількість
З
РеєстрНакопичення.ТовариОрганізацій ЯК ТовариОрг

Або другий варіант – додавання такої інформації до реквізиту, наприклад, у нашому випадку – додавання дати.

ПРАВИЛЬНО:

ВИБРАТИ
ТовариОрганізацій.Дата,
ТовариОрганізацій.Кількість
З
РеєстрНакопичення.ТовариОрганізацій ЯК ТовариОрганізацій

Підзапити за умови з'єднання

Для оптимізації неприпустимо використовувати підзапити в умовах з'єднання, це суттєво уповільнює роботу запиту. Бажано в таких випадках використовувати ВТ. Для з'єднання потрібно використовувати лише об'єкти метаданих та ВТ, попередньо проіндексувавши їх по полях з'єднання.

НЕПРАВИЛЬНО:

ВИБРАТИ …

ЛІВОЕ З'ЄДНАННЯ (
ВИБРАТИ З РеєстрВідомостей.
ДЕ …
ЗГРУПУВАТИ ЗА …
) ПЗ …

ПРАВИЛЬНО:

ВИБРАТИ …
ПОМІСТИТИ Ліміти
З РеєстрВідомостей. Ліміти
ДЕ …
ЗГРУПУВАТИ ЗА …
ІНДЕКСУВАТИ ПО …;

ВИБРАТИ …
З Документ.РеалізаціяТоварівПослуг
ЛІВОЕ З'ЄДНАННЯ Ліміти
ПЗ …;

З'єднання записів із віртуальними таблицями

Бувають ситуації, коли при з'єднанні віртуальної таблиці коїться з іншими система працює не оптимально. У такому випадку для оптимізації роботи запиту можна спробувати помістити віртуальну таблицю в тимчасову, не забувши проіндексувати поля, що з'єднуються в запиті тимчасової таблиці. Пов'язано це з тим, що ВТ часто містяться в кількох фізичних таблицях СУБД, в результаті їх вибірки складається підзапит, і проблема виходить аналогічною попередньому пункту.

Використання відборів по полям, що не індексуються.

Одна з найпоширеніших помилок при складанні запитів - використання умов по полям, що не індексуються, це суперечить правил оптимізації запитів.СУБД не може виконати запит оптимально, якщо в запиті накладається відбір по полям, що не індексуються. Якщо ж береться тимчасова таблиця – необхідно індексувати поля з'єднання.

Обов'язково для кожної умови повинен існувати відповідний індекс. Відповідним є індекс, що задовольняє наступним вимогам:

  1. Індекс містить усі поля, перелічені за умови.
  2. Ці поля знаходяться на початку індексу.
  3. Ці відбори йдуть поспіль, тобто між ними не «вклинюються» значення, які не беруть участі в запиті.

Якщо СУБД не підібрав правильні індекси, то буде просканована таблиця повністю – це дуже негативно позначиться на продуктивності та може призвести до тривалого блокування всього набору записів.

Використання логічного АБО в умовах

Ось і все, у цій статті було висвітлено основи аспектів оптимізації запитів, які повинен знати кожен експерт 1С.

Дуже корисний безкоштовний відеокурс з розробки та оптимізації запитів, категорично рекомендуюновачкам і не тільки!

Механізмів для роботи з рядками у запитах 1С мало. По-перше, рядки можна складати. По-друге, від рядка можна взяти підрядок. По-третє, рядки можна порівнювати, зокрема за шаблоном. Ось мабуть і все, що можна робити з рядками.

Складання рядків

Для додавання рядків у запиті використовується операція «+». Складати можна лише рядки обмеженої довжини.

ВИБРАТИ "Найменування: " + Контрагенти.Найменування ЯК Колонка1 З Довідник.Контрагенти ЯК Контрагенти ДЕ Контрагенти.Посилання = &Посилання

Функція Підстроювання

ПІДСТРОКУ(<Строка>, <НачальнаяПозиция>, <Длина>)

Аналог функції Серед () з об'єктної моделі. Функція Підстрока() може застосовуватися до даних рядкового типу та дозволяє виділити фрагмент <Строки> , що починається з номер символ <НачальнаяПозиция> (символи в рядку нумеруються з 1) та довжиною <Длина> символів. Результат обчислення функції має рядковий тип змінної довжини, причому довжина вважатиметься необмеженою, якщо <Строка> має необмежену довжину та параметр <Длина> не є константою чи перевищує 1024.

Якщо довжина рядка менша, ніж зазначено у другому параметрі, то функція поверне порожній рядок.

Увага!Використання функції ПІДСТРОКУ() з метою приведення рядків необмеженої довжини до рядків обмеженої довжини не рекомендується. Замість неї краще використовувати операцію наведення типу ВИРАЗИТИ().

Функція Подібно

Якщо потрібно переконатися, що рядковий реквізит відповідає певним критеріям, ми його порівнюємо:

ВИБРАТИ Контрагенти.Найменування ЯК Колонка1 З Довідник.Контрагенти ЯК Контрагенти ДЕ Контрагенти.Найменування = "Газпром"

А що, якщо потрібно хитріше порівняння? Не просто на рівність чи нерівність, а на подібність до певного шаблону? Ось саме для цього і створена функція подібно.

ПОДІБНО — Оператор перевірки рядка на зразок шаблону. Аналог LIKE у SQL.

Оператор подібно дозволяє порівняти значення виразу, вказаного зліва від нього, з рядком шаблону, вказаним праворуч. Значення виразу має мати рядок. Якщо значення виразу задовольняє шаблон - результатом оператора буде ІСТИНА, інакше - БРЕХНЯ.

Наступні символи у рядку шаблону є службовими і мають сенс, відмінний від символу рядка:

  • % (відсоток): послідовність, що містить будь-яку кількість довільних символів;
  • _ (підкреслення): один довільний символ;
  • […] (у квадратних дужках один або кілька символів): будь-який одиночний символ із перелічених усередині квадратних дужок. У перерахуванні можуть зустрічатися діапазони, наприклад, a-z, що означають довільний символ, що входить в діапазон, включаючи кінці діапазону;
  • [^…] (у квадратних дужках значок заперечення, за яким слідує один або кілька символів): будь-який одиночний символ, крім тих, які перелічені слідом за значком заперечення.

Будь-який інший символ означає сам себе і не несе жодного додаткового навантаження. Якщо як самого себе необхідно записати один із перелічених символів, то йому має передувати<Спецсимвол>. Сам<Спецсимвол>(будь-який відповідний символ) визначається в цьому ж операторі після ключового слова СПЕЦСИМВОЛ.

У мові запитів 1С:Підприємства функція ПІДСТРОКУ()в форматі ПІДСТРОКУ(<Исходная строка>, <Начало>, <Длина>) може застосовуватися до даних рядкового типу та дозволяє виділити фрагмент<Исходной строки>, що починається з номер символ<Начало>(символи в рядку нумеруються з 1) та довжиною<Длина>символів. Результат обчислення функції ПІДСТРОКУ() має рядковий тип змінної довжини, причому довжина буде вважатися необмеженою, якщо<Исходная строка>має необмежену довжину та параметр<Длина>не є константою чи перевищує 1024.

Обчислення функції ПІДСТРОКУ() на SQL сервері:
У клієнт-серверному варіанті роботи функція ПІДСТРОКУ() реалізується за допомогою функції SUBSTRING() відповідного оператора SQL, що передається серверу баз даних SQL Server, який обчислює тип результату функції SUBSTRING() за складними правилами залежно від типу та значень її параметрів, а так ж у залежності від контексту, в якому вона використовується.

У більшості випадків ці правила не впливають на виконання запиту 1С:Підприємства, однак є випадки, коли для виконання запиту істотна максимальна довжина рядка результату, обчислена SQL Server. Важливо мати на увазі, що в деяких контекстах використання функції ПІДСТРОКУ() максимальна довжина її результату може бути рівною максимальної довжині рядка обмеженої довжини, яка в SQL Server дорівнює 4000 символів. Це може призвести до несподіваного завершення запиту.

Наприклад, запит:
Код 1C v 8.х ВИБРАТИ
ВИБІР

Інакше NULL
КІНЕЦЬ ЯК Подання,
ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
ТОДИ ПІДСТРОКУ(Уявлення, 0, 200)
Інакше NULL
КІНЕЦЬ ЯК Подання1
З

ВПОРЯДКУВАТИ ЗА
Подання,
Подання1
завершується аварійно з повідомленням Помилка СУБД:
Microsoft OLE DB Provider для SQL Server: Warning: Processor Processor не може виконати потрібний план з optimizer, тому що загальний рівень всіх columnів в GROUP BY або ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618

Це відбувається тому, що обчислена Microsoft SQL Server максимальна довжина рядка, яка є результатом виразу:
Код 1C v 8.х ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
ТОДИ ПІДСТРОКУ(Уявлення, 0, 200)
Інакше NULL
КІНЕЦЬ ЯК Подання,
дорівнює 4000 символів. Тому довжина запису, що складається з двох таких полів, перевищує 8000 байт, дозволені для виконання операції сортування.

У зв'язку з описаною особливістю виконання функції SUBSTRING() на SQL Server використання функції ПІДСТРОКУ() з метою приведення рядків необмеженої довжини до рядків обмеженої довжини не рекомендується. Замість неї краще використовувати операцію наведення типу ВИРАЗИТИ(). Зокрема, наведений приклад можна переписати у вигляді:
Код 1C v 8.х ВИБРАТИ
ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
Інакше NULL
КІНЕЦЬ ЯК Подання,
ВИБІР
КОЛИ Вид = &ЮрАдресФізОбличчя
ТОДИ ВИРАЗИТИ(Уявлення ЯК Рядок(200))
Інакше NULL
КІНЕЦЬ ЯК Подання1
З
РеєстрДовідок.КонтактнаІнформація ЯК КонтактнаІнформація
ВПОРЯДКУВАТИ ЗА
Подання,
Подання1