Запрос: выбор номенклатур с ценами, оканчивающимися на 5
Условие
При помощи одного запроса выберите те номенклатуры, цены которых оканчиваются на 5 (без учёта копеек).
Дано:
- Справочник "Номенклатура"
- Регистр сведений "Цены номенклатуры" с измерением "Номенклатура" и ресурсом "Цена"
Пример
Если цены: 100, 125, 130, 155, 200 Нужно выбрать номенклатуры с ценами: 125, 155
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Обзор задачи
Даная задача требует написания 1С запроса, который выбирает номенклатуры на основе условия на цены — последняя цифра в рублевой части должна быть 5. Это тест на умение:
- Писать результативные запросы в 1С
- Использовать функции для работы с числами (Mod, ЦЕЛОЕ и т.д.)
- Связывать справочники с регистрами сведений
- Применять условия WHERE с вычислениями
Математическая логика
Для проверки последней цифры числа используется операция модуля:
- Берём цену в рублях (без копеек): ЦЕЛОЕ(Цена)
- Проверяем остаток от деления на 10: ЦЕЛОЕ(Цена) % 10 = 5
Решение 1: Простой запрос с условием на цену
Выбрать
Номенклатура.Ссылка
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
Цены.Цена % 10 = 5
Решение 2: С использованием ЦЕЛОЕ для безопасности
Выбрать
Номенклатура.Ссылка,
Номенклатура.Наименование,
Цены.Цена
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
ЦЕЛОЕ(Цены.Цена) % 10 = 5
Решение 3: С сортировкой и дополнительными колонками
Выбрать
Номенклатура.Ссылка,
Номенклатура.Наименование,
Цены.Цена,
ЦЕЛОЕ(Цены.Цена) Как ЦенаВРублях,
ЦЕЛОЕ(Цены.Цена) % 10 Как ПоследняяЦифра
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
ЦЕЛОЕ(Цены.Цена) % 10 = 5
Упорядочить По
Номенклатура.Наименование
Решение 4: С обработкой пустых значений
Выбрать
Номенклатура.Ссылка,
Номенклатура.Наименование,
Цены.Цена
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
Цены.Цена <> Неопределено
И Цены.Цена <> 0
И ЦЕЛОЕ(Цены.Цена) % 10 = 5
Решение 5: Вариант с ЛЕВОЕ СОЕДИНЕНИЕ (для поиска также номенклатур без цен)
Выбрать
Номенклатура.Ссылка,
Номенклатура.Наименование,
Цены.Цена
Из
Справочник.Номенклатура Как Номенклатура
Левое Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
Цены.Цена <> Неопределено
И ЦЕЛОЕ(Цены.Цена) % 10 = 5
Решение 6: С дополнением функцией на случай, если цены разные (для разных периодов)
Выбрать Различные
Номенклатура.Ссылка,
Номенклатура.Наименование
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
ЦЕЛОЕ(Цены.Цена) % 10 = 5
Решение 7: Вариант с проверкой через функцию МОД
Выбрать
Номенклатура.Ссылка,
Номенклатура.Наименование,
Цены.Цена
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
МОД(ЦЕЛОЕ(Цены.Цена), 10) = 5
Оптимальное решение
Рекомендуемый вариант — Решение 3:
Выбрать
Номенклатура.Ссылка,
Номенклатура.Наименование,
Цены.Цена
Из
Справочник.Номенклатура Как Номенклатура
Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
На Номенклатура.Ссылка = Цены.Номенклатура
Где
ЦЕЛОЕ(Цены.Цена) % 10 = 5
Упорядочить По
Номенклатура.Наименование
Это решение:
- Простое и понятное — четко видно условие на цену
- Безопасное — ЦЕЛОЕ гарантирует работу с целыми числами без копеек
- Эффективное — условие применяется на уровне БД
- Поддерживаемое — легко видеть логику
Важные моменты
-
ЦЕЛОЕ(Цены.Цена) % 10 = 5 — основное условие, отбирает цены, оканчивающиеся на 5 рублей
-
Оператор % (модуль) — для проверки остатка от деления на 10
-
Внутреннее Соединение — гарантирует, что выбираются только номенклатуры с существующими ценами
-
Наименование и Ссылка — возвращаем их для удобства работы с результатами
-
Упорядочить По — сортируем для лучшей читаемости результатов
Использование в коде 1С
Процедура ВыбратьНоменклатурыСЦенамиНа5()
ТекстЗапроса = "Выбрать
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Цены.Цена
|Из
| Справочник.Номенклатура Как Номенклатура
| Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
| На Номенклатура.Ссылка = Цены.Номенклатура
|Где
| ЦЕЛОЕ(Цены.Цена) % 10 = 5
|Упорядочить По
| Номенклатура.Наименование";
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультата = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТаблицаРезультата Цикл
Сообщить("Номенклатура: " + Строка.Наименование + ", Цена: " + Строка.Цена);
КонецЦикла;
КонецПроцедуры
Альтернативный способ — ФИЛЬТР
Если нужно применить фильтр к уже полученному результату в памяти:
Процедура ФильтроватьНоменклатурыВПамяти()
ТекстЗапроса = "Выбрать
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Цены.Цена
|Из
| Справочник.Номенклатура Как Номенклатура
| Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
| На Номенклатура.Ссылка = Цены.Номенклатура";
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультата = РезультатЗапроса.Выгрузить();
// Фильтруем в памяти
Отобрать(ТаблицаРезультата, "Цена % 10 = 5");
Для каждого Строка Из ТаблицаРезультата Цикл
Сообщить("Номенклатура: " + Строка.Наименование + ", Цена: " + Строка.Цена);
КонецЦикла;
КонецПроцедуры
Тестирование
// Если цены: 100, 125, 130, 155, 200
// Результат будет: 125, 155
// Так как ЦЕЛОЕ(125) % 10 = 5 ✓
// ЦЕЛОЕ(155) % 10 = 5 ✓