ОформлениеЯчейкиДинамическогоСписка

Типы · DynamicListCellAppearance

Содержит объекты, описывающие оформление ячейки динамического списка.

Полное описание, параметры и ограничения

ОформлениеЯчейкиДинамическогоСписка (DynamicListCellAppearance)

ОформлениеЯчейкиДинамическогоСписка (DynamicListCellAppearance)

Доступен, начиная с версии 8.3.10.

Свойства:
ДоступныеПараметры (AvailableParameters)
Элементы (Items)

Методы:
НайтиЗначениеПараметра (FindParameterValue)
УстановитьЗначениеПараметра (SetParameterValue)

Описание:

Содержит объекты, описывающие оформление ячейки динамического списка.

Доступность:

Сервер.

Использование в версии:

Доступен, начиная с версии 8.3.10.

Методическая информация

Практические примеры

Оформить реальные ячейки текущей пачки динамического списка и проверить native readback

Две строки константного запроса без справочников. Подлинные СтрокиДинамическогоСписка и оформление видимых ячеек предоставляет серверное событие, а не пользовательский конструктор.

Где и как запускать

Полный модуль своей ОбщаяФорма.Ячейки85; server создания и обязательный server-without-context callback таблицы.

Подготовка

  1. Создайте отдельную новую пустую CF УчебныеЯчейкиСписка85 на 8.5.1.1343, управляемое приложение, без бизнес-объектов, расширений и сохраненных настроек формы.

  2. Создайте ОбщаяФорма.Ячейки85; реквизит Список типа ДинамическийСписок. Элемент ТаблицаТоваров типа ТаблицаФормы, ПутьКДанным = Список. Колонки не создавайте вручную: основной модуль создает три настоящих поля.

  3. Свяжите событие формы ПриСозданииНаСервере с одноименной процедурой. Свяжите событие таблицы ПриПолученииДанныхНаСервере с ТаблицаТоваровПриПолученииДанныхНаСервере.

  4. Обработчик таблицы имеет ровно ИмяЭлемента, Настройки, Строки и директиву НаСервереБезКонтекста. Первый параметр НЕ Элемент, отсутствует доступ к реквизитам формы по контексту.

  5. Вставьте полный модуль. Режим совместимости не ниже 8.3.8. Откройте только свою ОбщаяФорма.Ячейки85 в настольном тонком или толстом управляемом клиенте.

  6. Для визуальной проверки оставьте Количество видимым. Если столбец скрыт пользователем, оформление отсутствует, но УстановитьОбязательноеИспользование явно сохраняет сами данные ключа и количества для 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 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Своя query fixture возвращает ровно строки с ключами 85 и 86, количествами 0 и 5. ПоляКлюча/ЗначениеПоля заданы явно: ключ строки не равен индексу после сортировки. Ключ и количество помечены обязательными для выборки и проверены GetRequiredUse.

  2. Событие получает только текущую серверную пачку. Количество() сравниваем с ПолучитьКлючи().Количество(), не с общим размером всего списка.

  3. Получить принимает настоящий ключ из ПолучитьКлючи, а не 0 или 1. Сверяем его с данными и двумя собственными допустимыми значениями.

  4. Оформление содержит только видимые ячейки. Обходим реальные КлючИЗначение и ищем путь Количество; отсутствие видимой ячейки означает пропуск, а не попытку создать недоступный native объект.

  5. Из readonly ДоступныеПараметры через НайтиПараметр извлекаем реальный ПараметрКомпоновкиДанных цвета. Set включает Использование; Find принимает объект параметра, не строку.

  6. Ноль получает светло-красный фон, пять — светло-зеленый. Readback проверяет Значение и Использование и совпадение с readonly коллекцией Элементы; сами исходные данные не изменяются.

Как проверить результат

  1. Две реальные строки отображаются, query fixture проверяется на сервере. Количество 0 красное, 5 зеленое.

  2. В отладчике события массив ключей равен размеру именно текущей пачки; для каждого ключа вернулась своя строка.

  3. Скройте столбец Количество: событие не должно пытаться обращаться к отсутствующей ячейке. Верните столбец — native оформление применяется снова.

  4. Сортировка меняет позиции на экране, но код продолжает пользоваться ключами 85/86.

  5. Измените свой query key на третий код: серверный callback должен отказать на проверке собственного ключа, не оформить чужую строку.

  6. Исключение отсутствующего native параметра или неверного readback не подавляется; успех не имитируется клиентским сообщением.

Ожидаемый результат

9 новых API работают с настоящей пачкой и видимыми ячейками, имеют проверку readback и безопасное отсутствие скрытой ячейки.

На что обратить внимание

  1. Native событие требует НаСервереБезКонтекста и не передает Элемент формы.

  2. Строки группировок в пачку не входят; тип СтрокаГруппировкиДинамическогоСписка здесь не имитируется.

  3. Пачка не равна всему списку: сервер может получать несколько порций.

  4. Коллекции native оформления readonly как свойства; нельзя заменить их или создать fake объекты конструктором.

  5. Меняется только оформление, не значение количества, иначе поиск/отбор работали бы по прежним значениям.

  6. Запуск в 1С и визуальная отрисовка не выполнялись; проверки статические.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.