бесплатно без регистрации урок 1 из 18

Зачем запрос, если отчёты уже есть

Объяснить, какие вопросы закрывает готовый отчёт, а какие только запрос; назвать четыре части запроса и три вида таблиц, из которых он берёт данные.

17 мин чтения · 4 главы ·4 задания ·домашняя работа

Вопрос, на который отчёт не отвечает

В любой базе 1С уже есть отчёты, и их много. «Ведомость по товарам на складах», «Валовая прибыль», «Задолженность покупателей» — десятки готовых форм, за каждой из которых стоит чужая работа и чужой опыт. Пока вопрос звучит так же, как называется отчёт, всё хорошо: открыл, выбрал период, посмотрел.

Трудность начинается в тот день, когда вопрос звучит по-своему. Руководитель спрашивает не «сколько продали», а «кто покупал у нас зимой и перестал летом». Бухгалтер спрашивает не «остатки на складе», а «что лежит дольше полугода и сколько в этом заморожено денег». Логист — «по каким поставщикам срок поставки чаще всего срывался в этом квартале». Ни один готовый отчёт так не называется, и это не случайность: готовый отчёт отвечает на частый вопрос, а у каждой организации есть свои редкие.

Сколько продализа месяцСколько продалипо складамКто покупал зимой,а летом пропалГотовый отчётЕго настройкиЗапросоткрыл и посмотрелотбор и группировкаэто урок 1 и дальше
Три вопроса об одних и тех же данных: первый закрывает готовый отчёт, второй — его настройки, третий не закрывает ничто, кроме запроса.

Дальше происходит одно из трёх. Либо вопрос откладывают — «потом посмотрим», и он не возвращается. Либо данные выгружают в таблицу и считают руками: два часа работы, которую придётся повторить через месяц, и ещё вопрос, не сбилось ли что-нибудь при выгрузке. Либо задачу ставят разработчику и ждут неделю, а он уточняет условия и ждёт ответа ещё три дня.

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

Есть и вторая причина, менее очевидная. Даже когда готовый отчёт подходит, он показывает результат и не показывает, откуда результат взялся. «Валовая прибыль — 1 240 000» — а почему не 1 300 000, как в прошлой версии отчёта? Пока вы не умеете достать данные сами, проверить чужую цифру нечем: остаётся верить. Умение написать простой запрос превращает спор «отчёт врёт» в двадцать минут работы, и последний урок этого уровня целиком про такой разбор.

Наконец, запрос — это не только отчёты. Он стоит внутри самой программы: когда документ проводится и проверяет остаток на складе, это запрос; когда открывается список товаров с отбором, это запрос; когда ночью выгружаются данные в другую базу, это тоже запрос. Поэтому язык запросов знают и те, кто отчётов не делает вовсе, — просто по другой причине: от того, как написан запрос, зависит, сколько программа будет думать.

Что такое запрос

Запрос — это текст. Не кнопка, не форма и не настройка, а несколько строк на особом языке, которые вы пишете, а платформа выполняет. Выглядит самый простой запрос так:

ВЫБРАТЬ
    Наименование,
    Код
ИЗ
    Справочник.Номенклатура

Читается он ровно так, как написан: показать наименование и код, взять из справочника номенклатуры. Результат — таблица: строк столько, сколько позиций в справочнике, колонок две. Это и есть весь запрос — у него нет ни начала, ни конца сложнее этого.

ВЫБРАТЬИЗГДЕУПОРЯДОЧИТЬ ПОкакие колонки показатьиз какой таблицы братькакие строки оставитьв каком порядке выдатьпорядок частей закреплён языком и не меняется
Четыре части отвечают на четыре вопроса: что показать, откуда взять, что отобрать и как разложить.

Части запроса стоят в закреплённом порядке, и порядок этот не выбирают. ВЫБРАТЬ — какие колонки показать. ИЗ — из какой таблицы их брать. ГДЕ — какие строки оставить, а какие выбросить. УПОРЯДОЧИТЬ ПО — в каком порядке выдать то, что осталось. Части можно опускать: без ГДЕ вернутся все строки, без УПОРЯДОЧИТЬ ПО порядок будет произвольным. Но переставлять их местами нельзя — язык этого не примет.

Добавим отбор и порядок, и получится запрос, который уже можно показать человеку:

ВЫБРАТЬ
    Наименование,
    Код
ИЗ
    Справочник.Номенклатура
ГДЕ
    НЕ ПометкаУдаления
УПОРЯДОЧИТЬ ПО
    Наименование

Второе, что стоит понять сразу: запрос описывает результат, а не способ его получить. Вы пишете «покажи товары без пометки удаления, по алфавиту» — и не пишете, в каком порядке база должна перебирать записи, какой индекс использовать и сколько ей понадобится памяти. Это решает не автор запроса, а сама база.

Текст запросаПлатформа 1СБаза данныхТаблица-результатстроки и колонки — то, что увидит отчёт или код
Запрос описывает результат, а способ его получить выбирает не автор запроса: платформа переводит текст на язык базы, база считает и возвращает таблицу.

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

Ещё одна мелочь, которая экономит новичку час недоумения: имена таблиц и полей пишутся так, как они названы в конфигурации. Если справочник называется «Номенклатура», в запросе он Справочник.Номенклатура — без пробелов и без синонима, который виден пользователю на экране. Синоним и имя — разные вещи: на форме написано «Товары и услуги», а в запросе всё равно «Номенклатура». Регистр букв при этом не важен: ВЫБРАТЬ и Выбрать платформа понимает одинаково, а вот опечатку в имени поля — нет, и сообщит об этом сразу.

