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