К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как определить, проведен документ или нет, программно в 1С

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

При разработке и доработке конфигураций 1С проверка статуса проведения документа — одна из самых частых задач. От неё зависят условия в обработках, формирование отчётов, блокировки редактирования, обмены данными и произвольные проверки перед записью. Платформа предоставляет несколько способов узнать, проведён документ или нет: через свойство объекта, через запрос к базе и через анализ движений по регистрам.

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

Ниже разобраны все рабочие варианты с примерами кода на встроенном языке 1С, указаны ограничения каждого подхода и типичные ошибки, из-за которых проверка возвращает неверный результат.

Что означает признак «Проведен» в платформе 1С

Каждый документ в 1С хранится в таблице со служебным полем «Проведен» (Posted). Это булево значение: Истина — документ проведён, его движения записаны в регистры; Ложь — документ создан, но проведения не было либо проведение отменено. Пометка удаления — отдельный признак, он не эквивалентен отмене проведения.

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

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

Проверка через свойство объекта или ссылки

Самый простой случай — документ уже получен как объект в модуле формы, обработки или процедуре проведения. Тогда достаточно прочитать свойство:

Если ДокументОбъект.Проведен Тогда

// документ проведён

Иначе

// документ не проведён или проведение отменено

КонецЕсли;

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

Если ДокументСсылка.Проведен Тогда

Сообщить("Документ проведён");

КонецЕсли;

У этого способа есть ограничение. Обращение к свойству ссылки на сервере вызывает обращение к базе. Если такая проверка стоит внутри цикла по тысячам ссылок, каждая итерация порождает отдельный запрос — это классическая причина «тормозов» обработок. Для массовых проверок используйте запрос, описанный ниже.

Проверка запросом для массовых операций

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Проведен

| И РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Для проверки одного конкретного документа запрос тоже допустим, если объект получать нежелательно:

Запрос.Текст =

"ВЫБРАТЬ

| Таб.Проведен КАК Проведен

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Таб

|ГДЕ

| Таб.Ссылка = &Ссылка";

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ДокументПроведен = Выборка.Проведен;

КонецЕсли;

Обратите внимание: если документ с такой ссылкой не существует (битая ссылка), выборка будет пустой. Это нужно обрабатывать отдельно, иначе переменная останется неопределённой и логика пойдёт по неверной ветке.

Сравнение способов проверки

Свойство объекта

Подходит, когда объект уже получен в модуле. Нулевая дополнительная стоимость, но требует загруженного объекта.

Свойство ссылки

Удобно для разовой проверки без чтения объекта. Не подходит для циклов из-за обращения к базе на каждой итерации.

Запрос

Оптимален для массовых проверок и отборов. Требует аккуратной обработки пустого результата и битых ссылок.

Проверка в модуле проведения и при записи

В обработчике ОбработкаПроведения свойство Проведен текущего объекта в момент выполнения ещё не установлено в Истину — проверять его там бессмысленно. Если нужно узнать, был ли документ проведён до текущей операции (например, чтобы отличить первое проведение от перепроведения), читайте состояние ссылки до записи:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Не ЭтоНовый() Тогда

БылПроведен = Ссылка.Проведен;

// дальнейшая логика с учётом прежнего состояния

КонецЕсли;

КонецПроцедуры

Частая задача — запретить изменение проведённого документа. Для этого в подписке на событие ПередЗаписью проверяют комбинацию: документ уже проведён в базе, а режим записи — обычная запись без отмены проведения. В типовых конфигурациях для этого есть готовые механизмы (например, проверки дат запрета изменения данных), и дублировать их собственными жёсткими блокировками обычно не стоит.

Проверка через движения по регистрам

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Таб.Регистратор КАК Регистратор

|ИЗ

| РегистрНакопления.ТоварыНаСкладах КАК Таб

|ГДЕ

| Таб.Регистратор = &Ссылка";

ЕстьДвижения = Не Запрос.Выполнить().Пустой();

Такую проверку применяют точечно: она тяжелее чтения одного поля и оправдана только для диагностики. Нормальное состояние — проведённый документ имеет движения по всем регистрам, по которым он обязан проводиться, а непроведённый — не имеет движений вовсе.

Контрольные точки

Как проверить результат

Свойство Проведен у ссылки
Норма

Истина — документ проведён, Ложь — нет

Тревожный признак

Значение не читается, ошибка обращения — возможна битая ссылка