И третье: запрос всегда возвращает таблицу. Не число, не список, не отчёт — таблицу со строками и колонками. Даже если в ответе одна цифра, формально это таблица из одной строки и одной колонки. Всё, что происходит дальше — отчёт, выгрузка, проверка в коде, — работает уже с этой таблицей.

Откуда запрос берёт данные

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

Данных в 1С три больших вида, и каждому отвечает свой вид таблиц.

Справочники — то, что существует само по себе и меняется редко: товары, контрагенты, склады, сотрудники, договоры. В запросе такая таблица называется Справочник.Номенклатура, Справочник.Контрагенты. Строка справочника — это одна позиция, и у неё есть код, наименование и реквизиты.

Документы — то, что произошло в определённый момент: поступление товара, реализация, платёж, приказ. Таблица называется Документ.РеализацияТоваровУслуг. У документа есть номер, дата и реквизиты шапки, а строки его табличной части лежат в отдельной таблице — Документ.РеализацияТоваровУслуг.Товары. Это важная мелочь: чтобы получить проданные позиции, обращаются не к документу, а к его табличной части.

что нужногде искать
Список товаров, контрагентов, складовСправочник.*
Что и когда произошло, с кем и на какую суммуДокумент.*
Строки документа: позиции, количества, ценыДокумент.*.ТабличнаяЧасть
Остаток, оборот, итог — уже посчитанныеРегистрНакопления.*
Значение, которое менялось во времениРегистрСведений.*

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

Как узнать, какая таблица нужна? Тремя способами, и все три законные. Первый — конструктор запроса: он показывает дерево всех таблиц базы, и по нему можно ходить как по справочнику. Второй — посмотреть в конфигураторе, какие движения делает документ: если «Реализация» пишет в регистр «Продажи», значит, продажи лежат там. Третий — открыть готовый отчёт, который показывает похожие цифры, и посмотреть его схему: чужой отчёт — законная подсказка.

Конструктор заслуживает отдельного слова. Он собирает текст запроса мышкой: выбрал таблицу, перетащил поля, задал условие. Начинать с него удобно, и никакого стыда в этом нет — им пользуются и опытные разработчики. Но читать текст запроса нужно уметь в любом случае: конструктор пишет многословно, чужие запросы придётся разбирать глазами, а ошибку он не объяснит.

Где запрос живёт и чего он не делает

Запрос написан — где он живёт и что с ним делают дальше? Мест три, и разница между ними определяет всё остальное: и как запрос запускают, и чем он опасен.

Консоль запросов — место, где запросы пишут и проверяют. Это обработка, в которой есть поле для текста, кнопка «Выполнить» и таблица результата. Здесь запрос ничем не рискует: выполнили, посмотрели, поправили, выполнили снова. Весь первый уровень мы работаем именно так — сначала получаем правильную таблицу, а уже потом думаем, как её показать.

Отчёт на компоновке данных — то, что видит пользователь. Запрос в нём становится источником данных, а дальше система компоновки берёт на себя всё остальное: группировки, итоги, отборы, оформление, вывод на экран и в файл. Человеку при этом достаётся форма с настройками, а не текст запроса. Компоновке отведены три последних урока уровня.

Код — запрос внутри модуля: в проведении документа, в обработке, в обмене, в форме списка. Здесь результат не показывают, а используют: проверяют остаток и запрещают проведение, перебирают строки и создают движения, собирают данные для выгрузки.

где запроскто видит результатчем рискуем
Консоль запросовавтор запросаничем: посмотрел и закрыл
Отчёт на компоновкепользователь, когда открыл отчётмедленный отчёт злит одного
Код: проведение, обмен, списокникто, он работает внутримедленный запрос тормозит всех

Разница в цене здесь принципиальная. Неудачный запрос в отчёте — это человек, который ждёт минуту вместо секунды; неприятно, но переживаемо. Тот же запрос в проведении документа выполняется при каждом проведении: двадцать кладовщиков, по сорок документов в день — и база встаёт. Поэтому в коде запрос пишут иначе: осторожнее с соединениями, без лишних полей, с оглядкой на объём. Это тема третьего уровня, но помнить о ней стоит с первого дня.

И последнее, о границах. Запрос достаёт данные — и только. Он не решает, что с ними делать, не проверяет их на смысл и не исправляет ошибки учёта. Если в базе дважды провели одну накладную, запрос честно покажет удвоенную сумму: это правда о том, что записано. Отличить ошибку данных от ошибки запроса — отдельное умение, и последний урок уровня учит именно ему.

Точно так же запрос не заменяет понимания предметной области. Чтобы посчитать «сколько мы заработали», нужно знать, что считать доходом, входит ли туда НДС и что делать с возвратами. Язык запросов даст любой ответ на любой вопрос — в том числе неправильный, если вопрос задан неправильно.

Задания урока

Первые задание решается прямо здесь — без регистрации. Щёлкните по ответу.

  1. 1. Управляющая спрашивает: «какие товары лежат дольше трёх месяцев и ни разу не продались». Почему готовый отчёт здесь обычно не помогает?

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

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