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