Контакти

Робота з рядками у запиті 1с 8.2. Особливість виконання функції підрядка(). Використання логічного АБО в умовах

У мові запитів 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, тому що загальна частина всіх columns в 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С існує багато функцій для роботи з ним. У цій статті ми докладно розглянемо різні способироботи з рядковими типами в 1С 8.3 та 8.2 на прикладах.

Рядок

Для того, щоб перетворити змінну будь-якого типу на рядок, існує однойменна функція «Рядок()». Вхідним параметром буде сама змінна, рядкове представлення якої потрібно отримати.

Рядок (Брехня) // Повертає «Ні»
Рядок(12345) // повертає «12 345»
Рядок(ПоточнаДата()) //»21.07.2017 11:55:36″

Перетворювати до рядка можна як примітивні типи, а й інші, наприклад елементи довідників, документів.

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

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

СокрЛП("Будуть видалені пробіли з обох сторін") // "Будуть видалені пробіли з обох сторін"
СокрЛ("Будуть видалені пробіли з обох сторін") // "Будуть видалені пробіли зліва"
СокрП(" Будуть видалені пробіли з обох сторін") // "Будуть видалені пробіли праворуч"

Лев, Правий, Середовище

Ці функції дозволяють обрізати частину рядка. Функція «Лев()» поверне частину рядка з лівого боку зазначеної довжини. Функція «Прав()» аналогічна, але обрізка проводиться праворуч. Функція «Серед()» дозволяє вказати номер символу, з якого буде виділено рядок та його довжину.

Лев («Строкова змінна», 4) // Повертає «Стро»
Прав(«Строкова змінна», 7) // повертає «часова»
Середовище («Строкова змінна», 2, 5)// повертає «троко»

СтрДліна

Функція визначає кількість символів, які містяться у рядковій змінній.

СтрДліна («Слово») // Результатом виконання буде число 5

Знайти

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

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

Знайти («раз, два, раз, два, три», «два») // Функція поверне число 6

Порожня стрічка

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

ПорожнійРядок («Пупкін Василь Іванович») // функція поверне значення Брехня
ПорожнійРядок() «) // функція поверне значення Істина

ВРег, НРег, трег

Ці функції дуже корисні при порівнянні та перетворенні рядкових змінних. «Врег()» поверне вихідний рядок у верхньому регістрі, «НРег()» у нижньому, а «Трєг()» відформатує її так, що перший символ кожного окремого слова буде з великої літери, а всі наступні з маленької.

ВРег(«ГеНЕРАЛЬНИЙ ДИРЕКТОР») // значення, що повертається – «ГЕНЕРАЛЬНИЙ ДИРЕКТОР»
НРег(«ГеНераЛьний дИРЕктОр») // значення, що повертається – «генеральний директор»
ТРег («ГеНераЛьНий дІРЕктОр») // значення, що повертається – «Генеральний Директор»

СтрЗамінити

Ця функціяє аналогом заміни в текстових редакторах. Вона дозволяє підміняти один символ або набір символів іншим у рядкових змінних.

СтрЗаменить(«червоний, білий, жовтий», «,», «;») // поверне «червоний; білий; жовтий»

СтрЧислоРядок

Функція дозволяє визначити кількість рядків, розділених перенесенням каретки в текстовій змінній.

Цикл, у наведеному нижче прикладі, пройде три кола, оскільки функція СтрЧислоРок поверне значення 3:

Для інд=1 по СтрЧислоРядок («Рядок1» + Символи.ПС + «Рядок2» + Символи.ПС + «Рядок3») Цикл
<тело цикла>
КінецьЦикл;

СтрОтриматиРядок

Ця функція працює з багаторядковим текстом так само, як і попередня. Вона дозволяє отримати певний рядок із текстової змінної.

СтрОтриматиСтроку(«Рядок1» + Символи.ПС + «Рядок2» + Символи.ПС + «Рядок3», 2) // поверне «Рядок2»

СтрЧіслоВходжень

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

СтрЧислоВкладень(«а;б;в;г;«,«;») // функція поверне число 4

Символ та КодСимволу

Ці функції дозволяють отримувати символ за його кодом у кодуванні Unicode, а також визначати цей код за самим символом.

КодСимволу(«А») // функція поверне число 1040
Код Символу (1040) // Функція поверне «А»

Часті завдання під час роботи з рядками

Об'єднання рядків

Щоб об'єднати кілька рядків (здійснити конкатенацію), достатньо використовувати оператор додавання.

"Рядок 1" + "Рядок 2" //результатом складання двох рядків буде "Рядок 1 Рядок 2"

Перетворення типів

Для того, щоб перетворити тип на рядок, наприклад, посилання на елемент довідника, число та інше, достатньо використовувати функцію «Рядок()». Функції, подібні до «СокрЛП()» так само перетворюватимуть змінні в рядок, але вже відразу з відсіканням незначних символів.

Рядок (1000) // поверне «1 000»

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

СтрЗаменить(Рядок(1000),Символи.НПП,»») // поверне «1000»

Рядок (Формат (1000, "ЧГ =")) // поверне "1000"

Лапки в рядку

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

Заголовок = Рядок («ТОВ ««Роги і копита»» - це ми!») // поверне «ТОВ «Роги та копита» - це ми!»

Багаторядність, перенесення рядка

Для того, щоб створити багаторядковий текст, достатньо додати до нього символи перенесення рядка (Символи.ПС).

Багаторядковий Текст = «Перший рядок» + Символи.ПС + «Другий рядок»

Як прибрати прогалини

Для того, щоб прибрати прогалини праворуч або зліва можна скористатися функцією «СокрЛП()» (а також «СокрЛ()» і «СокрП()»):

РядокБезпробілів = СокрЛП("Багато букв") // функція поверне значення "Багато букв"

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

РядокБезпробілів = СтрЗаменить(Рядок(99999),Символи.НПП,»») // поверне «99999»

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

РядокБезПробілів = СтрЗамінити(«прийом», » »,») // поверне «привіт»

Порівняння рядків між собою

Порівняти терміни можна звичайним знаком рівності. При порівнянні враховується регістр.

«Здрастуйте» = «здравствуйте» // поверне Брехня
«Здрастуйте» = «Здрастуйте» // поверне Істина
«Здрастуйте» = «До побачення» // поверне Брехня

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

Приклад 1. Створимо рядкову змінну тексту.

Рядкова Змінна = "Привіт світ!";

Функції роботи з рядками 1с 8.3

У цьому розділі будуть наведені основні функції, що дозволяють змінювати рядки в 1с, або аналізувати інформацію, що міститься в них.

СтрДліна

СтрДліна(<Строка>) . Повертає кількість символів, що містяться в рядку, переданому у параметрі.

Приклад 2. Порахуємо кількість символів у рядку "Привіт світ!".

Рядок = "Привіт світ!"; КількістьСимволів = СтрДліна(Рядок); Повідомити (Кількість Символів);

Результатом виконання цього коду буде виведення на екран кількості символів рядка: 11.

СокрЛ

СокрЛ(<Строка>) . Відсікає незначні символи, що стоять ліворуч від першого символу в рядку.
Незначні символи:

  • пробіл;
  • нерозривна прогалина;
  • табуляція;
  • повернення каретки;
  • переклад рядка;
  • переклад форми (сторінки).

Приклад 3. Прибрати усі прогалини з лівого боку рядка "світ!" та приєднати до неї рядок "Привіт".

Рядок = СокрЛ ("світ!"); Рядок = "Привіт" + Рядок; Повідомити(Рядок);

Підсумком виконання цього коду буде виведення на екран рядка "Привіт мир!".

СокрП

СокрП(<Строка>) . Відсікає незначні символи, що стоять праворуч від першого символу в рядку.

Приклад 4. Сформувати з рядків "Привіт" та "світ!" фразу «Привіт світ!»

Рядок = СокрП("Привіт")+"+СокрЛ("світ!"); Повідомити(Рядок);

СокрЛП

