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