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