СокрЛП(<Строка>) . Відсікає незначні символи, що стоять праворуч від першого символу в рядку, також відсікає незначні символи, що стоять ліворуч від першого символу в рядку. Ця функція використовується частіше за попередні два, оскільки вона більш універсальна.

Приклад 5. Прибрати незначні символи ліворуч і праворуч у найменуванні контрагента.

Контрагент = Довідники.Контрагенти.ЗнайтиПоРеквізиту("ІПН", "0777121211"); КонтрагентОб'єкт = Контрагент.Отримати Об'єкт (); Контрагент Об'єкт. Найменування = СокрЛП (Контрагент Об'єкт. Найменування); КонтрагентОб'єкт. Записати ();

Лев

Лев(<Строка>, <ЧислоСимволов>) . Отримує перші символи рядка, кількість символів вказується у параметрі Число символів.

Приклад 6. Нехай у структурі Співробітникутримуватися ім'я, прізвище та по батькові співробітника. Отримати рядок із прізвищем та ініціалами.

ІніціалІмені = Лев(Співробітник.Ім'я, 1); Ініціал Батьківщини = Лев (Співробітник. По-батькові, 1); Повне Ім'я = Співробітник. Прізвище + " " + Ініціал Імені + "." + Ініціатив Батьківщини + ".";

Має рацію

Прав(<Строка>, <ЧислоСимволов>) . Отримує останні символи рядка, кількість символів вказується у параметрі Число символів.Якщо вказана кількість символів перевищує довжину рядка, то повертається весь рядок.

Приклад 7. Нехай наприкінці рядкової змінної записано дату у форматі «ггггммдд», отримати рядок з датою та перетворити її на тип Дата.

Рядок = " Поточна дата: 20170910"; РядокДата = Прав(Рядок, 8); Дата = Дата(РядокДата);

Середовище

Середовище<Строка>, <НачальныйНомер>, <ЧислоСимволов>) . Отримує підрядок із рядка переданого у параметрі Рядок, починаючи з символу, номер якого вказаний у параметрі ПочатковийНомерта довжиною переданої у параметр Число символів.Нумерація символів у рядку починається з 1. Якщо у параметрі ПочатковийНомервказано значення, менше або дорівнює нулю, параметр приймає значення 1. Якщо параметр Число символівне вказано, вибираються символи до кінця рядка.

Приклад 8. Нехай у рядковій змінній, починаючи з дев'ятої позиції, міститься код регіону, слід отримати його та записати в окремий рядок.

Рядок = "Регіон: 99 р. Москва"; Регіон = Середовище (Рядок, 9, 2);

СтрНайти

СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) . Здійснює пошук зазначеного підрядка у рядку, повертає номер позиції першого символу знайденого підрядка. Розглянемо параметри цієї функції:

  • Рядок. Вихідний рядок;
  • ПідрядкаПошук. Шуканий підряд;
  • Напрям Пошуку. Вказує напрямок пошуку підрядка у рядку. Може приймати значення:
    • НапрямокПошуку.Спочатку;
    • Напрямок Пошуку.;
  • ПочатковаПозиція. Вказує позицію у рядку, з якого починається пошук;
  • НомерВходження. Вказує номер входження шуканого підрядка у вихідному рядку.

Приклад 9. У рядку "Привіт мир!" визначити позицію останнього входження символу "і".

НомерПозиції = СтрНайти("Привіт світ!", "і", НапрямПошуку.Сконця); Повідомити(НомерПозиції);

Результатом виконання цього коду буде виведення на екран номера останнього входження символу «і»: 9.

ВРег

ВРег(<Строка>) . Перетворює всі символи вказаного рядка в 1з8 до верхнього регістру.

Приклад 10. Перетворити рядок "Привіт світ!" до верхнього регістру.

РядокВрег = ВРег("привіт світ!"); Повідомити (Рядок);

Підсумком виконання цього коду буде виведення на екран рядка «ПРИВІТ СВІТ!»

НРег

НРег(<Строка>) . Перетворює всі символи вказаного рядка в 1с 8 до нижнього регістру.

Приклад 11. Перетворити рядок «ПРИВІТ СВІТ!» до нижнього регістру.

