1с изменить запрос динамического списка программно

Обновлено: 17.05.2024

Программный изменение формы списка, Динамический список

В данном разделе можно задавать вопросы по программированию на платформе 1С:Предприятие 8.
(Раздел предназначен для тех, кто уже прошел обучение в нашем учебном центре)

p.s. Просьба задавать вопросы только по программированию. На вопросы по типовым конфигурациям обычно не отвечаю по двум причинам
1. В последнее время редко с ними работаю.
2. Чтобы ответить на вопрос требуется: установить соответствующую базу нужного релиза, смоделировать ситуацию, и только после этого возможно залезть в конфигуратор и разобраться что не так (к сожалению, у меня нет столько времени).

Программный изменение формы списка, Динамический список

Александр » 24 июн 2013, 18:02

Здравствуйте Сергей!
Вывожу программно новый реквизит на управляемую форму списка.
Меняю произвольный запрос из динамического списка(Добавляю в него выбор нужного мне поля).
Хочу вывести новое поле в колонке таблицы.
На строчке кода Элемент.ПутьКДанным = "Список.ВнешнийКод" выдает ошибку, и ругается на неправильный путь.
Как быть? Добавить реквизит в динамический список тоже нельзя.
Код: выделить все ЭтаФормаПерем.Список.ТекстЗапроса = СтрЗаменить(ЭтаФормаПерем.Список.ТекстЗапроса,"СправочникКонтрагенты.Ссылка,","СправочникКонтрагенты.Ссылка, СправочникКонтрагенты.ВнешнийКод КАК ВнешнийКод");

admin » 26 июн 2013, 13:22

НовЭлемент = ЭтаФормаПерем.Элементы.Добавить("ПолеВнешнийКод",Тип("ПолеФормы"),ЭтаФормаПерем.Элементы.Список);
НовЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
НовЭлемент.ПутьКДанным = "Список.ВнешнийКод";

и у поля ВнешнийКод необходимо в реквизитах формы поставить галочку "использовать всегда"

Мне до конца не ясна задача, для чего вам все это потребовалось

Более простой вариант: вытащить все колонки и программно регулировать видимость колонок.

Александр » 26 июн 2013, 14:55

Я создал справочник метаконфигуратор, и через вызов процедуры ПриСозданииНаСервере, управляемой формы вызываю процедуру которая выводит новые реквизиты указанные в метеконфигураторе.

Александр » 26 июн 2013, 16:36

и у поля ВнешнийКод необходимо в реквизитах формы поставить галочку "использовать всегда"

вот это не понял где?
У меня список -- динамический список с произвольным запросом.
И реквизита ВнешнийКод в "Список" нету, так в запросе изначально его нету.
Но я программно меняю запрос и добавляю ВнешнийКод .
но путь "Список.ВнешнийКод" не присваивается.

Все делается таким образом, для того чтобы не вмешиваться в форму.
весь код пишется в общем модуле и не затрагивает форму.
Цель обновление без проблем.

admin » 28 июн 2013, 10:53

Динамический список сами добавляете, или он уже есть на форме? Динамический список используется только для справочника Номенклатура или в зависимости от запроса может отображаться любой справочник?

Александр » 01 июл 2013, 10:57

Все изменения в форме списка контрагента бп 3.0, динамический список уже есть на форме. В него заменой(изменением) запроса добавляю выбор нового поля "ВнешнийКод". и на путь "Список.ВнешнийКод" при выводе реквизита ругается.

admin » 01 июл 2013, 14:32

У меня все работает:
ЭтаФорма.Список.ТекстЗапроса = СтрЗаменить(ЭтаФорма.Список.ТекстЗапроса,"СправочникКонтрагенты.Ссылка,","СправочникКонтрагенты.Ссылка, СправочникКонтрагенты.ВнешнийКод КАК ВнешнийКод,");
НовЭлемент = ЭтаФорма.Элементы.Добавить("ПолеВнешнийКод",Тип("ПолеФормы"),ЭтаФорма.Элементы.Список);
НовЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
НовЭлемент.ПутьКДанным = "Список.ВнешнийКод";

(Это при условии, что в динамическом списке установлен флаг "произвольный запрос", к сожалению под рукой у меня нет свежей БП 3.0, в старой БП 3.0 этот флаг не установлен)

frutty » 13 фев 2015, 19:13

