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