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

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

Как создать движения документа с помощью конструктора движений 1С

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

Конструктор движений — встроенный инструмент конфигуратора 1С, который автоматически генерирует код процедуры проведения документа по регистрам. Вместо ручного написания циклов по табличным частям и заполнения записей регистров разработчик отмечает нужные регистры и реквизиты, а платформа создаёт готовый текст модуля. Это ускоряет разработку и снижает количество ошибок в типовых сценариях проведения.

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

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

Что должен делать документ до запуска конструктора

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

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

Желательно заранее продумать структуру: какие табличные части документа участвуют в проведении, какие реквизиты шапки и строк попадают в измерения, ресурсы и реквизиты регистров. Конструктор предложит сопоставление автоматически по совпадению имён, но осмысленная структура метаданных сильно упрощает этот этап.

Как запустить конструктор движений

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

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

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

Настройка соответствия реквизитов

Центральная часть окна конструктора — таблица соответствия полей регистра и выражений на встроенном языке. Для каждого измерения, ресурса и реквизита регистра нужно указать, откуда берётся значение: из реквизита шапки документа (например, Склад), из текущей строки табличной части (ТекСтрокаТовары.Номенклатура) или из произвольного выражения.

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

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

Что генерирует конструктор: разбор кода

После нажатия «ОК» в модуль объекта документа вставляется процедура ОбработкаПроведения. Для каждого регистра создаётся блок: цикл по строкам табличной части, внутри которого вызывается Движения.ИмяРегистра.Добавить(), задаётся вид движения, период и значения полей записи.

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

Строка Движения.ОстаткиТоваров.Записывать = Истина; принципиально важна: она указывает платформе физически записать набор движений. Если её убрать, записи сформируются в памяти, но в базу не попадут. Конструктор добавляет эту строку автоматически, но при ручной доработке её легко потерять.

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

Когда конструктора недостаточно

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

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

Когда использовать конструктор, а когда писать код вручную

Документ просто переносит строки табличной части в регистр без условий и расчётовИспользуйте конструктор — сгенерированного кода достаточно
Перед списанием нужно проверить остатки и отказать в проведении при нехваткеСгенерируйте базовый код конструктором, затем добавьте запрос остатков и установку Отказ = Истина
Движения зависят от вида операции или сложных условийКонструктор даст каркас, но ветвление и выбор вида движения пишите вручную
Проведение требует расчёта себестоимости или распределения суммКонструктор не подходит — пишите ОбработкаПроведения полностью вручную с запросами

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

Проверка движений в режиме предприятия

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

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

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

Наличие записей в регистре после проведения
Норма

Количество строк движений соответствует числу строк табличной части

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

Записей нет — проверьте строку Записывать = Истина и флаг проведения документа

Заполненность измерений и ресурсов
Норма

Все измерения и ресурсы заполнены ожидаемыми значениями

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

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

Вид движения для регистра остатков
Норма

Приход для поступления, расход для списания

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

Неверный вид — остатки уходят в минус при корректных данных

Период записей
Норма

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

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

Пустой или неверный период — поле Период не заполнено в коде

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

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

Типичные ошибки
01
Не отмечен регистр на вкладке «Движения» документа — конструктор не видит регистр, а платформа не создаёт набор записей.
02
Незаполненное соответствие полей — в регистре появляются пустые измерения, отчёты показывают строки с незаполненной аналитикой.
03
Неверный вид движения (приход вместо расхода) — остатки растут вместо уменьшения, контроль отрицательных остатков не срабатывает.
04
Повторный запуск конструктора после ручной доработки — весь дописанный код стирается без предупреждения.
05
Отсутствие контроля остатков при списании — документ проводится при нехватке товара, учёт уходит в минус.

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

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

Единообразное именование реквизитов документа и полей регистра (Номенклатура, Склад, Количество) позволяет кнопке «Заполнить выражения» сопоставить почти все поля автоматически. Это экономит время и снижает риск пропустить измерение при настройке конструктора.
ПЗ
Практическое замечание

Часто задаваемые вопросы

Где находится кнопка «Конструктор движений», если её не видно?

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

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

Да. В окне конструктора отметьте все нужные регистры — для каждого будет создан свой блок кода внутри одной процедуры ОбработкаПроведения. Соответствие реквизитов настраивается отдельно для каждого регистра.

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

Чаще всего причина в отсутствии строки Движения.ИмяРегистра.Записывать = Истина или в том, что регистр не отмечен на вкладке «Движения» документа. Также проверьте, что табличная часть заполнена — при пустой табличной части цикл не выполнится ни разу.

Как изменить вид движения с прихода на расход?

При генерации конструктор предлагает выбрать вид движения для регистров остатков. Если код уже создан, измените строку Движение.ВидДвижения = ВидДвиженияНакопления.Приход на ВидДвиженияНакопления.Расход вручную в модуле объекта.

Работает ли конструктор движений в управляемом приложении?

Да, конструктор — инструмент конфигуратора и не зависит от режима запуска прикладного решения. Сгенерированный код одинаково работает и в тонком клиенте, и в веб-клиенте, поскольку ОбработкаПроведения всегда выполняется на сервере.

Что делать, если конструктор перезаписал доработанную процедуру?

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

Итог

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

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