1С. Программное создание динамического списка

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

Задача

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

Решение

План работ следующий:

  1. Создать страницы на форме;
  2. Переместить типовой динамический список на нужную страницу;
  3. Создать динамический список и вывести его на нужную страницу.

Далее будет показан код по логическим блокам, в конце статьи будет представлен итоговый код

Создание страниц

Собственно создадим группу с видом «Страницы», и в нее добавим две группы с видом «Страница»

    Страницы = Элементы.Добавить("Страницы",	Тип("ГруппаФормы"),  ЭтаФорма);
    Страницы.Вид                = ВидГруппыФормы.Страницы;
    Страницы.Заголовок          = "Страницы";
	
    Страница_1 = Элементы.Добавить("Страница_1", Тип("ГруппаФормы"), Страницы);
    Страница_1.Вид              = ВидГруппыФормы.Страница;
    Страница_1.Заголовок        = "Страница 1";
	
    Страница_2 = Элементы.Добавить("Страница_2", Тип("ГруппаФормы"), Страницы);
    Страница_2.Вид              = ВидГруппыФормы.Страница;
    Страница_2.Заголовок        = "Страница 2";

Программное формирование реквизитов и элементов формы можно в статье 1С. Программное добавление и удаление реквизитов формы

Перемещение элементов формы

Для перемещения типового динамического списка воспользуемся методом коллекции элементов формы Переместить()

    Элементы.Переместить(Элементы.Список, Страница_1);

Программное создание динамического списка

Добавляем реквизит формы с типом Динамический список и определяем основные свойства.

    // Создадим реквизит формы динамическог списка
    ДобавляемыеРеквизиты	= Новый Массив;
	
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Список_Альтернативный", Новый ОписаниеТипов("ДинамическийСписок")));
	
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
    // Опишем параметры динамического списка	
    ЭтаФорма.Список_Альтернативный.ПроизвольныйЗапрос   = Истина;
    ЭтаФорма.Список_Альтернативный.ТекстЗапроса         =
    "ВЫБРАТЬ
    |	Спр_Номенклатура.Ссылка КАК Ссылка,
    |	Спр_Номенклатура.Код КАК Код,
    |	Спр_Номенклатура.Наименование КАК Наименование,
    |	Спр_Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    |	Спр_Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    |	ЕСТЬNULL(ДанныеДляОбработки.Обработан, ЛОЖЬ) КАК Обработан,
    |	ЕСТЬNULL(ДанныеДляОбработки.ОшибкаПриОбработке, ЛОЖЬ) КАК ОшибкаПриОбработке
    |ИЗ
    |	Справочник.Номенклатура КАК Спр_Номенклатура
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки
    |		ПО (ДанныеДляОбработки.Номенклатура = Спр_Номенклатура.Ссылка)";
	
    ЭтаФорма.Список_Альтернативный.ОсновнаяТаблица = "Справочник.Номенклатура";

Теперь создадим элементы формы относящиеся к динамическому списку

    //Создание элементов формы
    эл_Список = Элементы.Добавить("Список_Альтернативный", Тип("ТаблицаФормы"), Страница_2);
    эл_Список.ПутьКДанным                    = "Список_Альтернативный";
    эл_Список.Отображение                    = ОтображениеТаблицы.Список;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеСостоянияПросмотра    = ПоложениеСостоянияПросмотра.Нет;
    эл_Список.ПоложениеСтрокиПоиска          = ПоложениеСтрокиПоиска.Нет;
    эл_Список.ПоложениеКоманднойПанели       = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Ссылка", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Ссылка";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ПометкаУдаления", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ПометкаУдаления";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Код", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Код";
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Наименование", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Наименование";
    НоваяКолонка.Ширина                     = 20;
    НоваяКолонка.РастягиватьПоГоризонтали   = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Обработан";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ОшибкаПриОбработке";
    НоваяКолонка.Заголовок                  = "Ошибка";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.НоменклатурнаяГруппа";

Небольшая хитрость

