Документы и проведение

Документ фиксирует, что в определённый момент что-то произошло: продали, приняли на склад, начислили зарплату.

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

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

Зачем это нужно на практике

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

Дата и номер

Дата и номер — стандартные реквизиты любого документа, аналог Кода и Наименования у справочника. Дата определяет момент операции и порядок документов на оси времени. Номер — обычно автонумеруемый идентификатор в пределах периода (часто с префиксом организации). Читаются они как обычные свойства:

Реализация = Документы.РеализацияТоваров.НайтиПоНомеру("ПР-000123");

Если ЗначениеЗаполнено(Реализация) Тогда
    Сообщить("Документ от " + Формат(Реализация.Дата, "ДЛФ=DD")
        + ", номер " + Реализация.Номер
        + ", проведён: " + ?(Реализация.Проведён, "да", "нет"));
КонецЕсли;

Результат:

Документ от 15 марта 2026 г., номер ПР-000123, проведён: да

Здесь ?(условие, значениеЕслиИстина, значениеЕслиЛожь) — тернарный оператор 1С, а Проведён — стандартный признак документа.

Чем документ отличается от справочника

Оба хранят данные и имеют реквизиты с табличными частями — новичок легко их путает. Но роль у них разная:

СвойствоСправочникДокумент
Отвечает на вопросЧто у нас есть?Что произошло?
Привязка ко времениНетЕсть (дата и время)
Стандартные поляКод, НаименованиеДата, Номер
Главное действиеХранение и ссылкиПроведение → движения в регистрах
МеняетсяРедко (условно-постоянный)Постоянно создаются новые

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

Что такое проведение

Само по себе создание документа ничего не меняет в учёте — это лишь запись «зафиксировали намерение». Настоящая работа происходит при проведении: документ формирует движения в регистрах. Продали 5 ноутбуков — при проведении «Реализация» списывает 5 штук из регистра остатков. Приняли товар — «Поступление» их туда добавляет.

Проведение — процесс, при котором документ отражается в учёте, создавая записи (движения) в регистрах накопления и сведений. До проведения документ существует, но на итоги не влияет.

Логика проведения пишется в модуле документа — в обработчике события ОбработкаПроведения. Он выполняется на сервере в момент, когда пользователь нажимает «Провести»:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    // Перебираем строки товаров и списываем их с остатков
    Для Каждого СтрокаТовара Из Товары Цикл

        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период     = Дата;
        Движение.Номенклатура = СтрокаТовара.Номенклатура;
        Движение.Склад        = Склад;
        Движение.Количество   = СтрокаТовара.Количество;

    КонецЦикла;

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

Параметр Отказ — управляющий: если в ходе проверок присвоить Отказ = Истина, платформа отменит проведение целиком. Так делают контроль: например, запрещают провести продажу, если товара не хватает.

// Контроль остатков внутри ОбработкаПроведения
Если ОстатокНаСкладе < СтрокаТовара.Количество Тогда
    Сообщить("Недостаточно товара " + СтрокаТовара.Номенклатура + " на складе");
    Отказ = Истина;
КонецЕсли;

Распроведение

Если документ провели ошибочно, его распроводят — платформа удаляет все его движения из регистров, будто операции не было. Признак Проведён снова становится Ложь. Из кода это делается через объект документа:

ДокОбъект = Реализация.ПолучитьОбъект();

// Провести программно
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

// ...или распровести
ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Как это работает

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

Набор движений документа платформа «привязывает» к нему через регистратор. Поэтому распроведение — это просто удаление всех записей, где регистратор равен нашему документу. Никакого ручного пересчёта не нужно.

Частые ошибки

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

Итоги

  • Документ фиксирует факт операции во времени; его стандартные реквизиты — Дата и Номер.
  • Справочник — «что есть», документ — «что произошло»; документ влияет на итоги через проведение.
  • Проведение формирует движения в регистрах; логика живёт в обработчике ОбработкаПроведения на сервере.
  • Параметр Отказ = Истина отменяет проведение — так делают контроль остатков и прочие проверки.
  • Распроведение удаляет все движения документа; провести/распровести из кода можно через Записать() с нужным режимом.
Проверьте себя
1. Пользователь создал и записал документ «Реализация товаров», но НЕ провёл его. Как это отразится на остатках товара в регистре?
AОстаток сразу уменьшится на количество из документа
BОстаток не изменится: движения создаются только при проведении
CОстаток уменьшится, но только после перезапуска базы
DДокумент нельзя записать, не проведя его
2. Что произойдёт, если внутри процедуры ОбработкаПроведения присвоить Отказ = Истина?
AДокумент будет удалён из базы
BПроведение отменится, транзакция откатится, движения не запишутся
CДокумент проведётся, но без движений
DНичего, Отказ влияет только на запись реквизитов