Почему запрос в 1С с условием "Проведен = Истина" не возвращает данные?

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

Разберем классическую ситуацию, с которой часто сталкиваются как начинающие разработчики, так и опытные специалисты при переходе на новые конфигурации. Представим сценарий: вы пишете простой запрос для получения списка документов «Счет на оплату поставщика» и хотите отобрать только те документы, которые визуально отмечены в системе как проведенные. Вы добавляете условие Проведен = Истина, запускаете запрос, но он возвращает абсолютно пустой результат. При этом в пользовательском интерфейсе вы отчетливо видите документы с зеленой галочкой проведения. Давайте проанализируем эту ситуацию, выясним внутреннюю логику работы платформы «1С:Предприятие» и найдем правильное решение.

Причина 1. Свойство метаданных «Проведение» в конфигураторе

Первое, что необходимо сделать для локализации проблемы — обратиться к конфигуратору и изучить свойства метаданных исследуемого документа. Нажмите правой кнопкой мыши на документ СчетНаОплатуПоставщика, откройте его свойства и перейдите на вкладку Движения.

Здесь вы найдете ключевую настройку:

Если для документа установлено свойство Проведение = Запретить, это означает, что документ в принципе не предназначен для совершения движений по регистрам накопления, бухгалтерии или сведений. На уровне базы данных системный реквизит Проведен для всех без исключения документов данного типа всегда принимает значение Ложь (False). Платформа физически блокирует попытки установить этот флаг в значение Истина, даже если попытаться сделать это программным путем при записи.

Именно поэтому любое условие вида ГДЕ СчетНаОплатуПоставщика.Проведен = Истина всегда будет отсекать абсолютно все записи, делая выборку пустой.

Причина 2. Особенность отображения пиктограмм в интерфейсе 1С

Почему же тогда в списках документов пользователи и разработчики видят зеленую галочку, которая традиционно ассоциируется с проведенным документом? Это сознательное поведение интерфейсных механизмов платформы «1С».

Для документов, проведение которых запрещено на уровне метаданных, система использует специальную логику визуализации в динамических списках:

  1. Документ, который просто записан и не помечен на удаление, выводится со значком, визуально идентичным пиктограмме проведенного документа (документ с зеленой галочкой).
  2. Таким образом платформа сообщает пользователю, что данный документ является завершенным и актуальным. Поскольку проводить его не требуется, он сразу после записи считается готовым и окончательно зафиксированным в системе.

Это визуальное сходство часто рождает ложную уверенность в том, что документ «проведен», хотя в таблице СУБД поле Проведен гарантированно содержит Ложь.

Как правильно делать отбор в запросе для непроводимых документов?

Выяснив причину, рассмотрим правильные способы составления запросов. Если вам необходимо выбрать все актуальные (действующие) документы типа «Счет на оплату поставщика», критерием их корректности выступает исключительно отсутствие пометки удаления. Свойство проведения проверять не имеет смысла.

Разберем по шагам правильный вариант запроса:


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

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

Стандарты написания булевых условий в запросах 1С

Обратим внимание на важную деталь, упомянутую в обсуждении на форуме. Конструкция вида Проведен = Истина считается признаком невысокой квалификации разработчика и плохим стилем программирования.

Поскольку поле Проведен изначально имеет примитивный тип Булево, оно само по себе возвращает логическое значение для секции ГДЕ. Сравнивать его с константой Истина избыточно.

Рассмотрим правила хорошего тона при написании условий для действительно проводимых документов (например, для накладных или платежных документов):

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

← На главную