Как видно из кода, на форме не отображается поле «Ссылка», если на клиенте программно обратиться к текущим данным нашего списка, то свойства ссылка в полученной коллекции не будет. Для предотвращения такой ситуации необходимо указать обязательность использования поля, тогда свойство будет передаваться на клиент всегда

    ЭтаФорма.Список_Альтернативный.УстановитьОбязательноеИспользование("Ссылка", Истина);

Результат

Теперь проверяем, что у нас получилось. Первая страница, на которую мы перенесли типовой список

Программное создание динамического списка

Вторая страница с нашим сформированным списком

Программное создание динамического списка

И результирующий код:

#Область ОбработчикиСобытийформы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    #Область СозданиеСтраниц
    
    Страницы = Элементы.Добавить("Страницы",    Тип("ГруппаФормы"),  ЭтаФорма);
    Страницы.Вид                = ВидГруппыФормы.Страницы;
    Страницы.Заголовок          = "Страницы";
    
    Страница_1 = Элементы.Добавить("Страница_1", Тип("ГруппаФормы"), Страницы);
    Страница_1.Вид              = ВидГруппыФормы.Страница;
    Страница_1.Заголовок        = "Страница 1";
    
    Страница_2 = Элементы.Добавить("Страница_2", Тип("ГруппаФормы"), Страницы);
    Страница_2.Вид              = ВидГруппыФормы.Страница;
    Страница_2.Заголовок        = "Страница 2";
    
    #КонецОбласти
    
    #Область ПеремещениеТиповогоДинамическогоСписка
    
    Элементы.Переместить(Элементы.Список, Страница_1);
    
    #КонецОбласти
    
    #Область СозданиеДинамическогоСписка
    
    // Создадим реквизит формы динамическог списка
    ДобавляемыеРеквизиты    = Новый Массив;
    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Список_Альтернативный", Новый ОписаниеТипов("ДинамическийСписок")));
    
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    // Опишем параметры динамического списка    
    ЭтаФорма.Список_Альтернативный.ПроизвольныйЗапрос   = Истина;
    ЭтаФорма.Список_Альтернативный.ТекстЗапроса         =
    "ВЫБРАТЬ
    |    Спр_Номенклатура.Ссылка КАК Ссылка,
    |    Спр_Номенклатура.Код КАК Код,
    |    Спр_Номенклатура.Наименование КАК Наименование,
    |    Спр_Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    |    Спр_Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    |    ЕСТЬNULL(ДанныеДляОбработки.Обработан, ЛОЖЬ) КАК Обработан,
    |    ЕСТЬNULL(ДанныеДляОбработки.ОшибкаПриОбработке, ЛОЖЬ) КАК ОшибкаПриОбработке
    |ИЗ
    |    Справочник.Номенклатура КАК Спр_Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки
    |        ПО (ДанныеДляОбработки.Номенклатура = Спр_Номенклатура.Ссылка)";
    
    ЭтаФорма.Список_Альтернативный.ОсновнаяТаблица = "Справочник.Номенклатура";
    
    // Установка обязательного использования
    ЭтаФорма.Список_Альтернативный.УстановитьОбязательноеИспользование("Ссылка", Истина);
    
    //Создание элементов формы
    эл_Список = Элементы.Добавить("Список_Альтернативный", Тип("ТаблицаФормы"), Страница_2);
    эл_Список.ПутьКДанным                    = "Список_Альтернативный";
    эл_Список.Отображение                    = ОтображениеТаблицы.Список;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеСостоянияПросмотра    = ПоложениеСостоянияПросмотра.Нет;
    эл_Список.ПоложениеСтрокиПоиска          = ПоложениеСтрокиПоиска.Нет;
    эл_Список.ПоложениеКоманднойПанели       = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Ссылка", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Ссылка";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ПометкаУдаления", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ПометкаУдаления";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Код", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Код";
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Наименование", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Наименование";
    НоваяКолонка.Ширина                     = 20;
    НоваяКолонка.РастягиватьПоГоризонтали   = Ложь;
        
    НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Обработан";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ОшибкаПриОбработке";
    НоваяКолонка.Заголовок                  = "Ошибка";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.НоменклатурнаяГруппа";
    
    #КонецОбласти
    
КонецПроцедуры

#КонецОбласти
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Игорь

    Большое спасибо за статью!

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: