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