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