При разработке отчетов, обработок и механизмов выгрузки в 1С разработчики часто сталкиваются с ситуацией, когда стандартный отбор по признаку проведения не работает для документа ОперацияБух (или Операция). Проверка реквизита Проведен для данного документа всегда возвращает Ложь, даже если проводки введены, отображаются в учете и влияют на сальдо и обороты.
Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим практические способы выборки действительно проведенных (активных) операций.
Выясним причину этой особенности на уровне метаданных. В типовых конфигурациях (например, «1С:Бухгалтерия предприятия», «1С:Комплексная автоматизация», «1С:ERP») для документа ОперацияБух свойство конфигурации «Проведение» установлено в значение «Запретить».
Из этого следуют ключевые особенности работы объекта:
Проведен для этого документа всегда равен Ложь.Записать(РежимЗаписиДокумента.Проведение) приведет к вызову исключения.ОбработкаПроведения.Хозрасчетный).Таким образом, в учетной системе документом, участвующим в формировании финансового результата, считается не просто существующий документ, а документ, у которого есть активные записи в регистре.
Чтобы считать операцию «проведенной» (активной в учете), должны одновременно выполняться следующие условия:
ПометкаУдаления = Ложь.Активность = Истина.Рассмотрим самый быстрый и оптимизированный вариант получения ссылок на действующие операции. Если нам необходим только перечень документов, сформировавших проводки, запрос следует строить напрямую к таблице регистра бухгалтерии:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Рег.Регистратор КАК Ссылка
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Рег
ГДЕ
Рег.Регистратор ССЫЛКА Документ.ОперацияБух
И НЕ Рег.Регистратор.ПометкаУдаления
И Рег.Активность
В этом запросе мы отсекаем помеченные на удаление документы, фильтруем записи только по нужному типу метаданных и гарантируем, что проводки включены в расчет итогов с помощью условия Рег.Активность.
Если в результирующей выборке нам требуются реквизиты самого документа (например, Номер, Дата, Содержание, Организация), разберем запрос, строящийся от таблицы документов с условием вхождения в активные записи:
ВЫБРАТЬ
Док.Ссылка КАК Ссылка,
Док.Дата КАК Дата,
Док.Номер КАК Номер,
Док.Содержание КАК Содержание,
Док.Организация КАК Организация
ИЗ
Документ.ОперацияБух КАК Док
ГДЕ
НЕ Док.ПометкаУдаления
И Док.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Рег.Регистратор
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Рег
ГДЕ
Рег.Регистратор ССЫЛКА Документ.ОперацияБух
И Рег.Активность)
Такой подход позволяет выбрать все данные шапки операции, исключив «пустые» ручные операции, в которых нет ни одной строки проводок, а также операции с выключенной активностью движений.
Когда требуется проверить статус одного конкретного документа в коде (например, перед выполнением сервисной функции), обратимся к набору записей регистра без построения тяжелых запросов:
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
ОперацияАктивна = НЕ ДокументСсылка.ПометкаУдаления И (Набор.Количество() > 0);
Если ОперацияАктивна Тогда
ЕстьАктивныеПроводки = Ложь;
Для Каждого Запись Из Набор Цикл
Если Запись.Активность Тогда
ЕстьАктивныеПроводки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
ОперацияАктивна = ЕстьАктивныеПроводки;
КонецЕсли;
Используя проверку записей регистра бухгалтерии вместо обращения к свойству Проведен, вы гарантируете корректный отбор актуальных данных учета независимо от настроек проведения конкретного вида документа.