При работе с обычными формами в 1С 8.3 (например, в конфигурации «Управление производственным предприятием») разработчики часто сталкиваются с тем, что программно выгруженная Таблица Значений (ТЗ) ведет себя не так, как ожидалось. Ячейки могут не редактироваться, колонки не принимать нужную ширину, а вместо привычных «галочек» отображаться текст «Да/Нет». Рассмотрим подробно, как решить эти задачи и превратить обычное табличное поле в удобный инструмент для пользователя.
Одной из самых частых причин, по которой ячейки в колонке «Наименование» не поддаются редактированию, является отсутствие явного указания типа данных при создании ТЗ. Если вы добавляете колонку просто по имени, 1С может определить её тип как Неопределено, что блокирует ввод текста в табличном поле.
Проанализируем правильный подход к созданию структуры таблицы. Всегда указывайте ОписаниеТипов, чтобы платформа понимала, какой элемент управления нужно создать в ячейке:
// Правильное создание колонок с явным указанием типов
дТЗ = Новый ТаблицаЗначений;
дТЗ.Колонки.Добавить("наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
дТЗ.Колонки.Добавить("код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10)));
дТЗ.Колонки.Добавить("выбор", Новый ОписаниеТипов("Булево"));
дТЗ.Колонки.Добавить("код_п", Новый ОписаниеТипов("Булево"));
После выгрузки ТЗ на форму через команду СоздатьКолонки(), обязательно проверьте свойство ТолькоПросмотр самого элемента формы ТабличноеПоле. Если оно установлено в Истина, редактирование будет закрыто для всей таблицы целиком, независимо от настроек конкретных колонок.
Часто требуется разрешить редактирование колонки в целом, но запретить изменение данных в тех строках, которые соответствуют определенному критерию (например, если флаг код_п установлен в Ложь). Для решения этой задачи мы воспользуемся событием ПриНачалеРедактирования нашего табличного поля.
Рассмотрим алгоритм реализации такой проверки:
Процедура ТЗПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
// Получаем данные текущей строки
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Условие: запрет редактирования, если код_п равен Ложь
Если ТекущиеДанные.код_п = Ложь Тогда
// Запрещаем редактирование всей строки
Элемент.РазрешитьПравку = Ложь;
// Или можно использовать Отказ в событии ПередНачаломИзменения
КонецЕсли;
КонецПроцедуры
Если же вы хотите запретить редактирование только в одной конкретной колонке («Наименование») при определенных условиях, лучше использовать событие ПередНачаломИзменения. Это позволит курсору перемещаться по таблице, но не даст войти в режим редактирования ячейки.
По умолчанию колонки типа Булево отображаются текстом «Да» или «Нет». Чтобы превратить их в интерактивные «галочки», нужно правильно настроить свойства колонки в ТабличномПоле. Выясним важный нюанс: свойства Данные и ДанныеФлажка работают вместе особым образом.
"код_п").Непосредственно, чтобы пользователь мог менять состояние флажка одним кликом мыши.Чтобы визуально выделить строки, в которых редактирование запрещено, воспользуемся событием ПриВыводеСтроки. Это событие вызывается каждый раз, когда строка отрисовывается на экране, что позволяет динамически управлять оформлением.
Процедура ТЗПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Проверяем условие из данных строки
Если ДанныеСтроки.код_п = Ложь Тогда
// Устанавливаем цвет фона для всей строки
ОформлениеСтроки.ЦветФона = Новый Цвет(240, 240, 240); // Серый цвет
// Можно также изменить цвет текста для конкретной колонки
ОформлениеСтроки.Ячейки.наименование.ЦветТекста = Новый Цвет(128, 128, 128);
КонецЕсли;
КонецПроцедуры
Важно: Не используйте в этом событии тяжелые запросы или сложные вычисления, так как это значительно замедлит прокрутку таблицы пользователем.
Если в колонке «Порядок» нужно ограничить выбор пользователя только определенными значениями, которые еще не заняты в других строках, мы можем динамически формировать СписокВыбора.
Рассмотрим, как это сделать в событии НачалоВыбора:
Процедура ТЗПорядокНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный выбор
// Создаем список доступных значений
Список = Новый СписокЗначений;
Для Индекс = 1 По 10 Цикл
Список.Добавить(Индекс);
КонецЦикла;
// Удаляем из списка те значения, которые уже есть в ТЗ
Для Каждого СтрТЗ Из дТЗ Цикл
НайденныйЭлемент = Список.НайтиПоЗначению(СтрТЗ.порядок);
Если НайденныйЭлемент <> Неопределено Тогда
Список.Удалить(НайденныйЭлемент);
КонецЕсли;
КонецЦикла;
// Предлагаем пользователю выбрать из оставшихся
ВыбранноеЗначение = ВыбратьИзСписка(Список, Элемент);
Если ВыбранноеЗначение <> Неопределено Тогда
ЭлементыФормы.ТЗ.ТекущиеДанные.порядок = ВыбранноеЗначение.Значение;
КонецЕсли;
КонецПроцедуры
Если установка Колонка.Ширина = 3 не приносит результата, проанализируем настройки самого ТабличногоПоля. В обычных формах существует механизм автоматического распределения ширины, который может игнорировать ваши настройки.
Чтобы зафиксировать ширину, выполните следующие действия:
АвтоМасштаб у элемента ТабличноеПоле.РастягиватьПоГоризонтали, иначе они «схлопнут» вашу узкую колонку.Колонка.Ширина = 5, а уже потом применяйте ограничение ИзменениеРазмера = ИзменениеРазмераКолонки.НеИзменять.Помните, что метод СоздатьКолонки() полностью перерисовывает таблицу и сбрасывает все ваши программные настройки. Поэтому рекомендуется либо настраивать колонки в конфигураторе заранее, либо применять оформление (флажки, ширину, цвета) строго после каждого вызова СоздатьКолонки().