Работа с расширениями в среде 1С:Предприятие 8.3 — это мощный инструмент, который, однако, иногда преподносит неприятные сюрпризы. Одна из самых распространенных проблем, с которой сталкиваются разработчики: реквизит, добавленный в табличную часть объекта через расширение, упорно не отображается в списке «Путь к данным» при попытке вывести его на форму. Кажется, что всё сделано правильно — реквизит в дереве метаданных есть, форма заимствована, но связать их не получается.
В этой статье мы подробно разберем причины возникновения этой ситуации, проанализируем поведение различных версий платформы и изучим пошаговые алгоритмы решения — от стандартных манипуляций в конфигураторе до «хирургического» вмешательства в XML-структуру формы.
Разберем типичную ошибку новичка. Часто разработчик сначала заимствует форму документа, а уже потом добавляет новый реквизит в табличную часть этого документа в расширении. В этом случае форма «запоминает» структуру объекта на момент своего заимствования и не видит последующих изменений в метаданных расширения.
Рассмотрим правильный порядок действий:
ЗаказПокупателя).Товары).Если форма уже была заимствована до добавления реквизита, попробуйте следующее: откройте редактор формы в расширении, найдите в списке реквизитов формы (правое окно) основной реквизит Объект. Нажмите на нем правой кнопкой мыши и выберите команду «Обновить». Также убедитесь, что в составе заимствованного реквизита Объект в расширении проставлена «галочка» напротив вашего нового реквизита табличной части.
Проанализируем техническую сторону вопроса. В версиях платформы начиная с 8.3.13 и вплоть до некоторых релизов 8.3.15 наблюдался подтвержденный баг конфигуратора. При добавлении реквизитов в расширение визуальный редактор формы переставал видеть эти данные в диалоге выбора пути. Это связано с механизмом кэширования метаданных и отрисовки свойств элементов формы.
Если вы столкнулись именно с этой проблемой, стандартные методы «обновить» или «перезагрузить» могут не помочь. В этом случае рассмотрим метод правки XML-файла конфигурации, который является практически стопроцентным решением:
dataPath путь к вашему новому реквизиту.Этот метод позволяет «пропихнуть» нужный путь к данным в обход ограничений визуального интерфейса конфигуратора.
Выясним причину, почему иногда добавленные поля создаются как LabelField (Поле надписи), а не InputField (Поле ввода). Когда платформа не может однозначно определить тип данных или права доступа к новому реквизиту расширения, она по умолчанию создает элемент для чтения. Вы можете вручную изменить тип элемента в свойствах формы, но если «Путь к данным» пуст, редактирование будет недоступно.
Проанализируем пример кода, который может быть в XML при ручной правке:
<InputField name="ТоварыМойНовыйРеквизит" id="2000">
<DataPath>Объект.Товары.МойНовыйРеквизит</DataPath>
<ContextMenu name="ТоварыМойНовыйРеквизитКонтекстноеМеню" id="2001"/>
<ExtendedTooltip name="ТоварыМойНовыйРеквизитРасширеннаяПодсказка" id="2002"/>
</InputField>
После такой правки конфигуратор «подхватит» связь, и поле станет доступным для редактирования в обычном режиме.
Если визуальный редактор подводит, а работать с XML кажется слишком сложным, рассмотрим наиболее надежный с точки зрения стабильности метод — программное создание колонки табличной части. Этот способ гарантированно работает в режиме «Предприятие», так как к моменту выполнения кода на сервере все метаданные расширения уже полностью инициализированы.
Для этого в модуле заимствованной формы создадим процедуру-обработчик ПриСозданииНаСервере (после выполнения стандартной обработки):
&НаСервере
&ВИзмененииИКонтроле("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем новый элемент формы - поле табличной части
ИмяЭлемента = "ТоварыМойРеквизит";
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Товары);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Товары.МойРеквизит";
НовыйЭлемент.Заголовок = "Доп. Инфо (Расширение)";
КонецЕсли;
КонецПроцедуры
Разберем по шагам, что делает этот код:
Элементы.Добавить, где третьим параметром указывает родителя — саму табличную часть Товары. Это автоматически делает поле колонкой таблицы.ПутьКДанным. Здесь крайне важно соблюдать точность: Объект.ИмяТабличнойЧасти.ИмяРеквизита.Посмотрим на ситуацию шире. Иногда проблема кроется не в коде, а в окружении разработки. Проанализируем два важных фактора:
Подводя итог, можно сказать: если вы столкнулись с тем, что конфигуратор «не видит» добавленный реквизит, не спешите удалять расширение. Попробуйте обновить основной реквизит формы Объект, проверьте порядок заимствования, и если ничего не помогло — используйте программное создание элементов формы. Это сделает ваше расширение более устойчивым к багам платформы и обеспечит его корректную работу у конечного пользователя.