Добавить колонку в динамический список 1с программно
Обновлено: 04.07.2024
Особенности работы табличного поля с колонками динамических списков
Динамическими списками называются списки , использующие при обращении к базе данных механизм динамической выборки . Особенностью механизма динамической выборки является то , что данные считываются не полностью , а блоками , уменьшая время загрузки всего списка и размер отводимой для него памяти . Примерами динамических списков являются списки справочников , документов , регистров .
При считывании блока данных динамический список выполняет обращение к базе данных . Табличное поле для уменьшения объема выбираемых данных управляет набором полей , считываемых из базы данных . Считываются только те поля таблицы , которые связаны с соответствующими видимыми колонками табличного поля , поля, по которым выполняется упорядочивание, и поля , используемые табличным полем для отображения картинки и контроля удаления ( поля ЭтоГруппа , ПометкаУдаления ).
Отметим следующие особенности работы табличного поля с колонками динамических списков :
- При создании табличное поле инициализирует связанный с ним динамический список набором видимых колонок . Всем колонкам , добавляемым табличным полем, устанавливается свойство колонки списка АвтоУдаление = Истина .
- Специальная форма " Настройка списка ", открываемая через контекстное меню или через меню командной панели , позволяет управлять набором видимых колонок . После установки видимости колонок табличное поле установит новый набор колонок в связанный с ним динамический список , при этом колонки динамического списка, не видимые в табличном поле и у которых свойство АвтоУдаление = Истина, будут удалены из списка .
Следовательно , связанный с табличным полем динамический список содержит в себе только те поля базы данных , которые связаны с видимыми колонками табличного поля , а также поля, необходимые для отображения картинки и других служебных целей .
Иногда может потребоваться обратиться к колонкам динамического списка , не связанными с видидимыми только колонки Номенклатура и Сумма ( будет заполняться при обработке события табличного поля ПриВыводеСтроки ). Так как по умолчанию табличное поле устанавливает в динамический список только видимые колонки , то динамический список не будет содержать колонки Количество и Цена . Следовательно , при обработке события ПриВыводеСтроки возникнет ошибка времени выполнения . Для решения этой проблемы предлагаются следующие способы :
Добрый день, Коллеги!
//+++ Обновление публикации от 31.08.2020 г.
//--- Обновление публикации от 31.08.2020 г.
Возникла необходимость в программном создании элементов формы, особенно такого как динамический список. Необходимо программно влиять на него полностью, включая и формирование необходимых мне колонок. Данная процедура может выполняться за сеанс формы N-ное количество раз, поэтому и была написана универсальная процедура формирования динамического списка:
Но если мы что-то создаем программно, то должны уметь и удалять это программно. Поэтому вытекающая процедура это удаление списка:
Но не стоит забывать, что просто создать на форме элемент динамического списка - зачастую мало, пример постобработки программно созданного динамического списка демонстрирую ниже.
Пример использования (простой):
Пример использования (сложный):
Демонстрация работы показана на 1С:Комплексная автоматизация 2 (УТ11, ERP), но так же будет работать и в режиме мистической совместимости 8.2.13 (1С:Комплексная автоматизация 1.1), так как именно для старой доброй 1.1 и делалось и используется. Для простоты восприятия пример использования представлен на видео (без озвучки правда), сама обработка прилагается к публикации.
Как видно, в обработке программно (динамически) формируется динамический список на форме в зависимости от смены имени метаданных документа. Если углубиться, то динамически формируется в обработке также и список будущих колонок по наличию реквизитов у документа, а также сама выборка - текст запроса. Ниже демонстрирую, для чего всё это было, упрощение будущего сопровождения при расширение списка документов:
Пример из практики - история разработки этой процедуры
Есть некая разработка регистрации первичных документов. Управление производится через АРМы. Если в начале жизни разработки, АРМ был рассчитан всего на три документа, то мне было несложно разместить все элементы и описать логику их работы. Но время идёт и хотелки растут, вот уже документов стало пять. А потом попросили ещё пять добавить. И я чувствую, это их (бухгалтерию) не остановит. Тут я и понял, что дальнейшее сопровождение АРМа просто мучительно для меня. Переосмысление привело к разработке с нуля, не помню, кто сказал, но перефразирую: "Когда ты чувствуешь что обрастаешь г. внокодом - остановись и начни с нуля". Так и сделал.
Благодаря новой логике, дальнейшее расширение АРМа количеством документов делается просто - добавляются необходимые значения в перечисление ТипДокумента и без кодинга уже будет работать АРМ.
Визуально для конечного пользователя на форме ничего не изменилось за исключением исчезновения "страниц" и появления переключателя "ТипДокумента". Но с технической стороны, изменения колоссальные:
А теперь о неприятном!
При программном создании динамического списка естественно появляется желание программно влиять на весь элемент формы, а именно речь пойдёт о трудностях с командной панелью и контекстным меню. Программно я не нашел способа добраться до свойства "Автозаполнение":
Казалось бы, почему бы не обратиться просто. Элементы[ИмяЭлемента]КоманднаяПанель.Автозаполнение = ЛОЖЬ , но нет такого свойства. Поэтому пришлось применять хитрости (костыли).
Вопрос с командной панелью решил в процедуре публикации следующим образом:
1. Создается программно элемент группа, вид обычная группа, группировка - горизонтальная, отображать заголовок - ложь.
2. Создается программно в выше созданной группе элемент группа с видом командная панель. Именно она теперь будет основной командной панелью будущего динамического списка.
3. Добавляется создаваемый программно элемент таблица формы (динамический список).
4. У таблицы формы отключается вывод командной панели.
Вопрос по отключению "Автозаполнения" в контекстном меню - решения не нашел. Подозреваю, что это невозможно технически.
в нем прописал
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, "itilprofИнциденты.КодЗавершения,", "itilprofИнциденты.КодЗавершения, itilprofИнциденты.ЧисловойПриоритет, itilprofИнциденты.КрайнийСрок, ");
НоваяКолонка = Элементы.Вставить("ЧисловойПриоритет", Тип("ПолеФормы"), Элементы.Список, Элементы.ТекущийИсполнитель);
НоваяКолонка.ПутьКДанным = "Список.ЧисловойПриоритет";
НоваяКолонка.Заголовок = "Приоритет(Ч)";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка = Элементы.Вставить("КрайнийСрок", Тип("ПолеФормы"), Элементы.Список, Элементы.ТекущийИсполнитель);
НоваяКолонка.ПутьКДанным = "Список.КрайнийСрок";
НоваяКолонка.Заголовок = "Крайний срок";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
Колонки появились. Но в них не отображаются значения! Отбор меж тем работает. Добавил реквизиты в расширение - не помогло. Что я делаю не так?!
(0) запрос измени в расширении - в данных динамического списка нет твоих реквизитовА что смотреть? Строки в СписокПриПолученииДанныхНаСервереПосле посмотрел, там нет этих данных :(
(4) Не, ошибся - есть там.
Строки[45].Значение.Данные.ЧисловойПриоритет 77 Число
3 варианта. А в статьях что в инете нашел все было просто, так как я и написал изначально :( Буду пробовать сейчас
(14) какие три варианта?
(10)+(12)+(14) это один код по кусочкам - просто получилось так
(0) это из БСП если не хочешь так то попробуй вызвать код из БСП
Ну и "ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СтруктураПараметров);" конечно жеМожет с компоновщиком что то сделать надо?
Коллеги! неужели никто такого не делал? Не поверю никак!
(23) похоже это не поле ввода, а что-то другое. Почему влруг поле ввода?
(28) ну а почему отбор работает если не поменял текст запроса?
может с компоновщиком динамического запроса что нибудь надо сделать?
(31) Пробовал - не помогло. И потом я подозреваю что это ограничит возможность сортировки списка.
(32) Не парь мозг СтрЗаменить. Ты все равно затащил форму в расширение, сделай все по-человечески.
Во-первых добавление (заимствование) формы в расширение может привести к некоторым нежелательным эффектам, которые могут возникнуть после обновления конфигурации. Приведем немного теории.
Платформа использует сразу три формы:
Данные формы взаимодействуют между собой и в результате такого взаимодействия получается Результирующая форма, которую видит пользователь. В ходе взаимодействия указанных форм может возникнуть нежелательная ситуация, например, мы доработали форму в расширении, потом в новом релизе добавились реквизиты и они на форме не отображаются! Более подробно тут.
Во-вторых добавление формы в расширение привело бы к автоматическому добавлению всех реквизитов этого объекта и объектов метаданных (соответствующих ссылочным типам реквизитов объекта) в данное расширение, что загромождало бы само расширение и также не желательно.
Поэтому возникла задача программного создания элемента формы для добавленного реквизита в самом расширении, этому и посвящена данная публикация."
вот поэтому я должен (ТЗ такое) добавить в расширении в форму программно.
Как добавить произвольные колонки в динамический список?
В 1С Предприятии 8.2 формы списка объектов конфигурации построены с помощью динамического списка. Например, форма списка справочника Номенклатура содержит основной реквизит типа Динамический список , отображающий основную таблицу Справочник.Номенклатура и динамический список формируется путем запроса к этой таблице.
Однако бывает необходимо добавить произвольные колонки в динамический список. Рассмотрим эту ситуацию на примере отображения актуальной цены в списке справочника Номенклатура .
Эти данные мы можем получить из таблицы регистра сведений Цены.СрезПоследних . Следовательно поле Цена из этой таблицы нам нужно добавить в динамический список Список , который является основным реквизитом формы списка номенклатуры и служит источником данных для таблицы списка.
Создадим форму списка справочника Номенклатура и откроем палитру свойств основного реквизита формы Список . Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмем Открыть .
В поле Запрос введем следующий текст запроса:
ВЫБРАТЬ
СправочникНоменклатура.Код,
СправочникНоменклатура.Наименование,
ЦеныСрезПоследних.Цена
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних
ПО ЦеныСрезПоследних.Номенклатура = СправочникНоменклатура.Ссылка
Теперь перетащим поле Цена из окна реквизитов в окно элементов формы.
В результате мы получим список номенклатуры, выводящийся вместе с ее актуальной ценой.
Демонстрационный пример находится в каталоге 1CITS/EXE/FAQ/ПроизвольнаяКолонкаВДинамическомСписке.dt. Пример выполнен на версии платформы 8.2.9.356.
Читайте также: