Как в запросе 1С добавить исключение для конкретного сотрудника при распределении затрат?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Бухгалтерский учет
← На главную

При разработке сложных отчетов или документов, связанных с начислением заработной платы и ее отражением в бухгалтерском учете, часто возникает задача: выбрать данные по общему фильтру (например, по конкретному проекту), но при этом включить в выборку определенных сотрудников, чьи данные учитываются по иным правилам. В этой статье мы разберем, как правильно составить запрос, избежать ловушек с приоритетами логических операций и что делать, если запрос визуально правильный, но не возвращает ожидаемые строки.

Постановка задачи и анализ исходного запроса

Рассмотрим ситуацию: у нас есть запрос, который собирает данные из трех источников: РегистрРасчета.Начисления, РегистрСведений.БухучетРаспределениеОсновногоЗаработка и РегистрНакопления.БухучетНачисленияУдержанияПоСотрудникам. Основная цель — получить отработанные часы и суммы, распределенные по статьям финансирования и способам отражения.

Проблема заключается в блоке фильтрации ГДЕ. По умолчанию запрос выбирает всех сотрудников по одному конкретному способу отражения (параметр &Способ). Однако нам нужно добавить в этот же список еще одного сотрудника (с кодом "ПА2"), у которого способ отражения отличается и содержит в названии подстроку "Способ2".

Первоначальный вариант условия с использованием конструкции ВЫБОР выглядел так:


ГДЕ
    ВЫБОР
        КОГДА БухучетНачисленияУдержанияПоСотрудникам.Сотрудник = &Сотрудник ТОГДА
            БухучетНачисленияУдержанияПоСотрудникам.СпособОтраженияЗарплатыВБухучете.Наименование ПОДОБНО "%Способ2%"
        ИНАЧЕ
            БухучетНачисленияУдержанияПоСотрудникам.СпособОтраженияЗарплатыВБухучете = &Способ
    КОНЕЦ
    И БухучетНачисленияУдержанияПоСотрудникам.Период МЕЖДУ &НачПериода И &КонПериода

На первый взгляд логика верна, но такой подход может не сработать из-за особенностей обработки NULL или неявных приоритетов. Разберем более надежные способы реализации этой логики.

Решение 1: Оптимизация через логическое ИЛИ с использованием скобок

Проанализируем альтернативный подход. Вместо громоздкой конструкции ВЫБОР в секции ГДЕ, эффективнее использовать сочетание операторов И и ИЛИ. Важно помнить, что в языке запросов 1С (как и в SQL) оператор И имеет более высокий приоритет, чем ИЛИ. Если не использовать скобки, запрос выдаст неверный результат или «размножит» строки.

Рассмотрим правильную структуру условия:


ГДЕ
    (
        (БухучетНачисленияУдержанияПоСотрудникам.Сотрудник = &Сотрудник 
         И БухучетНачисленияУдержанияПоСотрудникам.СпособОтраженияЗарплатыВБухучете.Наименование ПОДОБНО "%Способ2%")
        ИЛИ 
        (БухучетНачисленияУдержанияПоСотрудникам.СпособОтраженияЗарплатыВБухучете = &Способ)
    )
    И БухучетНачисленияУдержанияПоСотрудникам.Период МЕЖДУ &НачПериода И &КонПериода
    И БухучетНачисленияУдержанияПоСотрудникам.НачислениеУдержание.ВклВРаспределениеПЭО

В этом примере мы четко разделяем два сценария:

  1. Выборка конкретного сотрудника по специфическому способу отражения.
  2. Выборка всех остальных сотрудников по общему способу отражения.

Обе группы условий объединяются общими фильтрами по периоду и признаку включения в распределение.

Почему условие ПОДОБНО может не находить данные?

Часто программисты сталкиваются с тем, что код написан верно, но сотрудник "ПА2" все равно не попадает в выборку. Проанализируем возможные причины:

1. Особенности поиска по строке. Оператор ПОДОБНО "%Текст%" чувствителен к пробелам и невидимым символам. Если в наименовании способа отражения написано "Способ 2" (с пробелом), а вы ищете "%Способ2%", запись не будет найдена. Кроме того, использование процентов в начале строки "%..." отключает использование индексов СУБД, что замедляет запрос.

2. Расхождение данных в регистрах. В конфигурациях Зарплата и Управление Персоналом (ЗУП) 3.1 данные в регистр накопления БухучетНачисленияУдержанияПоСотрудникам записываются в момент проведения документов начисления (например, "Начисление зарплаты и взносов"). Если вы сначала изменили способ отражения в карточке сотрудника или в настройках штатного расписания, а документ начисления не перепровели, в регистре останутся старые данные.

Рекомендация: Всегда проверяйте данные напрямую через "Функции для технического специалиста" в соответствующем регистре, чтобы убедиться, какой именно способ отражения зафиксирован в движениях документа.

Работа с параметрами и исключение жесткого кодирования

В исходном примере код сотрудника ("ПА2") и текст способа отражения прописаны жестко. С точки зрения качественной разработки, это плохая практика. Если завтра код сотрудника изменится или появится второй такой человек, придется снова лезть в код. Проанализируем, как сделать решение универсальным:


// Вместо НайтиПоКоду лучше использовать ссылку из настроек или передавать список
Запрос.УстановитьПараметр("Сотрудник", Справочники.Сотрудники.НайтиПоКоду("ПА2"));
Запрос.УстановитьПараметр("Способ", Объект.Проект);
// Если нужен поиск по строке, передавайте её целиком как параметр
Запрос.УстановитьПараметр("СтрокаПоиска", "%Способ2%");

В самом запросе используйте ПОДОБНО &СтрокаПоиска. Но еще лучше передавать конкретную ссылку на элемент справочника СпособыОтраженияЗарплатыВБухучете.

Использование временных таблиц для исключений

Если список «особых» сотрудников велик, условия в блоке ГДЕ становятся нечитаемыми. Разберем профессиональный метод решения через временные таблицы (ВТ).

  1. Создаем ВТ ВТ_СписокИсключений, куда помещаем пары "Сотрудник" — "НужныйСпособ".
  2. В основном запросе используем ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы с этой ВТ.
  3. В условии ГДЕ прописываем логику: если сотрудник есть в ВТ, проверяем соответствие его спец. способу, если нет — используем стандартный способ.

Такой подход значительно упрощает отладку и позволяет легко расширять логику исключений без переписывания сложных цепочек И/ИЛИ.

Резюме

Выясним кратко основные моменты, которые помогут вам добавить сотрудника в исключение:

Применяя эти шаги, мы добьемся стабильной работы запроса и корректного формирования ФОТ в документах распределения затрат.

← На главную