Аналогичная проблема, в документ добавил свой реквизит, и хотелось бы видеть его в списке документов, но вот вручную его добавлять не хочется, чтобы избежать проблем с обновлениями.
Из-за этого решил воспользоваться общим модулем "МодификацияКонфигурацииПереопределяемый" в котором можно внести свои изменения в форму при вызове процедуры "ПриСозданииНаСерврере".
Так вот в чём проблема, пытаюсь изменить запрос и вытащить колонку с моим реквизитом, но ловлю ошибку:
Ошибка при установке значения атрибута контекста (ПутьКДанным)
Элемент.ПутьКДанным = "Список.ДополнительныйНомер";
по причине:
Недопустимое значение

Код: выделить все Форма.Список.ТекстЗапроса = СтрЗаменить(Форма.Список.ТекстЗапроса, "СостоянияЭД.СостояниеВерсииЭД", ",ДокументЗаказКлиента.ФАЙТ_ДополнительныйНомер КАК ДополнительныйНомер");
Форма.Список.УстановитьОбязательноеИспользование("ДополнительныйНомер", Истина);
Элемент = Форма.Элементы.Добавить("ПолеДополнительныйНомер", Тип("ПолеФормы"), Форма.Элементы.Список);
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным = "Список.ДополнительныйНомер";

1. Если текст запроса динамического списка переопределяется в коде, то рекомендуется придерживаться правил, описанных ниже. Это нужно для того, чтобы:

  • разработчики, глядя на запрос в динамическом списке, могли однозначно понять, что он переопределяется в коде конфигурации;
  • не снижать производительность при открытии формы, установке текста запроса, основной таблицы и признака динамического считывания данных.

1.1. В редакторе запроса динамического списка следует устанавливать полноценный наиболее часто выполняемый текст запроса (запрос по умолчанию), чтобы при открытии формы, в большинстве случаев, не происходила программная установка текста запроса, снижающая производительность. Исключением является случай, когда текст запроса собирается программно.

ВЫБРАТЬ
НоменклатураПереопределяемый.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК НоменклатураПереопределяемый

Запрос, требующий обязательной замены в коде конфигурации, т.к. не содержит секции ИЗ:

ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Ссылка

1.2. Псевдонимы таблиц должны заканчиваться постфиксом «Переопределяемый», чтобы визуально было заметно, что этот запрос может переопределяться в коде конфигурации.

ВЫБРАТЬ
Номенклатура Переопределяемый .Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура Переопределяемый

ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура

1.3. Установка текста запроса и основной таблицы при первичной инициализации динамического списка (в ПриСозданииНаСервере) должна выполняться до любого обращения к настройкам этого списка (в т.ч. параметрам), чтобы не снижалась производительность. В остальных случаях, если требуется изменить текст запроса и основную таблицу, между этими действиями не следует обращаться к настройкам (можно до них или после). При наличии БСП, следует использовать процедуру ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(). Это необходимо для повышения производительности и возможности автоматического сбора переопределяемых текстов запросов динамических списков.

СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
СвойстваСписка.ОсновнаяТаблица = "Справочник.Номенклатура";
СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
СвойстваСписка.ТекстЗапроса = ТекстЗапроса;
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список,
СвойстваСписка);
Список.Параметры.УстановитьЗначениеПараметра("Параметр1", 42);

Список.ТекстЗапроса = ТекстЗапроса;
Список.Параметры.УстановитьЗначениеПараметра("Параметр1", 42);
Список.ОсновнаяТаблица = ОсновнаяТаблица;

В этом случае снижается производительность из-за того, что при изменении текста запроса или основной таблицы сбрасывается источник доступных настроек и при обращении к Список.Параметры источник инициализируется заново.

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

Одним из требований для прохождения аудита расширения в модели сервиса является программная модификация управляемых форм без заимствования самой формы в расширение.

Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.

Добавление реквизитов

Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения

Реквизиты формы, добавленные через конфигуратор, удалить невозможно, поэтому второй аргумент процедуры можно не указывать.

Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы .

Например, если мы создаем таблицу значений из двух колонок, то программный код для их создания будет выглядеть следующим образом:

Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере , но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый , в состав которого входит процедура

Данную процедуру можно заимствовать в расширение, добавить проверку имени формы и вставить код изменения реквизитов:

Для остальных конфигураций придется переопределять другие процедуры. Например

Использование той или иной процедуры следует проверить в модуле редактируемой формы.

Изменение элементов формы

Управление элементами формы производится через коллекцию Элементы объекта ФормаКлиентскогоПриложения , с помощью которой можно добавлять, удалять, изменять свойства элементов формы, а также перемещать элементы формы между родителями.

Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:

По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP) , ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере .

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

Обработка событий формы

