Back to Prismjs

Prism Bsl

examples/prism-bsl.html

latest23.5 KB
Original Source

Comments

// This is a 1C:Enterprise comments
//

Strings and characters

"This is a 1C:Enterprise string"
""
"a"
"A tabulator character: ""#9"" is easy to embed"

Numbers

123
123.456

Full example

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Основные процедуры и функции поиска контактов.

// Получает представление и всю контактную информацию контакта.
//
// Параметры:
// Контакт - ОпределяемыйТип.КонтактВзаимодействия - контакт для которого получается информация.
// Представление - Строка - в данный параметр будет помещено полученное представление.
// СтрокаКИ - Строка - в данный параметр будет помещено полученная контактная информация.
// ТипКонтактнойИнформации - Перечисления.ТипыКонтактнойИнформации - возможность установить отбор по типу получаемой
// контактной информации.
//
Процедура ПредставлениеИВсяКонтактнаяИнформациюКонтакта(Контакт, Представление, СтрокаКИ,ТипКонтактнойИнформации = Неопределено) Экспорт

	Представление = "";
	СтрокаКИ = "";
	Если Не ЗначениеЗаполнено(Контакт) 
		ИЛИ ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
		Контакт = Неопределено;
		Возврат;
	КонецЕсли;

	ИмяТаблицы = Контакт.Метаданные().Имя;
	ИмяПоляДляНаименованияВладельца = Взаимодействия.ИмяПоляДляНаименованияВладельца(ИмяТаблицы);

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	СправочникКонтакт.Наименование КАК Наименование,
	|	" + ИмяПоляДляНаименованияВладельца + " КАК НаименованиеВладельца
	|ИЗ
	|	Справочник." + ИмяТаблицы + " КАК СправочникКонтакт
	|ГДЕ
	|	СправочникКонтакт.Ссылка = &Контакт
	|";

	Запрос.УстановитьПараметр("Контакт", Контакт);
	Запрос.УстановитьПараметр("ТипКонтактнойИнформации", ТипКонтактнойИнформации);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Не Выборка.Следующий() Тогда
		Возврат;
	КонецЕсли;

	Представление = Выборка.Наименование;

	Если Не ПустаяСтрока(Выборка.НаименованиеВладельца) Тогда
		Представление = Представление + " (" + Выборка.НаименованиеВладельца + ")";
	КонецЕсли;

	МассивКонтактов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Контакт);
	ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивКонтактов, ТипКонтактнойИнформации, Неопределено, ТекущаяДатаСеанса());

	Для Каждого СтрокаТаблицы Из ТаблицаКИ Цикл
		Если СтрокаТаблицы.Тип <> Перечисления.ТипыКонтактнойИнформации.Другое Тогда
			СтрокаКИ = СтрокаКИ + ?(ПустаяСтрока(СтрокаКИ), "", "; ") + СтрокаТаблицы.Представление;
		КонецЕсли;
	КонецЦикла;

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

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

	Если Не ЗначениеЗаполнено(Контакт) 
		Или ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
		Возврат Неопределено;
	КонецЕсли;

	МетаданныеКонтакта = Контакт.Метаданные();

	Если МетаданныеКонтакта.Иерархический Тогда
		Если Контакт.ЭтоГруппа Тогда
			Возврат Неопределено;
		КонецЕсли;
	КонецЕсли;

	МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов();
	ЭлементМассиваОписания = Неопределено;
	Для Каждого ЭлементМассива Из МассивОписанияТиповКонтактов Цикл

		Если ЭлементМассива.Имя = МетаданныеКонтакта.Имя Тогда
			ЭлементМассиваОписания = ЭлементМассива;
			Прервать;
		КонецЕсли;

	КонецЦикла;

	Если ЭлементМассиваОписания = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	ИмяТаблицы = МетаданныеКонтакта.ПолноеИмя();

	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ЕСТЬNULL(ТаблицаКонтактнаяИнформация.АдресЭП,"""") КАК АдресЭП,
	|	СправочникКонтакт." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта + " КАК Наименование
	|ИЗ
	|	" + ИмяТаблицы + " КАК СправочникКонтакт
	| ЛЕВОЕ СОЕДИНЕНИЕ " + ИмяТаблицы + ".КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация
	| ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка)
	| И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты))
	|ГДЕ
	|	СправочникКонтакт.Ссылка = &Контакт
	|ИТОГИ ПО
	|	Наименование";

	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("Контакт", Контакт);
	Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

	Если Не Выборка.Следующий() Тогда
		Возврат Неопределено;
	КонецЕсли;

	Адреса = Новый Структура("Наименование,Адреса", Выборка.Наименование, Новый СписокЗначений);
	ВыборкаАдреса = Выборка.Выбрать();
	Пока ВыборкаАдреса.Следующий() Цикл
		Адреса.Адреса.Добавить(ВыборкаАдреса.АдресЭП);
	КонецЦикла;

	Возврат Адреса;

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

// Получает адреса электронной почты контакта.
//
// Параметры:
// Контакт - ОпределяемыйТип.КонтактВзаимодействия - контакт, для которого получаются данные.
//
// Возвращаемое значение:
// Массив - массив структур содержащих адреса, виды и представления адресов.
//
Функция ПолучитьАдресаЭлектроннойПочтыКонтакта(Контакт, ВключатьНезаполненныеВиды = Ложь) Экспорт

	Если Не ЗначениеЗаполнено(Контакт) Тогда
		Возврат Неопределено;
	КонецЕсли;

	Запрос = Новый Запрос;
	ИмяМетаданныхКонтакта = Контакт.Метаданные().Имя;

	Если ВключатьНезаполненныеВиды Тогда

		Запрос.Текст =
		"ВЫБРАТЬ
		|	ВидыКонтактнойИнформации.Ссылка КАК Вид,
		|	ВидыКонтактнойИнформации.Наименование КАК ВидНаименование,
		|	Контакты.Ссылка КАК Контакт
		|ПОМЕСТИТЬ КонтактВидыКИ
		|ИЗ
		|	Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации,
		|	Справочник." + ИмяМетаданныхКонтакта + " КАК Контакты
		|ГДЕ
		|	ВидыКонтактнойИнформации.Родитель = &ГруппаВидаКонтактнойИнформации
		|	И Контакты.Ссылка = &Контакт
		|	И ВидыКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Представление(КонтактВидыКИ.Контакт) КАК Представление,
		|	ЕСТЬNULL(КонтактнаяИнформация.АдресЭП, """") КАК АдресЭП,
		|	КонтактВидыКИ.Вид,
		|	КонтактВидыКИ.ВидНаименование
		|ИЗ
		|	КонтактВидыКИ КАК КонтактВидыКИ
		| ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяМетаданныхКонтакта + ".КонтактнаяИнформация КАК КонтактнаяИнформация
		| ПО (КонтактнаяИнформация.Ссылка = КонтактВидыКИ.Контакт)
		| И (КонтактнаяИнформация.Вид = КонтактВидыКИ.Вид)";

		ГруппаВидаКонтактнойИнформации = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("Справочник" + ИмяМетаданныхКонтакта);
		Запрос.УстановитьПараметр("ГруппаВидаКонтактнойИнформации", ГруппаВидаКонтактнойИнформации);
	Иначе

		Запрос.Текст =
		"ВЫБРАТЬ
		|	Таблицы.АдресЭП,
		|	Таблицы.Вид,
		|	Таблицы.Представление,
		|	Таблицы.Вид.Наименование КАК ВидНаименование
		|ИЗ
		|	Справочник." + ИмяМетаданныхКонтакта + ".КонтактнаяИнформация КАК Таблицы
		|ГДЕ
		|	Таблицы.Ссылка = &Контакт
		|	И Таблицы.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)";

	КонецЕсли;

	Запрос.УстановитьПараметр("Контакт", Контакт);

	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Количество() = 0 Тогда
		Возврат Новый Массив;
	КонецЕсли;

	Результат = Новый Массив;
	Пока Выборка.Следующий() Цикл
		Адрес = Новый Структура;
		Адрес.Вставить("АдресЭП", Выборка.АдресЭП);
		Адрес.Вставить("Вид", Выборка.Вид);
		Адрес.Вставить("Представление", Выборка.Представление);
		Адрес.Вставить("ВидНаименование", Выборка.ВидНаименование);
		Результат.Добавить(Адрес);
	КонецЦикла;

	Возврат Результат;

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

