Первый шаг в 1С — абсолютно бесплатно.

📋 Урок 5.1

Запросы на языке 1С: говорим с базой на её языке

Добрый день! ☀️

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

Зачем? Потому что рано или поздно вам понадобится не «отчёт для директора», а простая выборка внутри кода: «Найди всех клиентов с долгом больше нуля». И вот тут без запроса — никак.

Что такое запрос и почему он важен

Запрос — это команда базе данных, написанная на языке запросов 1С. Он говорит: «Возьми из таких-то таблиц такие-то поля, отфильтруй по такому-то условию, сгруппируй, отсортируй».

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

 

Главные причины использовать запросы:

Скорость. Запрос выполняется на сервере базы данных, а не перебором в коде.

Удобство. Сложные выборки описываются в несколько строк.

Стандарт. В реальной работе вы будете писать запросы каждый день.

Шаг 1. Самый простой запрос

В 1С запрос живёт в коде. Пример:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Наименование КАК Наименование,

| Товары.Цена КАК Цена

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.ВНаличии = ИСТИНА";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Наименование + " — " + Выборка.Цена + " руб.");

КонецЦикла;

Что тут происходит:

Создаём объект Запрос.

Записываем в его свойство Текст сам текст запроса (в кавычках, многострочный, с | в начале строк — это особенность 1С).

Выполняем: Запрос.Выполнить().

Получаем результат — таблицу.

Перебираем строки через Выбрать() и Следующий().

 

Про | в начале строк. Это просто «склейка» строк. 1С понимает, что строки запроса продолжаются. Можно писать и в одну строку, но читать неудобно.

Шаг 2. Разбираем структуру запроса

Запрос состоит из секций, как заявление из пунктов:

ВЫБРАТЬ — какие поля мы хотим видеть.

ИЗ — из какой таблицы берём (справочник, документ, регистр).

ГДЕ — условие отбора.

СГРУППИРОВАТЬ ПО — как группировать (если нужны итоги).

УПОРЯДОЧИТЬ ПО — как сортировать.

ИТОГИ — что суммировать.

Например, вот запрос «все товары дороже 1000, отсортированные по цене»:

ВЫБРАТЬ

Товары.Наименование,

Товары.Цена

ИЗ

Справочник.Товары КАК Товары

ГДЕ

Товары.Цена > 1000

УПОРЯДОЧИТЬ ПО

Товары.Цена УБЫВ

Всё читается почти как английский (или русский, если учесть, что ключевые слова русские).

Шаг 3. Обращение к регистру: виртуальные таблицы

Помните, в уроке 10 мы использовали виртуальную таблицу Остатки? В запросе это выглядит так:

ВЫБРАТЬ

Остатки.Товар,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ОстаткиТоваров.Остатки КАК Остатки

Почему виртуальная? Потому что физически в базе хранятся только движения (приходы и расходы). А Остатки — это «фокус», который 1С выполняет на лету: берёт все движения и складывает. Вам не нужно писать СГРУППИРОВАТЬ ПО и вручную считать — платформа делает это за вас.

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

РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, )

Тогда вы получите остатки не на текущий момент, а на конкретную дату. Это именно то, что нужно для отчётов.

Шаг 4. Группировка и итоги в запросе

Если вам нужны не остатки, а обороты (сколько пришло и ушло за период), используйте таблицу Обороты:

ВЫБРАТЬ

Обороты.Товар,

Обороты.КоличествоПриход,

Обороты.КоличествоРасход

ИЗ

РегистрНакопления.ОстаткиТоваров.Обороты(&Начало, &Конец, ) КАК Обороты

А если считаете что-то по справочнику с группировкой, то так:

ВЫБРАТЬ

Товары.Артикул,

КОЛИЧЕСТВО(*) КАК КоличествоТоваров,

СУММА(Товары.Цена) КАК ОбщаяЦена

ИЗ

Справочник.Товары КАК Товары

СГРУППИРОВАТЬ ПО

Товары.Артикул

Функции КОЛИЧЕСТВО, СУММА, МИНИМУМ, МАКСИМУМ — стандартные для группировок.

Шаг 5. Где это использовать

Запросы в коде нужны, например:

В обработках — когда нужно найти что-то и показать пользователю.

В проведении документов — проверить, хватает ли товара на складе.

В общих модулях — там, где живёт общая логика.

В отчётах без СКД — если хочется полного контроля.

 

Самый частый сценарий: «найти элемент по условию». Например:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Товары.Ссылка

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", "CH-001");

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Сообщить("Нашли: " + Выборка.Ссылка);

