Как настроить доступность и ограничение типов субконто в табличной части управляемой формы 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке новых документов в конфигурациях на платформе 1С:Предприятие 8 часто возникает задача организации бухгалтерского ввода: в табличной части указываются реквизиты Счет (или СчетЗатрат) и сопутствующие аналитические разрезы Субконто1, Субконто2, Субконто3. Разработчики нередко сталкиваются с ситуацией, когда при открытии уже сохраненного документа поведение колонок субконто кажется неочевидным: одни поля доступны для редактирования, другие заблокированы, а состав типов данных в ячейках формируется автоматически без явного вызова обработчиков в модуле формы. Разберем, какие встроенные механизмы платформы управляют доступностью и типами субконто и где именно искать эти настройки.

Механизм «Связь по типу» в свойствах метаданных

Проанализируем базовый уровень настройки аналитики. Если в документе колонка субконто сразу после ввода счета принимает тип соответствующего субконто счета без единой строчки программного кода, в конфигурации задействован механизм платформы Связь по типу.

  1. Откроем свойства реквизита табличной части (например, Субконто1) в дереве метаданных конфигуратора.
  2. Убедимся, что реквизит имеет составной тип данных (включающий все возможные типы видов субконто плана счетов).
  3. Найдем свойство Связь по типу. В нем настраивается связь с реквизитом СчетЗатрат текущей строки табличной части с указанием номера субконто (индекса вида субконто на счете).

Благодаря этой настройке платформа 1С автоматически отслеживает выбранный счет и сужает составной тип данных ячейки до конкретного типа значения, привязанного к данному субконто в плане счетов.

Управление доступностью колонок через условное оформление формы

Выясним причину, почему при открытии записанного документа определенные субконто становятся заблокированными (серыми или недоступными для ввода). В управляемом интерфейсе блокировка отдельных ячеек в строках таблицы реализуется не через прямое изменение свойств элементов формы, а через Условное оформление.

Условное оформление управляемой формы способно управлять такими свойствами отображения ячеек, как Доступность, ТолькоПросмотр, Видимость и Текст. Настройка правил может быть выполнена двумя способами:

  1. Интерактивно в конфигураторе: в свойствах самой формы открываем коллекцию Условное оформление. Там могут быть заранее добавлены правила: например, если на счете отсутствует второе субконто (или количество субконто счета меньше двух), то для поля Субконто2 свойство Доступность устанавливается в значение Ложь (или ТолькоПросмотр = Истина).
  2. Программно при инициализации: если в типовой конфигурации вызываются стандартные процедуры подсистем, правила могут добавляться динамически в обработчике ПриСозданииНаСервере.

Посмотрим на пример программного добавления правила условного оформления для отключения доступности субконто, если в строке выбран счет без соответствующего субконто:


&НаСервере
Процедура НастроитьОформлениеСубконтоНаСервере()
    
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Определяем оформляемое поле
    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТабличнаяЧастьСубконто2");
    
    // Задаем условие (например, флаг доступности в данных строки)
    ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТабличнаяЧасть.Субконто2Доступно");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементУсловия.ПравоеЗначение = Ложь;
    
    // Устанавливаем свойство оформления
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
    
КонецПроцедуры

Особенности платформы: ограничение типов в строках табличной части

Рассмотрим важную особенность клиентского интерфейса: элемент формы (колонка) является общим для всей таблицы. Если разработчик пытается программно ограничить доступные типы через свойство элемента ОграничениеТипа, это ограничение применяется сразу ко всей колонке таблицы формы в текущий момент времени.

Если для аналитики не используется механизм Связь по типу, динамическое ограничение типов при интерактивной работе пользователя реализуют с помощью событий клиентских элементов:

  1. Событие ПриАктивизацииСтроки таблицы формы: используется для обновления параметров формы или доступности элементов при переходе пользователя от одной строки к другой.
  2. Событие НачалоВыбора поля ввода субконто: позволяет переопределить доступные для выбора типы непосредственно перед открытием окна выбора значения:

&НаКлиенте
Процедура ТабличнаяЧастьСубконто1НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    ТекущаяСтрока = Элементы.ТабличнаяЧасть.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем массив допустимых типов для первого субконто выбранного счета
    МассивТипов = ПолучитьМассивТиповСубконто(ТекущаяСтрока.СчетЗатрат, 1);
    Если МассивТипов.Количество() > 0 Тогда
        Элемент.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);
    КонецЕсли;
    
КонецПроцедуры

Очистка неактуальных данных при смене аналитики

Обратим внимание на критически важный нюанс: визуальное отключение доступности поля через Условное оформление или ограничение типов на клиенте не очищает уже записанные данные в строке объекта. Если пользователь сначала выбрал счет с тремя субконто, заполнил их, а затем изменил счет на другой (у которого только одно субконто), невидимые или заблокированные субконто физически останутся заполненными в табличной части документа.

Чтобы избежать появления скрытых некорректных движений в регистрах бухгалтерии, разберем обязательные действия по программной очистке данных:

  1. В обработчике ПриИзменении поля счета необходимо сразу очищать значения субконто, которые не входят в состав субконто нового счета.
  2. В модуле объекта в процедуре ПередЗаписью следует выполнять валидацию строк: проверять количество видов субконто у счета и принудительно устанавливать значение Неопределено для тех полей аналитики, номеров которых нет на счете.

Процедура ОчиститьЛишниеСубконтоВСтроке(СтрокаТЧ) Экспорт
    
    Счет = СтрокаТЧ.СчетЗатрат;
    КоличествоСубконтоСчета = ?(ЗначениеЗаполнено(Счет), Счет.ВидыСубконто.Количество(), 0);
    
    Если КоличествоСубконтоСчета < 1 Тогда
        СтрокаТЧ.Субконто1 = Неопределено;
    КонецЕсли;
    
    Если КоличествоСубконтоСчета < 2 Тогда
        СтрокаТЧ.Субконто2 = Неопределено;
    КонецЕсли;
    
    Если КоличествоСубконтоСчета < 3 Тогда
        СтрокаТЧ.Субконто3 = Неопределено;
    КонецЕсли;
    
КонецПроцедуры

Таким образом, корректная работа субконто в табличных частях складывается из трех уровней: связь по типу в реквизитах метаданных для сужения типа, условное оформление формы для визуальной блокировки лишних колонок и серверная очистка реквизитов для поддержания целостности данных.

← На главную