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