Содержит объекты, описывающие оформление ячейки динамического списка.
Полное описание, параметры и ограничения
ОформлениеЯчейкиДинамическогоСписка (DynamicListCellAppearance)
ОформлениеЯчейкиДинамическогоСписка (DynamicListCellAppearance)
Доступен, начиная с версии 8.3.10.
Свойства:
ДоступныеПараметры (AvailableParameters)
Элементы (Items)
Методы:
НайтиЗначениеПараметра (FindParameterValue)
УстановитьЗначениеПараметра (SetParameterValue)
Описание:
Содержит объекты, описывающие оформление ячейки динамического списка.
Доступность:
Сервер.
Использование в версии:
Доступен, начиная с версии 8.3.10.
Методическая информация
Практические примеры
Оформить реальные ячейки текущей пачки динамического списка и проверить native readback
Две строки константного запроса без справочников. Подлинные СтрокиДинамическогоСписка и оформление видимых ячеек предоставляет серверное событие, а не пользовательский конструктор.
Где и как запускать
Полный модуль своей ОбщаяФорма.Ячейки85; server создания и обязательный server-without-context callback таблицы.
Подготовка
Создайте отдельную новую пустую CF УчебныеЯчейкиСписка85 на 8.5.1.1343, управляемое приложение, без бизнес-объектов, расширений и сохраненных настроек формы.
Создайте ОбщаяФорма.Ячейки85; реквизит Список типа ДинамическийСписок. Элемент ТаблицаТоваров типа ТаблицаФормы, ПутьКДанным = Список. Колонки не создавайте вручную: основной модуль создает три настоящих поля.
Свяжите событие формы ПриСозданииНаСервере с одноименной процедурой. Свяжите событие таблицы ПриПолученииДанныхНаСервере с ТаблицаТоваровПриПолученииДанныхНаСервере.
Обработчик таблицы имеет ровно ИмяЭлемента, Настройки, Строки и директиву НаСервереБезКонтекста. Первый параметр НЕ Элемент, отсутствует доступ к реквизитам формы по контексту.
Вставьте полный модуль. Режим совместимости не ниже 8.3.8. Откройте только свою ОбщаяФорма.Ячейки85 в настольном тонком или толстом управляемом клиенте.
Для визуальной проверки оставьте Количество видимым. Если столбец скрыт пользователем, оформление отсутствует, но УстановитьОбязательноеИспользование явно сохраняет сами данные ключа и количества для callback. Код пропускает только отсутствующее оформление. Файлы, SQL, серверы и рабочие данные не нужны.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойПустойСтенд();
Список.ПроизвольныйЗапрос = Истина;
Список.ОсновнаяТаблица = "";
Список.ДинамическоеСчитываниеДанных = Ложь;
Список.АвтоЗаполнениеДоступныхПолей = Истина;
Список.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
Список.ВидКлюча = ВидКлючаДинамическогоСписка.ЗначениеПоля;
КлючевыеПоля = Новый Массив;
КлючевыеПоля.Добавить("УчебныйНомер");
Список.ПоляКлюча = Новый ФиксированныйМассив(КлючевыеПоля);
Список.ТекстЗапроса = "ВЫБРАТЬ 85 КАК УчебныйНомер, ""Свой нулевой остаток"" КАК Наименование, 0 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ 86, ""Свои пять учебных единиц"", 5";
Элементы.ТаблицаТоваров.ТолькоПросмотр = Истина;
Список.УстановитьОбязательноеИспользование("УчебныйНомер", Истина);
Список.УстановитьОбязательноеИспользование("Количество", Истина);
Если Не Список.ПолучитьОбязательноеИспользование("УчебныйНомер") Или Не Список.ПолучитьОбязательноеИспользование("Количество") Тогда
ВызватьИсключение "Данные ключа и количества нужны callback даже при скрытии колонки";
КонецЕсли;
Контроль = Новый Запрос(Список.ТекстЗапроса);
Данные = Контроль.Выполнить().Выгрузить();
Если Данные.Количество() <> 2 Тогда
ВызватьИсключение "Своя query fixture должна содержать ровно две строки";
КонецЕсли;
Если Список.ПоляКлюча.Получить(0) <> "УчебныйНомер" Тогда
ВызватьИсключение "Ключ строки должен быть собственным полем, не индексом";
КонецЕсли;
Для Каждого ИмяПоля Из СтрРазделить("УчебныйНомер,Наименование,Количество", ",") Цикл
Колонка = Элементы.Добавить("Товары" + ИмяПоля, Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
Колонка.Вид = ВидПоляФормы.ПолеВвода;
Колонка.ПутьКДанным = "Список." + ИмяПоля;
Колонка.Заголовок = ИмяПоля;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ТаблицаТоваровПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
ПроверитьСвойПустойСтенд();
Если ИмяЭлемента <> "ТаблицаТоваров" Или ТипЗнч(Настройки) <> Тип("НастройкиКомпоновкиДанных") Тогда
ВызватьИсключение "Событие должно прийти от своей таблицы с настоящими настройками";
КонецЕсли;
Если ТипЗнч(Строки) <> Тип("СтрокиДинамическогоСписка") Тогда
ВызватьИсключение "Нужна реальная native пачка строк, не ТаблицаЗначений";
КонецЕсли;
Ключи = Строки.ПолучитьКлючи();
Если Строки.Количество() <> Ключи.Количество() Тогда
ВызватьИсключение "Число ключей должно совпадать с размером текущей пачки";
КонецЕсли;
Для Каждого Ключ Из Ключи Цикл
СтрокаСписка = Строки.Получить(Ключ);
Данные = СтрокаСписка.Данные;
Если Данные.УчебныйНомер <> Ключ Или (Ключ <> 85 И Ключ <> 86) Тогда
ВызватьИсключение "Пачка содержит не собственный реальный ключ";
КонецЕсли;
Если (Ключ = 85 И Данные.Количество <> 0) Или (Ключ = 86 И Данные.Количество <> 5) Тогда
ВызватьИсключение "Не совпали собственные контрольные данные";
КонецЕсли;
Ячейка = Неопределено;
Для Каждого Пара Из СтрокаСписка.Оформление Цикл
Если Пара.Ключ = "Количество" Тогда
Ячейка = Пара.Значение;
КонецЕсли;
КонецЦикла;
Если Ячейка = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Ячейка) <> Тип("ОформлениеЯчейкиДинамическогоСписка") Тогда
ВызватьИсключение "Native оформление видимой ячейки имеет другой тип";
КонецЕсли;
ПараметрФона = Новый ПараметрКомпоновкиДанных("ЦветФона");
ДоступныйФон = Ячейка.ДоступныеПараметры.НайтиПараметр(ПараметрФона);
Если ДоступныйФон = Неопределено Тогда
ВызватьИсключение "Параметр ЦветФона отсутствует в native доступном оформлении";
КонецЕсли;
Если Данные.Количество = 0 Тогда
ЦветЯчейки = Новый Цвет(255, 235, 235);
Иначе
ЦветЯчейки = Новый Цвет(225, 245, 230);
КонецЕсли;
Ячейка.УстановитьЗначениеПараметра(ДоступныйФон.Параметр, ЦветЯчейки);
ЗначениеФона = Ячейка.НайтиЗначениеПараметра(ДоступныйФон.Параметр);
Если ЗначениеФона = Неопределено Тогда
ВызватьИсключение "Установленный параметр не найден методом native ячейки";
КонецЕсли;
Если Не ЗначениеФона.Использование Или ЗначениеФона.Значение <> ЦветЯчейки Тогда
ВызватьИсключение "Цвет не включен или не совпал с контрольным";
КонецЕсли;
НайденВКоллекции = Ложь;
Для Каждого ЭлементОформления Из Ячейка.Элементы Цикл
Если ЭлементОформления.Параметр = ДоступныйФон.Параметр Тогда
Если ЭлементОформления.Использование И ЭлементОформления.Значение = ЦветЯчейки Тогда
НайденВКоллекции = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не НайденВКоллекции Тогда
ВызватьИсключение "Readback через readonly коллекцию элементов не совпал";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Своя query fixture возвращает ровно строки с ключами 85 и 86, количествами 0 и 5. ПоляКлюча/ЗначениеПоля заданы явно: ключ строки не равен индексу после сортировки. Ключ и количество помечены обязательными для выборки и проверены GetRequiredUse.
Событие получает только текущую серверную пачку. Количество() сравниваем с ПолучитьКлючи().Количество(), не с общим размером всего списка.
Получить принимает настоящий ключ из ПолучитьКлючи, а не 0 или 1. Сверяем его с данными и двумя собственными допустимыми значениями.
Оформление содержит только видимые ячейки. Обходим реальные КлючИЗначение и ищем путь Количество; отсутствие видимой ячейки означает пропуск, а не попытку создать недоступный native объект.
Из readonly ДоступныеПараметры через НайтиПараметр извлекаем реальный ПараметрКомпоновкиДанных цвета. Set включает Использование; Find принимает объект параметра, не строку.
Ноль получает светло-красный фон, пять — светло-зеленый. Readback проверяет Значение и Использование и совпадение с readonly коллекцией Элементы; сами исходные данные не изменяются.
Как проверить результат
Две реальные строки отображаются, query fixture проверяется на сервере. Количество 0 красное, 5 зеленое.
В отладчике события массив ключей равен размеру именно текущей пачки; для каждого ключа вернулась своя строка.
Скройте столбец Количество: событие не должно пытаться обращаться к отсутствующей ячейке. Верните столбец — native оформление применяется снова.
Сортировка меняет позиции на экране, но код продолжает пользоваться ключами 85/86.
Измените свой query key на третий код: серверный callback должен отказать на проверке собственного ключа, не оформить чужую строку.
Исключение отсутствующего native параметра или неверного readback не подавляется; успех не имитируется клиентским сообщением.
Ожидаемый результат
9 новых API работают с настоящей пачкой и видимыми ячейками, имеют проверку readback и безопасное отсутствие скрытой ячейки.
На что обратить внимание
Native событие требует НаСервереБезКонтекста и не передает Элемент формы.
Строки группировок в пачку не входят; тип СтрокаГруппировкиДинамическогоСписка здесь не имитируется.
Пачка не равна всему списку: сервер может получать несколько порций.
Коллекции native оформления readonly как свойства; нельзя заменить их или создать fake объекты конструктором.
Меняется только оформление, не значение количества, иначе поиск/отбор работали бы по прежним значениям.
Запуск в 1С и визуальная отрисовка не выполнялись; проверки статические.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.