Работа с динамическим списком в 1С 8.3 (8.2). Программно добавить колонку в динамический список 1с
Динамический список в 1С 8.3 и 8.2 в управляемых формах
Наконец-то осуществилась мечта любого «семерошника». Как часто пользователи программы 7.7 просили сделать нормальный подбор номенклатуры. Чтобы и остатки можно было видеть, и цены, и установить фильтры. Приходилось придумывать разные хитрости, вплоть до написания внешних компонентов. В 1С 8.2 появились динамические списки. Предлагаю рассмотреть, что это такое и что они нам могут дать в 1С 8.3.
Создание формы выбора
За основу возьмем некую тестовую конфигурацию 1С:»Бухгалтерия предприятия 3.0″. Не будем сейчас делать подбор, просто в справочнике «Номенклатура» добавим еще одну форму выбора и сделаем ее временно основной:
При создании система по умолчанию добавит на форму табличное поле с типом «Динамический список».
Зайдем в его свойства и посмотрим, что там.
В первую очередь нас интересует флажок «Произвольный запрос». Он-то и откроет нам все преимущества динамического списка. У нас появится возможность написать собственный запрос, причем с параметрами. Устанавливаем флажок и нажимаем ссылку «Открыть»:
Получите 267 видеоуроков по 1С бесплатно:
Откроется окно с уже готовым кодом на языке запросов. Пока что там просто перечислены все поля справочника «Номенклатура».
Как видим, имеется кнопка вызова «Конструктора запроса» и флажок, который дает возможность динамически изменять содержимое списка. То есть когда другой пользователь меняет что-то в справочнике, в нашем списке это тоже изменится. Кроме того, имеется закладка «Настройки», но ее мы коснемся позже.
Собственный запрос в динамическом списке
Сначала создадим нужный нам запрос с остатками и ценами. Примерно так:
Закладка «Настройки»
И вот теперь самое вкусное! Переходим на закладку «Настройки». И сразу видим, что на первой вкладке мы можем делать любые отборы по любому полю в запросе:
Программная установка параметров запроса в динамическом списке 1С 8.3
Не забываем, что в запросе у нас присутствуют два параметра: «Период» и «Тип цен». Мы должны передать их в запрос, иначе будет ошибка.
Пропишем эти параметры в параметрах формы, а в модуле формы добавим следующие строки:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Дата); Список.Параметры.УстановитьЗначениеПараметра("ТипЦен", Параметры.ТипЦен); КонецПроцедурыЗначения параметров можно передать из объекта, откуда вызывается форма, либо другие, установленные по умолчанию.
Далее на форму с «Динамическим списком» можно добавить таблицу значений, куда будут при двойном клике передаваться строки с выбранным товаром и затем переноситься в документ.
Также на форму можно добавить флажок «Запрашивать количество».
В этом случае мы получаем уже простенький подбор товаров, однако с достаточно расширенными возможностями.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
programmist1s.ru
1С. Программное создание динамического списка
При доработке типовых решений для упрощения дальнейшей поддержки и обновления использую программное создание динамического списка и вывод его на форму.
Задача
Считаем, что есть типовая форма списка номенклатуры с динамическим списком. На форму необходимо добавить страницы: на первой выводить типовой список, а на второй список номенклатуры и данные РС «Данные для обработки». На текущий момент форма выглядит так:
Решение
План работ следующий:
- Создать страницы на форме;
- Переместить типовой динамический список на нужную страницу;
- Создать динамический список и вывести его на нужную страницу.
Далее будет показан код по логическим блокам, в конце статьи будет представлен итоговый код
Создание страниц
Собственно создадим группу с видом «Страницы», и в нее добавим две группы с видом «Страница»
Страницы = Элементы.Добавить("Страницы", Тип("ГруппаФормы"), ЭтаФорма); Страницы.Вид = ВидГруппыФормы.Страницы; Страницы.Заголовок = "Страницы"; Страница_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; НоваяКолонка.РастягиватьПоГоризонтали = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Обработан"; НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка; НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.ОшибкаПриОбработке"; НоваяКолонка.Заголовок = "Ошибка"; НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка; НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.НоменклатурнаяГруппа"; #КонецОбласти КонецПроцедуры #КонецОбластиguesto.ru
Программно изменить динамический список на форме #811050
Добрый день. Ситуация такая - клиент в форме подбора номенклатуры захотел увидеть основную ячейку хранения номенклатуры. Список номенклатуры в форме - динамический список, запрос по которому формируется программно. С запросом проблем нет - в результирующую таблицу ячейка попадает. Программно добавляю колонку таблицы, но указывая путь к данным как "СписокНоменклатура.Ячейка" 1С колонку не выводит по тому как нету этой колонки. Реквизит динамический список заведен в реквизитах формы . Как программно добавить в него еще одну колонку?
просто добавить ее в запросе - никак?
В запрос все добавлено - в таблице на форме не появляется. Подозреваю, что колонка (которую я добавляю) не видит путь к данным.
На платформе 8.3.11 в режиме совместимости 8.3.10 (и на платформе 8.3.10 без режима совместимости) программное изменение запроса динамического списка отрабатывает некорректно. А так нужно элемент формы ещё добавить, конечно. И в нем указать путь к данным.
все отрабатывает корректно - а вот элемент формы не появляется.
В какой процедуре всё происходит?
Обработка подбора в документ продажи. Меняется запрос и добавляется реквизит при создании на сервере
Тогда скажи релиз платформы и режим совместимости
Поймал отладчиком при активизации строки - уже нет моего реквизита - где то еще меняется ... будем искать
Всё же сообщи релиз.
Как клещами. А режим совместимости? )
Не использовать
ХАААА !!! кажется нашел ...
Перечитай пост . Текст запроса устанавливается без ошибок, но потом "ТекущиеДанные" выдает не все поля запроса.
Действительно нашел - все дело в том, что на форме этой обработки есть два списка - стандартный и расширенный (находятся они в одном и том же месте). Менял я стандартный, а программа (из-за установленной галки) использовала расширенный. Все нормально - и запрос исправлен корректно и результаты в таблице есть и реквизиты добавились правильно все изменения только программные.
Tags: 1С 8
avprog.ru