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