Как отобрать проведенные бухгалтерские операции в 1С?

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

При разработке отчетов, обработок и механизмов выгрузки в 1С разработчики часто сталкиваются с ситуацией, когда стандартный отбор по признаку проведения не работает для документа ОперацияБух (или Операция). Проверка реквизита Проведен для данного документа всегда возвращает Ложь, даже если проводки введены, отображаются в учете и влияют на сальдо и обороты.

Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим практические способы выборки действительно проведенных (активных) операций.

Почему документ ОперацияБух не бывает проведенным?

Выясним причину этой особенности на уровне метаданных. В типовых конфигурациях (например, «1С:Бухгалтерия предприятия», «1С:Комплексная автоматизация», «1С:ERP») для документа ОперацияБух свойство конфигурации «Проведение» установлено в значение «Запретить».

Из этого следуют ключевые особенности работы объекта:

  1. Платформенный реквизит Проведен для этого документа всегда равен Ложь.
  2. Попытка вызвать метод Записать(РежимЗаписиДокумента.Проведение) приведет к вызову исключения.
  3. У документа отсутствует обработчик события ОбработкаПроведения.
  4. Документ служит исключительно «оболочкой-регистратором». Введенные пользователем проводки не хранятся в табличных частях документа, а сразу записываются напрямую в регистр бухгалтерии (например, Хозрасчетный).

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

Критерии активной операции

Чтобы считать операцию «проведенной» (активной в учете), должны одновременно выполняться следующие условия:

  1. Документ не помечен на удаление: ПометкаУдаления = Ложь.
  2. В регистре бухгалтерии присутствуют записи с данным регистратором.
  3. Для записей регистра флаг активности включен: Активность = Истина.

Способ 1. Получение списка регистраторов запросом к регистру бухгалтерии

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Рег.Регистратор КАК Ссылка
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Рег
ГДЕ
    Рег.Регистратор ССЫЛКА Документ.ОперацияБух
    И НЕ Рег.Регистратор.ПометкаУдаления
    И Рег.Активность

В этом запросе мы отсекаем помеченные на удаление документы, фильтруем записи только по нужному типу метаданных и гарантируем, что проводки включены в расчет итогов с помощью условия Рег.Активность.

Способ 2. Запрос от таблицы документа с фильтрацией по движениям

Если в результирующей выборке нам требуются реквизиты самого документа (например, Номер, Дата, Содержание, Организация), разберем запрос, строящийся от таблицы документов с условием вхождения в активные записи:


ВЫБРАТЬ
    Док.Ссылка КАК Ссылка,
    Док.Дата КАК Дата,
    Док.Номер КАК Номер,
    Док.Содержание КАК Содержание,
    Док.Организация КАК Организация
ИЗ
    Документ.ОперацияБух КАК Док
ГДЕ
    НЕ Док.ПометкаУдаления
    И Док.Ссылка В
        (ВЫБРАТЬ РАЗЛИЧНЫЕ
            Рег.Регистратор
        ИЗ
            РегистрБухгалтерии.Хозрасчетный КАК Рег
        ГДЕ
            Рег.Регистратор ССЫЛКА Документ.ОперацияБух
            И Рег.Активность)

Такой подход позволяет выбрать все данные шапки операции, исключив «пустые» ручные операции, в которых нет ни одной строки проводок, а также операции с выключенной активностью движений.

Способ 3. Проверка активности конкретного документа через объектную модель

Когда требуется проверить статус одного конкретного документа в коде (например, перед выполнением сервисной функции), обратимся к набору записей регистра без построения тяжелых запросов:


Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();

ОперацияАктивна = НЕ ДокументСсылка.ПометкаУдаления И (Набор.Количество() > 0);

Если ОперацияАктивна Тогда
    ЕстьАктивныеПроводки = Ложь;
    Для Каждого Запись Из Набор Цикл
        Если Запись.Активность Тогда
            ЕстьАктивныеПроводки = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    ОперацияАктивна = ЕстьАктивныеПроводки;
КонецЕсли;

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

← На главную