Почему при тестировании и исправлении удаляются движения регистра, добавленные документу через расширение, и как это исправить?

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

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

Таблица содержит записи, имеющие недопустимое значение поля регистратора. Записи удалены.

Разберем детально, почему так происходит на уровне платформы и СУБД, а также рассмотрим корректные способы решения поставленной задачи.

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

Проанализируем ситуацию изнутри. Физическая таблица любого регистра накопления в СУБД содержит системное поле Регистратор. Это поле имеет составной ссылочный тип данных (ДокументСсылка.*). Состав этого составного типа строго ограничен списком документов, которые указаны в свойстве регистра накопления Регистраторы.

Когда мы заимствуем типовой регистр накопления в расширение, свойство Регистраторы становится недоступным для редактирования. Платформа принципиально запрещает расширять состав регистраторов у типового регистра для типовых (заимствованных) документов.

Почему же тогда платформа разрешает отметить регистр в свойстве Движения заимствованного документа? Дело в том, что включение флага в свойстве документа лишь инициирует создание программной коллекции в объектной модели встроенного языка — Движения.ИмяРегистра. Это дает возможность коду отработать без падения в режиме 1С:Предприятие. Но при этом физическая реструктуризация таблицы регистра не происходит: ссылка заимствованного документа не добавляется в метаданные допустимых типов поля Регистратор в основной конфигурации.

Когда администратор запускает Тестирование и исправление, операция проверки логической целостности сверяет фактические типы ссылок в поле Регистратор таблицы СУБД с перечнем регистраторов из метаданных основной конфигурации. Обнаружив документ, не входящий в официальный список регистраторов, утилита признает запись некорректной и безвозвратно удаляет ее при установленном режиме исправления данных.

Вариант 1. Минимальное изменение основной конфигурации (рекомендуемый способ)

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

Разберем по шагам, как это сделать с минимальным вмешательством в обновление:

  1. В основной конфигурации включаем возможность изменения с сохранением поддержки (меню Конфигурация — Поддержка — Настройка поддержки).
  2. Находим нужный регистр накопления и переводим только его в режим Редактируется с сохранением поддержки. Сам документ снимать с поддержки не требуется.
  3. В свойствах регистра накопления открываем список Регистраторы и устанавливаем флаг напротив необходимого документа.
  4. Применяем изменения к базе данных (F7). Физическая структура поля регистратора в таблице СУБД обновляется.
  5. Всю бизнес-логику формирования записей, заполнение измерений и ресурсов оставляем в расширении. В модуле документа в расширении используем штатный перехватчик:
    
    &После("ОбработкаПроведения")
    Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
        
        Если Отказ Тогда
            Возврат;
        КонецЕсли;
        
        Движение = Движения.Взаиморасчеты.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        // Заполнение измерений и ресурсов регистра
        
        Движения.Взаиморасчеты.Записать();
        
    КонецПроцедуры
    

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

Вариант 2. Создание собственного регистра-сателлита в расширении

Если условием задачи является строгий запрет на снятие основной конфигурации с поддержки (конфигурация должна оставаться на «полном замке»), рассмотрим альтернативный архитектурный вариант.

Платформа 1С позволяет произвольно назначать заимствованные документы регистраторами для тех регистров, которые созданы непосредственно внутри расширения.

Разберем последовательность действий:

  1. В расширении создаем новый собственный регистр накопления (например, Расш1_ВзаиморасчетыДополнительно).
  2. Повторяем в нем структуру измерений и ресурсов оригинального регистра, которая необходима для решения задачи.
  3. В свойствах созданного регистра переходим в список Регистраторы и отмечаем заимствованный документ. Для собственного регистра расширения эта операция является штатной.
  4. В расширении через метод &После("ОбработкаПроведения") формируем движения по новому регистру.
  5. Если данные этого регистра должны участвовать в типовых отчетах или алгоритмах, заимствуем соответствующие запросы отчетов и дополняем их оператором ОБЪЕДИНИТЬ ВСЕ, выбирая данные из нашего регистра расширения.

Вариант 3. Использование служебного документа-корректировки

Посмотрим еще на один обходной путь, который не требует изменения конфигурации и добавления новых регистров. Во многих типовых конфигурациях уже присутствует универсальный документ для ручных записей (например, КорректировкаРегистров, КорректировкаВзаиморасчетов или ОперацияБух), у которого нужный регистр уже входит в состав официальных регистраторов.

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

← На главную