Как исправить ошибку «Значение контролируемого свойства Состав у объекта ОбщийРеквизит не совпадает со значением в расширяемой конфигурации» в 1С?

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

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

Выясняем причину возникновения ошибки

Проанализируем механику работы платформы с общими реквизитами. В основной конфигурации (например, в 1С:Управление торговлей 11) существуют такие общие реквизиты, как Автор, Комментарий, ОбластьДанныхОсновныеДанные и другие. У каждого из них есть ключевое свойство — Состав. В этом свойстве разработчик определяет, какие именно документы, справочники или бизнес-процессы будут использовать данный реквизит.

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

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

Расш1: Значение контролируемого свойства Состав у объекта ОбщийРеквизит.Автор не совпадает со значением в расширяемой конфигурации

---

Способ 1. Удаление лишних общих реквизитов из расширения (Рекомендуемый)

Рассмотрим самый простой и корректный способ решения проблемы. Если наша задача заключается лишь в изменении логики проведения документа ВыпускПродукции или доработке его экранной формы, нам совершенно не нужно модифицировать сами общие реквизиты. Они должны наследоваться из основной конфигурации «как есть».

Выполним следующие шаги для очистки метаданных расширения:

  1. Откроем дерево объектов метаданных нашего расширения.
  2. Развернем ветку Общие, а затем перейдем в подраздел Общие реквизиты.
  3. Найдем конфликтующие реквизиты (в нашем случае это Автор и Комментарий).
  4. Нажмем клавишу Del (или выберем в контекстном меню пункт «Удалить») и подтвердим действие.

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

---

Способ 2. Отключение проверки контролируемого свойства

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

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

  1. В дереве метаданных расширения найдем нужный общий реквизит и откроем его палитру свойств (клавиша F4).
  2. Найдем строку Состав.
  3. Обратим внимание на пиктограмму контроля рядом с этим свойством. Нам необходимо отключить проверку соответствия этого свойства с основной конфигурацией.
  4. Щелкнем правой кнопкой мыши по свойству Состав в палитре и выберем команду Сбросить или отключим признак контроля (в зависимости от версии используемой платформы 1С).

После этого система позволит сохранить расширение без выдачи критической ошибки.

---

Способ 3. Перезаимствование объектов после обновления

Иногда эта ошибка проявляется неожиданно, когда мы пытаемся обновить основную конфигурацию. Например, фирма «1С» в новом релизе добавила в состав общего реквизита Комментарий какой-то новый документ. В нашем расширении остался «слепок» старого состава общего реквизита, что и приводит к ошибке при попытке применить расширение к обновленной базе.

Проанализируем алгоритм актуализации метаданных:

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

---

Ограничения платформы 1С при работе с общими реквизитами

Разработчику крайне важно понимать технологические ограничения платформы при проектировании архитектуры расширений:

---

Лучшие практики разработки и обновления баз с расширениями

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

1. Избегайте «избыточного заимствования» (Over-borrowing)

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

2. Своевременный контроль режима совместимости

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

3. Использование аннотации &ИзменениеИКонтроль вместо &Вместо

Для модификации существующего кода процедур и функций старайтесь использовать директиву &ИзменениеИКонтроль (доступна начиная с платформы 8.3.15). Она позволяет платформе отслеживать изменения кода, сделанные вендором в новых релизах, и вовремя предупреждать разработчика о конфликтах алгоритмов.

Посмотрим на пример использования директивы &Вместо, которая полностью замещает типовой метод (это не всегда безопасно при обновлениях):


&Вместо("РассчитатьПараметрыВыпуска")
Процедура Расш1_РассчитатьПараметрыВыпуска(Параметры)
    // Наша доработка логики
    Параметры.Вставить("ДополнительныйРасчет", Истина);
    // Вызов оригинального метода
    ПродолжитьВызов(Параметры);
КонецПроцедуры

А теперь проанализируем более безопасный и современный подход с использованием директивы &ИзменениеИКонтроль:


&ИзменениеИКонтроль("РассчитатьПараметрыВыпуска")
Процедура Расш1_РассчитатьПараметрыВыпуска(Параметры)
    // В данном блоке мы строго контролируем код основной конфигурации
    // и внедряем свои изменения только в нужные места
    
    // #Вставка
    Если Параметры.Свойство("ОсобыйРежим") Тогда
        Параметры.ОсобыйРежим = Истина;
    КонецЕсли;
    // #КонецВставки
    
КонецПроцедуры

Применение этого подхода гарантирует, что если разработчики фирмы «1С» изменят внутреннюю структуру метода РассчитатьПараметрыВыпуска в новом релизе, система не затрет изменения молча, а предложит вам сопоставить код и корректно перенести доработки.

Таким образом, своевременная очистка расширения от лишних заимствованных общих реквизитов и соблюдение правил гигиены кода позволяют создавать стабильные и легко обновляемые решения в экосистеме 1С.

← На главную