Все публикации

БСП
Разработки

Общая форма для вывода сообщений пользователю в HTML

Как то мне потребовалось вывести пользователю сообщение с таблицей 4 на 4. Решил сделать для этого общую форму HTMLСообщение, пример ее вызова ниже: СтруктураПараметров = Новый Структура(Заголовок, ТекстСообщения); СтруктураПараметров.Заголовок = Заключе...
RomanVG 63 3 2

Функция преобразует Массив из структур в ТаблицуЗначений

RomanVG 63 3 2
&НаСервереБезКонтекста
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) 
    
    тзДанные = Новый ТаблицаЗначений;
    
    Для Каждого ЭлементМассива Из мсДанные Цикл
		
		Если тзДанные.Колонки.Количество() = 0 Тогда
            Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
                тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
            КонецЦикла;
        КонецЕсли;
        
        НоваяСтрока = тзДанные.Добавить();
        Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
            НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
        КонецЦикла;
    КонецЦикла;
    
    Возврат тзДанные;
    
КонецФункции

TurboConf - расширение Конфигуратора 1С Промо

TurboConf повышает эффективность работы в Конфигураторе 1С и помогает программисту автоматизировать свои задачи.
bolsun
4 990 руб.

Прибавить рабочие дни к дате (Запрос)

Получение указанного порядкового рабочего дня к дате
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000000
	Календарь.ДатаКалендаря КАК ДатаКалендаря
ПОМЕСТИТЬ БанковскиеДниКалендаря
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
	(Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
			ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))

УПОРЯДОЧИТЬ ПО
	Календарь.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
	Календарь.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДАТАВРЕМЯ(2022, 4, 1) КАК ДатаДокумента,
	5 КАК ДнейОтсрочки
ПОМЕСТИТЬ ТаблицаОплат

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ДАТАВРЕМЯ(2022, 4, 9),
	7
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Оплаты.ДатаДокумента КАК ДатаДокумента,
	Оплаты.ДнейОтсрочки КАК ДнейОтсрочки,
	Календарь.ДатаКалендаря КАК ДатаОплаты
ИЗ
	ТаблицаОплат КАК Оплаты
		ЛЕВОЕ СОЕДИНЕНИЕ БанковскиеДниКалендаря КАК Календарь
		ПО ((Календарь.ДатаКалендаря, Оплаты.ДнейОтсрочки) В
				(ВЫБРАТЬ
					Выборка.ДатаКалендаря КАК ДатаКалендаря,
					СУММА(1) КАК НомерРабочегоДня
				ИЗ
					БанковскиеДниКалендаря КАК Выборка ЛЕВОЕ СОЕДИНЕНИЕ БанковскиеДниКалендаря КАК ПодВыборка
						ПО
							ПодВыборка.ДатаКалендаря > Оплаты.ДатаДокумента
								И ПодВыборка.ДатаКалендаря <= Выборка.ДатаКалендаря
				ГДЕ
					Выборка.ДатаКалендаря > Оплаты.ДатаДокумента
				СГРУППИРОВАТЬ ПО
							Выборка.ДатаКалендаря))

Сравнить ТЗ

Сравнение Таблиц Значений две Таблицы
miha 121 7 2
// Предварительно надо отсортировать обе таблицы по одному и тому же уникальному ключу
	СтрВнутр_СтараяТЗ = ЗначениеВСтрокуВнутр(тзСтарыеПартииГТД.Скопировать());
	СтрВнутр_НоваяТЗ  = ЗначениеВСтрокуВнутр(тзНовыеПартииГТД.Скопировать());

	Если СтрВнутр_СтараяТЗ <> СтрВнутр_НоваяТЗ Тогда

Свернуть массив

RomanVG 63 3 2
Процедура СвернутьМассив(Мас) Экспорт 
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("ЗначМас");
	Для каждого ЗначМас из Мас Цикл 
		НСтрока = ТЗ.Добавить();
		НСтрока.ЗначМас = ЗначМас;
	КонецЦикла;
	ТЗ.Свернуть("ЗначМас");
	Мас.Очистить();
	Для каждого СтрТЗ из ТЗ Цикл 
		Мас.Добавить(СтрТЗ.ЗначМас);
	КонецЦикла;
	
КонецПроцедуры

Транспонировать таблицу значений

RomanVG 63 3 2
Функция ТранспонироватьТЗ(ТЗ)
   
	ТЗ2 = Новый ТаблицаЗначений;
	Массив = ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0]); // первая колонка содержит названия новых колонок
	ТЗ2.Колонки.Добавить(ТЗ.Колонки[0].Имя); // старые названия колонок сохраним в первой колонке
	
	Для Каждого Значения из Массив Цикл
		ТЗ2.Колонки.Добавить(СокрЛП(Значения));
	КонецЦикла;
	
	Для Сч = 1 По ТЗ.Колонки.Количество() - 1 Цикл
		ТЗ2.Добавить();
		ТЗ2[Сч - 1][ТЗ.Колонки[0].Имя] = ТЗ.Колонки[Сч].Имя;
	КонецЦикла;
	
	СчетчикСтрок = -1;
	Для каждого стр из Тз Цикл
		СчетчикСтрок = СчетчикСтрок + 1;
		Мас = Новый Массив;
		Для Сч = 1 По ТЗ.Колонки.Количество() - 1 Цикл
			Мас.Вставить(Сч - 1, стр[Сч]);
		КонецЦикла;
		ТЗ2.ЗагрузитьКолонку(Мас, ТЗ2.Колонки[СчетчикСтрок + 1]);
	КонецЦикла;
	
	Возврат ТЗ2;
   
