Вопрос, на который отчёт не отвечает
В любой базе 1С уже есть отчёты, и их много. «Ведомость по товарам на складах», «Валовая прибыль», «Задолженность покупателей» — десятки готовых форм, за каждой из которых стоит чужая работа и чужой опыт. Пока вопрос звучит так же, как называется отчёт, всё хорошо: открыл, выбрал период, посмотрел.
Трудность начинается в тот день, когда вопрос звучит по-своему. Руководитель спрашивает не «сколько продали», а «кто покупал у нас зимой и перестал летом». Бухгалтер спрашивает не «остатки на складе», а «что лежит дольше полугода и сколько в этом заморожено денег». Логист — «по каким поставщикам срок поставки чаще всего срывался в этом квартале». Ни один готовый отчёт так не называется, и это не случайность: готовый отчёт отвечает на частый вопрос, а у каждой организации есть свои редкие.
Дальше происходит одно из трёх. Либо вопрос откладывают — «потом посмотрим», и он не возвращается. Либо данные выгружают в таблицу и считают руками: два часа работы, которую придётся повторить через месяц, и ещё вопрос, не сбилось ли что-нибудь при выгрузке. Либо задачу ставят разработчику и ждут неделю, а он уточняет условия и ждёт ответа ещё три дня.
Запрос — это четвёртый путь. Запрос — это способ спросить у базы ровно то, что нужно, и получить ответ таблицей. Не «весь регистр продаж за год», из которого потом считают в Excel, а сразу нужные строки и нужные колонки. Написанный один раз, он повторяется в любой момент: через месяц те же цифры считаются заново одним нажатием.
Есть и вторая причина, менее очевидная. Даже когда готовый отчёт подходит, он показывает результат и не показывает, откуда результат взялся. «Валовая прибыль — 1 240 000» — а почему не 1 300 000, как в прошлой версии отчёта? Пока вы не умеете достать данные сами, проверить чужую цифру нечем: остаётся верить. Умение написать простой запрос превращает спор «отчёт врёт» в двадцать минут работы, и последний урок этого уровня целиком про такой разбор.
Наконец, запрос — это не только отчёты. Он стоит внутри самой программы: когда документ проводится и проверяет остаток на складе, это запрос; когда открывается список товаров с отбором, это запрос; когда ночью выгружаются данные в другую базу, это тоже запрос. Поэтому язык запросов знают и те, кто отчётов не делает вовсе, — просто по другой причине: от того, как написан запрос, зависит, сколько программа будет думать.
Что такое запрос
Запрос — это текст. Не кнопка, не форма и не настройка, а несколько строк на особом языке, которые вы пишете, а платформа выполняет. Выглядит самый простой запрос так:
ВЫБРАТЬ
Наименование,
Код
ИЗ
Справочник.Номенклатура
Читается он ровно так, как написан: показать наименование и код, взять из справочника номенклатуры. Результат — таблица: строк столько, сколько позиций в справочнике, колонок две. Это и есть весь запрос — у него нет ни начала, ни конца сложнее этого.
Части запроса стоят в закреплённом порядке, и порядок этот не выбирают. ВЫБРАТЬ — какие колонки показать. ИЗ — из какой таблицы их брать. ГДЕ — какие строки оставить, а какие выбросить. УПОРЯДОЧИТЬ ПО — в каком порядке выдать то, что осталось. Части можно опускать: без ГДЕ вернутся все строки, без УПОРЯДОЧИТЬ ПО порядок будет произвольным. Но переставлять их местами нельзя — язык этого не примет.
Добавим отбор и порядок, и получится запрос, который уже можно показать человеку:
ВЫБРАТЬ
Наименование,
Код
ИЗ
Справочник.Номенклатура
ГДЕ
НЕ ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Наименование
Второе, что стоит понять сразу: запрос описывает результат, а не способ его получить. Вы пишете «покажи товары без пометки удаления, по алфавиту» — и не пишете, в каком порядке база должна перебирать записи, какой индекс использовать и сколько ей понадобится памяти. Это решает не автор запроса, а сама база.
Из этого следуют две вещи, важные до конца курса. Первая приятная: одинаковый по смыслу запрос можно написать несколькими способами, и все они дадут один результат. Вторая менее приятная: разные способы могут работать с очень разной скоростью — на сотне строк разницы не видно, на миллионе один вариант отвечает за секунду, другой за минуту. Почему так, разбирается на втором уровне; здесь достаточно знать, что результат и цена результата — разные вещи.
Ещё одна мелочь, которая экономит новичку час недоумения: имена таблиц и полей пишутся так, как они названы в конфигурации. Если справочник называется «Номенклатура», в запросе он Справочник.Номенклатура — без пробелов и без синонима, который виден пользователю на экране. Синоним и имя — разные вещи: на форме написано «Товары и услуги», а в запросе всё равно «Номенклатура». Регистр букв при этом не важен: ВЫБРАТЬ и Выбрать платформа понимает одинаково, а вот опечатку в имени поля — нет, и сообщит об этом сразу.
И третье: запрос всегда возвращает таблицу. Не число, не список, не отчёт — таблицу со строками и колонками. Даже если в ответе одна цифра, формально это таблица из одной строки и одной колонки. Всё, что происходит дальше — отчёт, выгрузка, проверка в коде, — работает уже с этой таблицей.
Откуда запрос берёт данные
Раз запрос берёт данные «из таблицы», нужно знать, какие таблицы вообще есть. И вот здесь у новичка возникает главная путаница: таблицы 1С — не те таблицы, которые видно в интерфейсе. Список документов на экране — это форма, а не таблица; за ней стоит таблица с другим составом полей. Подробно устройство хранения разбирается в следующем уроке, здесь — карта местности.
Данных в 1С три больших вида, и каждому отвечает свой вид таблиц.
Справочники — то, что существует само по себе и меняется редко: товары, контрагенты, склады, сотрудники, договоры. В запросе такая таблица называется Справочник.Номенклатура, Справочник.Контрагенты. Строка справочника — это одна позиция, и у неё есть код, наименование и реквизиты.
Документы — то, что произошло в определённый момент: поступление товара, реализация, платёж, приказ. Таблица называется Документ.РеализацияТоваровУслуг. У документа есть номер, дата и реквизиты шапки, а строки его табличной части лежат в отдельной таблице — Документ.РеализацияТоваровУслуг.Товары. Это важная мелочь: чтобы получить проданные позиции, обращаются не к документу, а к его табличной части.
| что нужно | где искать |
|---|---|
| Список товаров, контрагентов, складов | Справочник.* |
| Что и когда произошло, с кем и на какую сумму | Документ.* |
| Строки документа: позиции, количества, цены | Документ.*.ТабличнаяЧасть |
| Остаток, оборот, итог — уже посчитанные | РегистрНакопления.* |
| Значение, которое менялось во времени | РегистрСведений.* |
Регистры — самое непривычное для тех, кто пришёл из обычных баз, и самое полезное. Регистр накопления хранит движения: этот документ прибавил на склад 10 штук, тот списал 3. Программа умеет складывать эти движения и отдавать готовый остаток на любой момент или оборот за любой период — и отдавать быстро, потому что промежуточные итоги она считает заранее. Регистр сведений хранит значения, которые меняются во времени: цена товара с такого-то числа, курс валюты на дату, ответственный менеджер контрагента.
Как узнать, какая таблица нужна? Тремя способами, и все три законные. Первый — конструктор запроса: он показывает дерево всех таблиц базы, и по нему можно ходить как по справочнику. Второй — посмотреть в конфигураторе, какие движения делает документ: если «Реализация» пишет в регистр «Продажи», значит, продажи лежат там. Третий — открыть готовый отчёт, который показывает похожие цифры, и посмотреть его схему: чужой отчёт — законная подсказка.
Конструктор заслуживает отдельного слова. Он собирает текст запроса мышкой: выбрал таблицу, перетащил поля, задал условие. Начинать с него удобно, и никакого стыда в этом нет — им пользуются и опытные разработчики. Но читать текст запроса нужно уметь в любом случае: конструктор пишет многословно, чужие запросы придётся разбирать глазами, а ошибку он не объяснит.
Где запрос живёт и чего он не делает
Запрос написан — где он живёт и что с ним делают дальше? Мест три, и разница между ними определяет всё остальное: и как запрос запускают, и чем он опасен.
Консоль запросов — место, где запросы пишут и проверяют. Это обработка, в которой есть поле для текста, кнопка «Выполнить» и таблица результата. Здесь запрос ничем не рискует: выполнили, посмотрели, поправили, выполнили снова. Весь первый уровень мы работаем именно так — сначала получаем правильную таблицу, а уже потом думаем, как её показать.
Отчёт на компоновке данных — то, что видит пользователь. Запрос в нём становится источником данных, а дальше система компоновки берёт на себя всё остальное: группировки, итоги, отборы, оформление, вывод на экран и в файл. Человеку при этом достаётся форма с настройками, а не текст запроса. Компоновке отведены три последних урока уровня.
Код — запрос внутри модуля: в проведении документа, в обработке, в обмене, в форме списка. Здесь результат не показывают, а используют: проверяют остаток и запрещают проведение, перебирают строки и создают движения, собирают данные для выгрузки.
| где запрос | кто видит результат | чем рискуем |
|---|---|---|
| Консоль запросов | автор запроса | ничем: посмотрел и закрыл |
| Отчёт на компоновке | пользователь, когда открыл отчёт | медленный отчёт злит одного |
| Код: проведение, обмен, список | никто, он работает внутри | медленный запрос тормозит всех |
Разница в цене здесь принципиальная. Неудачный запрос в отчёте — это человек, который ждёт минуту вместо секунды; неприятно, но переживаемо. Тот же запрос в проведении документа выполняется при каждом проведении: двадцать кладовщиков, по сорок документов в день — и база встаёт. Поэтому в коде запрос пишут иначе: осторожнее с соединениями, без лишних полей, с оглядкой на объём. Это тема третьего уровня, но помнить о ней стоит с первого дня.
И последнее, о границах. Запрос достаёт данные — и только. Он не решает, что с ними делать, не проверяет их на смысл и не исправляет ошибки учёта. Если в базе дважды провели одну накладную, запрос честно покажет удвоенную сумму: это правда о том, что записано. Отличить ошибку данных от ошибки запроса — отдельное умение, и последний урок уровня учит именно ему.
Точно так же запрос не заменяет понимания предметной области. Чтобы посчитать «сколько мы заработали», нужно знать, что считать доходом, входит ли туда НДС и что делать с возвратами. Язык запросов даст любой ответ на любой вопрос — в том числе неправильный, если вопрос задан неправильно.