← Назад к вопросам

Запрос: выбор номенклатур с ценами, оканчивающимися на 5

1.0 Junior🔥 101 комментариев
#Запросы и оптимизация

Условие

При помощи одного запроса выберите те номенклатуры, цены которых оканчиваются на 5 (без учёта копеек).

Дано:

  • Справочник "Номенклатура"
  • Регистр сведений "Цены номенклатуры" с измерением "Номенклатура" и ресурсом "Цена"

Пример

Если цены: 100, 125, 130, 155, 200 Нужно выбрать номенклатуры с ценами: 125, 155

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Обзор задачи

Даная задача требует написания 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
Упорядочить По
    Номенклатура.Наименование

Это решение:

  • Простое и понятное — четко видно условие на цену
  • Безопасное — ЦЕЛОЕ гарантирует работу с целыми числами без копеек
  • Эффективное — условие применяется на уровне БД
  • Поддерживаемое — легко видеть логику

Важные моменты

  1. ЦЕЛОЕ(Цены.Цена) % 10 = 5 — основное условие, отбирает цены, оканчивающиеся на 5 рублей

  2. Оператор % (модуль) — для проверки остатка от деления на 10

  3. Внутреннее Соединение — гарантирует, что выбираются только номенклатуры с существующими ценами

  4. Наименование и Ссылка — возвращаем их для удобства работы с результатами

  5. Упорядочить По — сортируем для лучшей читаемости результатов

Использование в коде 1С

Процедура ВыбратьНоменклатурыСЦенамиНа5()
    
    ТекстЗапроса = "Выбрать
        |    Номенклатура.Ссылка,
        |    Номенклатура.Наименование,
        |    Цены.Цена
        |Из
        |    Справочник.Номенклатура Как Номенклатура
        |    Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
        |        На Номенклатура.Ссылка = Цены.Номенклатура
        |Где
        |    ЦЕЛОЕ(Цены.Цена) % 10 = 5
        |Упорядочить По
        |    Номенклатура.Наименование";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаРезультата = РезультатЗапроса.Выгрузить();
    
    Для каждого Строка Из ТаблицаРезультата Цикл
        Сообщить("Номенклатура: " + Строка.Наименование + ", Цена: " + Строка.Цена);
    КонецЦикла;
    
КонецПроцедуры

Альтернативный способ — ФИЛЬТР

Если нужно применить фильтр к уже полученному результату в памяти:

Процедура ФильтроватьНоменклатурыВПамяти()
    
    ТекстЗапроса = "Выбрать
        |    Номенклатура.Ссылка,
        |    Номенклатура.Наименование,
        |    Цены.Цена
        |Из
        |    Справочник.Номенклатура Как Номенклатура
        |    Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры Как Цены
        |        На Номенклатура.Ссылка = Цены.Номенклатура";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаРезультата = РезультатЗапроса.Выгрузить();
    
    // Фильтруем в памяти
    Отобрать(ТаблицаРезультата, "Цена % 10 = 5");
    
    Для каждого Строка Из ТаблицаРезультата Цикл
        Сообщить("Номенклатура: " + Строка.Наименование + ", Цена: " + Строка.Цена);
    КонецЦикла;
    
КонецПроцедуры

Тестирование

// Если цены: 100, 125, 130, 155, 200
// Результат будет: 125, 155
// Так как ЦЕЛОЕ(125) % 10 = 5 ✓
//        ЦЕЛОЕ(155) % 10 = 5 ✓
Запрос: выбор номенклатур с ценами, оканчивающимися на 5 | PrepBro