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

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

Как создать движения документа в 1С

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

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

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

Что такое движения и какие регистры выбрать

Документ в 1С хранит только свои реквизиты и табличные части. Учётный эффект появляется, когда при проведении он формирует записи в регистрах: накопления (остатки, обороты), сведений, бухгалтерии или расчёта. Набор таких записей и называется движениями документа.

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

Прежде чем писать код, ответьте на вопрос: что должно измениться в учёте при проведении документа? Например, для «Приходной накладной» — увеличиться остаток товара на складе и появиться задолженность перед поставщиком. Каждое такое изменение — отдельный регистр и отдельная запись в нём.

Подключение регистров к документу

Откройте конфигуратор, найдите нужный документ в дереве конфигурации и откройте его свойства. На закладке «Движения» отметьте галочками регистры, по которым документ будет проводиться. Без этого шага обращение к Движения.ИмяРегистра в коде вызовет ошибку — набор записей просто не будет создан.

Там же проверьте свойство «Проведение» документа: оно должно быть установлено в «Разрешить». Если проведение запрещено, обработчик проведения не вызовется, и никакие движения не сформируются.

Создание движений через конструктор

Конструктор движений — самый быстрый способ получить рабочий код. В модуле объекта документа создайте пустую процедуру ОбработкаПроведения, поставьте курсор внутрь неё и нажмите кнопку «Конструкторы → Конструктор движений» (или вызовите через контекстное меню).

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

Порядок действий с конструктором
  1. 1
    Откройте модуль объекта документа и создайте процедуру ОбработкаПроведения(Отказ, Режим)
  2. 2
    Вызовите конструктор движений и выберите нужный регистр
  3. 3
    Укажите табличную часть и сопоставьте поля документа с измерениями и ресурсами регистра
  4. 4
    Нажмите ОК — конструктор вставит готовый код в модуль
  5. 5
    Обновите конфигурацию базы данных и проверьте проведение на тестовом документе

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

Ручное написание кода проведения

Для нестандартной логики код пишут вручную. Базовый шаблон выглядит так: получить набор записей регистра, добавить в него записи, заполнить поля и записать.

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

Движения.ОстаткиТоваров.Записывать = Истина;

Для Каждого СтрокаТовара Из Товары Цикл

Движение = Движения.ОстаткиТоваров.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Номенклатура = СтрокаТовара.Номенклатура;

Движение.Склад = Склад;

Движение.Количество = СтрокаТовара.Количество;

КонецЦикла;

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

Ключевые моменты кода. Строка Движения.ОстаткиТоваров.Записывать = Истина гарантирует, что набор будет записан даже если он пуст — это важно для очистки старых движений при перепроведении. Поле Период обычно равно дате документа. Для регистра остатков обязательно указывайте ВидДвижения (Приход или Расход), иначе запись будет некорректной.

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

Не читайте данные справочников через точку внутри цикла (СтрокаТовара.Номенклатура.СтавкаНДС) — каждое такое обращение тянет объект из базы. Получите нужные поля одним запросом до цикла и соедините с табличной частью.
ПЗ
Практическое замечание

Контроль остатков и отказ от проведения

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

Отказ откатывает транзакцию проведения целиком: ни одно движение не сохранится. Это безопасный механизм — не нужно вручную «отменять» уже записанные наборы.

Проверка результата

После обновления конфигурации создайте тестовый документ, заполните его и проведите. Затем откройте документ и через меню «Ещё → Движения документа» (в управляемых формах) посмотрите сформированные записи. Сверьте измерения, ресурсы и вид движения с ожидаемыми.

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

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

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

Список движений документа
Норма

Записи есть во всех подключённых регистрах, поля заполнены

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

Регистр пуст или записи с незаполненными измерениями

Отмена проведения
Норма

Движения удаляются полностью

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

Остаются «висячие» записи в регистре

Перепроведение документа
Норма

Движения перезаписываются без дублей

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

Записи задваиваются или суммируются

Отчёт по регистру
Норма

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

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

Расхождение с данными документа

Типичные ошибки и ограничения

Типичные ошибки
01
Регистр не отмечен в свойстве «Движения» документа — обращение к набору вызывает ошибку исполнения
02
Не установлен флаг Записывать = Истина — при перепроведении с пустой табличной частью старые движения не очищаются
03
Не указан ВидДвижения для регистра остатков — остатки считаются неверно или запись отвергается
04
Период движения не равен дате документа — данные попадают не в тот отчётный период
05
Контроль остатков выполняется до записи движений без учёта собственных записей документа — ложные отказы при перепроведении

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

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

Итог

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

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

Частые вопросы

Можно ли создать движения без программирования?

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

Почему документ проводится, но движений нет?

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

Как удалить движения документа, не удаляя сам документ?

Достаточно отменить проведение документа — платформа автоматически удалит все его записи из регистров. Программно это делается методом Записать с режимом РежимЗаписиДокумента.ОтменаПроведения. Вручную очищать наборы записей регистров не требуется.

Чем отличается регистр накопления «Остатки» от «Обороты»?

Регистр «Остатки» хранит вид движения (приход/расход) и позволяет быстро получать остаток на любую дату — он нужен для складов и взаиморасчётов. Регистр «Обороты» только накапливает суммы за период без разделения на приход и расход — он подходит для выручки, количества продаж и подобных показателей, где остаток не имеет смысла.

Нужно ли вручную записывать наборы движений в конце обработчика?

Обычно нет: если установлено Движения.ИмяРегистра.Записывать = Истина, платформа запишет набор автоматически при завершении проведения. Явный вызов Движения.ИмяРегистра.Записать() нужен только в середине обработчика — например, чтобы после записи запросом прочитать остатки с учётом собственных движений документа.

Можно ли изменить движения уже проведённого документа?

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