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