Функция ОтправитьПолучитьПочтуПользователяВФоне(УникальныйИдентификатор) Экспорт

	ПараметрыПроцедуры = Новый Структура;

	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение и отправка электронной почты пользователя'");

	ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне("УправлениеЭлектроннойПочтой.ОтправитьЗагрузитьПочтуПользователя",
		ПараметрыПроцедуры,	ПараметрыВыполнения);
	Возврат ДлительнаяОперация;

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

////////////////////////////////////////////////////////////////////////////////
// Прочее

// Устанавливает предмет для массива взаимодействий.
//
// Параметры:
// МассивВзаимодействий - Массив - массив взаимодействий для которых будет установлен предмет.
// Предмет - Ссылка - предмет, на который будет выполнена замена.
// ПроверятьНаличиеДругихЦепочек - Булево - если Истина, то будет выполнена замена предмета и для взаимодействий,
// которые входят в цепочки взаимодействий первым взаимодействием которых
// является взаимодействие входящее в массив.
//
Процедура УстановитьПредметДляМассиваВзаимодействий(МассивВзаимодействий, Предмет, ПроверятьНаличиеДругихЦепочек = Ложь) Экспорт

	Если ПроверятьНаличиеДругихЦепочек Тогда

		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ПредметыВзаимодействий.Взаимодействие КАК Ссылка
		|ИЗ
		|	РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий
		|ГДЕ
		|	НЕ (НЕ ПредметыВзаимодействий.Предмет В (&МассивВзаимодействий)
		| И НЕ ПредметыВзаимодействий.Взаимодействие В (&МассивВзаимодействий))";

		Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий);
		МассивВзаимодействий = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

	КонецЕсли;

	НачатьТранзакцию();
	Попытка
		Блокировка = Новый БлокировкаДанных;
		РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапокВзаимодействий(Блокировка, МассивВзаимодействий);
		Блокировка.Заблокировать();

		Если ТипЗнч(Предмет) = Тип("РегистрСведенийКлючЗаписи.СостоянияПредметовВзаимодействий") Тогда
			Предмет = Предмет.Предмет;
		КонецЕсли;

		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ПредметыПапкиВзаимодействий.Предмет
		|ИЗ
		|	РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
		|ГДЕ
		|	ПредметыПапкиВзаимодействий.Взаимодействие В(&МассивВзаимодействий)
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	&Предмет";

		Запрос.УстановитьПараметр("Предмет", Предмет);
		Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий);

		ВыборкаПредметы = Запрос.Выполнить().Выбрать();

		Для Каждого Взаимодействие Из МассивВзаимодействий Цикл
			Взаимодействия.УстановитьПредмет(Взаимодействие, Предмет, Ложь);
		КонецЦикла;

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

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

	ДанныеФайла = СтруктураДанныхФайла();

	ДанныеПисьма = Взаимодействия.ИнтернетПочтовоеСообщениеИзПисьма(Письмо);
	Если ДанныеПисьма <> Неопределено Тогда

		ДвоичныеДанные = ДанныеПисьма.ИнтернетПочтовоеСообщение.ПолучитьИсходныеДанные();
		ДанныеФайла.СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

		ДанныеФайла.Наименование = Взаимодействия.ПредставлениеПисьма(ДанныеПисьма.ИнтернетПочтовоеСообщение.Тема,
			ДанныеПисьма.ДатаПисьма);

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

	КонецЕсли;

	Возврат ДанныеФайла;

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

Функция СтруктураДанныхФайла()

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

	Возврат СтруктураДанныхФайла;

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

#КонецОбласти