Разработка и Конфигурация · 11 мин
Как создать движения документа с помощью конструктора движений 1С
Пошаговая инструкция по созданию движений документа конструктором в 1С: выбор регистров, генерация процедуры ОбработкаПроведения, проверка результата и типичные ошибки.
Конструктор движений — встроенный инструмент конфигуратора 1С, который автоматически генерирует код процедуры проведения документа по регистрам. Вместо ручного написания циклов по табличным частям и заполнения записей регистров разработчик отмечает нужные регистры и реквизиты, а платформа создаёт готовый текст модуля. Это ускоряет разработку и снижает количество ошибок в типовых сценариях проведения.
Конструктор доступен в любой конфигурации на обычных формах и в управляемом приложении — он является частью платформы, а не конкретного прикладного решения. Инструмент вызывается из модуля объекта документа и работает только с теми регистрами, которые документ реально двигает.
Ниже разобран полный цикл работы: подготовка документа и регистров, запуск конструктора, настройка соответствия реквизитов, анализ сгенерированного кода, проверка движений в режиме предприятия и типичные ошибки, из-за которых проводки формируются неправильно.
Что должен делать документ до запуска конструктора
Конструктор движений работает только с регистрами, которые документ уже «двигает» на уровне метаданных. Поэтому первый шаг — открыть свойства документа в конфигураторе, перейти на вкладку «Движения» и отметить галочками нужные регистры: накопления, сведений, бухгалтерии или расчёта. Если регистр не отмечен, он не появится в списке конструктора.
Также документ должен быть разрешён для проведения: в свойствах документа на вкладке «Основные» флаг «Проведение» установлен в значение «Разрешить». Без этого процедура ОбработкаПроведения не вызывается платформой, и сгенерированный код не будет выполняться.
Желательно заранее продумать структуру: какие табличные части документа участвуют в проведении, какие реквизиты шапки и строк попадают в измерения, ресурсы и реквизиты регистров. Конструктор предложит сопоставление автоматически по совпадению имён, но осмысленная структура метаданных сильно упрощает этот этап.
Как запустить конструктор движений
Откройте конфигуратор, найдите нужный документ в дереве конфигурации, перейдите на вкладку «Движения» — на ней расположена кнопка «Конструктор движений». Альтернативный путь: открыть модуль объекта документа и вызвать конструктор через меню «Конструкторы» — «Конструктор движений». Оба способа открывают одно и то же окно.
- 1Откройте свойства документа и на вкладке «Движения» отметьте нужные регистры.
- 2Нажмите кнопку «Конструктор движений» на той же вкладке или через меню «Конструкторы» в модуле объекта.
- 3В открывшемся окне слева выберите регистры, по которым нужно сформировать движения.
- 4Нажмите «Заполнить выражения» для автоматического сопоставления реквизитов или заполните соответствие вручную.
- 5Нажмите «ОК» — платформа сгенерирует процедуру ОбработкаПроведения в модуле объекта.
В верхней части окна конструктора находится список табличных частей документа — от него зависит, какие реквизиты доступны для сопоставления. Если движения строятся по нескольким табличным частям, конструктор обрабатывает каждую выбранную часть отдельным циклом.
Настройка соответствия реквизитов
Центральная часть окна конструктора — таблица соответствия полей регистра и выражений на встроенном языке. Для каждого измерения, ресурса и реквизита регистра нужно указать, откуда берётся значение: из реквизита шапки документа (например, Склад), из текущей строки табличной части (ТекСтрокаТовары.Номенклатура) или из произвольного выражения.
Кнопка «Заполнить выражения» автоматически подставляет реквизиты, имена которых совпадают с именами полей регистра. Это работает хорошо, если при проектировании метаданных выдержано единое именование. Всё, что конструктор не смог сопоставить, остаётся пустым — такие строки нужно заполнить вручную, иначе в регистре появятся незаполненные измерения.
Для регистра бухгалтерии конструктор дополнительно формирует проводку с указанием счетов дебета и кредита, субконто и суммы. Счета обычно хранятся в реквизитах документа или определяются алгоритмом — в простых случаях их можно указать выражением прямо в конструкторе, в сложных — задать в коде после генерации.
Что генерирует конструктор: разбор кода
После нажатия «ОК» в модуль объекта документа вставляется процедура ОбработкаПроведения. Для каждого регистра создаётся блок: цикл по строкам табличной части, внутри которого вызывается Движения.ИмяРегистра.Добавить(), задаётся вид движения, период и значения полей записи.
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
КонецПроцедурыСтрока Движения.ОстаткиТоваров.Записывать = Истина; принципиально важна: она указывает платформе физически записать набор движений. Если её убрать, записи сформируются в памяти, но в базу не попадут. Конструктор добавляет эту строку автоматически, но при ручной доработке её легко потерять.
Поле Период конструктор заполняет значением Дата — датой документа. Для большинства регистров это корректно, но для регистров сведений с периодичностью «в пределах секунды» или регистров расчёта может потребоваться другая дата, например дата начала периода действия.
Когда конструктора недостаточно
Конструктор создаёт линейный код без условий, контролей и запросов. Как только логика проведения выходит за рамки «перенести строки табличной части в регистр», код нужно дорабатывать вручную. Типичные случаи: контроль остатков перед списанием, распределение суммы по строкам, движения по нескольким регистрам с разными условиями, расчёт себестоимости.
Когда использовать конструктор, а когда писать код вручную
Практичный подход — использовать конструктор как генератор каркаса: он правильно оформит циклы, виды движений и присвоения полей, а бизнес-логика добавляется поверх. Повторный запуск конструктора после ручной доработки перезапишет процедуру, поэтому перед этим сохраните свой код.
Проверка движений в режиме предприятия
После генерации кода обновите конфигурацию базы данных (F7) и откройте режим предприятия. Создайте тестовый документ, заполните табличную часть и проведите его. Затем откройте движения документа: в форме документа это обычно команда «Движения документа» или переход по кнопке с пиктограммой регистров.
Как проверить результат
Количество строк движений соответствует числу строк табличной части
Записей нет — проверьте строку Записывать = Истина и флаг проведения документа
Все измерения и ресурсы заполнены ожидаемыми значениями
Пустые измерения — в конструкторе не задано соответствие поля
Приход для поступления, расход для списания
Неверный вид — остатки уходят в минус при корректных данных
Период равен дате документа
Пустой или неверный период — поле Период не заполнено в коде
Дополнительно проверьте отмену проведения: при отмене платформа должна автоматически удалить движения документа. Если записи остаются, вероятная причина — движения записывались вручную методом Записать() в обход штатного механизма или набор записей создавался отдельно от коллекции Движения документа.
Типичные ошибки и ограничения
Ещё одно ограничение: конструктор не умеет строить движения по данным запроса. Если табличная часть документа большая или нужны итоги по сгруппированным строкам, эффективнее написать в ОбработкаПроведения запрос с группировкой и обходить его результат — так движений будет меньше и проведение ускорится.
Для документов со сложной логикой отмены проведения иногда требуется процедура ОбработкаУдаленияПроведения — например, чтобы разблокировать связанные данные. Конструктор её не создаёт, эта часть всегда пишется вручную.
Единообразное именование реквизитов документа и полей регистра (Номенклатура, Склад, Количество) позволяет кнопке «Заполнить выражения» сопоставить почти все поля автоматически. Это экономит время и снижает риск пропустить измерение при настройке конструктора.
Часто задаваемые вопросы
Где находится кнопка «Конструктор движений», если её не видно?
Кнопка расположена на вкладке «Движения» в палитре свойств документа в конфигураторе. Также конструктор доступен из модуля объекта через меню «Конструкторы» — «Конструктор движений». Если пункт неактивен, проверьте, что у документа разрешено проведение и отмечен хотя бы один регистр в движениях.
Можно ли сгенерировать движения сразу по нескольким регистрам?
Да. В окне конструктора отметьте все нужные регистры — для каждого будет создан свой блок кода внутри одной процедуры ОбработкаПроведения. Соответствие реквизитов настраивается отдельно для каждого регистра.
Почему документ проводится, но записей в регистре нет?
Чаще всего причина в отсутствии строки Движения.ИмяРегистра.Записывать = Истина или в том, что регистр не отмечен на вкладке «Движения» документа. Также проверьте, что табличная часть заполнена — при пустой табличной части цикл не выполнится ни разу.
Как изменить вид движения с прихода на расход?
При генерации конструктор предлагает выбрать вид движения для регистров остатков. Если код уже создан, измените строку Движение.ВидДвижения = ВидДвиженияНакопления.Приход на ВидДвиженияНакопления.Расход вручную в модуле объекта.
Работает ли конструктор движений в управляемом приложении?
Да, конструктор — инструмент конфигуратора и не зависит от режима запуска прикладного решения. Сгенерированный код одинаково работает и в тонком клиенте, и в веб-клиенте, поскольку ОбработкаПроведения всегда выполняется на сервере.
Что делать, если конструктор перезаписал доработанную процедуру?
Штатной отмены этой операции нет. Восстановить код можно из копии базы, из хранилища конфигурации (если объект захвачён и версии сохраняются) или из выгрузки конфигурации в файлы. Поэтому перед повторным запуском конструктора всегда сохраняйте текущий текст процедуры.
Что важно запомнить
Конструктор движений генерирует каркас процедуры ОбработкаПроведения по выбранным регистрам и сопоставленным реквизитам. Перед запуском отметьте регистры в движениях документа, после генерации проверьте вид движения и заполненность полей, а сложную логику — контроль остатков, условия, расчёты — дописывайте вручную, помня, что повторный запуск конструктора затирает доработки.