Выполнить код по событию элемента формы можно двумя способами:

  • Создать команду, указать для этой команды имя обработчика события и назначить эту команду элементу формы
  • Выполнить метод УстановитьДействие элемента формы, чтобы указать имя обработчика события в модуле формы

Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент - Команда. Для второго - всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент - ЭлементФормы . А для события ПередНачаломДобавления таблицы формы - целых 6 аргументов ( ЭлементФормы , Отказ , Копирование , Родитель , ЭтоГруппа , Параметр ). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.

Для самых простых случаев (команда или событие без параметров) можно использовать следующие комбинации обработчиков и переопределяемых процедур:

  • обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
  • обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду

При этом в предопределенной процедуре обязательно проверять имя команды (или имя элемента формы) и имя самой формы.

Либо вариант с использованием команд:

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

Полезные советы

Работа с динамическими списками

Довольно частой задачей является модификация в расширении текста запроса динамического списка. Многие разработчики просто копируют текст запроса из конфигуратора, редактируют его и заменяют стандартный в свойстве ТекстЗапроса объекта Динамический список .

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

Переопределение открываемой формы

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

Для этого следует реализовать новую форму (не заимствовать её, а написать с нуля) и в модуле менеджера переопределить процедуру ОбработкаПолученияФормы .

Данный метод следует использовать с осторожностью или ограничивать его использование ключами открытия формы, т.к. в этом случае мы делаем недоступной типовую форму.

в нем прописал
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "itilprofИнциденты.КодЗавершения,", "itilprofИнциденты.КодЗавершения, itilprofИнциденты.ЧисловойПриоритет, itilprofИнциденты.КрайнийСрок, ");

НоваяКолонка = Элементы.Вставить("ЧисловойПриоритет", Тип("ПолеФормы"), Элементы.Список, Элементы.ТекущийИсполнитель);
НоваяКолонка.ПутьКДанным = "Список.ЧисловойПриоритет";
НоваяКолонка.Заголовок = "Приоритет(Ч)";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;

НоваяКолонка = Элементы.Вставить("КрайнийСрок", Тип("ПолеФормы"), Элементы.Список, Элементы.ТекущийИсполнитель);
НоваяКолонка.ПутьКДанным = "Список.КрайнийСрок";
НоваяКолонка.Заголовок = "Крайний срок";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;

Колонки появились. Но в них не отображаются значения! Отбор меж тем работает. Добавил реквизиты в расширение - не помогло. Что я делаю не так?!

(0) запрос измени в расширении - в данных динамического списка нет твоих реквизитов
А что смотреть? Строки в СписокПриПолученииДанныхНаСервереПосле посмотрел, там нет этих данных :(
(4) Не, ошибся - есть там.
Строки[45].Значение.Данные.ЧисловойПриоритет 77 Число
3 варианта. А в статьях что в инете нашел все было просто, так как я и написал изначально :( Буду пробовать сейчас

(14) какие три варианта?

(10)+(12)+(14) это один код по кусочкам - просто получилось так

(11) ПолеНадписи и так стоит по умолчанию после Элементы.Вставить("ЧисловойПриоритет", Тип("ПолеФормы"), Элементы.Список, Элементы.ТекущийИсполнитель);

(0) это из БСП если не хочешь так то попробуй вызвать код из БСП

Ну и "ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СтруктураПараметров);" конечно же
Может с компоновщиком что то сделать надо?
Коллеги! неужели никто такого не делал? Не поверю никак!
(23) похоже это не поле ввода, а что-то другое. Почему влруг поле ввода?
(28) ну а почему отбор работает если не поменял текст запроса?
может с компоновщиком динамического запроса что нибудь надо сделать?
(31) Пробовал - не помогло. И потом я подозреваю что это ограничит возможность сортировки списка.

(32) Не парь мозг СтрЗаменить. Ты все равно затащил форму в расширение, сделай все по-человечески.

Во-первых добавление (заимствование) формы в расширение может привести к некоторым нежелательным эффектам, которые могут возникнуть после обновления конфигурации. Приведем немного теории.

Платформа использует сразу три формы:

Данные формы взаимодействуют между собой и в результате такого взаимодействия получается Результирующая форма, которую видит пользователь. В ходе взаимодействия указанных форм может возникнуть нежелательная ситуация, например, мы доработали форму в расширении, потом в новом релизе добавились реквизиты и они на форме не отображаются! Более подробно тут.

Во-вторых добавление формы в расширение привело бы к автоматическому добавлению всех реквизитов этого объекта и объектов метаданных (соответствующих ссылочным типам реквизитов объекта) в данное расширение, что загромождало бы само расширение и также не желательно.

Поэтому возникла задача программного создания элемента формы для добавленного реквизита в самом расширении, этому и посвящена данная публикация."

вот поэтому я должен (ТЗ такое) добавить в расширении в форму программно.

Читайте также: