При разработке функционала в расширениях конфигурации разработчики часто сталкиваются с задачей: необходимо заставить типовой документ формировать движения по типовому регистру накопления, которого изначально у документа не было. Казалось бы, платформа 1С позволяет заимствовать в расширение и документ, и регистр накопления, отметить регистр в свойстве документа Движения и написать программный код в процедуре &После("ОбработкаПроведения"). Проведение отрабатывает без исключений, записи успешно попадают в базу. Однако при первом же запуске процедуры Тестирование и исправление информационной базы (пункт «Проверка логической целостности информационной базы») система выдает ошибку:
Таблица содержит записи, имеющие недопустимое значение поля регистратора. Записи удалены.
Разберем детально, почему так происходит на уровне платформы и СУБД, а также рассмотрим корректные способы решения поставленной задачи.
Проанализируем ситуацию изнутри. Физическая таблица любого регистра накопления в СУБД содержит системное поле Регистратор. Это поле имеет составной ссылочный тип данных (ДокументСсылка.*). Состав этого составного типа строго ограничен списком документов, которые указаны в свойстве регистра накопления Регистраторы.
Когда мы заимствуем типовой регистр накопления в расширение, свойство Регистраторы становится недоступным для редактирования. Платформа принципиально запрещает расширять состав регистраторов у типового регистра для типовых (заимствованных) документов.
Почему же тогда платформа разрешает отметить регистр в свойстве Движения заимствованного документа? Дело в том, что включение флага в свойстве документа лишь инициирует создание программной коллекции в объектной модели встроенного языка — Движения.ИмяРегистра. Это дает возможность коду отработать без падения в режиме 1С:Предприятие. Но при этом физическая реструктуризация таблицы регистра не происходит: ссылка заимствованного документа не добавляется в метаданные допустимых типов поля Регистратор в основной конфигурации.
Когда администратор запускает Тестирование и исправление, операция проверки логической целостности сверяет фактические типы ссылок в поле Регистратор таблицы СУБД с перечнем регистраторов из метаданных основной конфигурации. Обнаружив документ, не входящий в официальный список регистраторов, утилита признает запись некорректной и безвозвратно удаляет ее при установленном режиме исправления данных.
Рассмотрим наиболее надежное и чистое с точки зрения целостности данных решение. Если нам критически важно писать именно в типовой регистр накопления и использовать типовые отчеты без их модификации, необходимо легализовать тип регистратора в метаданных.
Разберем по шагам, как это сделать с минимальным вмешательством в обновление:
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
Если Отказ Тогда
Возврат;
КонецЕсли;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
// Заполнение измерений и ресурсов регистра
Движения.Взаиморасчеты.Записать();
КонецПроцедуры
При таком подходе при последующих обновлениях конфигурации регистр легко объединяется с типовым, а тестирование и исправление больше никогда не удалит сформированные движения.
Если условием задачи является строгий запрет на снятие основной конфигурации с поддержки (конфигурация должна оставаться на «полном замке»), рассмотрим альтернативный архитектурный вариант.
Платформа 1С позволяет произвольно назначать заимствованные документы регистраторами для тех регистров, которые созданы непосредственно внутри расширения.
Разберем последовательность действий:
Расш1_ВзаиморасчетыДополнительно).&После("ОбработкаПроведения") формируем движения по новому регистру.ОБЪЕДИНИТЬ ВСЕ, выбирая данные из нашего регистра расширения.Посмотрим еще на один обходной путь, который не требует изменения конфигурации и добавления новых регистров. Во многих типовых конфигурациях уже присутствует универсальный документ для ручных записей (например, КорректировкаРегистров, КорректировкаВзаиморасчетов или ОперацияБух), у которого нужный регистр уже входит в состав официальных регистраторов.
В таком случае в процедуре проведения заимствованного документа в расширении можно программно формировать или перезаполнять подчиненный документ корректировки, записывая и проводя его от имени системы. Регистратором движений в базе будет выступать разрешенный документ корректировки, а связь с основным документом можно хранить в комментарии или дополнительном реквизите. Это полностью исключает претензии со стороны утилиты тестирования и исправления.