При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с жестким ограничением платформы: расширения конфигурации не позволяют изменять физическую структуру существующих регистров. Это означает, что вы не можете просто «заимствовать» типовой регистр в расширение и добавить в него новое измерение, ресурс или реквизит. Платформа выдаст ошибку, так как структура таблиц базы данных для регистров в расширениях не может быть модифицирована таким образом.
В этой статье мы подробно разберем, как обойти это ограничение, проанализируем различные стратегии решения задачи и выясним, какой метод лучше выбрать в зависимости от требований к обновляемости базы и сложности задачи.
Рассмотрим техническую причину. Когда мы добавляем реквизит в документ через расширение, платформа создает отдельную таблицу «сбоку», связывая её с основной таблицей документа. Для регистров (сведений, накопления, бухгалтерии) такой механизм не реализован. Это связано с тем, что регистры обеспечивают уникальность записей по набору измерений и работу виртуальных таблиц (например, СрезПоследних). Если бы платформа позволила добавлять измерения в расширении, она не смогла бы гарантировать корректность итогов и уникальность данных без полной перестройки основной таблицы БД, что противоречит идеологии расширений как «легких» надстроек.
Это наиболее «чистый» способ с точки зрения сохранения типовой конфигурации в неприкосновенности. Суть метода заключается в создании нового регистра в самом расширении, который будет дублировать ключевые измерения основного регистра и содержать ваше новое поле.
Разберем алгоритм реализации этого метода:
Наш_ИсторияКадровыхРезервов).Посмотрим на пример кода, который может быть размещен в модуле расширения для синхронизации данных. Вместо правки модулей каждого документа-регистратора, мы перехватим запись самого набора записей типового регистра:
// В расширении создаем подписку на событие ПередЗаписью для набора записей типового регистра
Процедура ПередЗаписьюНабораТиповогоРегистра(Источник, Отказ, Замещение) Экспорт
// Источник — это НаборЗаписей типового регистра
// Создаем набор записей для нашего нового регистра из расширения
НашНабор = РегистрыСведений.Наш_ИсторияКадровыхРезервов.СоздатьНаборЗаписей();
// Копируем отборы (например, по регистратору или ключевым измерениям)
Для Каждого ЭлементОтбора Из Источник.Отбор Цикл
Если НашНабор.Отбор.Найти(ЭлементОтбора.Имя) <> Неопределено Тогда
НашНабор.Отбор[ЭлементОтбора.Имя].Установить(ЭлементОтбора.Значение);
КонецЕсли;
КонецЦикла;
// Переносим данные из типового набора в наш
Для Каждого ЗаписьТиповая Из Источник Цикл
НоваяЗапись = НашНабор.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, ЗаписьТиповая);
// Здесь заполняем наше новое поле, если оно доступно в контексте
// Например, если данные есть в ДополнительныхСвойствах набора или документа
Если ЗаписьТиповая.Регистратор <> Неопределено Тогда
НоваяЗапись.НашеНовоеПоле = ЗаписьТиповая.Регистратор.НашРеквизитДокумента;
КонецЕсли;
КонецЦикла;
НашНабор.Записать(Замещение);
КонецПроцедуры
Преимущества: Основная конфигурация остается на полной поддержке («на замке»).
Недостатки: Удвоение объема данных в базе, сложность построения отчетов (нужно соединять две таблицы в запросе), необходимость переноса старых данных разовой обработкой.
Если новое поле критически важно для работы системы (например, оно должно быть именно измерением и влиять на уникальность записей), лучше отказаться от идеи использования расширения для этой конкретной задачи и внести изменения в cf.
Рассмотрим, как сделать это правильно, чтобы не возникло проблем при последующих обновлениях:
пф_Действие), чтобы избежать конфликтов имен при выходе новых релизов от фирмы 1С.Этот метод считается более надежным для сложных систем класса ERP или ЗУП, так как он гарантирует целостность данных на уровне СУБД.
Если ваша конфигурация построена на базе БСП (Библиотеки Стандартных Подсистем), например, ЗУП 3.1 или УТ 11, проанализируем возможность использования «Дополнительных сведений».
Если новое «измерение» нужно только для аналитики в отчетах и оно логически привязано к документу-регистратору, мы можем:
Регистратор) и виртуальной таблицей РегистрСведений.ДополнительныеСведения.Это позволит вообще избежать программирования и изменения структуры таблиц.
Выясним причину, по которой автор темы в итоге изменил свое решение. В процессе обсуждения стало понятно, что часто под «добавлением измерения» понимается просто необходимость хранить дополнительный признак. Если этот признак не должен менять уникальность записи (то есть не является ключевым параметром, определяющим запись), то его следует добавлять как Ресурс или Реквизит.
Запомните ключевые правила:
cf — используем параллельный регистр в расширении (Вариант 1) или дополнительные сведения БСП.Проанализировав ситуацию, мы видим, что универсального «красивого» решения через одно только расширение без дублирования данных не существует из-за ограничений платформы. Выбор метода всегда остается за разработчиком исходя из баланса между «чистотой» поддержки и производительностью системы.