Почему запрос к документам отпуска в 1С не возвращает данные и как это исправить?

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

Часто начинающие разработчики и аналитики сталкиваются с ситуацией: документ в системе создан, заполнен и проведен, но при попытке извлечь данные с помощью Конструктора запросов или консоли запросов результат оказывается пустым. Рассмотрим на примере документа Отпуск, почему это происходит и как правильно отладить запрос, чтобы получить нужные сведения.

Анализируем исходный запрос

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


ВЫБРАТЬ
    Отпуск.Сотрудник КАК Сотрудник,
    Отпуск.ДатаНачалаОсновногоОтпуска КАК ДатаНачала,
    Отпуск.ДатаОкончанияОсновногоОтпуска КАК ДатаОкончания
ИЗ
    Документ.Отпуск КАК Отпуск
ГДЕ
    Отпуск.Сотрудник = &Сотрудник
    И Отпуск.ДатаОкончанияОсновногоОтпуска >= &ТекущаяДата

На первый взгляд запрос написан верно. Однако в системе 1С существует множество "подводных камней", которые могут сделать условие ГДЕ невыполнимым.

Разбираем проблему №1: Особенности типа Дата и время

Выясним причину, связанную с форматом хранения данных. В 1С тип Дата всегда содержит время (часы, минуты, секунды). Если в реквизите ДатаОкончанияОсновногоОтпуска записано значение 22.04.2024 00:00:00, а в параметр &ТекущаяДата передается текущее системное время (например, 22.04.2024 14:30:00), то условие ДатаОкончания >= ТекущаяДата вернет Ложь.

Решение: При передаче параметров в запрос всегда приводите даты к началу или концу дня. В коде это выглядит так:


Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
// Или для захвата всего дня в условии "по":
Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата()));

Если вы работаете в консоли запросов, убедитесь, что в поле значения параметра указана дата с временем 00:00:00, либо используйте функции языка запросов для очистки времени прямо в условии.

Разбираем проблему №2: Сотрудники против Физических лиц

Проанализируем ситуацию со справочниками. В конфигурациях типа Зарплата и Управление Персоналом (ЗУП) существует два похожих справочника: Сотрудники и Физические лица. В документе Отпуск реквизит Сотрудник чаще всего имеет тип СправочникСсылка.Сотрудники.

Если в параметре запроса &Сотрудник вы случайно выберете значение из справочника Физические лица, запрос будет пустым. Несмотря на то, что ФИО совпадает, для системы это принципиально разные объекты с разными уникальными идентификаторами (GUID).

Как проверить: Посмотрите на тип параметра в консоли запросов. Он должен строго соответствовать типу реквизита в метаданных документа.

Разбираем проблему №3: Статус проведения документа

Посмотрим на пример хорошего тона при написании запросов. Автор вопроса указал, что документ проведен, но в самом тексте запроса проверка на проведение отсутствует. Если вы хотите получать только актуальные данные, обязательно добавляйте условия:


ГДЕ
    Отпуск.Проведен = ИСТИНА
    И Отпуск.ПометкаУдаления = ЛОЖЬ

Это исключит попадание в выборку черновиков или помеченных на удаление объектов, которые могли быть созданы по ошибке и иметь те же параметры сотрудника и дат.

Разбираем проблему №4: Табличные части и пустые реквизиты

Рассмотрим структуру современных документов. В актуальных версиях 1С данные об отпуске могут храниться не в шапке документа, а в табличных частях (например, если сотруднику предоставляется основной и дополнительный отпуск одновременно). Если вы обращаетесь к реквизиту ДатаОкончанияОсновногоОтпуска в шапке, а он не заполнен (так как данные ушли в таблицу), запрос вернет пустое значение (пустую дату).

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


ВЫБРАТЬ
    ОтпускДопОтпуска.Ссылка.Сотрудник,
    ОтпускДопОтпуска.ДатаНачала,
    ОтпускДопОтпуска.ДатаОкончания
ИЗ
    Документ.Отпуск.ДополнительныеОтпуска КАК ОтпускДопОтпуска

Разбираем проблему №5: Регистры против Документов

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

Для получения информации о том, кто сейчас в отпуске, правильнее использовать виртуальные таблицы среза последних регистра сведений ДанныеСостоянийСотрудников. Это работает быстрее и учитывает все кадровые изменения, а не только один конкретный вид документа.

Итоговый чек-лист для отладки запроса

Если ваш запрос в 1С не работает, пройдите по следующим шагам:

  1. Проверьте параметры: Нажмите кнопку "Получить параметры" в консоли и убедитесь, что они заполнены верными значениями.
  2. Уберите лишние фильтры: Попробуйте выполнить запрос без условия по дате. Если данные появились — проблема в сравнении дат (время или границы периода).
  3. Проверьте типы ссылок: Убедитесь, что передаете в параметр Сотрудника, а не Физическое лицо.
  4. Проверьте права доступа: Если включен механизм RLS (Record Level Security), система может скрывать данные от пользователя, даже если они есть в базе. Попробуйте запустить запрос под пользователем с полными правами.
  5. Имена реквизитов: Убедитесь, что реквизит шапки ДатаОкончанияОсновногоОтпуска заполнен в самом документе.

Соблюдение этих правил поможет вам быстро находить ошибки в логике запросов и корректно извлекать данные из учетной системы.

← На главную