Почему новый или скопированный документ в 1С не делает движения по регистрам и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

1. Проверки типа документа в общих модулях конфигурации

В современных типовых и доработанных конфигурациях логика проведения редко содержится только внутри модуля самого документа. Чаще всего алгоритмы вынесены в общие модули или модули менеджера в рамках Библиотеки Стандартных Подсистем (БСП).

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

Проанализируем типовой фрагмент кода, где выполняется подобная проверка:


Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") Тогда
    // Формирование движений по регистрам
    СформироватьДвиженияПоКассе(ДокументСсылка, Отказ);
КонецЕсли;

Для исправления этой проблемы выполним следующие действия:

  1. Нажмем сочетание клавиш Ctrl + Shift + F для вызова глобального поиска по конфигурации.
  2. Введем имя оригинального документа (например, ПриходныйКассовыйОрдер).
  3. Найдем все места в общих модулях, где проверяется тип или формируется список документов.
  4. Добавим наш новый документ в эти условия:

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

2. Настройка подписок на события

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

Если скопированный документ не включен в состав типов свойства Источник соответствующей подписки, платформа 1С не передает управление в общий модуль, обрабатывающий проведение.

Разберем порядок проверки подписок:

  1. В дереве метаданных найдем ветку Общие -> Подписки на события.
  2. Найдем подписки, связанные с проведением нужной группы документов (например, кассовых или учетных).
  3. Откроем свойства подписки и проверим поле Источник.
  4. Установим флажок напротив нашего нового документа, чтобы он вошел в состав обрабатываемых типов.

3. Проверка привязки события ОбработкаПроведения

При копировании объекта метаданных через буфер обмена или команду «Скопировать» сам текст процедуры ОбработкаПроведения в модуле объекта сохраняется. Однако связь между событием платформы и процедурой модуля может слететь.

Проверим привязку события:

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

4. Установка флагов записи движений

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

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


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

5. Новый документ в списке регистраторов регистра

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

  1. Найдем целевой регистр в дереве метаданных.
  2. Откроем его свойства и перейдем на вкладку Регистраторы.
  3. Убедимся, что новый документ отмечен в списке регистраторов этого регистра.

Альтернативный подход: использования расширений (.cfe)

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

С помощью расширения можно перехватить процедуру проведения оригинального документа (используя аннотации &Перед, &После или &Вместо) или добавить необходимые реквизиты без создания нового документа метаданных.

← На главную