При активной разработке в среде 1С:Предприятие 8 механизм расширений стал незаменимым инструментом. Он позволяет кастомизировать типовые решения без снятия их с поддержки. Однако программисты часто сталкиваются со специфическими ошибками платформы на этапе сохранения и применения расширений. Одна из самых распространенных — ошибка контроля свойства Состав для общих реквизитов (например, Автор или Комментарий). Давайте детально разберем, почему возникает эта проблема, как ее быстро устранить и как правильно обновлять измененные базы в дальнейшем.
Проанализируем механику работы платформы с общими реквизитами. В основной конфигурации (например, в 1С:Управление торговлей 11) существуют такие общие реквизиты, как Автор, Комментарий, ОбластьДанныхОсновныеДанные и другие. У каждого из них есть ключевое свойство — Состав. В этом свойстве разработчик определяет, какие именно документы, справочники или бизнес-процессы будут использовать данный реквизит.
Когда мы заимствуем в свое расширение какой-либо объект (например, документ ВыпускПродукции и его форму), конфигуратор анализирует связи объектов. По умолчанию система пытается заимствовать все связанные метаданные, в том числе и общие реквизиты, которые входят в состав этого документа.
Как только общий реквизит оказывается в расширении, платформа автоматически включает строгий контроль его свойств. Свойство Состав становится контролируемым. Платформа ожидает, что список объектов в составе общего реквизита внутри расширения будет абсолютно идентичен списку в основной конфигурации. Но поскольку в расширение мы перенесли только один документ ВыпускПродукции, а сотни других документов основной базы остались незаимствованными, физический состав общего реквизита в расширении резко сокращается. Происходит конфликт метаданных, и система выдает ошибку:
Расш1: Значение контролируемого свойства Состав у объекта ОбщийРеквизит.Автор не совпадает со значением в расширяемой конфигурации
---
Рассмотрим самый простой и корректный способ решения проблемы. Если наша задача заключается лишь в изменении логики проведения документа ВыпускПродукции или доработке его экранной формы, нам совершенно не нужно модифицировать сами общие реквизиты. Они должны наследоваться из основной конфигурации «как есть».
Выполним следующие шаги для очистки метаданных расширения:
Автор и Комментарий).Del (или выберем в контекстном меню пункт «Удалить») и подтвердим действие.После удаления этих объектов из расширения платформа перестанет контролировать их свойство Состав. При этом документ ВыпускПродукции и его формы продолжат корректно использовать реквизиты Автор и Комментарий, получая их напрямую из основной конфигурации.
---
Бывают редкие ситуации, когда общий реквизит нам действительно необходим в расширении (например, если мы хотим программно обращаться к нему в специфическом контексте расширения). В этом случае удалять его нельзя. Мы можем пойти по пути отключения контроля свойства.
Разберем, как это сделать по шагам:
F4).Состав в палитре и выберем команду Сбросить или отключим признак контроля (в зависимости от версии используемой платформы 1С).После этого система позволит сохранить расширение без выдачи критической ошибки.
---
Иногда эта ошибка проявляется неожиданно, когда мы пытаемся обновить основную конфигурацию. Например, фирма «1С» в новом релизе добавила в состав общего реквизита Комментарий какой-то новый документ. В нашем расширении остался «слепок» старого состава общего реквизита, что и приводит к ошибке при попытке применить расширение к обновленной базе.
Проанализируем алгоритм актуализации метаданных:
---
Разработчику крайне важно понимать технологические ограничения платформы при проектировании архитектуры расширений:
8.3.20 ограничения были несколько смягчены. Теперь разработчики могут изменять тип заимствованного общего реквизита (если он не выступает в роли разделителя данных), однако полноценное управление составом все еще остается под запретом.---
Чтобы в будущем процесс обновления не превращался в головную боль, рассмотрим несколько золотых правил разработки расширений в среде 1С.
1. Избегайте «избыточного заимствования» (Over-borrowing)
При заимствовании формы или документа конфигуратор часто предлагает автоматически перенести в расширение связанные роли, картинки, стили, общие реквизиты и определяемые типы. Всегда отказывайтесь от автоматического добавления связей, если в этом нет реальной необходимости для вашей доработки. Чем меньше объектов заимствовано в расширение, тем меньше вероятность возникновения конфликтов при обновлении конфигурации поставщика.
2. Своевременный контроль режима совместимости
При обновлении конфигураций вендоры часто повышают режим совместимости. Если после обновления базы ваше расширение отказывается подключаться, проверьте свойство РежимСовместимости в самом корне свойств расширения. Он должен в точности соответствовать аналогичному свойству основной конфигурации.
3. Использование аннотации &ИзменениеИКонтроль вместо &Вместо
Для модификации существующего кода процедур и функций старайтесь использовать директиву &ИзменениеИКонтроль (доступна начиная с платформы 8.3.15). Она позволяет платформе отслеживать изменения кода, сделанные вендором в новых релизах, и вовремя предупреждать разработчика о конфликтах алгоритмов.
Посмотрим на пример использования директивы &Вместо, которая полностью замещает типовой метод (это не всегда безопасно при обновлениях):
&Вместо("РассчитатьПараметрыВыпуска")
Процедура Расш1_РассчитатьПараметрыВыпуска(Параметры)
// Наша доработка логики
Параметры.Вставить("ДополнительныйРасчет", Истина);
// Вызов оригинального метода
ПродолжитьВызов(Параметры);
КонецПроцедуры
А теперь проанализируем более безопасный и современный подход с использованием директивы &ИзменениеИКонтроль:
&ИзменениеИКонтроль("РассчитатьПараметрыВыпуска")
Процедура Расш1_РассчитатьПараметрыВыпуска(Параметры)
// В данном блоке мы строго контролируем код основной конфигурации
// и внедряем свои изменения только в нужные места
// #Вставка
Если Параметры.Свойство("ОсобыйРежим") Тогда
Параметры.ОсобыйРежим = Истина;
КонецЕсли;
// #КонецВставки
КонецПроцедуры
Применение этого подхода гарантирует, что если разработчики фирмы «1С» изменят внутреннюю структуру метода РассчитатьПараметрыВыпуска в новом релизе, система не затрет изменения молча, а предложит вам сопоставить код и корректно перенести доработки.
Таким образом, своевременная очистка расширения от лишних заимствованных общих реквизитов и соблюдение правил гигиены кода позволяют создавать стабильные и легко обновляемые решения в экосистеме 1С.