Движения по регистру у проведённого документа
Норма

Записи присутствуют по ожидаемым регистрам

Тревожный признак

Проведен = Истина, но движений нет — признак повреждения данных или особенностей модуля проведения

Поведение в цикле
Норма

Один запрос обрабатывает всю выборку

Тревожный признак

Обращение к базе на каждой итерации — рост времени выполнения

Отбор проведённых документов в динамических списках

При настройке форм списков и отчётов на СКД отбор по проведённости делается без программирования: в настройках динамического списка или схемы компоновки добавляется отбор «Проведен Равно Да». Это стандартное поле, доступное всегда.

Если список строится программно, отбор устанавливается через свойство Отбор динамического списка или через параметры запроса в произвольном тексте запроса списка. Учитывайте, что жёсткий отбор в тексте запроса списка лишает пользователя возможности увидеть непроведённые документы — обычно правильнее выносить условие в настраиваемый отбор.

Типичные ошибки
01
Проверка Проведен в обработчике ОбработкаПроведения — значение там ещё Ложь, логика срабатывает неверно
02
Проверка в цикле через Ссылка.Проведен — тысячи лишних запросов к базе и падение производительности
03
Смешение ПометкаУдаления и Проведен — помеченный документ может быть формально проведённым, это разные признаки
04
Игнорирование пустого результата запроса — при битой ссылке переменная остаётся незаполненной и ветвление идёт по ошибочному пути

Особые случаи и ограничения

Несколько ситуаций, где простая проверка даёт неочевидный результат. Документы, у которых в конфигураторе отключено проведение (режим «Запрещено»), всегда имеют Проведен = Ложь — для них этот признак бессмыслен. В разделённых информационных базах и при обменах возможны ситуации, когда документ загружен без проведения, хотя в базе-источнике был проведён: статус переносится настройками правил обмена, и проверять нужно уже в приёмнике.

Для документов с оперативным проведением отмена проведения может быть недоступна в некоторых режимах, а перепроведение — ограничено текущей датой. Если ваша логика строится на предположении, что любой проведённый документ можно распровести, проверьте настройки вида документа в конфигураторе.

Наконец, при работе через COM-соединение или внешние источники помните о типах: свойство Проведен возвращает булево значение, и сравнение с числом или строкой «Истина» даст неверный результат. Используйте строгое сравнение с Истина/Ложь.

Маршрут решения

Как выбрать способ проверки

Объект документа уже получен в кодеЧитайте ДокументОбъект.Проведен — дополнительных обращений к базе не будет
Есть только ссылка и проверка разоваяИспользуйте Ссылка.Проведен
Нужно проверить много документов или отобрать проведённыеСформируйте запрос с условием ГДЕ Проведен = ИСТИНА
Нужно подтвердить фактические движения, а не признакПроверьте наличие записей в регистрах по регистратору

FAQ

Чем отличается Проведен от ПометкаУдаления?

Это независимые признаки. Помеченный на удаление документ может оставаться проведённым до физического удаления, хотя типовые механизмы обычно снимают проведение при пометке. Если логика должна исключать удалённые документы, проверяйте оба условия: Проведен = Истина И ПометкаУдаления = Ложь.

Как проверить проведённость документа, не открывая транзакцию чтения объекта?

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

Почему в ОбработкаПроведения свойство Проведен равно Ложь?

Признак устанавливается платформой после успешного завершения обработчика проведения. Внутри самого обработчика документ ещё считается непроведённым. Для анализа прежнего состояния читайте Ссылка.Проведен до записи.

Можно ли отобрать проведённые документы в отчёте на СКД без кода?

Да. В настройках отчёта добавьте отбор по полю Проведен со сравнением «Равно» и значением «Да». Поле доступно в схеме компоновки для любого документа без доработок.

Что делать, если Проведен = Истина, а движений по регистру нет?

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

Работает ли проверка Проведен для битых ссылок?

Нет, обращение к свойству битой ссылки вызывает ошибку или возвращает неопределённое поведение в зависимости от контекста. Перед проверкой убедитесь, что ссылка существует — например, запросом с проверкой ISNULL или через функцию проверки существования объекта.

Итог

Что важно запомнить

Проведённость документа определяется свойством Проведен у объекта или ссылки. Для массовых проверок используйте запрос, не проверяйте признак внутри ОбработкаПроведения и не путайте его с пометкой удаления. Для диагностики расхождений дополнительно сверяйте фактические движения по регистрам.