КонецФункции

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

RomanVG 63 3 2
&НаСервере
Функция ПолучитьТЗизДинамическогоСписка()

	Схема = Элементы.Сделки.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.Сделки.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ТабЗначений = Новый ТаблицаЗначений;
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(ТабЗначений);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
	
	Возврат ТабЗначений;

КонецФункции

Простое добавление колонки в Динамический список

Предлагаю свой вариант добавления нового поля в текст запроса динамического списка и добавление этого поля на форму.
Sergpn 14 1
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ЧастиЗапроса = СтрРазделить(Список.ТекстЗапроса, ",");
	ЧастиЗапроса.Вставить(1, "СправочникКонтрагенты.ПометкаУдаления");
	Список.ТекстЗапроса = СтрСоединить(ЧастиЗапроса, ",");
	
	НовыйЭлемент  = Элементы.Добавить("СписокПометкаУдаления", Тип("ПолеФормы"), Элементы.Список);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;      
	НовыйЭлемент.ПутьКДанным = "Список.ПометкаУдаления";
	
КонецПроцедуры

Передача менеджера временных таблиц в СКД

Для того, чтобы компоновщик настроек мог понять, с каким типами данных из временной таблицы он имеет дело, желательно прописать это в тексте запроса, используя выражения языка запросов ВЫРАЗИТЬ(ВТ.ЗначениеПоля КАК <Описание типа>) или ЕСТЬNULL(ВТ.ЗначениеП...
ChOP 154 2 5 5

Ввод по строке вхождением с доп параметрами и подсветкой вхождения

К оригиналу добавил возможность передать дополнительно свои условия к запросу Модуль менеджера //Параметры.ДопУсловияПоиска - строка - значение подставится в параметры запроса // Пример: Справочники.ПодразделенияОрганизаций.ПолучитьДанныеВыбора(Новый Ст...
ChOP 154 2 5 5

Получить web-cсылку на объект метаданных

Примеры использования: для запуска ДО из других конфигураций или из Битрикс24 и т.п. интеграций Функция ПолучитьWebСсылкуНаОбъект(Объект) Экспорт НавСсылка = ПолучитьНавигационнуюСсылку(Объект); ДлинаСтроки = СтрДлина(НавСсылка); ПозицияРеф = СтрНа...
RomanVG 63 3 2

Фильтрация таблицы значений

С помощью построителя запросов
freeman 8 1
// ТаблицаОтборов - Таблица значений с колонками
// ИмяОтбора - Строка
// ВидСравнения - ВидСравнения
// Значение - Any
// Возвращает отфильтрованную таблицу значений

Функция ОтфильтроватьТаблицуЗначений(ТаблицаЗначенийДляФильтрации, ТаблицаОтборов)

	Построитель                = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначенийДляФильтрации);

	Для Каждого СтрокаКоллекции Из ТаблицаОтборов Цикл
		Отбор                     = Построитель.Отбор.Добавить(СтрокаКоллекции.ИмяОтбора);
		Отбор.ВидСравнения        = СтрокаКоллекции.ВидСравнения;
		Отбор.Использование       = Истина;
		Отбор.Значение            = СтрокаКоллекции.Значение;
	КонецЦикла;

	Возврат Построитель.Результат.Выгрузить();

КонецФункции

Определить это Linux или Windows

buketoff 127 2 2 9
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоLinux = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ СистемнаяИнформация.ТипПлатформы.Linux_x86_64;

Раскрасить код

Раскрашивает код 1с
ChOP 154 2 5 5
//Вспомогательная, используется в "РаскраситьКод1С8"
Процедура ДобавитьСлово(Код, Слово, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, ТипСлова=Неопределено)
    Если ПустаяСтрока(Слово) Тогда
        Код = Код + СтрЗаменить(СтрЗаменить(СтрЗаменить(Слово, " ", " "), Символы.НПП, " "), Символы.Таб, "    ");
        Возврат;
    ИначеЕсли ТипСлова=Неопределено Тогда
        нсл = НРег(СокрП(Слово));
        Если Найти(СписокКлючевыхСлов, нсл)>0 Тогда
            ТипСлова = "<keywrd>";
        ИначеЕсли Слово = "0" или мОписаниеТипаЧисло.ПривестиЗначение(Слово)<>0 Тогда
            ТипСлова = "<num>";
        Иначе
            ТипСлова = "<text>";
            ЭтоЧисло = Истина;
            Для сч=1 по СтрДлина(нсл) Цикл
                ТекСимв=Сред(нсл, сч, 1);
                Если Найти(ДопустимыеЗнаки, ТекСимв)=0 Тогда
                    ТипСлова="<unwn>";
                    Прервать;
                ИначеЕсли ТекСимв<>"0" Тогда
                    ЭтоЧисло = Ложь;
                КонецЕсли;
            КонецЦикла;
            Если ЭтоЧисло Тогда
                ТипСлова = "<num>";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Код = Код + ?(ТекТипСлова=ТипСлова, "", ТипСлова) + СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Слово, "<", "<"), ">", ">"), " ", " "), Символы.НПП, " "), Символы.Таб, "    ");
    ТекТипСлова = ТипСлова;
    Слово = "";