РядокНрег = НРег("ПРИВІТ СВІТ!"); Повідомити(РядокВрег);

Підсумком виконання цього коду буде виведення на екран рядка «Привіт світ!»

трег

трег(<Строка>) . Перетворює рядок наступним чином: перший символ кожного слова переводиться у верхній регістр, решта символів слова перетворюється на нижній регістр.

Приклад 12. Зробити великими перші літери слів у рядку «Привіт світ!».

РядокТрег = ТРег("привіт світ!"); Повідомити(РядокТрег);

Підсумком виконання цього коду буде виведення на екран рядка "Привіт Світ!"

Символ

Символ(<КодСимвола>) . Отримує символ за кодом кодування Unicod.

Приклад 13. Додамо ліворуч та праворуч у рядок «Привіт Мир!» символ ★

РядокЗі зірками = Символ("9733")+"Привіт Світ!"+Символ("9733"); Повідомити (Рядок зі Зірками);

Підсумком виконання цього коду буде виведення на екран рядка «Привіт Мир!★»

КодСимволу

КодСимволу(<Строка>, <НомерСимвола>) . Отримує код символу в кодуванні Unicode з рядка, зазначеного в першому параметрі, розташованого в позиції, зазначеній у другому параметрі.

Приклад 14. Дізнатись код останнього символу в рядку «Привіт Світ!».

Рядок = "Привіт Світ!"; КодСимволу = КодСимволу(Рядок, СтрДліна(Рядок)); Повідомити(КодСимволу);

Підсумком виконання цього коду буде виведення на екран коду символу "!" - 33.

Порожня стрічка

Порожня стрічка(<Строка>) . Перевіряє, чи складається рядок тільки з незначних символів, тобто чи є він порожнім.

Приклад 15. Перевірити чи порожній рядок складається з трьох пробілів.

Порожня = ПорожняРядок(" "); Повідомити(Порожня);

Результатом виконання цього коду буде виведення на екран слова «Так» (рядковий вираз логічного значення Істина).

СтрЗамінити

Стр Замінити (<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) . Знаходить у вихідному рядку всі входження підрядка пошуку та замінює її на підрядок заміни.

Приклад 16. У рядку "Привіт Мир!" замінити слово "Світ" на слово "Друзі".

Рядок = СтрЗаменить("Привіт Світ!", "Світ", "Друзі"); Повідомити(Рядок);

Підсумком виконання цього коду буде виведення на екран рядка "Привіт Друзі!"

СтрЧислоРядок

СтрЧислоРядок(<Строка>) . Дозволяє порахувати кількість рядків у рядковому рядку. Для переходу на новий рядокв 1с 8 використовується символ ПС(Символ перекладу рядка).

Приклад 17. Визначити кількість рядків у тексті:
«Перший рядок
Другий рядок
Третій рядок»

Число = СтрЧіслоРядок("Перший рядок"+Символи.ПС +"Другий рядок"+Символи.ПС +"Третій рядок"); Повідомити (Число);

Результатом виконання цього коду буде виведення на екран кількості рядків у тексті: 3

СтрОтриматиРядок

СтрОтриматиРоку(<Строка>, <НомерСтроки>) . Отримує рядок у рядковому рядку за його номером. Нумерація рядків починається з першого.

Приклад 18. Отримати останній рядок у тексті:
«Перший рядок
Другий рядок
Третій рядок»

Текст = "Перший рядок" + Символи. ПС + "Другий рядок" + Символи. ПС + "Третій рядок"; ОстанняРядок = СтрОтриматиРоку(Текст, СтрЧислоРядок(Текст)); Повідомити(ОстанняРядок);

Підсумком виконання цього коду буде виведення на екран рядка "Третій рядок".

СтрЧислоВходжень

СтрЧИСЛОВХОДЖЕНЬ(<Строка>, <ПодстрокаПоиска>) . Повертає кількість входжень зазначеного підрядка в рядок. Функція чутлива до регістру.

Приклад 19. Визначити скільки разів входить до рядка «Рядки в 1с 8.3 і 8.2» буква «с», незалежно від її регістру.

