1с динамический список добавить колонку реквизита

[Практика программирования] Управляемые формы 1С 8: как программно изменить запрос динамического списка и программно вывести колонку добавленного реквизита списка

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

Для программного добавления элементов управляемой формы должно быть учтено условие о том, что добавление происходит на стороне сервера, а не на клиенте (не в процедуре «ПриОткрытии», как это было в обычном приложении). И так можно ошибочно подумать по старой привычке (если есть опыт программирования в обычном интерфейсе), учитывая архитектуру платформы 1С: Предприятие 8.2 и 8.3. Ведь процедура «ПриОткрытии» формы есть и в управляемом приложении, но через не создать программно и не разместить элементы для прикладной задачи. Поэтому «&НаСервере» и преимущественно в процедуре «ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)» формы документа или элемента справочника или формы списка теперь происходит программное добавление каких-либо элементов формы.

В общем информация о том, как программно изменить текст запроса динамического списка, использующего произвольный запрос можно найти на странице сайта ИТС 1С, если у Вас есть доступ. Но если доступа нет, то можете сильно не расстраиваться — информация на странице как и во многих случаях методологической информации от 1С носит условно практический характер. А это означает, что мелочи и нюансы, о которых бы было неплохо упомянуть на указанной странице ИТС, не упомянуты никак. И их понимание будет происходить на практике. Вот часть такой практики изложена ниже на прикладной задаче.

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

Прикладная задача заключалась в том, чтобы выводить программно в управляемую форму списка документов «Реализация товаров и услуг» колонку добавленного реквизита документа. Реквизит с именем «ДопМФ_Отгружено» тип «Булево», в данном примере добавлен в расширении, но может быть и добавлен в основной конфигурации, если она на частичной поддержке. Как вывести программно элемент формы, содержащей флажок, добавленного реквизита, повторимся, можно изучить в соответствующей статье, о которой уже упоминалось в начале страницы.

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

Рис. 2. Пример добавленного реквизита объекта конфигурации (документа) в 1С 8 для дальнейшего программного вывода колонки в управляемую форму списка объекта.

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

1 | СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
2 | СвойстваСписка.ОсновнаяТаблица = «Документ.РеализацияТоваровУслуг»;
3 | СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
4 | ИсхТекстаЗапроса = СписокРеализацииТоваровУслуг.ТекстЗапроса;
5 |
|
СвойстваСписка.ТекстЗапроса = СтрЗаменить(ИсхТекстаЗапроса, «ВЫБРАТЬ», «ВЫБРАТЬ»+Символы.ПС+«РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено,»);
6 |
|
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокРеализацииТоваровУслуг, СвойстваСписка);
7 | //СписокРеализацииТоваровУслуг.Параметры.УстановитьЗначениеПараметра(«Параметр1», 42);

Прокомментируем его основные моменты. В строке 1 происходит получение структуры через функцию «СтруктураСвойствДинамическогоСписка()» общего модуля «ОбщегоНазначения» для заполнения ее значений и передачи для заполнения свойств динамического списка. Для ключа «ОсновнаяТаблица» структуры в строке 2 указывается название основной таблицы, которая используюется для динамического списка, в примере это «Документ.РеализацияТоваровУслуг». Значение ключа структуры в строке 3 «ДинамическоеСчитываниеДанных» в значении «Истина». В строках 4 и 5 ведется произвольная модификация запроса.

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

Можно просто подготовить новый или измененный исходный текст запроса для указания его в ключе «ТекстЗапроса» структуры. В данном же случае была использована хитрость, чтобы минимизировать зависимость от изменений разработчиков. Происходит модификация исходного текста запроса, который определили разработчики, за счет замены подстроки «ВЫБРАТЬ», которая есть в любом запросе, на подстроку так же содержащее это обязательное слово текста запроса и текст для выборки значения добавленного реквизита документа «ДопМФ_Отгружено». Таким образом, доработка в расширении может сломаться тогда, когда разработчики существенным образом изменять исходный текст запроса. И на примере строки 5 помещаем новый вариант текста запроса в структуру. В данном примере получилось, что запрос содержит одну дополнительную строчку, чтобы выбирать значения добавленного реквизита. Порядок следования полей выборки в запросе для динамического списка не имеет значения.