КонецЕсли;

ПЕРВЫЕ 1 — ограничение: нам нужен только один результат.

&Артикул — параметр запроса, значение подставляется через УстановитьПараметр.

Мини-итог

Сегодня вы:

Узнали, что такое запрос и зачем он нужен.

Научились писать простые запросы: ВЫБРАТЬ, ИЗ, ГДЕ, УПОРЯДОЧИТЬ ПО.

Познакомились с виртуальными таблицами регистров — Остатки и Обороты.

Разобрались с группировкой и агрегатными функциями.

Увидели, как использовать параметры в запросах.

 

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

📋 Урок 5.2

Обработки: инструменты для разовых задач

Отчёты — это «смотреть». Документы — «фиксировать». А обработки — это «делать». Сегодня мы создадим первый инструмент: обработку, которая загружает товары из списка.

Что такое обработка и зачем она

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

Типичные примеры:

Загрузить товары из Excel.

Пересчитать цены по курсу.

Сформировать письмо.

Слить дубли справочника.

Внешние обработки (те, что в .epf) — это ровно то, с чего мы начинали в уроке 2. Но есть и встроенные обработки — они живут внутри конфигурации, как справочники и документы.

Сегодня сделаем встроенную.

Шаг 1. Создаём обработку

В дереве конфигурации найдите ветку «Обработки».

Правая кнопка → «Добавить».

Заполняем:

Имя: ЗагрузкаТоваров

Синоним: Загрузка товаров

 

Обработка создана. Теперь нужна форма — то, что увидит пользователь.

Шаг 2. Создаём форму

Разверните обработку → «Формы» → «Добавить».

Тип формы — «Форма обработки».

Нажимаем «Готово».

 

Откроется редактор формы. Кидаем на неё элементы:

Поле с именем СписокТоваров — но не простое, а табличное поле (многострочное). В панели элементов выберите «Табличное поле» и перетащите на форму.

Кнопка с заголовком Загрузить — она запустит загрузку.

Кнопка с заголовком Очистить — на всякий случай.

 

В табличное поле добавим колонки:

Наименование — строка.

Артикул — строка.

Цена — число.

Как добавить реквизиты формы: на вкладке «Реквизиты» формы создайте «Таблица значений» с именем СписокТоваров и колонками Наименование, Артикул, Цена. Потом на форме привяжите табличное поле к этому реквизиту.

Шаг 3. Пишем логику загрузки

Теперь самое интересное. Двойной клик по кнопке Загрузить — 1С создаст обработчик. Пишем:

&НаКлиенте

Процедура Загрузить(Команда)

ЗагрузитьНаСервере();

КонецПроцедуры

&НаСервере

Процедура ЗагрузитьНаСервере()

Для Каждого Строка Из СписокТоваров Цикл

// Ищем товар по артикулу

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Товары.Ссылка

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", Строка.Артикул);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

// Нашли — обновим цену

Товар = Выборка.Ссылка.ПолучитьОбъект();

Иначе

// Не нашли — создадим новый

Товар = Справочники.Товары.СоздатьЭлемент();

Товар.Артикул = Строка.Артикул;

КонецЕсли;

Товар.Наименование = Строка.Наименование;

Товар.Цена = Строка.Цена;

Товар.ВНаличии = Истина;

Товар.Записать();

КонецЦикла;

Сообщить("Загрузка завершена!");

КонецПроцедуры

Что здесь происходит:

Идём по строкам таблицы на форме.

Для каждой строки ищем товар в справочнике по артикулу.

Если нашли — берём существующий. Если нет — создаём новый.

Заполняем реквизиты и записываем.

В конце сообщаем, что всё готово.

 

Важный момент: &НаКлиенте и &НаСервере — это те самые директивы компиляции из урока 9. Кнопка нажимается на клиенте, а работа с базой идёт на сервере. Поэтому мы разделили процедуру на две.

Шаг 4. Запускаем и проверяем

Сохраняем (Ctrl+S), обновляем базу (F7), запускаем (F5).

Открываем обработку: «Все функции» → «Обработки» → «Загрузка товаров».

Заполняем таблицу парочкой товаров.

Жмём «Загрузить».

Смотрим в справочник «Товары» — там появились наши записи. 🎉

Мини-итог

Сегодня вы: Узнали, что такое обработка и чем она отличается от отчёта и документа.

Создали встроенную обработку с формой.

Разделили код на клиентскую и серверную части.

Написали логику загрузки данных с поиском и созданием элементов.

Убедились, что обработка — это универсальный инструмент для любых задач.