Рядок = "Рядки в 1с 8.3 і 8.2"; ЧислоВходжень = СтрЧіслоВходінь(Врег(Рядок), "С"); Повідомити(ЧислоВходжений);

Результатом виконання цього коду буде виведення на екран числа входжень: 2.

ПочинаєтьсяС

ПочинаєтьсяС(<Строка>, <СтрокаПоиска>) . Перевіряє чи починається рядок переданий у першому параметрі, з рядка у другому параметрі.

Приклад 20. Визначити чи починається ІПН обраного контрагента з цифри 1. Нехай у змінній Контрагент Контрагенти.

ІПН = Контрагент.ІПН; ПочинаєтьсяСединиці = СтрНачинаетсяС(ІПН, "1"); Якщо починаєтьсяСединиці Тоді //Ваш код КінецьЯкщо;

СтрЗакінчуєтьсяНа

СтрЗаканчиваетсяНа(<Строка>, <СтрокаПоиска>) . Перевіряє чи закінчується рядок переданий у першому параметрі, на рядок у другому параметрі.

Приклад 21. Визначити чи закінчується ІПН обраного контрагента на цифру 2. Нехай у змінній Контрагентзберігається посилання на елемент довідника Контрагенти.

ІПН = Контрагент.ІПН; Закінчується На Двійку = Стр Закінчується На (ІПН, "2"); Якщо закінчується на двійку тоді // Ваш код Кінець Якщо;

Поділити

Розділити(<Строка>, <Разделитель>, <ВключатьПустые>) . Розділяє рядок на частини за вказаними символами-розділювачами та записує отримані рядки у масив. У першому параметрі зберігається вихідний рядок, у другому рядок містить роздільник, у третьому вказується, чи потрібно записувати в масив порожні рядки (за замовчуванням Істина).

Приклад 22. Нехай у нас є рядок, який містить числа розділені символом «;», отримати з рядка масив чисел.

Рядок = "1; 2; 3"; Масив = РОЗДІЛИТИ(Рядок, ";"); Для Сч = 0 По Масив. Кількість () - 1 Цикл Спроба Масив [Сч] = Число (СокрЛП (Масив [Сч])); Виняток Масив [Сч] = 0; КінецьСпроби КінецьЦикл;

В результаті виконання буде отримано масив із числами від 1 до 3-х.

СтрЗ'єднати

СтрЗ'єднати(<Строки>, <Разделитель>) . Перетворює масив рядків з першого параметра на рядок, що містить всі елементи масиву через роздільник, зазначений у другому параметрі.

Приклад 23. Використовуючи масив чисел із попереднього прикладу, одержати вихідний рядок.

Для Сч = 0 По Масив. Кількість () - 1 Цикл Масив [Сч] = Рядок (Масив [Сч]); КінецьЦикл; Рядок = СтрЗ'єднати(Масив, "; ");

Рядок — один із примітивних типів даних у системах 1С:Підприємство 8. Змінні з типом рядокмістять текст.

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

Пер1 = "Слово 1";
Пер2 = "Слово 2";
Пер3 = Пер1 + "" + Пер2;

В підсумку Пер3матиме значення « Слово 1 Слово 2”.

Крім того, в системах 1С:Підприємство 8 передбачені функції для роботи з рядками. Розглянемо основні:

ВвестиРядок(<Строка>, <Подсказка>, <Длина>, <Многострочность>) — функція призначена для виведення діалогового вікна, в якому користувач може вказати значення змінної типу Рядок. Параметр <Строка> є обов'язковим і містить ім'я змінної, в яку буде записано введений рядок. Параметр <Подсказка> необов'язковий це заголовок діалогового вікна. Параметр <Длина> необов'язковий, показує максимальну довжинурядка, що вводиться. За замовчуванням дорівнює нулю, що означає необмежену довжину. Параметр <Многострочность> необов'язковий. Визначає режим введення багаторядкового тексту: Істина – введення багаторядкового тексту з роздільниками рядків; Брехня - введення простого рядка.

Рядок можна ввести і, знаючи код символу в кодуванні Unicode:

