Вопросы по языку запросов 1С на собеседовании
Запросы спрашивают на любом собесе программиста 1С, и проверяют не синтаксис, а понимание: что станет с левым соединением, если условие на правую таблицу поставить в ГДЕ, почему отчёт падает на пустом периоде и чем ОБЪЕДИНИТЬ теряет деньги в сумме.
Что спрашивают
- +Параметры: почему значения не вклеивают в текст, порядок РАЗРЕШЕННЫЕ, РАЗЛИЧНЫЕ, ПЕРВЫЕ и ПЕРВЫЕ без сортировки
- +Соединения: внутреннее и левое, условие в ПО против ГДЕ, размножение строк при двух парах справа
- +Разыменование: точка как скрытое соединение, составное поле и ВЫРАЗИТЬ
- +Функции: ЕСТЬNULL и ЕСТЬ NULL, СУММА по пустому набору, РАЗНОСТЬДАТ на границе суток, ВЫБОР
- +Группировки: ИМЕЮЩИЕ, условная агрегация прихода и расхода, ИТОГИ по иерархии
- +Пакеты: временные таблицы, менеджер временных таблиц, таблица значений параметром
Из чего состоит тема
Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, что просели.
- Временные таблицы и пакеты12
- Группировки, ИТОГИ, ОБЪЕДИНИТЬ12
- Основы и параметры12
- Результат запроса в коде12
- Соединения и разыменование12
- Функции языка запросов12
Разборы подтем
Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.
- Язык запросов 1С: основы и параметры12 вопросов
- Соединения в запросах 1С: левое соединение и разыменование12 вопросов
- Функции языка запросов 1С: ЕСТЬNULL, ВЫБОР, РАЗНОСТЬДАТ12 вопросов
- Группировки, ИТОГИ и ОБЪЕДИНИТЬ в запросах 1С12 вопросов
- Временные таблицы и пакетные запросы 1С12 вопросов
- Результат запроса 1С: Выбрать и Выгрузить12 вопросов
Примеры вопросов с разбором
- Как в тексте запроса 1С обозначают параметр?A)
&ДатаB):ДатаC)@ДатаD)?Датапоказать ответ и разбор
+A)`&Дата`// разбор: Параметр в тексте запроса начинается с амперсанда: &Дата. Значение задают до выполнения: Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса()). Двоеточие и собака — синтаксис других СУБД и библиотек, в языке запросов 1С они не работают.
- Что делает
ЕСТЬNULL(Поле, 0)?A)Заменяет ноль в поле на NULLB)Проверяет поле на NULL и возвращает ИстинуC)Заменяет NULL нулём, остальное оставляетD)Удаляет строки, где поле NULLпоказать ответ и разбор
+C)Заменяет NULL нулём, остальное оставляет// разбор: ЕСТЬNULL возвращает второй аргумент, когда первый NULL, и первый в остальных случаях. Чаще всего так обрабатывают поля из левого соединения и итоги, которые могут не прийти. Проверку на NULL в условии пишут иначе: Поле ЕСТЬ NULL.
- Чем
ОБЪЕДИНИТЬотличается отОБЪЕДИНИТЬ ВСЕ?A)ОБЪЕДИНИТЬ ВСЕ убирает дублиB)ОБЪЕДИНИТЬ убирает одинаковые строкиC)ОБЪЕДИНИТЬ соединяет таблицы по ключуD)Ничем, это синонимыпоказать ответ и разбор
+B)ОБЪЕДИНИТЬ убирает одинаковые строки// разбор: Оба склеивают результаты запросов друг под другом. ОБЪЕДИНИТЬ дополнительно убирает полностью совпадающие строки, для этого СУБД сортирует или хэширует результат. ОБЪЕДИНИТЬ ВСЕ сохраняет все строки и работает быстрее, поэтому без нужды в дедупликации пишут его.
- Чем ЛЕВОЕ соединение отличается от ВНУТРЕННЕГО?A)Различий нет, это синонимыB)Левое работает быстрее за счёт индексовC)Внутреннее сохраняет все строки обеих таблицD)Левое сохраняет строки без пары
показать ответ и разбор
+D)Левое сохраняет строки без пары// разбор: Внутреннее соединение оставляет только строки, у которых нашлась пара по условию. Левое сохраняет все строки левой таблицы, а поля правой у строк без пары заполняются NULL. Строки обеих таблиц без пары сохраняет полное соединение.
- Как перебрать строки результата запроса?A)
Для Инд = 0 По Результат.Количество() - 1B)Для Каждого Стр Из Результат ЦиклC)Перебор коллекцииРезультат.СтрокиD)Выбрать()иПока Следующий() Циклпоказать ответ и разбор
+D)`Выбрать()` и `Пока Следующий() Цикл`// разбор: Выбрать() даёт выборку, Следующий() перемещает её на очередную строку и возвращает Ложь в конце. Сам РезультатЗапроса не коллекция, его не обходят циклом Для Каждого. Для обхода как таблицы результат выгружают: Выгрузить().
- Что делает
ПОМЕСТИТЬ ВТв конце запроса?A)Кладёт результат во временную таблицуB)Сохраняет результат в регистр сведений ВТC)Выводит результат пользователю в таблицуD)Создаёт индекс по полям результатапоказать ответ и разбор
+A)Кладёт результат во временную таблицу// разбор: ПОМЕСТИТЬ записывает результат запроса во временную таблицу, к которой обращаются следующие запросы пакета: ИЗ ВТ КАК Т. Так тяжёлые части считают один раз и переиспользуют. Индекс по ней создаёт ИНДЕКСИРОВАТЬ ПО.
- Какой порядок ключевых слов после
ВЫБРАТЬправильный?A)Порядок слов не важенB)ВЫБРАТЬ ПЕРВЫЕ 10 РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕC)ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10 РАЗРЕШЕННЫЕD)ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 10показать ответ и разбор
+D)`ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 10`// разбор: Синтаксис фиксирован: РАЗРЕШЕННЫЕ, затем РАЗЛИЧНЫЕ, затем ПЕРВЫЕ n. Другой порядок — синтаксическая ошибка. Конструктор запроса расставляет их сам, но на собесе часто просят написать текст руками.
- Как в условии запроса проверить, что поле не заполнено (NULL)?A)
Поле = NULLB)Поле ЕСТЬ NULLC)ЕСТЬNULL(Поле)D)Поле = НЕОПРЕДЕЛЕНОпоказать ответ и разбор
+B)`Поле ЕСТЬ NULL`// разбор: Сравнение с NULL через равенство не даёт Истину ни для одной строки: NULL = NULL неизвестно. Для проверки есть отдельный оператор ЕСТЬ NULL и НЕ ... ЕСТЬ NULL. Неопределено — другое значение, им хранится пустой составной реквизит.
- Запрос группирует продажи по товару. Почему падает с ошибкой поле
П.Покупательв выборке?A)Поле не сгруппировано и не агрегатB)Покупатель нельзя выбирать в запросеC)Нужен РАЗЛИЧНЫЕ, чтобы убрать повторыD)Группировать можно только по одному полюпоказать ответ и разбор
+A)Поле не сгруппировано и не агрегат// разбор: При группировке каждое поле выборки должно либо входить в СГРУППИРОВАТЬ ПО, либо быть агрегатом: СУММА, МАКСИМУМ, КОЛИЧЕСТВО. Иначе непонятно, какого покупателя показать для товара с сотней продаж. Решение — добавить поле в группировку или обернуть агрегатом.
это 9 из 72
Ещё 63 вопросов по теме — в тренажёре, с движком повторения
Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы приходят сессиями, а подтему, на которой ты споткнулся, движок принесёт снова: завтра, через три дня, через неделю. Бесплатно: сессия дня каждый день.
Частые вопросы
Куда ставить условие на правую таблицу левого соединения?
В ПО. В ГДЕ условие проверяется после соединения, у строк без пары поля правой таблицы равны NULL, сравнение не проходит, и строки пропадают: левое соединение превращается во внутреннее.
Чем ОБЪЕДИНИТЬ отличается от ОБЪЕДИНИТЬ ВСЕ?
ОБЪЕДИНИТЬ убирает одинаковые строки, ОБЪЕДИНИТЬ ВСЕ сохраняет все и работает быстрее. Если склеить две продажи на одинаковую сумму через ОБЪЕДИНИТЬ, они сольются в одну, и отчёт потеряет слагаемое.
Почему запрос в цикле считается ошибкой?
Каждый запрос отдельно идёт в базу: разбор, план, сеть. Сто строк документа дают сто обращений. Строки кладут во временную таблицу и получают ответ одним пакетом.