1с как работать с запросами
Платформа «1С Предприятие» позволяет выполнить последовательно несколько запросов за один раз. В 1С это называется пакетом запросов. В рамках одного пакета каждый запрос разделяется «точкой с запятой».
Для достижения поэтапного выполнения запросов в пакете, как правило, первоначально создаются временные таблицы, потом формируются условия их совместного использования, такие как фильтры, соединения, объединения. Благодаря этому достигается конечный результат. Временные таблицы, полученные в результате каких-либо запросов в пакете, продолжают существовать до окончания выполнения пакета в целом либо до выполнения запроса, который уничтожает временные таблицы.
Кроме того, использование пакетных запросов и временных таблиц значительно повышает читаемость всего отрезка данного кода. Сложные запросы, содержащие в себе еще и вложенные запросы, бывают очень трудными к восприятию. Однако если разбить длинный сложный запрос на несколько, да еще и использовать временные таблицы, то это позволит добиться не только повышения восприятия, но и в большинстве случаев приводит к повышению производительности.
Еще одна важная деталь в пользу пакетных запросов в 1С – это то, что в отличие от вложенных запросов мы можем получить отдельно результат каждого запроса в пакете.
Пример создания пакета запросов на языке 1С
Чтобы посмотреть на примере, как создать пакет запросов, будем использовать конструктор запросов, который вызовем для наглядности из консоли запросов. Таким образом, сможем сразу посмотреть результат выполнения пакета.
Создадим простенький пакетный запрос. Предлагаю сразу вставить текст запроса в консоль запросов, а потом открыть конструктор и посмотреть, как формируется пакет запросов. Добавьте в консоль новый запрос и вставьте следующий текст:
Хозрасчетный.Ссылка,
Хозрасчетный.Родитель,
Хозрасчетный.Код,
Хозрасчетный.КодБыстрогоВыбора,
Хозрасчетный.Наименование,
Хозрасчетный.Вид,
Хозрасчетный.Забалансовый,
Хозрасчетный.Количественный,
ИЗ
ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Ссылка = &Счет
;
////////////////////////////////////////////////////////////////////////////////
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
ВЫБРАТЬ
ХозрасчетныйВидыСубконто.НомерСтроки КАК НомерСтроки,
ХозрасчетныйВидыСубконто.ВидСубконто КАК ВидСубконто,
ХозрасчетныйВидыСубконто.ВидСубконто.Наименование КАК Наименование,
ХозрасчетныйВидыСубконто.ВидСубконто.ТипЗначения КАК ТипЗначения,
ХозрасчетныйВидыСубконто.ТолькоОбороты КАК ТолькоОбороты,
ХозрасчетныйВидыСубконто.Суммовой КАК Суммовой
ИЗ
ПланСчетов.Хозрасчетный.ВидыСубконто КАК ХозрасчетныйВидыСубконто
ГДЕ
ХозрасчетныйВидыСубконто.Ссылка = &Счет
УПОРЯДОЧИТЬ ПО
ХозрасчетныйВидыСубконто.НомерСтроки
У меня это выглядит так:
Теперь перейдем в конструктор запросов. Здесь нас будет интересовать закладка «Пакет запросов»:
Как видим, у нас появился пакет из двух запросов. Кликнув два раза на любом из них, можно перейти к его редактированию:
Нажмем кнопку «Ок» и попробуем посмотреть результат выполнения пакетного запроса.
Установим параметр «Счет». Можно выбрать любой счет из плана счетов. Как Вы уже, наверное, догадались, данный пакет запросов должен получить свойства счета. Нажимаем «Выполнить» и смотрим результат:
Методы Выполнить() и ВыполнитьПакет()
Помимо метода Выполнить(), который поочередно выполнит все запросы в пакете и вернет результат последнего запроса, в 1С существует метод ВыполнитьПакет(). Он возвращает массив выборок каждого запроса в пакете. В примере выше выполняется как раз этот метод.
Далее работаем с результатом как с массивом:
Если Выборка1.Следующий() Тогда
//Действия с выборкой 1
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Урок 1 - Роль и место запросов в системе 1С Предприятие
В системе 1С Предприятие 8 существует две модели представления данных: объектная и табличная. Типичный метод использования объектной модели выглядит примерно так:
То же действие, но с обращением к табличной модели:
Таким образом, у обеих моделей есть свои достоинства и свои недостатки. Объектная модель хороша, прежде всего, тем, что она чрезвычайно лаконична: если поступиться «читабельностью», простейшие выборки можно получать всего одной строкой кода! Табличная модель значительно уступает по данному критерию объектной, зато имеет ряд неоспоримых преимуществ.
Табличная модель обеспечивает:
- Гибкость: получение сложно-организованных выборок, использование сложных условий, управление блокировками;
- Использование конструктора: повышение скорости написания запроса, уменьшение вероятности появления синтаксических и логических ошибок.
Урок 1 - Конструктор запросов 1C
Одним из самых мощных инструментов 1С Предприятия, без сомнения, является конструктор запросов. Конструктор является визуальным средством для работы с запросами. Поэтому знакомиться с ним мы будем тоже наглядно, с помощью иллюстраций.
Сразу оговоримся, что поместить главу о конструкторе в самом начале курса - решение неоднозначное. Если развивать тему использования запросов строго последовательно, знакомиться с конструктором следовало бы в самом конце, после того, как будут изучены все остальные свойства запросов. Но дело в том, что большую часть запросов мы будем «собирать» именно с помощью конструктора. В этом случае, проблема похожа на извечный вопрос: что было раньше, яйцо или курица? Всё-таки, мы решили начать с конструктора.
Изучать устройство конструктора мы будем на примере универсальной обработки Консоль запросов. Эта обработка входит в состав типовых конфигураций 1С, поэтому её так же вполне можно назвать типовым инструментом.
Урок 3 - Источники данных 1С
Все объекты базы данных 1С (справочники, документы, регистры и т, д.) имеют своё табличное представление, и это вполне объяснимо. В самом деле, физически, вся информация хранится в базе данных в виде плоских таблиц. Никак иначе быть не может, потому что такова природа реляционных баз данных. Следовательно, если предоставить разработчику прикладного решения доступ напрямую (ну, или, почти напрямую) к таблицам, никакого нарушения логики работы с данными не случиться. Более того, поскольку в данном случае мы работаем непосредственно с таблицами, в качестве полезного побочного эффекта можно ожидать повышения быстродействия в сравнении с объектной моделью.
Теперь, когда мы определились с тем, что же такое табличная модель данных 1С:Предприятия пора рассмотреть ещё одно понятие, непосредственно с нею связанное. Речь идёт о виртуальных таблицах. Кроме таблиц, действительно существующих в базе, о которых мы говорили до сих пор, (они так и называются, Реальными) в системе вводится понятие Виртуальных таблиц. Физически, никаких новых мистических таблиц в базе, конечно же, нет. Просто обращение к виртуальной таблице автоматически преобразуется механизмом запросов в обращение к таблице реальной. Алгоритм преобразования может весьма изощренным, но нам (разработчикам) это никаких особых хлопот не доставляет. Нам важно то, что виртуальные таблицы на практике почти неотличимы от реальных.
Как известно основой работы по отбору данных на платформе 1С-Предприятие 8.х являются запросы, в этом кратком материале, не претендующем на полноту, приводится несколько простых приёмов работы с запросами на мой взгляд, представляющих интерес для новичков. Все приёмы будут приводиться в тексте запросов, после кода будет даваться краткое пояснение. Большинство приёмов рассчитаны на традиционную парадигму кодирования на 1С8.Х, а именно: вынесение многократно используемого кода в общие модули, стремление к написанию более компактного и более читаемого кода, написание универсальных процедур и функций. Запросы выбраны для примеров самые простые, что-бы лучше был виден сам приём а не терялся в глубине кода.
1. 1.Обработка пустого результата в самом запросе.
Что это даёт: в результате работы запрос может возвращать значение типа «Null». В этом случае работа с результатом запроса выдаст ошибку, т.к. значение типа "Null" не может быть преоблазовано к значению другого вида (число, строка и др.). Функция ЕСТЬNULL() прямо в запросе произведёт проверку возвращаемого результата. Такой приём позволяет несколько разгрузить клиентскую часть, в случае многократного использования запроса вынесенного в общий модуль позволит сократить строки кода.
2.Построение многовариантного запроса.
Что это даёт: выполнение над текстом запроса операции «СтрЗаменить» до команды «Запрос.Выполнить()» позволяет сделать универсальный и легко читаемый запрос над разными схожими по структуре регистрами. Конечно, можно было вынести имя регистра в переменную ну например «ИмяРегистра» тогда-бы запрос имел вид :
Но в этом случае мы теряем возможность правки текста запроса посредством конструктора запросов, что в случае сложных запросов является серьёзным недостатком
3. Использование функции Значение.
Что это даёт: если этот запрос отбирает только один вид контакта, то нет необходимости передавать вид контакта в качестве параметра в запрос.
Примечение: в качестве аргумента функции значение может выступать предопределённое значение, т.е то значение, к которому кожно обратиться из кода напрямую (предопределённые счета плана счетов, все значения перечислений и т.п.).
4. Выгрузка результатов запроса в табличную часть.
Что это даёт: такой код позволяет выполнить загрузку результатов запроса в табличную часть документа двумя командами без обхода результатов в цикла. Код более компактный, читабельный, быстрый.
5. Добавление необходимых значений в результат запроса.
При использовании результатов запроса, как в предыдущем примере, нередко для получения значения некоторых колонок в запрос приходится добавлять обращения ещё к одной или нескольким таблицам, чтобы получить значения всех требуемых колонок, в том случае когда эти значения уже известны их можно передать в качестве параметров, подобный запрос может иметь вид:
Что это даёт: читабьельность не теряется, запрос удобнее читается «с экрана», за счёт ухода от использования в запросе обращения к дополнительным таблицам, время выполнения запроса меньше.
6. Передача массива в качестве параметра.
Что это даёт: текст запроса остаётся читабельным, количество параметров не зашкаливает, трафик данных между клиентом и сервером минимальный.
7.По многочисленным просьбам пример чуть посложнее, результат запроса будет выгружен в регист остатков.
Текст, демонстрирующий сразу несколько приёмов, текст кода находится в модуле объекта документа (естественно в оригинале код немного сложнее и движения выполняются по нескольким регистрам), код написан для платформы 1С8.2 :
Что делает этот код: процедура "ОбработкаПроведения" вызывает процедуру "ВыполнитьДвиженияОстаткиНоменклатуры" (Далее просто процедура) . Процедура выполняет запрос, с единственным параметром "Ссылка" (это ссылка на наш документ - выполняющий функцию регистратора движений регистра ). Запрос возвращет весь перечень номенклатуры документа кроме номеклатуры имеющей тип "Услуга", результат запроса выгружается в таблицу и из таблицы загружается в регистр " РегистрыНакопления.ОстаткиНоменклатуры "(вид регистра - регистр остатков).
Справочно, структура регистра:
Количество - Число 15.3
Одной из потенциальных проблем при изучении 1С является тот факт, что встроенный язык 1С и язык запросов отличаются друг от друга. Новичкам приходится не только запоминать всевозможные операторы, но и понимать, где их применять. Но в платформу 1С 8.3 встроен мощный инструмент, облегчающий работу с запросами на языке 1С – конструктор запросов. Не используя его, вы напрасно усложняете себе работу.
Применение конструктора запросов 1С
Перед тем как разбирать функции этого механизма, нам нужно понять, как и где можно открыть конструктор запросов 1С 8.3. Воспользоваться им вы сможете в конфигураторе или специальных обработках – консолях запросов, которые, являясь по сути инструментами доработки 1С 8, позволяют сохранить конфигурацию на поддержке. Чтобы открыть конструктор, необходимо щелкнуть правой кнопкой мыши в модулях или на поле для написания кода и выбрать нужный пункт.
Рис.1 Применение конструктора запросов 1С
В конфигураторе же придется зайти в один из модулей и через контекстное меню выбрать один из двух вариантов. Первый откроет конструктор запроса, и после работы с ним у вас останется лишь текст запроса. Нижний пункт позволит вам не просто написать запрос, но и создаст все необходимые операторы для его выполнения и обработки. Это очень удобно и ускоряет разработку бизнес – приложений, но в некоторых случаях это не нужно.
Рис.2 Применение конструктора запросов 1С
После вызова конструктора перед нами открывается форма этого механизма. Она разделена на несколько закладок, отличающихся по функционалу и назначению.
Таблицы и поля. Начальная вкладка, отражающая информацию о задействованных в запросе таблицах и выбранных полях. Слева отображается общее дерево конфигурации, в центре – источники данных для выборки, справа – конечные поля. Здесь закладывается основа запроса из секций «ВЫБРАТЬ … ИЗ …».
Рис.3 Таблицы и поля
Связи. В данном разделе указываются соединения выбранных таблиц и поля, по которым они соединяются. Зачастую 1С самостоятельно предлагает программистам свои варианты связей на основе схожих типов данных, но в большинстве случаев лучше их изменить. В тексте запроса данные с этой вкладки преобразуются в конструкцию «СОЕДИНЕНИЕ».
Группировка. Здесь устанавливается группировка строк по конкретным полям и простейшие арифметические операции с числовыми реквизитами. В тексте запроса эти данные можно найти в разделе «СГРУППИРОВАТЬ ПО».
Рис.5 Группировка
Условия. Раздел установки дополнительных условий на данные, попадающие в результат выборки. В тексте фигурирует после оператора «ГДЕ».
Дополнительно. Вкладка, содержащая различные стандартные ограничения или возможности выборки:
- Первые – позволяет выбрать определенное количество записей. В текстовом представлении запроса определяется оператором «ПЕРВЫЕ N»;
- Без повторяющихся – исключает попадание в конечную выборку повторяющихся строк. В тексте отражается, как «РАЗЛИЧНЫЕ»;
- Разрешенные – включает учет настроенных прав доступа при выполнении запроса (оператор «РАЗРЕШЕННЫЕ»);
- Определение типа запроса из трех вариантов – обыкновенной выборки, создания или уничтожения временной таблицы;
- Блокировка данных. Предназначена для автоматического режима блокировок, чтобы сохранить целостность данных на время от чтения до записи.
Рис.7 Дополнительно
Объединения/Псевдонимы. Слева представлен список запросов, а справа вы можете изменить имя реквизита или объединить данные из нескольких запросов. Эти настройки можно найти в текстовом виде по операторам «ОБЪЕДИНИТЬ» и «КАК».
Рис.8 Объединения/Псевдонимы
Порядок. На данной вкладке задается сортировка итоговых записей. За нее отвечает оператор «УПОРЯДОЧИТЬ ПО».
Мы рассмотрели основные возможности конструктора запросов. Если у вас возникли сложности при работе с ним или вам необходимо получить консультации по программе 1С, обращайтесь к нашим специалистам по телефону, а также оставляйте заявки на нашем сайте. Мы свяжемся с вами в кратчайшие сроки.
Дополнительные возможности конструктора запросов
Вышеперечисленные вкладки конструктора позволяют настроить запрос на выборку данных практически для любой задачи. Однако в некоторых случаях нам пригодятся дополнительные функции конструктора запросов. Самая распространенная из них – возможность создания пакетных запросов. Для этого нам пригодится последняя вкладка в конструкторе запросов.
Рис.10 Дополнительные возможности конструктора запросов
Пакет запросов нам необходим, когда нужно получить несколько выборок данных за 1 обращение к базе. Также этот механизм пригодится в случае работы с временными таблицами. Это особый тип таблиц с данными, которые может создать 1С на время выполнения запроса. Если их использовать, то они будут доступны во всех последующих запросах в дереве конфигурации на 1 вкладке конструктора.
Вы можете и сами создавать свои временные таблицы с помощью конструктора. На вкладке «Таблицы и поля» в среднем окне есть кнопка создания описания временной таблицы. Наиболее часто эту возможность используют для передачи таблиц в запрос извне. Рядом находится кнопка создания вложенного запроса – обращения к базе данных, результат которого можно использовать в дальнейшем.
Рис.11 Дополнительные возможности конструктора запросов
Еще одна возможность конструктора, которая не так часто используется – вывод итогов. На вкладке «Итоги» вы можете задать нужные вам арифметические операции с числовыми полями с учетом других полей. К примеру, на скриншоте показан подсчет суммы количества по каждой номенклатуре. В тексте мы увидим эту настройку в виде оператора «ИТОГИ … ПО…».
Рис.12 Дополнительные возможности конструктора запросов
Построитель – еще одна закладка конструктора запросов с интересными возможностями. Здесь собраны все настройки, позволяющие выполняться запросу, как интерактивно, так и без участия пользователей. Также есть возможность адаптировать текст запроса в зависимости от введенных начальных данных. В текстовом варианте сделанные настройки построителя выделяются фигурными скобками.
Иногда в процессе работы с конструктором запроса с обработкой результата 1С требуется взглянуть на текстовый вид запроса. Для этого в левом нижнем углу есть кнопка «Запрос». При нажатии на нее открывается новое окно с полным текстом обращения к базе. Присутствует возможность изменения – при нажатии на соответствующую кнопку вы сможете внести изменения, а при закрытии конструктор отразит их на вкладках.
Рис.13 Дополнительные возможности конструктора запросов
Мы ознакомились лишь с основными функциями конструктора запросов и научились им пользоваться. Глубокое знание функционала, понимание принципов работы и внутренних механизмов появится с опытом. Поэтому, чем больше вы будете работать с конструктором, тем более оптимальными будут ваши запросы. Для тех же, кто предпочитает писать код в текстовом виде – открытие конструктора поможет быстро проверить опечатки в операторах. В любом случае, если возникли вопросы, обращайтесь к специалистам технического сопровождения 1С, мы с радостью вам поможем.
В своем коде разработчикам 1С приходится обращаться к базе данных, получать оттуда информацию и работать с ней. Операцию работы с результатом запроса данных из БД называют «выборкой». Для успешной работы и написания оптимального кода необходимо понимать, как нужно работать с запросом и полученными данными. Также важно запомнить основные инструменты платформы, используемые для выборки.
Синтаксис выборки 1С 8.3 и работа с ее результатом
Чаще всего в конфигурациях 1С можно встретить два варианта получения выборки для работы с ней:
-
Используя запрос. Программист 1С пишет запрос на языке 1С, выполняет его и получает результат запроса – таблицу с данными. Методом "Выбрать()" выбираются данные из полученного результата;
В обоих случаях, чтобы получить выборку из документов или справочников, необходимо использовать метод «Выбрать()». В результате в переменную «ВыборкаДанных» помещаются данные типа «ВыборкаИзРезультатаЗапроса». Это таблица, в которой содержаться все поля, перечисленные в запросе, использующая индексы. После этого с ними можно работать, используя различные методы данного типа данных:
Владелец() – возвращает результат запроса, из которого и была сформирована полученная выборка;
Следующий() – позволяет последовательно перебрать все записи выборки, перемещая указатель на следующую строку. Чаще всего используется, так как позволяет выполнять определенные действия со всеми выбранными записями в цикле. Будьте аккуратны и не допускайте выполнения запросов в цикле;
НайтиСледующий(УсловияПоиска) – позволяет отобрать из выборки только те записи,
которые удовлетворяют условию поиска. УсловияПоиска – переменная типа
«Структура», содержащая имена полей и нужные значения;
СледующийПоЗначениюПоля(ИмяПоля) – позволяет перебирать записи только с уникальными значениями конкретного поля, указанного в параметре;
Сбросить() – позволяет в процессе перебора результата выборки вернуться к верхней записи;
Количество() – метод показывает сколько записей получилось в результате выборки из результата запроса;
Получить(ЧислоИндекса) – команда возвращает запись с заданным индексом в качестве параметра;
Выбрать(ТипОбхода) – применяется в том случае, если в качестве параметра указан обход «По группировкам». Стандартно применяется тип "Прямой", в случае получения результатов запроса с 1 группировкой применяют "ПоГруппировкам". Если же группировок несколько, то выбирайте "ПоГруппировкамСИерархией";
Уровень() – показывает в виде числа уровень в иерархии;
ТипЗаписи() – возвращает тип текущей записи;
Группировка() – метод получает имя группировки, если это простая запись – пустую строчку.
Рис.1 Синтаксис-помощник
Выборка из результатов запроса применяется в подавляющем большинстве случаев, но иногда удобнее работать с таблицей результатов. Если нужны сразу все данные, лучше использовать не метод «Выбрать()», а «Выгрузить()». В результате в переменной оказываются данные с типом ТаблицаЗначений, где вы сможете найти сразу все данные.
Вы сможете сортировать полученную таблицу, сравнивать различные строки, осуществлять поиск одинаковых элементов и многое другое. Также вы можете и выбирать построчно данные из этого типа данных с помощью обхода строк в цикле:
В случае пакетного запроса используемые методы немного отличаются. После написания запроса необходимо использовать метод «ВыполнитьПакет()». В результате в переменной будет массив результатов запросов. В дальнейшем с помощью операторов «Выбрать()» или «Выгрузить()» можно получить выборку из результатов запроса. Помните, что индексы массива начинаются с 0.
Запомните суть методов, так как их синтаксис вы всегда сможете найти во встроенном помощнике 1С. Большинство методов применяется в случае сложных запросов с группировками. Чаще всего разработчики 1С 8.3 обходятся простым обходом выборки с помощью метода Следующий(). Но дополнительные возможности платформы необходимо знать и использовать их в нужный момент. Если у вас остались вопросы, обращайтесь к нашим специалистам за консультацией по программам 1С. Мы с радостью вам поможем!
Читайте также: