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

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

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

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

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

Объединение и соединение табличных документов Проблема соединения (объединения) табличных документов начинается тогда, когда табличный документ имеет блоки строк с разной шириной колонок. Сейчас почти все печатные формы на УФ имеют блоки разной ширины к...
Рустем 9 1

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

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

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

Данный шаблон можно временно втыкать в расширении (в режиме "вместо"), если отладка не доступна, а подробности падения узнать хочется. //Описание Попытка // оборачиваемый код Исключение ПоляК...
Ndochp 8 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 25 2
// Добавляет новую команду формы. Дополнительно можно сразу разместить кнопку на форме
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяКоманды  - Строка - имя новой команды формы
//
//  ДействиеКоманды  - Строка - имя обработчика для команды
//
//  ИмяГруппы  - Строка - имя родительского элемента, если необходимо разместить команду на форме
//			   - Неопределено - если нужно только создать новую команду
//								По умолчанию команда размещается в корне формы
//
//  ВидКнопки  - ВидКнопкиФормы   - вид кнопки формы. По умолчанию ОбычнаяКнопка или КнопкаКоманднойПанели,
//														зависит от родителя
//
//  Заголовок  - Строка  - заголовок кнопки формы. Не обязательный
//
//  ПоместитьПеред  - Строка - имя элемента, перед которым необходимо разместить кнопку формы. Не обязательный
//
//  Картинка  - Картинка - картинка кнопки формы. Не обязательный
//
//  ОтображениеКнопки  - ОтображениеКнопки - вариант отражение кнопки на форме. Учитывается только если
//												заполнен параметр Картинка. Не обязательный
//
Процедура ДобавитьРазместитьКомандуФормы(Форма, ИмяКоманды, ДействиеКоманды, ИмяГруппы = "", ВидКнопки = Неопределено,
										Заголовок = "", ПоместитьПеред = "",
										Картинка = Неопределено, ОтображениеКнопки = Неопределено,
										Доступность = Истина) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Форматирование кода

Форматирование кода 1С для TurboConf: Установка отступов, сдвигов, приведение к каноническому написанию.
Phoenix 17 3
Бесплатно

Переключатель активной задачи

Возможность вести список задач для установки активной задачи в TurboConf
Phoenix 17 3
Бесплатно

Выбор файла управляемое приложение

freelance_1C 25 1 1
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр 			= НСтр("ru=’Книга Excel 97 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx'");
	Диалог.Заголовок 		= НСтр("ru=’Выберите файл Excel'");
	ОповещениеЗавершения 	= Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);
	
	Диалог.Показать(ОповещениеЗавершения);

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

&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы <> Неопределено Тогда
		
		ПутьКФайлу = ВыбранныеФайлы[0];
		
	КонецЕсли;
	
КонецПроцедуры

Универсальная процедура проверки на дубли строк в табличной части документа

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Если Запасы.Количество() = 0 Тогда Возврат; КонецЕсли; ПроверитьДублиСтрок(Ссылка, Запасы, Номенклатура, АлгоритмФормированияШК,Регион, Отказ); КонецПроцедуры //Процедура провер...
buketoff 121 2 2 8

Получить выделенные строки списка (с сохранением выделения)

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

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

//////////////////////////////////////////////////// Кнопка вызова печати МассивОбъектов = Новый Массив; МассивОбъектов.Добавить(СсылкаНаДокументИлиСправочник); ПараметрыПечать = Новый Структура; ПараметрыПечать.Вставить(ЗаголовокФормы, СсылкаНаДокумент...

СКД. Вывод данных из Таблицы значений

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

Проверка на роль пользователя

Проверяет пользователя на принадлежность его к группе (в которой находится наша роль). Для данной функции не требуется никаких дополнительных танцев с ролями, простое создание профилей групп, назначение профилям ролей и участников группы.
ArtVadan 25 2
Функция ЕстьРоль(ИмяРоли, Пользователь = Неопределено) Экспорт

	Если Пользователь = Неопределено Тогда
		Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	1 
		|ИЗ
		|	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
		|		ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
		|ГДЕ
		|	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
		|	И ГруппыДоступаПользователи.Пользователь = &Пользователь";
	
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Роль", ИмяРоли);
	
	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить();
	УстановитьПривилегированныйРежим(Ложь);
	
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Ложь;		
	Иначе	
		Возврат Истина;		
	КонецЕсли;
	
КонецФункции

Цены на дату документа продажи

Получить цены номенклатуры на дату документа продажи ВЫБРАТЬ Продажи.Период, Продажи.Контрагент, Продажи.Номенклатура, Продажи.КоличествоОборот КАК Количество, Продажи.СтоимостьОборот КАК Стоимость, ЦеныНоменклатуры.Цена ИЗ Р...
akim 7 1

Пересекаются ли два интервала

miha 94 6 1
Пересекаются = Ложь;
Если Макс(Начало1, Начало2) < Мин(Конец1, Конец2) Тогда
    Пересекаются = Истина;
КонецЕсли;

Программно свернуть все уровни группировок табличного документа

Kirushqe 32 2
КоличествоУровней = ЭлементыФормы.ПолеТабличногоДокумента1.КоличествоУровнейГруппировокСтрок() - 1;
Для Уровень = 1 По КоличествоУровней  Цикл
    ЭлементыФормы.ПолеТабличногоДокумента1.ПоказатьУровеньГруппировокСтрок(КоличествоУровней - Уровень);
КонецЦикла;

КоличествоУровней = ЭлементыФормы.ПолеТабличногоДокумента1.КоличествоУровнейГруппировокКолонок() - 1;
Для Уровень = 1 По КоличествоУровней Цикл
    ЭлементыФормы.ПолеТабличногоДокумента1.ПоказатьУровеньГруппировокКолонок(КоличествоУровней - Уровень);
КонецЦикла;

Выделение текущей строки в отчете

Выделяет текущие строки в отчете. Добавляется в форму отчета. НаКлиенте Перем ДанныеВыделенныхСтрок; НаКлиенте Процедура ОтчетТабличныйДокументПриАктивизации(Элемент) // Делаем через обработчик ожидания, чтобы дать возможность выделить несколько ст...
ChOP 121 2 3 4

Как сохранять и восстанавливать настройки системы компоновки данных

Через XML файл
miha 94 6 1
//Сохранение настроек в файл может быть выполнено следующим образом (листинг 6.40):
//Листинг 6.40. Сохранение настроек
Процедура СохранитьНастройки(Кнопка)

    Настройки  = ОтчетОбъект.КомпоновщикНастроек.Настройки;
    НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
    Путь = СокрЛП(Константы.ПутьДоФайлов.Получить());

    Запись = Новый ЗаписьXML;
    
    Запись.ОткрытьФайл(Путь + "\config.xml");
    Запись.ЗаписатьОбъявлениеXML();
    
    НовыйСXDTO.ЗаписатьXML(Запись, Настройки, НазначениеТипаXML.Явное, ФормаXML.Элемент);
    
    Запись.Закрыть();

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

//Восстановление настроек из файла может быть выполнено следующим образом (листинг 6.41):
//Листинг 6.41. Восстановление настроек
Процедура ВосстановитьНастройки(Кнопка)

    Чтение = Новый ЧтениеXML;
    НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
    Путь = СокрЛП(Константы.ПутьДоФайлов.Получить());
    
    Чтение.ОткрытьФайл(Путь + "\config.xml");
    
    Настройки = НовыйСXDTO.ПрочитатьXML(Чтение);
    
    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

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

//В константе ПутьДоФайлов хранится путь до файла сохраняемых (восстанавливаемых) настроек.

//(с) Простые примеры разработки

Добавить водяной знак (изображение) в табличный документ

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

Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
	
// Высота и ширина заданы по желанию, можете задать свои значения.
Рисунок.Картинка = БиблиотекаКартинок.Успешно; // Взял любую картинку из конфы для демонстрации. Фон должен быть прозрачный
Рисунок.Высота = 25;
Рисунок.Ширина = 25;   
Рисунок.ЦветФона = Новый Цвет(); // Необходимо, чтобы 1С не заливала фон по умолчанию
	
// Расположить рисунок по центру изображения
	
Рисунок.Верх = ТабДок.ВысотаТаблицы/2;
Рисунок.Лево = ТабДок.ШиринаТаблицы/2 + Рисунок.Ширина/2;

Отправка почты с вложением БСП

Пример использования функции отправки почты из БСП и преобразования табличного документа в pdf без использования временных файлов. Требуется заполненная системная учетная запись в справочнике УчетныеЗаписиЭлектроннойПочты
Функция ОтправитьТабличныйДокументЭлектроннойПочтойКакPDF(УчетнаяЗаписьПочтыОтправителя, ПочтаПолучателя, ТекстПисьма, ТемаПисьма, АдресТабличногоДокументаВоВременномХранилище)

Отправлено = Ложь;
	
	Если УчетнаяЗаписьПочтыОтправителя = Неопределено Или УчетнаяЗаписьПочтыОтправителя.Пустая() Тогда
		
		Возврат Отправлено;		
		
	КонецЕсли;
	
	ТабДок = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
	
	ПотокФайла = Новый ПотокВПамяти();
	ТабДок.Записать(ПотокФайла, ТипФайлаТабличногоДокумента.PDF);
	
	ДвоичныеДанныеФайла = ПотокФайла.ЗакрытьИПолучитьДвоичныеДанные();
	
	ВременноеХранилищеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, Новый УникальныйИдентификатор);
	
	Вложения = Новый Массив;
	
	ОписаниеВложения = Новый Структура("Представление, АдресВоВременномХранилище", ТекстПисьма + ".pdf", ВременноеХранилищеФайла);
	
	Вложения.Добавить(ОписаниеВложения);
	
	ПараметрыПисьма = Новый Структура;
	ПараметрыПисьма.Вставить("Кому", ПочтаПолучателя);
	ПараметрыПисьма.Вставить("Тема", ТемаПисьма);
	ПараметрыПисьма.Вставить("Тело", ТекстПисьма);
	ПараметрыПисьма.Вставить("ТипТекста", "ПростойТекст");
	ПараметрыПисьма.Вставить("Вложения", Вложения);
	
	Попытка
		
		Идентификатор = РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗаписьПочтыОтправителя, ПараметрыПисьма);
		
		Если ЗначениеЗаполнено(Идентификатор) Тогда
			
			Отправлено = Истина;
			
		КонецЕсли;
		
	Исключение
		
		ЗаписьЖурналаРегистрации("Отправка письма " + ПочтаПолучателя, УровеньЖурналаРегистрации.Ошибка,,,ОписаниеОшибки());
		
	КонецПопытки;
	
	Возврат Отправлено;

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