Т.е. в практической задаче начало запроса программно изменялось:

С:

ВЫБРАТЬ

    РеализацияТоваровУслуг.Ссылка,

На:

ВЫБРАТЬ

    РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено,

    РеализацияТоваровУслуг.Ссылка,

Особенно обратим внимание на то, к каким объектам ведется обращение в строке 7, когда выполняется установка новой настройки для динамического списка с помощью процедуры «УстановитьСвойстваДинамическогоСписка» общего модуля «ОбщегоНазначения». В этом месте важно не перепутать, т.к. в типовой конфигурации названия элемента формы таблицы-списка и реквизита формы одинаковые. А важно, что первым параметром передается элемент управляемой формы — Таблица реквизита формы. Не перепутать его с названием реквизита формы, к которому ранее обращались для получения текста исходного запроса. Вторым параметром передается заполненная структура. Строка 7 в данном примере закомментирована, т.к. в данной прикладной задаче в тексте запроса не содержится параметров. Но, если параметр  есть, то устанавливается через свойство «Параметры» и метод «УстановитьЗначениеПараметра» реквизита управляемой формы, а не элемента формы. Установка значения по имени параметра по коду как для классического запроса в 1С: первое значение — текстовое имя параметра, второе значение — собственно значение для параметра.

Нажатие на изображении увеличит его
1С 8, как программно изменить текст запроса динамического списка реквизита управляемой формы
Рис. 4. Сравнение одноименных реквизита и элемента управляемой формы 1С 8 для программного изменения текста произвольного запроса динамического списка этого реквизита формы.

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

Нажатие на изображении увеличит его
1С 8, как программно вывести, добавить колонку из запроса динамического списка для добавленного реквизита справочника, документа
Рис. 5. Пример кода в 1С 8 для программного вывода колонки нового реквизита объекта конфигурации, в частности документа, в элемент «Таблица» управляемой формы 

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

1 | ТаблицаФормы = Элементы.СписокРеализацииТоваровУслуг;
2 | КолонкаВставки = ТаблицаФормы.ПодчиненныеЭлементы.Найти(«Номер»);
3 |  
4 | КолонкаОтгружено = Элементы.Вставить(«_Отгружено», Тип(«ПолеФормы»), ТаблицаФормы, КолонкаВставки);
5 | КолонкаОтгружено.Вид = ВидПоляФормы.ПолеФлажка;
6 | КолонкаОтгружено.Заголовок = «О.»;
7 | КолонкаОтгружено.Подсказка = «Отгружено»;
8 | КолонкаОтгружено.ТолькоПросмотр = Истина;
9 | КолонкаОтгружено.ШиринаЭлемента = 5;
10 | КолонкаОтгружено.ПутьКДанным = «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»;

Есть небольшие отличия от случая, который уже упоминался выше, добавления колонки для элемента формы Таблица динамического списка, как было описано смежной статье. В смежном случае был пример для таблицы, данными (ПутьКДанным) которой выступал «динамический список», но у которого основанием выступала таблица, а не произвольный запрос. Если отличия не учесть, то будут просто возникать ошибки. В данном же примере 

Отличия заключаются в двух местах кода. Во-первых, это обращение к свойству «ШиринаЭлемента, а не просто «Ширина» как в случае, если колонка — это программно выводимая колонка динамического списка, но у которого указана «Основная таблица» и не используется произвольный запрос. Т.е. для программно добавляемой колонки динамического списка с произвольным запросом указывается свойство «ШиринаЭлемента».

Во-вторых, очень важно правильно указать значение свойства «ПутьКДанным», иначе можно получить ошибку:

Нажатие на изображении увеличит его
1С 8, ошибка, Ошибка при установке значения атрибута контекста (ПутьКДанным) по причине: Недопустимое значение
Рис. 6. Пример ошибки «Недопустимое значение» при указании неверного значения для свойства «ПутьКДанным» элемента управляемой формы .

{Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(26)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)

КолонкаОтгружено.ПутьКДанным = «Объект.СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»; 

по причине:

Недопустимое значение

Недопустимое значение

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

Нажатие на изображении увеличит его
1С 8, программирование, как программно вывести, добавить элементы управляемой формы, колонку реквизита запроса динамического списка
Рис. 7. Демонстрация того, что данные элемента формы Таблица — это динамический произвольный запрос.

В текущей задаче реквизит формы (он не основной) носит имя «СписокРеализацийТоваровУслуг», а не так, как часто можно встретить в конфигурации, что основной реквизит формы носит имя «Объект». И значения для добавленной колонки берется из реквизита типа «ДинамическийСписок» и для элемента формы. Поэтому строка для «ПутьКДанным» — «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено» с указанием через «.» имени нового реквизита.

Это все условия и нюансы, с которыми пришлось столкнуться на практике для программной модификации произвольного запроса динамического списка реквизита управляемой формы в 1С 8, чтобы потом программно вывести колонку нового реквизита объекта конфигурации базы в элемент «Таблица» формы .

Оцените, оказалась ли эта публикация полезна для Вас?




© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

25-11-2021

Журавлев А.С.
(Сайт azhur-c.ru)

Назад

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

Продолжаем рассматривать варианты размещения элементов на форме на примере вывода реквизитов документа на форму списка документов, состав документа представлен на рис. 1:

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 1. Реквизиты документа

Добавим на форму списка документов колонку со значением статуса приходной, статус приходной находится в регистре сведений. Открываем форму списка документа пр_Приходная. Если формы списка еще нет, то нажимаем значок лупы на вкладке Формы окна свойств документа (рис. 2):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 2. Создание формы списка документа

В открывшемся окне Конструктор формы документа нажимаем Далее > и выбираем поля, которые хотим вывести на форму (поля — это реквизиты и табличные части документа), нажимаем Готово. Открывается окно формы списка документа.

В форме списка документа открываем свойства реквизита Список (правой кнопкой мышки — Свойства), в окне Свойства ставим галочку у свойства Произвольный запрос (рис. 3):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 3. Свойства реквизита формы Список

После установки свойства Произвольный запрос состав свойств раздела Объект изменится (рис. 4):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 4. Состав раздела Объект окна Свойства

Нажимаем на гиперссылку Открыть свойства Настройка списка (рис. 4). Открывается окно Динамический список (рис. 5):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 5. Окно Динамический список

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

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 6. Состав регистра с данными о статусе приходной

Изменить запрос в окне Динамический список можно нажав на кнопку Конструктор запроса… или можно сразу написать нужный текст в поле Запрос (рис. 7):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 7. Измененный запрос

Текст запроса:

ВЫБРАТЬ
                Документпр_Приходная.Ссылка,
                Документпр_Приходная.ПометкаУдаления,
                Документпр_Приходная.Номер,
                Документпр_Приходная.Дата,
                Документпр_Приходная.Проведен,
                Документпр_Приходная.Организация,
                Документпр_Приходная.ТипПриходной,
                Документпр_Приходная.Склад,
                Документпр_Приходная.Подразделение,
                Документпр_Приходная.Ответственный,
                Документпр_Приходная.Комментарий,
                пр_СтатусПриходнойСрезПоследних.Статус
ИЗ
                Документ.пр_Приходная КАК Документпр_Приходная
                                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.пр_СтатусПриходной.СрезПоследних КАК пр_СтатусПриходнойСрезПоследних
                                ПО пр_СтатусПриходнойСрезПоследних.Приходная = Документпр_Приходная.Ссылка

Важно проверить, что в поле Основная таблица окна Динамический список указан нужный документ (рис. 7), иначе, если поле будет не заполнено, то в форме списка документов не будет возможности добавлять новые документы и открывать существующие (и не будет привычных кнопок Создать, Создать копированием и т.п.). Нажимаем ОК. Теперь в составе реквизита Список те поля, которые были выбраны в запросе (рис. 8):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 8. Состав реквизита Список

Перетаскиваем новое поле Статус из вкладки Реквизиты на вкладку Элементы в состав элемента Список (рис. 8). И размещаем поле Статус на вкладке Элементы после полей Дата, Номер (рис. 9):

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 9. Размещение поля Статус

У реквизитов (на вкладке Реквизиты) в составе динамического списка можно отметить свойство Использовать всегда (рис. 8). Это нужно, когда поля должны быть в составе динамического списка в любом случае, даже если они не будут добавлены на форму как элементы, например, будут использоваться в дальнейшем в коде модуля формы списка документа.

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

УФ: Размещение элементов на форме в 1С — добавление колонки на форму списка (произвольный запрос динамического списка)

Рис. 10. Новая колонка формы списка

Список.ТекстЗапроса = ИзмТекстЗапроса();

Список.КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное);

НовЭлемент = Элементы.Добавить(«ЕстьРеализация», Тип(«ПолеФормы»), Элементы.Список);

НовЭлемент.Вид = ВидПоляФормы.ПолеФлажка;

НовЭлемент.ПутьКДанным = «Список.ЕстьРеализация»;

НовЭлемент.Заголовок = «Есть реализация»;

НовЭлемент.ТолькоПросмотр = Ложь;

Где ИзмТекстЗапроса() возвращает новый текст запроса

Похожее

&НаСервере
Процедура СозданиеДинамическогоСписка(
   ИмяДинамичСписка = «Список», // тип строка — имя будущего списка на форме и реквизита
   ТекстЗапроса = «»,  // тип строка — запрос, если он не указан, необходимо указать таблицу
   МассивКолонокДС,  // тип массив — массив создаваемых колонок, значения тип строка. Пример: «Д,ДоговораКонтрагента» значит будет создана колонка
// с заголовком «Д» и колонкой списка «ДоговораКонтрагента». Если указать просто «ДоговораКонтрагента»,
//  заголовок будет идентичен заголовку по умолчанию типа «Договор контрагента».
   СписокДействийДС = Неопределено,  // типа структура — структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
// пример: СписокДействийДС = Новый Структура(«Выбор,ПриАктивизацииСтроки»,»СписокВыбор»,»СписокПриАктивизацииСтроки»)
   ТаблицаДинамичСписка = «», // тип строка — содержит имя основной таблицы, пример: «Документ.РеализацияТоваров»
   ДобавитьВ = «», // тип строка — имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
   ВставитьПеред = «», // тип строка — имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
   СвояКоманднаяПанель = Ложь, // тип булево — если ИСТИНА, скрывает стандартную панель и создает свою пустую для будушего наполнения ИмяДинамичСписка+»КоманднаяПанель2″
   ПараметрыЗапроса = Неопределено) //тип структура — содержит перечень параметров, если они используются в запросе.

   //Защита от дурака
   Если ТекстЗапроса = «» И ТаблицаДинамичСписка = «» Тогда Сообщить(«Ошибка формирования динамического списка, укажите запрос или таблицу»); Возврат; КонецЕсли;

   //Создаем свою командную панель, тот случай когда я не нашел способа снять галочку «Автозаполнение»
   Если СвояКоманднаяПанель Тогда
       Если ВставитьПеред = «» Тогда
           ГруппаДинамическогоСписка  = Элементы.Добавить(«Группа» + ИмяДинамичСписка + «CоСвоейКоманднойПанелью»,Тип(«ГруппаФормы»),?(ДобавитьВ = «»,ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]));
       Иначе
           ГруппаДинамическогоСписка  = Элементы.Вставить(«Группа» + ИмяДинамичСписка + «CоСвоейКоманднойПанелью»,Тип(«ГруппаФормы»),?(ДобавитьВ = «»,ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
       КонецЕсли;
       ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
       ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
       ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
       ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
       КоманднаяПанельСписка  = Элементы.Добавить(ИмяДинамичСписка + «КоманднаяПанель2»,Тип(«ГруппаФормы»),ГруппаДинамическогоСписка);
       КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;
   КонецЕсли;

   //Создаем реквизит формы
   ТипыРеквизита = Новый Массив;
   ТипыРеквизита.Добавить(Тип(«ДинамическийСписок»));
   ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
   ДинамическийСписок = Новый РеквизитФормы(ИмяДинамичСписка, ОписаниеТиповДляРеквизита,,«»,Ложь); //Имя реквизита
   ДобавляемыеРеквизиты = Новый Массив;
   ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);

   //Задаем свойства реквизиту
   ИзменитьРеквизиты(ДобавляемыеРеквизиты);
   РеквизитДинамическийСписок = ЭтаФорма[ИмяДинамичСписка]; //Имя реквизита
   Если ТекстЗапроса = «» Тогда
       РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь;
       РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаДинамичСписка;
   Иначе
       РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина;
       РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
       Если ТаблицаДинамичСписка <> «» Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаДинамичСписка; КонецЕсли;
   КонецЕсли;

   //Заполняем параметры если они были указаны
   Если ПараметрыЗапроса <> Неопределено Тогда
       Для Каждого Параметра Из ПараметрыЗапроса Цикл
           РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
       КонецЦикла;
   КонецЕсли;

   //Размещаем реквизит на форме
   Если Ложь
       Или ВставитьПеред = «»
       Или СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
       Тогда
       ТаблицаФормы = Элементы.Добавить(ИмяДинамичСписка,Тип(«ТаблицаФормы»),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = «»,ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ])));
   Иначе
       ТаблицаФормы = Элементы.Вставить(ИмяДинамичСписка,Тип(«ТаблицаФормы»),?(ДобавитьВ = «»,ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
   КонецЕсли;
   ТаблицаФормы.ПутьКДанным = ИмяДинамичСписка; //Имя реквизита

   //Если своя панель тогда скрываем стандартную
   Если СвояКоманднаяПанель Тогда
       Элементы[ИмяДинамичСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
   КонецЕсли;

   //Создание колонок на основание МассивКолонокДС
   Для Каждого Элемента Из МассивКолонокДС Цикл
       ПараметрыКолонки = СтрЗаменить(Элемента,«,»,Символы.ПС);
       Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
           Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
           ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
       Иначе
           Заголовок = «»;
           ИмяКолонки = ПараметрыКолонки;
       КонецЕсли;
       НоваяКолонкаТаблицы = Элементы.Добавить(ИмяДинамичСписка + ИмяКолонки, Тип(«ПолеФормы»), ТаблицаФормы);
       Если Заголовок <> «» Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
       НоваяКолонкаТаблицы.ПутьКДанным = ИмяДинамичСписка + «.» + ИмяКолонки;
   КонецЦикла;

   //Задаем действия (События) на основание СписокДействийДС, если он определен
   Если СписокДействийДС <> Неопределено Тогда
       ПереченьСвойств = «ПриИзменении
       |Выбор
       |ПриАктивизацииСтроки
       |ВыборЗначения
       |ПриАктивизацииПоля
       |ПриАктивизацииЯчейки
       |ПередНачаломДобавления
       |ПередНачаломИзменения
       |ПередУдалением
       |ПриНачалеРедактирования
       |ПередОкончаниемРедактирования
       |ПриОкончанииРедактирования
       |ОбработкаВыбора
       |ПередРазворачиванием
       |ПередСворачиванием
       |ПослеУдаления
       |ПриСменеТекущегоРодителя
       |ОбработкаЗаписиНового
       |ПриСохраненииПользовательскихНастроекНаСервере
       |ПередЗагрузкойПользовательскихНастроекНаСервере
       |ПриЗагрузкеПользовательскихНастроекНаСервере
       |ПриОбновленииСоставаПользовательскихНастроекНаСервере
       |ОбработкаЗапросаОбновления
       |ПриПолученииДанныхНаСервере
       |НачалоПеретаскивания
       |ПроверкаПеретаскивания
       |ОкончаниеПеретаскивания
       |Перетаскивание»;
       Для Счетчик = 1 По 28 Цикл
           ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
           Элементы[ИмяДинамичСписка].УстановитьДействие(ИмяСвойства,?(СписокДействийДС.Свойство(ИмяСвойства),СписокДействийДС[ИмяСвойства],«»));
       КонецЦикла;
   КонецЕсли;

КонецПроцедуры

Программное создание практически всех популярных элементов формы.

2020

Добрый день, Коллеги!

//+++ Обновление публикации от 31.08.2020 г.

// Посмотрите новую статью «Динамическое формирование интерфейса»

//— Обновление публикации от 31.08.2020 г.

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

Применение

Есть определенные ситуации, когда без программного формирования элементов формы не обойтись:

  1. Заранее неизвестно какое количество элементов необходимо разместить на форме (Примеры: Система тестирования, где при формирование тестового задания заранее неизвестно сколько будет вопросов или документ корректировки регистров, когда так же заранее не известно какие колонки будут у таблицы формы).
  2. Доработка типового функционала. Программное размещение элементов впоследствии упрощает обновление типовых конфигураций. Многие разработчики даже придерживаются данного правила при работе с «расширениями».

Шпаргалка

Оглавление

Введение

Общее

Группа — Тип(«ГруппаФормы»)

Поле — Тип(«ПолеФормы»)

Создаем реквизит

Создаем Поле

Декорация — Тип(«ДекорацияФормы»)

Декорация «Надпись»

Декорация «Картинка»

Кнопка — Тип(«КнопкаФормы»)

Создание команды

Создание кнопок

Таблица формы и колонки

Создание таблицы формы

Создание колонок

Динамический список

Бонус — общий модуль с готовыми функциями

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

Создание элементов, реквизитов и команд лучше производить в процедуре «ПриСозданииНаСервере».

Есть два варианта размещения элементов на форме — «добавить» и «вставить».

ЭтаФорма.Элементы.Добавить([Название нового элемента], [Тип элемента], [Элемент-родитель]) — Элемент будет добавлен на размещаемый элемент-родитель в конец списка.

ЭтаФорма.Элементы.Вставить([Название нового элемента], [Тип элемента], [Элемент-родитель], [Последующий элемент]) — Элемент будет добавлен на размещаемый элемент-родитель и вставлен перед желаемым элементом.

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

Элементы формы, которые можно создать с типом «ГруппаФормы»:

  • ГруппаКнопок
  • ГруппаКолонок
  • КоманднаяПанель
  • КонтекстноеМеню
  • ОбычнаяГруппа
  • Подменю
  • Страницы
  • Страница

Пример создания элементов типа «ГруппаФормы»

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

Элементы формы, которые можно создать с типом «ПолеФормы»:

  • ПолеHTMLДокумента
  • ПолеВвода
  • ПолеГеографическойСхемы
  • ПолеГрафическойСхемы
  • ПолеДендрограммы
  • ПолеДиаграммы
  • ПолеДиаграммыГанта
  • ПолеИндикатор
  • ПолеКалендарь
  • ПолеКартинки
  • ПолеНадписи
  • ПолеПереключателя
  • ПолеПланировщика
  • ПолеПолосыРегулирования
  • ПолеТабличногоДокумента
  • ПолеТекстовогоДокумента
  • ПолеФлажок
  • ПолеФорматированногоДокумента

Создаем реквизит

При создании важно понимать, что указывается не «тип», а «описание типов» и для часто используемых типов: «строка», «число» и «дата», необходимо указывать квалификатор. Рассмотрим на примере ниже.

Пример создания реквизитов

Создаем Поле

При создании поля указываем тип «ПолеФормы», принцип мало чем отличается от создания группы:

Обе существующие декорации имеют один тип, но разный вид.

Декорация «Надпись»

Пример создания декорации надпись

Декорация «Картинка»

Пример создания декорации картинка

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

Создание команды

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

Пример заранее описанного общего действия для всех команд

Создание кнопок

//+++ Обновление публикации от 10.02.2020 г.

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

Создание таблицы

Создание колонок

//— Обновление публикации от 10.02.2020 г.

«Лень — двигатель прогресса» и костылей J

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

// +++ Обновление публикации от 30.03.2021 г.

// НОВЫЙ МОДУЛЬ СМОТРИТЕ ТУТ

// — Обновление публикации от 30.03.2021 г.

И скопируйте в него код:

Код общего модуля (лучше использовать новый, по ссылке выше)

Удобно или нет — решать вам. Приведу лишь пример кода, созданного выше с помощью и без помощи общего модуля.

Пример реализации интерфейса без использования функций общего модуля

Пример реализации интерфейса с использованием функций общего модуля

Всем удачного кодинга!

Другие полезные шпаргалки:

Несколько 1С-Серверов на одном сервере Свой заголовок отчету на СКД (с параметрами)

Публикации по работе с интерфейсом:

Интерактивный выбор даты Интерактивный выбор периода

Свой флажок Цифровые и аналоговые часы

Понравилась статья? Поделить с друзьями:
  • 1с дополнительные реквизиты в динамическом списке
  • 1с дополнительные реквизиты для разработчиков имя
  • 1с дополнительные реквизиты как выбрать в запросе
  • 1с дополнительные реквизиты не во всех документах
  • 1с доступность дополнительных реквизитов на форме