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