Первый шаг в 1С — абсолютно бесплатно.
Запросы на языке 1С: говорим с базой на её языке Добрый день! ☀️ До этого мы работали с данными через СКД — то есть просили платформу: «Сделай красиво». Но под капотом СКД всё равно выполняет запрос — специальную команду, которая вытаскивает данные из базы. Сегодня мы разберёмся, что это за зверь, и научимся писать запросы руками. Зачем? Потому что рано или поздно вам понадобится не «отчёт для директора», а простая выборка внутри кода: «Найди всех клиентов с долгом больше нуля». И вот тут без запроса — никак. |
Что такое запрос и почему он важен Запрос — это команда базе данных, написанная на языке запросов 1С. Он говорит: «Возьми из таких-то таблиц такие-то поля, отфильтруй по такому-то условию, сгруппируй, отсортируй». Особенность 1С: вы пишете запрос не как код, а как текст в кавычках, который передаётся специальному объекту — Запрос. Платформа сама его разбирает и выполняет.
Главные причины использовать запросы: Скорость. Запрос выполняется на сервере базы данных, а не перебором в коде. Удобство. Сложные выборки описываются в несколько строк. Стандарт. В реальной работе вы будете писать запросы каждый день. |
Шаг 1. Самый простой запрос В 1С запрос живёт в коде. Пример: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Наименование КАК Наименование, | Товары.Цена КАК Цена |ИЗ | Справочник.Товары КАК Товары |ГДЕ | Товары.ВНаличии = ИСТИНА"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование + " — " + Выборка.Цена + " руб."); КонецЦикла; Что тут происходит: Создаём объект Запрос. Записываем в его свойство Текст сам текст запроса (в кавычках, многострочный, с | в начале строк — это особенность 1С). Выполняем: Запрос.Выполнить(). Получаем результат — таблицу. Перебираем строки через Выбрать() и Следующий().
Про | в начале строк. Это просто «склейка» строк. 1С понимает, что строки запроса продолжаются. Можно писать и в одну строку, но читать неудобно. |
Шаг 2. Разбираем структуру запроса Запрос состоит из секций, как заявление из пунктов: ВЫБРАТЬ — какие поля мы хотим видеть. ИЗ — из какой таблицы берём (справочник, документ, регистр). ГДЕ — условие отбора. СГРУППИРОВАТЬ ПО — как группировать (если нужны итоги). УПОРЯДОЧИТЬ ПО — как сортировать. ИТОГИ — что суммировать. Например, вот запрос «все товары дороже 1000, отсортированные по цене»: ВЫБРАТЬ Товары.Наименование, Товары.Цена ИЗ Справочник.Товары КАК Товары ГДЕ Товары.Цена > 1000 УПОРЯДОЧИТЬ ПО Товары.Цена УБЫВ Всё читается почти как английский (или русский, если учесть, что ключевые слова русские). |
Шаг 3. Обращение к регистру: виртуальные таблицы Помните, в уроке 10 мы использовали виртуальную таблицу Остатки? В запросе это выглядит так: ВЫБРАТЬ Остатки.Товар, Остатки.КоличествоОстаток ИЗ РегистрНакопления.ОстаткиТоваров.Остатки КАК Остатки Почему виртуальная? Потому что физически в базе хранятся только движения (приходы и расходы). А Остатки — это «фокус», который 1С выполняет на лету: берёт все движения и складывает. Вам не нужно писать СГРУППИРОВАТЬ ПО и вручную считать — платформа делает это за вас. Полезный бонус: у виртуальной таблицы можно задать параметр — дату, на которую считать остатки: РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, ) Тогда вы получите остатки не на текущий момент, а на конкретную дату. Это именно то, что нужно для отчётов. |
Шаг 4. Группировка и итоги в запросе Если вам нужны не остатки, а обороты (сколько пришло и ушло за период), используйте таблицу Обороты: ВЫБРАТЬ Обороты.Товар, Обороты.КоличествоПриход, Обороты.КоличествоРасход ИЗ РегистрНакопления.ОстаткиТоваров.Обороты(&Начало, &Конец, ) КАК Обороты А если считаете что-то по справочнику с группировкой, то так: ВЫБРАТЬ Товары.Артикул, КОЛИЧЕСТВО(*) КАК КоличествоТоваров, СУММА(Товары.Цена) КАК ОбщаяЦена ИЗ Справочник.Товары КАК Товары СГРУППИРОВАТЬ ПО Товары.Артикул Функции КОЛИЧЕСТВО, СУММА, МИНИМУМ, МАКСИМУМ — стандартные для группировок. |
Шаг 5. Где это использовать Запросы в коде нужны, например: В обработках — когда нужно найти что-то и показать пользователю. В проведении документов — проверить, хватает ли товара на складе. В общих модулях — там, где живёт общая логика. В отчётах без СКД — если хочется полного контроля.
Самый частый сценарий: «найти элемент по условию». Например: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Товары.Ссылка |ИЗ | Справочник.Товары КАК Товары |ГДЕ | Товары.Артикул = &Артикул"; Запрос.УстановитьПараметр("Артикул", "CH-001"); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Сообщить("Нашли: " + Выборка.Ссылка); КонецЕсли; ПЕРВЫЕ 1 — ограничение: нам нужен только один результат. &Артикул — параметр запроса, значение подставляется через УстановитьПараметр. |
Мини-итог Сегодня вы: Узнали, что такое запрос и зачем он нужен. Научились писать простые запросы: ВЫБРАТЬ, ИЗ, ГДЕ, УПОРЯДОЧИТЬ ПО. Познакомились с виртуальными таблицами регистров — Остатки и Обороты. Разобрались с группировкой и агрегатными функциями. Увидели, как использовать параметры в запросах.
Запросы — это язык, на котором разработчик говорит с базой. Чем лучше вы его знаете, тем меньше кода пишете и тем быстрее работают программы. |
Обработки: инструменты для разовых задач Отчёты — это «смотреть». Документы — «фиксировать». А обработки — это «делать». Сегодня мы создадим первый инструмент: обработку, которая загружает товары из списка. Что такое обработка и зачем она Обработка — это объект конфигурации, который выполняет какую-то работу: загружает данные, чистит базу, пересчитывает что-то, формирует файл. У неё обычно нет «жизни» в учёте — она запускается, делает дело и закрывается. Типичные примеры: Загрузить товары из Excel. Пересчитать цены по курсу. Сформировать письмо. Слить дубли справочника. Внешние обработки (те, что в .epf) — это ровно то, с чего мы начинали в уроке 2. Но есть и встроенные обработки — они живут внутри конфигурации, как справочники и документы. Сегодня сделаем встроенную. |
Шаг 1. Создаём обработку В дереве конфигурации найдите ветку «Обработки». Правая кнопка → «Добавить». Заполняем: Имя: ЗагрузкаТоваров Синоним: Загрузка товаров
Обработка создана. Теперь нужна форма — то, что увидит пользователь. |
Шаг 2. Создаём форму Разверните обработку → «Формы» → «Добавить». Тип формы — «Форма обработки». Нажимаем «Готово».
Откроется редактор формы. Кидаем на неё элементы: Поле с именем СписокТоваров — но не простое, а табличное поле (многострочное). В панели элементов выберите «Табличное поле» и перетащите на форму. Кнопка с заголовком Загрузить — она запустит загрузку. Кнопка с заголовком Очистить — на всякий случай.
В табличное поле добавим колонки: Наименование — строка. Артикул — строка. Цена — число. Как добавить реквизиты формы: на вкладке «Реквизиты» формы создайте «Таблица значений» с именем СписокТоваров и колонками Наименование, Артикул, Цена. Потом на форме привяжите табличное поле к этому реквизиту. |
Шаг 3. Пишем логику загрузки Теперь самое интересное. Двойной клик по кнопке Загрузить — 1С создаст обработчик. Пишем: &НаКлиенте Процедура Загрузить(Команда) ЗагрузитьНаСервере(); КонецПроцедуры &НаСервере Процедура ЗагрузитьНаСервере() Для Каждого Строка Из СписокТоваров Цикл
// Ищем товар по артикулу Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Товары.Ссылка |ИЗ | Справочник.Товары КАК Товары |ГДЕ | Товары.Артикул = &Артикул"; Запрос.УстановитьПараметр("Артикул", Строка.Артикул);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда // Нашли — обновим цену Товар = Выборка.Ссылка.ПолучитьОбъект(); Иначе // Не нашли — создадим новый Товар = Справочники.Товары.СоздатьЭлемент(); Товар.Артикул = Строка.Артикул; КонецЕсли;
Товар.Наименование = Строка.Наименование; Товар.Цена = Строка.Цена; Товар.ВНаличии = Истина; Товар.Записать();
КонецЦикла;
Сообщить("Загрузка завершена!"); КонецПроцедуры Что здесь происходит: Идём по строкам таблицы на форме. Для каждой строки ищем товар в справочнике по артикулу. Если нашли — берём существующий. Если нет — создаём новый. Заполняем реквизиты и записываем. В конце сообщаем, что всё готово.
Важный момент: &НаКлиенте и &НаСервере — это те самые директивы компиляции из урока 9. Кнопка нажимается на клиенте, а работа с базой идёт на сервере. Поэтому мы разделили процедуру на две. |
Шаг 4. Запускаем и проверяем Сохраняем (Ctrl+S), обновляем базу (F7), запускаем (F5). Открываем обработку: «Все функции» → «Обработки» → «Загрузка товаров». Заполняем таблицу парочкой товаров. Жмём «Загрузить». Смотрим в справочник «Товары» — там появились наши записи. 🎉 |
Мини-итог Сегодня вы: Узнали, что такое обработка и чем она отличается от отчёта и документа. Создали встроенную обработку с формой. Разделили код на клиентскую и серверную части. Написали логику загрузки данных с поиском и созданием элементов. Убедились, что обработка — это универсальный инструмент для любых задач. |