КонецПроцедуры

//Реализует функционал "Оформить фрагмент кода"
Функция РаскраситьКод1С8(ТекстКод) Экспорт
    мОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
    Таб = Символы.Таб;
    НПП = Символы.НПП;
    ДопустимыеЗнаки = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789abcdefghijklmnopqrstyvwxyz_";
    СписокКлючевыхСлов = "асинх|async|ждать|await|if|если|then|тогда|elsif|иначеесли|else|иначе|endif|конецесли|do|цикл|for|для|to|по|each|каждого|in|из|while|пока|enddo|конеццикла|procedure|процедура|endprocedure|конецпроцедуры|function|функция|endfunction|конецфункции|var|перем|export|экспорт|goto|перейти|and|и|or|или|not|не|val|знач|break|прервать|continue|продолжить|return|возврат|try|попытка|except|исключение|endtry|конецпопытки|raise|вызватьисключение|false|ложь|true|истина|undefined|неопределено|null|new|новый|execute|выполнить|";
    Ответ = "<span style=""text-align: left; font-family: courier new,courier; color: blue; font-size: 10pt; white-space: pre; display: inline-block; ""><font>";
    ТекТипСлова = "<text>";
    Для нс=1 По СтрЧислоСтрок(ТекстКод) Цикл
        ТекСтрока = СокрП(СтрПолучитьСтроку(ТекстКод, нс));
        дл = СтрДлина(ТекСтрока);
        сч = 0;
        ТекСлово = "";
        КодНеНачался = Истина;
        Пока сч<дл Цикл
            сч = сч + 1;
            ТекущийСимвол = Сред(ТекСтрока, сч, 1);
            Если КодНеНачался Тогда
                Если ТекущийСимвол=" " Или ТекущийСимвол=Таб Или ТекущийСимвол=НПП Тогда
                    //ТекущийСимвол = ?(ТекущийСимвол=" " или ТекущийСимвол=НПП, " ", "    ");
                    Ответ = Ответ + ТекущийСимвол;
                    Продолжить;
                ИначеЕсли ТекущийСимвол="#" или ТекущийСимвол="&" Тогда
                    ТекСлово = "";
                    ДобавитьСлово(Ответ, Сред(ТекСтрока, сч), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<dir>");
                    Прервать;
                КонецЕсли;
            КонецЕсли;
            КодНеНачался = Ложь;            
            Если ТекущийСимвол=" " Или ТекущийСимвол=Таб Или ТекущийСимвол=НПП Тогда
                Если КодНеНачался Тогда
                    Ответ = Ответ + ТекущийСимвол;
                    Продолжить;
                КонецЕсли;
                //ТекущийСимвол = ?(ТекущийСимвол=" " или ТекущийСимвол=НПП, " ", "    ");
                ДобавитьСлово(Ответ, ТекСлово+ТекущийСимвол, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
                ТекСлово = "";
                Продолжить;
            ИначеЕсли Найти("():;.,=+-*<>?[]%/", ТекущийСимвол) > 0 Тогда
                ДобавитьСлово(Ответ, ТекСлово, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
                ТекСлово = "";
                //Проверяем на комментарий
                Если ТекущийСимвол="/" и Сред(ТекСтрока, сч+1, 1)="/" Тогда
                    ТекСлово = "";
                    ДобавитьСлово(Ответ, СокрП(Сред(ТекСтрока, сч)), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<cmnt>");
                    Прервать;
                КонецЕсли;    
                ДобавитьСлово(Ответ, ТекущийСимвол, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<symb>");
                Продолжить;
            ИначеЕсли ТекущийСимвол="""" или ТекущийСимвол="|" Тогда
                ДобавитьСлово(Ответ, ТекСлово, ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
                // найти закрывающую кавычку
                нач = сч;
                сч = сч + 1;
                СледующийСимвол = Сред(ТекСтрока, сч, 1);
                Пока сч<дл Цикл
                    сч = сч + 1;
                    ТекущийСимвол = СледующийСимвол;
                    СледующийСимвол = Сред(ТекСтрока, сч, 1);
                    Если ТекущийСимвол="""" Тогда
                        Если СледующийСимвол="""" Тогда
                            сч = сч + 1;
                            СледующийСимвол = Сред(ТекСтрока, сч, 1);
                        Иначе
                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
                ТекСлово = "";
                ДобавитьСлово(Ответ, Сред(ТекСтрока, нач, сч-нач), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<str>");
                сч = сч - 1;
                Продолжить;
            ИначеЕсли ТекущийСимвол="'" Тогда
                нач = сч;
                сч = сч + 1;
                СледующийСимвол = Сред(ТекСтрока, сч, 1);
                Пока сч<дл Цикл
                    сч = сч + 1;
                    ТекущийСимвол = СледующийСимвол;
                    СледующийСимвол = Сред(ТекСтрока, сч, 1);
                    Если ТекущийСимвол="'" Тогда
                        Если СледующийСимвол="'" Тогда
                            сч = сч + 1;
                            СледующийСимвол = Сред(ТекСтрока, сч, 1);
                        Иначе
                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
                ТекСлово = "";
                ДобавитьСлово(Ответ, Сред(ТекСтрока, нач, сч-нач), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло, "<str>");
                сч = сч - 1;
                Продолжить;
            КонецЕсли;
            ТекСлово = ТекСлово + ТекущийСимвол;
        КонецЦикла;
        Если Не ПустаяСтрока(ТекСлово) Тогда
            ДобавитьСлово(Ответ,СокрП(ТекСлово), ТекТипСлова, СписокКлючевыхСлов, ДопустимыеЗнаки, мОписаниеТипаЧисло);
        КонецЕсли;
        Ответ = Ответ + "";
    КонецЦикла;    
    Ответ = Ответ + Символы.ПС+"</font></span>";
    Ответ = СтрЗаменить(Ответ, "<keywrd>", "</font><font color=red>");
    Ответ = СтрЗаменить(Ответ, "<text>", "</font><font color=blue>");
    Ответ = СтрЗаменить(Ответ, "<str>", "</font><font color=black>");
    Ответ = СтрЗаменить(Ответ, "<num>", "</font><font color=black>");
    Ответ = СтрЗаменить(Ответ, "<unwn>", "</font><font color=black>");
    Ответ = СтрЗаменить(Ответ, "<symb>", "</font><font color=red>");
    Ответ = СтрЗаменить(Ответ, "<cmnt>", "</font><font color=green>");
    Ответ = СтрЗаменить(Ответ, "<dir>", "</font><font color=brown>");    
    Ответ = СтрЗаменить(Ответ, Символы.Таб, "    ");
    Возврат Ответ;
КонецФункции

Формат даты в СКД

Неделя Полугодие Декада |Поле|Тип|Формат| |-------- | --------- | --------------------------------------------| |ПериодДень | формат | ДФ='dd.MM.yyyy'| |ПериодНеделя | выражение | Формат(НачалоПериода(ПериодНеделя, "Неделя"), "ДФ='dd.MM.yyyy...
miha 121 7 2

Генератор обработчиков оповещения

Скрипт для TurboConf реализует вставку в текст модуля конструкцию создания нового описания оповещения, а также саму процедуру-обработчик для него.
dhurricane 8 1
Бесплатно

Объединение табличных документов

Объединение и соединение табличных документов - исследовательская статья "на подумать" Проблема соединения (объединения) табличных документов начинается тогда, когда табличный документ имеет блоки строк с разной шириной колонок. Сейчас почти все печатны...
Рустем 10 1

Добавление контекста к сообщению об ошибке в ЖР (Журнале регистрации)

Данный шаблон можно временно втыкать в расширении (в режиме "вместо"), если отладка не доступна, а подробности падения узнать хочется. //Описание Попытка // оборачиваемый код Исключение ПоляК...
Ndochp 9 1

Преобразование unixtime в 1С Дата (Unix Time Stamp)

Добрый день! Ребят, ну помогите победить беду. Пытаюсь из unixtime получить читабельную дату. Делаю так : Дата1С = дата(1970,1,1,1,0,0) + 637746530810000000; Получаю 01.01.0001 0:00:00 , а должно быть 09.12.2021 13:24:41 Это знаю так как с этой базой раб...

Библиотека программного редактирования управляемых форм

upd: v21.1210.1200 - Исправлены орфографические ошибки в коде v21.1027.1000 Программное изменение или добавление реквизитов, свойств, полей и прочего на форме. Позаимствовано с infostart, дорабатывается под себя. P.S. В данную библиотеку ещё дорабатывать и дорабатывать, надеюсь на вашу помощь и предложения, чтобы привести данную библиотеку в божеский вид :)
ArtVadan 29 2
// Добавляет новую команду формы. Дополнительно можно сразу разместить кнопку на форме
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяКоманды  - Строка - имя новой команды формы
//
//  ДействиеКоманды  - Строка - имя обработчика для команды
//
//  ИмяГруппы  - Строка - имя родительского элемента, если необходимо разместить команду на форме
//			   - Неопределено - если нужно только создать новую команду
//								По умолчанию команда размещается в корне формы
//
//  ВидКнопки  - ВидКнопкиФормы   - вид кнопки формы. По умолчанию ОбычнаяКнопка или КнопкаКоманднойПанели,
//														зависит от родителя
//
//  Заголовок  - Строка  - заголовок кнопки формы. Не обязательный
//
//  ПоместитьПеред  - Строка - имя элемента, перед которым необходимо разместить кнопку формы. Не обязательный
//
//  Картинка  - Картинка - картинка кнопки формы. Не обязательный
//
//  ОтображениеКнопки  - ОтображениеКнопки - вариант отражение кнопки на форме. Учитывается только если
//												заполнен параметр Картинка. Не обязательный
//
Процедура ДобавитьРазместитьКомандуФормы(Форма, ИмяКоманды, ДействиеКоманды, ИмяГруппы = "", ВидКнопки = Неопределено,
										Заголовок = "", ПоместитьПеред = "",
										Картинка = Неопределено, ОтображениеКнопки = Неопределено,
										Доступность = Истина) Экспорт

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

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

// Добавляет новый реквизит формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяРеквизита  - Строка - имя нового реквизита формы
//
//  ТипРеквизита  - ОписаниеТипов - тип реквизита. По умолчанию строка
//
//  ЗаголовокРеквизита  - Строка - отображаемый текст реквизита. Не обязательный
//
//  Путь  - Строка  - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
//
//  СохраняемыеДанные  - Булево  - если реквизит содержит сохраняемые данные. По умолчанию Ложь
//
//  РодительЭлемента  - Строка - имя родителя элемента формы,
//								если дополнительно необходимо разместить на форме. Не обязательный
//
//  ИмяЭлемента  - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
//							По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитФормы(Форма, ИмяРеквизита, ТипРеквизита, ЗаголовокРеквизита = "", Путь = "",
							СохраняемыеДанные = Ложь, РодительЭлемента = "", ИмяЭлемента = "") Экспорт

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

// Добавляет новые реквизиты формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  МассивРеквизитов  - Массив структур - содержит:
//     *ИмяРеквизита  - Строка - имя нового реквизита формы
//     *ТипРеквизита  - ОписаниеТипов - тип реквизита. По умолчанию строка неограниченной длины
//     *ЗаголовокРеквизита  - Строка - отображаемый текст реквизита. Не обязательный
//     *Путь  - Строка  - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
//     *СохраняемыеДанные  - Булево  - если реквизит содержит сохраняемые данные. По умолчанию Ложь
//     *РодительЭлемента  - Строка - имя родителя элемента формы,
//	   *ИмяЭлемента  - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
//							По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитыФормы(Форма, МассивРеквизитов) Экспорт

	ДобавляемыеРеквизиты 	= Новый Массив;
	РеквизитыДляРазмещения 	= Новый Массив;
	
	Для каждого ОписаниеРеквизита Из МассивРеквизитов Цикл
		
		ИмяРеквизита = ОписаниеРеквизита.ИмяРеквизита;
		
		Если ОписаниеРеквизита.Свойство("ТипРеквизита") Тогда
			ТипРеквизита = ОписаниеРеквизита.ТипРеквизита;	
		Иначе
			ТипРеквизита = Новый ОписаниеТипов("Строка");
		КонецЕсли;
		
		ЗаголовокРеквизита = "";
		
		Если ОписаниеРеквизита.Свойство("ЗаголовокРеквизита") Тогда
			ЗаголовокРеквизита = ОписаниеРеквизита.ЗаголовокРеквизита;	
		КонецЕсли;
		
		Путь = "";	
		
		Если ОписаниеРеквизита.Свойство("Путь") Тогда
			Путь = ОписаниеРеквизита.Путь;	
		КонецЕсли;
		
		СохраняемыеДанные = Ложь;	
		
		Если ОписаниеРеквизита.Свойство("СохраняемыеДанные") Тогда
			СохраняемыеДанные = ОписаниеРеквизита.СохраняемыеДанные;	
		КонецЕсли;
		
		РеквизитФормы = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, Путь, ЗаголовокРеквизита, СохраняемыеДанные);
		
		ДобавляемыеРеквизиты.Добавить(РеквизитФормы);
		
		//+ Дополнительное размещение реквизитов на форме
		Если ОписаниеРеквизита.Свойство("РодительЭлемента") Тогда
		
			СтруктураЭлемента = Новый Структура;
			СтруктураЭлемента.Вставить("ИмяГруппы", ОписаниеРеквизита.РодительЭлемента);
			
			Если ОписаниеРеквизита.Свойство("Путь") Тогда
				Шаблон = "%1.%2";
				ПутьКДанным = СтрШаблон(Шаблон, ОписаниеРеквизита.Путь, ИмяРеквизита); 	
			Иначе
				ПутьКДанным = ИмяРеквизита;
			КонецЕсли;
			
			СтруктураЭлемента.Вставить("ПутьКДанным", ПутьКДанным);
			
			ИмяЭлемента = ИмяРеквизита;
			
			Если ОписаниеРеквизита.Свойство("ИмяЭлемента") Тогда
				ИмяЭлемента = ОписаниеРеквизита.ИмяЭлемента;	
			КонецЕсли;
			
			СтруктураРеквизитов = Новый Структура;
			СтруктураРеквизитов.Вставить(ИмяЭлемента, СтруктураЭлемента);
			
			РеквизитыДляРазмещения.Добавить(СтруктураРеквизитов);
		
		КонецЕсли;
		//- Дополнительное размещение реквизитов на форме
	
	КонецЦикла;
	
	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	РазместитьРеквизитыНаФорме(Форма, РеквизитыДляРазмещения);
								
КонецПроцедуры

// Добавляет в дерево элементов формы существующие реквизиты объекта и формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  МассивРеквизитов  - Массив структур - содержит:
//     * Имя  - Имя добавляемого реквизита
//     * Значение - Структура - содержит (все свойства не обязательные):
//        ** ИмяГруппы 			- Строка - имя элемента родителя
//        ** ПутьКДанным		- Строка - путь к данным. Если не указано, то будет Объект.<ИмяРеквизита>
//        ** ВидПоляФормы		- ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
//        ** Видимость 			- Булево - значение свойства Видимость
//        ** ТолькоПросмотр 	- Булево - значение свойства ТолькоПросмотр
//        ** Доступность 		- Булево - значение свойства Доступность
//        ** ПоместитьПеред		- Строка - имя элемента, перед которым необходимо разместить
//        ** ОбработкаСобытий 	- Массив структур - содержит:
//           *** Событие 	- Строка - имя события элемента
//           *** Действие 	- Строка - имя процедуры исполнителя события
//
Процедура РазместитьРеквизитыНаФорме(Форма, МассивРеквизитов) Экспорт

	Для каждого ТекРеквизит Из МассивРеквизитов Цикл
		
		ИмяРеквизита 		= ТекРеквизит.Имя;
		ПараметрыРеквизита 	= ТекРеквизит.Значение;
				
		Если ПараметрыРеквизита.Свойство("ИмяГруппы") Тогда
			ЭлементРодитель = Форма.Элементы[ПараметрыРеквизита.ИмяГруппы];	
		Иначе
			ЭлементРодитель = Форма;
		КонецЕсли;
		
		Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), ЭлементРодитель);
				
		Если ПараметрыРеквизита.Свойство("ПутьКДанным") Тогда
			Элемент.ПутьКДанным = ПараметрыРеквизита.ПутьКДанным;
		Иначе 
			Элемент.ПутьКДанным = "Объект." + ИмяРеквизита;
		КонецЕсли; 
		
		Если ПараметрыРеквизита.Свойство("ВидПоляФормы") Тогда		
			Элемент.Вид = ПараметрыРеквизита.ВидПоляФормы;	
		Иначе
			Элемент.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;                               	
		
		Если ПараметрыРеквизита.Свойство("Видимость") Тогда
			Элемент.Видимость = ПараметрыРеквизита.Видимость;	
		КонецЕсли; 		
		
		Если ПараметрыРеквизита.Свойство("ТолькоПросмотр") Тогда
			Элемент.ТолькоПросмотр = ПараметрыРеквизита.ТолькоПросмотр;	
		КонецЕсли; 		
		
		Если ПараметрыРеквизита.Свойство("Доступность") Тогда
			Элемент.Доступность = ПараметрыРеквизита.Доступность;	
		КонецЕсли; 		
				
		Если ПараметрыРеквизита.Свойство("ПоместитьПеред") Тогда
			Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПараметрыРеквизита.ПоместитьПеред]);	
		КонецЕсли; 		
		
		//--- обработчики событий
		Если ПараметрыРеквизита.Свойство("ОбработкаСобытий")
			И ТипЗнч(ПараметрыРеквизита.ОбработкаСобытий) = Тип("Массив") Тогда
			
			Для каждого ТекСобытие Из ПараметрыРеквизита.ОбработкаСобытий Цикл
				Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);		
			КонецЦикла; 			
			
		КонецЕсли; 
		
	КонецЦикла; 	
	
КонецПроцедуры

// Добавляет в дерево элементов формы существующие реквизиты объекта и формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  Имя  - Имя добавляемого реквизита
//  ИмяГруппы 			- Строка - имя элемента родителя
//  ПутьКДанным		- Строка - путь к данным. Если не указано, то будет Объект.<ИмяРеквизита>
//  ВидПоляФормы		- ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
//  Видимость 			- Булево - значение свойства Видимость
//  ТолькоПросмотр 	- Булево - значение свойства ТолькоПросмотр
//  Доступность 		- Булево - значение свойства Доступность
//  ПоместитьПеред		- Строка - имя элемента, перед которым необходимо разместить
//  ОбработкаСобытий 	- Массив структур - содержит:
//   * Событие 	- Строка - имя события элемента
//   * Действие 	- Строка - имя процедуры исполнителя события 
//  ТипЭлемента     - Поле формы или например Таблица формы, по умолчанию тип поле формы
//
Процедура РазместитьРеквизитНаФорме(Форма, Имя, ИмяГруппы = "", ПутьКДанным = "", ПутьКДаннымПодвала = "", ПВидПоляФормы = неопределено, Видимость = Истина,
									ТолькоПросмотр = Ложь, Доступность = Истина, ПоместитьПеред = "", ОбработкаСобытий = неопределено, Заголовок = "") Экспорт

	//Для каждого ТекРеквизит Из МассивРеквизитов Цикл
		
		УстановитьПривилегированныйРежим(Истина);		
		Если ЗначениеЗаполнено(ИмяГруппы) Тогда
			ЭлементРодитель = Форма.Элементы[ИмяГруппы];	
		Иначе
			ЭлементРодитель = Форма;
		КонецЕсли;
		
		
		Элемент = Форма.Элементы.Добавить(Имя, Тип("ПолеФормы"), ЭлементРодитель);
		
		Если ЗначениеЗаполнено(Заголовок) Тогда
			Элемент.Заголовок = Заголовок;	
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ПутьКДанным) Тогда
			Элемент.ПутьКДанным = ПутьКДанным;
		Иначе 
			Элемент.ПутьКДанным = "Объект." + Имя;
		КонецЕсли; 
		
		Если ЗначениеЗаполнено(ПутьКДаннымПодвала) Тогда
			Элемент.ПутьКДаннымПодвала = ПутьКДаннымПодвала;	
		КонецЕсли;
		
		Если ПВидПоляФормы <> неопределено Тогда		
			Элемент.Вид = ПВидПоляФормы;	
		Иначе
			Элемент.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;                               	
		
		Если ЗначениеЗаполнено(Видимость) Тогда
			Элемент.Видимость = Видимость;	
		КонецЕсли; 		
		
		Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
			Элемент.ТолькоПросмотр = ТолькоПросмотр;	
		КонецЕсли; 		
		
		Если ЗначениеЗаполнено(Доступность) Тогда
			Элемент.Доступность = Доступность;	
		КонецЕсли; 		
				
		Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
			Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);	
		КонецЕсли; 		
		
		//--- обработчики событий
		Если ОбработкаСобытий <> неопределено
			И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда
			
			Для каждого ТекСобытие Из ОбработкаСобытий Цикл
				Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);		
			КонецЦикла; 			
			
		КонецЕсли; 
		
	//КонецЦикла; 	
	
КонецПроцедуры

// Устанавливает обработчик события для элемента формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяЭлемента  - Строка - имя элемента формы
//
//  Событие  - Строка - имя события элемента
//
//  Действие  - Строка - имя процедуры исполнителя события
//
Процедура УстановитьСобытиеЭлементаФормы(Форма, ИмяЭлемента, Событие, Действие) Экспорт

	Элемент = Форма.Элементы[ИмяЭлемента];
	Элемент.УстановитьДействие(Событие, Действие);		

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

// Добавляет в дерево элементов формы новую группу
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяГруппы  - Строка - имя новой группы
//
//  РодительГруппы  - Строка - родитель группы. Не обязательно
//
//  ВидГруппы  - ВидГруппыФормы - вид группы. По умолчанию ОбычнаяГруппа
//
//  Группировка  - ГруппировкаПодчиненныхЭлементовФормы  - вариант группировки. По умолчанию ГоризонтальнаяЕслиВозможно
//
//  ОтображатьЗаголовок  - Булево - значение свойства ОтображатьЗаголовок группы. По умолчанию Ложь
//
//  Заголовок  - Строка - заголовок группы. По умолчанию заголовок пустой
//
Процедура ДобавитьГруппуНаФорму(Форма, ИмяГруппы, РодительГруппы = "",
								ВидГруппы = Неопределено,
								Группировка = Неопределено,
								ОтображатьЗаголовок = Ложь,
								Заголовок = Неопределено,
								Объединенная = Истина,
								ПоместитьПеред = "") Экспорт

	Если НЕ ПустаяСтрока(РодительГруппы) Тогда
		ЭлементРодитель = Форма.Элементы[РодительГруппы];	
	Иначе
		ЭлементРодитель = Форма;
	КонецЕсли;
	
	ГруппаФормы = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), ЭлементРодитель);
	
	ГруппаФормы.Вид 				= ?(ВидГруппы = Неопределено, ВидГруппыФормы.ОбычнаяГруппа, ВидГруппы);
	ГруппаФормы.Группировка 		= ?(Группировка = Неопределено,
										ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно,
										Группировка);
	ГруппаФормы.ОтображатьЗаголовок = ОтображатьЗаголовок;
	ГруппаФормы.Заголовок = Заголовок;
	Если ВидГруппы = ВидГруппыФормы.ОбычнаяГруппа Тогда
		ГруппаФормы.Объединенная = Объединенная; 
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
		Форма.Элементы.Переместить(ГруппаФормы, Форма.Элементы[РодительГруппы], Форма.Элементы[ПоместитьПеред]);	
	КонецЕсли;
	
КонецПроцедуры

// Добавляет в дерево элементов формы существующие реквизиты объекта и формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  Имя  - Имя добавляемого реквизита
//  ИмяГруппы 			- Строка - имя элемента родителя
//  ПутьКДанным		- Строка - путь к данным. Если не указано, то будет Объект.<ИмяРеквизита>
//  ВидПоляФормы		- ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
//  Видимость 			- Булево - значение свойства Видимость
//  ТолькоПросмотр 	- Булево - значение свойства ТолькоПросмотр
//  Доступность 		- Булево - значение свойства Доступность
//  ПоместитьПеред		- Строка - имя элемента, перед которым необходимо разместить
//  ОбработкаСобытий 	- Массив структур - содержит:
//   * Событие 	- Строка - имя события элемента
//   * Действие 	- Строка - имя процедуры исполнителя события 
//  ТипЭлемента     - Поле формы или например Таблица формы, по умолчанию тип поле формы
//
Процедура РазместитьТаблицуНаФорме(Форма, Имя, ИмяГруппы = "", ПутьКДанным = "", Видимость = Истина, ТолькоПросмотр = Ложь, 
							Доступность = Истина, ПоместитьПеред = "", ОбработкаСобытий = неопределено, Подвал = Ложь) Экспорт

				
		Если ЗначениеЗаполнено(ИмяГруппы) Тогда
			ЭлементРодитель = Форма.Элементы[ИмяГруппы];	
		Иначе
			ЭлементРодитель = Форма;
		КонецЕсли;
		
		
		Элемент = Форма.Элементы.Добавить(Имя, Тип("ТаблицаФормы"), ЭлементРодитель);
				
		Если ЗначениеЗаполнено(ПутьКДанным) Тогда
			Элемент.ПутьКДанным = ПутьКДанным;
		Иначе 
			Элемент.ПутьКДанным = "Объект." + Имя;
		КонецЕсли;                               	
		
		Если ЗначениеЗаполнено(Видимость) Тогда
			Элемент.Видимость = Видимость;	
		КонецЕсли; 		
		
		Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
			Элемент.ТолькоПросмотр = ТолькоПросмотр;	
		КонецЕсли; 		
		
		Если ЗначениеЗаполнено(Доступность) Тогда
			Элемент.Доступность = Доступность;	
		КонецЕсли; 		
				
		Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
			Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);	
		КонецЕсли; 		
		
		Элемент.Подвал = Подвал;
		
		//--- обработчики событий
		Если ОбработкаСобытий <> неопределено
			И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда
			
			Для каждого ТекСобытие Из ОбработкаСобытий Цикл
				Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);		
			КонецЦикла; 			
			
		КонецЕсли; 
		
	//КонецЦикла; 	
	
КонецПроцедуры

&НаСервере
Процедура СозданиеДинамическогоСписка(
	Форма,                                      //Тип форма -  Форма документа
	ИмяСписка = "Список", 						//тип строка - имя будущего списка на форме и реквизита
	ТекстЗапроса = "", 							//тип строка - запрос, если он не указан, необходимо указать таблицу
	МассивКолонок,                  			//тип массив - массив создаваемых колонок, значения тип строка. Пример: "Д,ДоговораКонтрагента" значит будет создана колонка
												//				с заголовком "Д" и колонкой списка "ДоговораКонтрагента". Если указать просто "ДоговораКонтрагента", 
												//				заголовок будет идентичен заголовку по умолчанию типа "Договор контрагента".
	СписокДействий = Неопределено,  			//типа структура - структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
												//				пример: СписокДействий = Новый Структура("Выбор,ПриАктивизацииСтроки","СписокВыбор","СписокПриАктивизацииСтроки")
	ТаблицаСписка = "",							//тип строка - содержит имя основной таблицы, пример: "Документ.РеализацияТоваровУслуг"	
	ДобавитьВ = "",                 			//тип строка - имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
	ВставитьПеред = "",             			//тип строка - имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
	СвояКоманднаяПанель = ЛОЖЬ,     			//тип булево - если ИСТИНА, скрывает стандартную панель и создает свою пустую для будущего наполнения ИмяСписка+"КоманднаяПанель2"
	ПараметрыЗапроса = Неопределено) Экспорт 	//тип структура - содержит перечень параметров, если они используются в запросе.
	
	//Защита от дурака
	Если ТекстЗапроса = "" И ТаблицаСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;
	
	Элементы = Форма.Элементы;
	
	//Создаем свою командную панель, тот случай когда я не нашел способа снять галочку "Автозаполнение"
	Если СвояКоманднаяПанель Тогда
		Если ВставитьПеред = "" Тогда
			ГруппаДинамическогоСписка  = Элементы.Добавить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]));
		Иначе
			ГруппаДинамическогоСписка  = Элементы.Вставить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]),Форма.Элементы[ВставитьПеред]);			
		КонецЕсли;
		ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
		ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
		ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
		ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		КоманднаяПанельСписка  = Элементы.Добавить(ИмяСписка + "КоманднаяПанель2",Тип("ГруппаФормы"),ГруппаДинамическогоСписка);
		КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;			
	КонецЕсли;
									
	//Создаем реквизит формы
	ТипыРеквизита = Новый Массив;                             
	ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
	ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита); 
	ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,"",ЛОЖЬ); //Имя реквизита
	ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);        
	
	//Задаем свойства реквизиту
	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);        
	РеквизитДинамическийСписок = Форма[ИмяСписка]; //Имя реквизита
	Если ТекстЗапроса = "" Тогда
		РеквизитДинамическийСписок.ПроизвольныйЗапрос = ЛОЖЬ;
		РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
	Иначе
		РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
		РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
		Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;		
	КонецЕсли;
	
	//Заполняем параметры если они были указаны
	Если ПараметрыЗапроса <> Неопределено Тогда
		Для Каждого Параметра из ПараметрыЗапроса Цикл
			РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);	
		КонецЦикла;		 
	КонецЕсли;
	
	//Размещаем реквизит на форме
	Если ЛОЖЬ
		ИЛИ ВставитьПеред = "" 
		ИЛИ СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
		Тогда
		ТаблицаФормы = Элементы.Добавить(ИмяСписка,Тип("ТаблицаФормы"),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ])));
	Иначе
		ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип("ТаблицаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]),Форма.Элементы[ВставитьПеред]);	
	КонецЕсли;		
	ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита 
	
	//Если своя панель тогда скрываем стандартную
	Если СвояКоманднаяПанель Тогда
		Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
	КонецЕсли;

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

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

// Изменяет свойства элементов формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяЭлемента  - Строка - имя элемента формы
//
//  ИмяСвойства  - Строка - имя свойства элемента
//
//  ЗначениеСвойства  - Произвольный - значение свойства элемента
//
Процедура ИзменитьСвойствоЭлементаФормы(Форма, ИмяЭлемента, ИмяСвойства, ЗначениеСвойства) Экспорт

	Элемент = Форма.Элементы[ИмяЭлемента];
	Элемент[ИмяСвойства] = ЗначениеСвойства;
	
КонецПроцедуры