Символ(<КодСимвола>) — код вводиться як числа.

Літера = Символ (1103); // Я

Існує і зворотна функція, що дозволяє дізнатися код символу.

КодСимволу(<Строка>, <НомерСимвола>) — повертає номер вказаного символу у кодуванні Unicode у вигляді числа.

Функції перетворення регістру тексту:

ВРег(<Строка>) - Перетворює всі символи рядка у верхній регістр.

НРег(<Строка>) - Перетворює всі символи рядка в нижній регістр.

трег(<Строка>) - Перетворює всі символи рядка в титульний регістр. Тобто перші букви у всіх словах перетворюється на верхній регістр, інші літери — в нижній.

Функції пошуку та заміни символів у рядку:

Знайти (<Строка>, <ПодстрокаПоиска>) - знаходить номер символу входження підрядка пошуку. Наприклад:

Знайти ("Рядок", "ока"); // 4

СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) - знаходить номер символу входження підрядка пошуку, номер входження вказується у відповідному параметрі. При цьому пошук починається із символу, номер якого вказано у параметрі Початкова позиція.Пошук можливий з початку або кінця рядка. Наприклад:

Номер4 Входження = СтрНайти ( "Обороноздатність", "О" , Напрям Пошуку. Спочатку, 1, 4); // 7

Стр Замінити (<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) – знаходить у вихідному рядку всі входження підрядка пошуку та замінює її на підрядок заміни.

СтрЗамінити ("Рядок", "ока", ""); // Стор

Порожня стрічка(<Строка>) – перевіряє рядок на наявність символів. Якщо значущих символів немає, або взагалі ніяких символів немає, то значення повертається Істина. В іншому випадку - Брехня.

СтрЧИСЛОВХОДЖЕНЬ(<Строка>, <ПодстрокаПоиска>) – обчислює кількість входжень підрядка пошуку у вихідному рядку.

СтрЧИСЛОВХОДЖЕНЬ ( "вчитися, вчитися та ще раз вчитися", "вчитися", ""); // 3

СтрШаблон(<Строка>, <ЗначениеПодстановки1>…<ЗначениеПодстановкиN> — підставляє параметри у рядок за номером. Рядок повинен містити маркери підстановки виду: %1..%N. Нумерація маркерів починається з 1. Якщо значення параметра Не визначене, підставляється порожній рядок.

СтрШаблон ( "Параметр 1 = %1, Параметр 2 = %2", "1" , "2" ) ; // Параметр 1 = 1, Параметр 2 = 2

Функції перетворення рядків:

Лев(<Строка>, <ЧислоСимволов>) - Повертає перші спочатку символи рядка.

Прав(<Строка>, <ЧислоСимволов>) - Повертає останні символи рядка.

Середовище<Строка>, <НачальныйНомер>, <ЧислоСимволов>) - Повертає рядок довжиною в<ЧислоСимволов>починаючи з символу<НачальныйНомер>.

СокрЛ(<Строка>) відсікає незначні символи, що стоять ліворуч від першого символу в рядку.

СокрП(<Строка>) — відсікає незначні символи, що стоять праворуч від останнього символу в рядку.

СокрЛП(<Строка>) – відсікає незначні символи, що стоять ліворуч від першого символу в рядку і праворуч від останнього символу в рядку.

СтрОтриматиРоку(<Строка>, <НомерСтроки>) – отримує рядок рядкового рядка за номером.

Інші функції:

СтрДліна(<Строка>) – повертає кількість символів у рядку.

СтрЧислоРядок(<Строка>) – повертає число рядків у рядковому рядку. Рядок вважається новим, якщо він відокремлений від попереднього символу перекладу рядка.

Стр Порівняти(<Строка1>, <Строка2> ) – порівнює два рядки без урахування регістру. Функція працює аналогічно об'єкту ПорівнянняЗначень. Повертає:

  • 1 — якщо перший рядок більший за другий
  • -1 — якщо другий рядок більший за перший
  • 0 - якщо рядки рівні

СтрПорівняти("Перший рядок", "Другий рядок"); // 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С.

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



Сподобалася стаття? Поділіться їй