Часто начинающие разработчики и аналитики сталкиваются с ситуацией: документ в системе создан, заполнен и проведен, но при попытке извлечь данные с помощью Конструктора запросов или консоли запросов результат оказывается пустым. Рассмотрим на примере документа Отпуск, почему это происходит и как правильно отладить запрос, чтобы получить нужные сведения.
Проанализируем типичный запрос, который может не выдавать результат. Представим ситуацию: мы хотим получить список сотрудников, находящихся в отпуске на определенную дату, используя прямую выборку из документов.
ВЫБРАТЬ
Отпуск.Сотрудник КАК Сотрудник,
Отпуск.ДатаНачалаОсновногоОтпуска КАК ДатаНачала,
Отпуск.ДатаОкончанияОсновногоОтпуска КАК ДатаОкончания
ИЗ
Документ.Отпуск КАК Отпуск
ГДЕ
Отпуск.Сотрудник = &Сотрудник
И Отпуск.ДатаОкончанияОсновногоОтпуска >= &ТекущаяДата
На первый взгляд запрос написан верно. Однако в системе 1С существует множество "подводных камней", которые могут сделать условие ГДЕ невыполнимым.
Выясним причину, связанную с форматом хранения данных. В 1С тип Дата всегда содержит время (часы, минуты, секунды). Если в реквизите ДатаОкончанияОсновногоОтпуска записано значение 22.04.2024 00:00:00, а в параметр &ТекущаяДата передается текущее системное время (например, 22.04.2024 14:30:00), то условие ДатаОкончания >= ТекущаяДата вернет Ложь.
Решение: При передаче параметров в запрос всегда приводите даты к началу или концу дня. В коде это выглядит так:
Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
// Или для захвата всего дня в условии "по":
Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата()));
Если вы работаете в консоли запросов, убедитесь, что в поле значения параметра указана дата с временем 00:00:00, либо используйте функции языка запросов для очистки времени прямо в условии.
Проанализируем ситуацию со справочниками. В конфигурациях типа Зарплата и Управление Персоналом (ЗУП) существует два похожих справочника: Сотрудники и Физические лица. В документе Отпуск реквизит Сотрудник чаще всего имеет тип СправочникСсылка.Сотрудники.
Если в параметре запроса &Сотрудник вы случайно выберете значение из справочника Физические лица, запрос будет пустым. Несмотря на то, что ФИО совпадает, для системы это принципиально разные объекты с разными уникальными идентификаторами (GUID).
Как проверить: Посмотрите на тип параметра в консоли запросов. Он должен строго соответствовать типу реквизита в метаданных документа.
Посмотрим на пример хорошего тона при написании запросов. Автор вопроса указал, что документ проведен, но в самом тексте запроса проверка на проведение отсутствует. Если вы хотите получать только актуальные данные, обязательно добавляйте условия:
ГДЕ
Отпуск.Проведен = ИСТИНА
И Отпуск.ПометкаУдаления = ЛОЖЬ
Это исключит попадание в выборку черновиков или помеченных на удаление объектов, которые могли быть созданы по ошибке и иметь те же параметры сотрудника и дат.
Рассмотрим структуру современных документов. В актуальных версиях 1С данные об отпуске могут храниться не в шапке документа, а в табличных частях (например, если сотруднику предоставляется основной и дополнительный отпуск одновременно). Если вы обращаетесь к реквизиту ДатаОкончанияОсновногоОтпуска в шапке, а он не заполнен (так как данные ушли в таблицу), запрос вернет пустое значение (пустую дату).
Рекомендация: Проверьте в конфигураторе, действительно ли данные хранятся в тех реквизитах, к которым вы обращаетесь. Возможно, вам нужно делать соединение с табличной частью документа:
ВЫБРАТЬ
ОтпускДопОтпуска.Ссылка.Сотрудник,
ОтпускДопОтпуска.ДатаНачала,
ОтпускДопОтпуска.ДатаОкончания
ИЗ
Документ.Отпуск.ДополнительныеОтпуска КАК ОтпускДопОтпуска
Выясним, как работают профессиональные разработчики. Обращение напрямую к таблицам документов — не самая эффективная практика. Данные о состояниях сотрудников (в отпуске, на больничном) записываются в Регистры сведений или Регистры расчета.
Для получения информации о том, кто сейчас в отпуске, правильнее использовать виртуальные таблицы среза последних регистра сведений ДанныеСостоянийСотрудников. Это работает быстрее и учитывает все кадровые изменения, а не только один конкретный вид документа.
Если ваш запрос в 1С не работает, пройдите по следующим шагам:
Сотрудника, а не Физическое лицо.ДатаОкончанияОсновногоОтпуска заполнен в самом документе.Соблюдение этих правил поможет вам быстро находить ошибки в логике запросов и корректно извлекать данные из учетной системы.