prism/examples/prism-bsl.html

386 lines
24 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<h2>Comments</h2>
<pre><code> // This is a 1C:Enterprise comments
//</code></pre>
<h2>Strings and characters</h2>
<pre><code>"This is a 1C:Enterprise string"
""
"a"
"A tabulator character: ""#9"" is easy to embed"</code></pre>
<h2>Numbers</h2>
<pre><code>123
123.456
</code></pre>
<h2>Full example</h2>
<pre><code>///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
////////////////////////////////////////////////////////////////////////////////
// Основные процедуры и функции поиска контактов.
// Получает представление и всю контактную информацию контакта.
//
// Параметры:
// Контакт - ОпределяемыйТип.КонтактВзаимодействия - контакт для которого получается информация.
// Представление - Строка - в данный параметр будет помещено полученное представление.
// СтрокаКИ - Строка - в данный параметр будет помещено полученная контактная информация.
// ТипКонтактнойИнформации - Перечисления.ТипыКонтактнойИнформации - возможность установить отбор по типу получаемой
// контактной информации.
//
Процедура ПредставлениеИВсяКонтактнаяИнформациюКонтакта(Контакт, Представление, СтрокаКИ,ТипКонтактнойИнформации = Неопределено) Экспорт
Представление = "";
СтрокаКИ = "";
Если Не ЗначениеЗаполнено(Контакт)
ИЛИ ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
Контакт = Неопределено;
Возврат;
КонецЕсли;
ИмяТаблицы = Контакт.Метаданные().Имя;
ИмяПоляДляНаименованияВладельца = Взаимодействия.ИмяПоляДляНаименованияВладельца(ИмяТаблицы);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СправочникКонтакт.Наименование КАК Наименование,
| " + ИмяПоляДляНаименованияВладельца + " КАК НаименованиеВладельца
|ИЗ
| Справочник." + ИмяТаблицы + " КАК СправочникКонтакт
|ГДЕ
| СправочникКонтакт.Ссылка = &Контакт
|";
Запрос.УстановитьПараметр("Контакт", Контакт);
Запрос.УстановитьПараметр("ТипКонтактнойИнформации", ТипКонтактнойИнформации);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
Возврат;
КонецЕсли;
Представление = Выборка.Наименование;
Если Не ПустаяСтрока(Выборка.НаименованиеВладельца) Тогда
Представление = Представление + " (" + Выборка.НаименованиеВладельца + ")";
КонецЕсли;
МассивКонтактов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Контакт);
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивКонтактов, ТипКонтактнойИнформации, Неопределено, ТекущаяДатаСеанса());
Для Каждого СтрокаТаблицы Из ТаблицаКИ Цикл
Если СтрокаТаблицы.Тип &lt;&gt; Перечисления.ТипыКонтактнойИнформации.Другое Тогда
СтрокаКИ = СтрокаКИ + ?(ПустаяСтрока(СтрокаКИ), "", "; ") + СтрокаТаблицы.Представление;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Получает наименование и адреса электронной почты контакта.
//
// Параметры:
// Контакт - Ссылка - контакт, для которого получаются данные.
//
// Возвращаемое значение:
// Структура - содержит наименование контакта и список значений электронной почты контакта.
//
Функция НаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт) Экспорт
Если Не ЗначениеЗаполнено(Контакт)
Или ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
Возврат Неопределено;
КонецЕсли;
МетаданныеКонтакта = Контакт.Метаданные();
Если МетаданныеКонтакта.Иерархический Тогда
Если Контакт.ЭтоГруппа Тогда
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов();
ЭлементМассиваОписания = Неопределено;
Для Каждого ЭлементМассива Из МассивОписанияТиповКонтактов Цикл
Если ЭлементМассива.Имя = МетаданныеКонтакта.Имя Тогда
ЭлементМассиваОписания = ЭлементМассива;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭлементМассиваОписания = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ИмяТаблицы = МетаданныеКонтакта.ПолноеИмя();
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ЕСТЬNULL(ТаблицаКонтактнаяИнформация.АдресЭП,"""") КАК АдресЭП,
| СправочникКонтакт." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта + " КАК Наименование
|ИЗ
| " + ИмяТаблицы + " КАК СправочникКонтакт
| ЛЕВОЕ СОЕДИНЕНИЕ " + ИмяТаблицы + ".КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация
| ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка)
| И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты))
|ГДЕ
| СправочникКонтакт.Ссылка = &Контакт
|ИТОГИ ПО
| Наименование";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Контакт", Контакт);
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Если Не Выборка.Следующий() Тогда
Возврат Неопределено;
КонецЕсли;
Адреса = Новый Структура("Наименование,Адреса", Выборка.Наименование, Новый СписокЗначений);
ВыборкаАдреса = Выборка.Выбрать();
Пока ВыборкаАдреса.Следующий() Цикл
Адреса.Адреса.Добавить(ВыборкаАдреса.АдресЭП);
КонецЦикла;
Возврат Адреса;
КонецФункции
// Получает адреса электронной почты контакта.
//
// Параметры:
// Контакт - ОпределяемыйТип.КонтактВзаимодействия - контакт, для которого получаются данные.
//
// Возвращаемое значение:
// Массив - массив структур содержащих адреса, виды и представления адресов.
//
Функция ПолучитьАдресаЭлектроннойПочтыКонтакта(Контакт, ВключатьНезаполненныеВиды = Ложь) Экспорт
Если Не ЗначениеЗаполнено(Контакт) Тогда
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос;
ИмяМетаданныхКонтакта = Контакт.Метаданные().Имя;
Если ВключатьНезаполненныеВиды Тогда
Запрос.Текст =
"ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК Вид,
| ВидыКонтактнойИнформации.Наименование КАК ВидНаименование,
| Контакты.Ссылка КАК Контакт
|ПОМЕСТИТЬ КонтактВидыКИ
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации,
| Справочник." + ИмяМетаданныхКонтакта + " КАК Контакты
|ГДЕ
| ВидыКонтактнойИнформации.Родитель = &ГруппаВидаКонтактнойИнформации
| И Контакты.Ссылка = &Контакт
| И ВидыКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Представление(КонтактВидыКИ.Контакт) КАК Представление,
| ЕСТЬNULL(КонтактнаяИнформация.АдресЭП, """") КАК АдресЭП,
| КонтактВидыКИ.Вид,
| КонтактВидыКИ.ВидНаименование
|ИЗ
| КонтактВидыКИ КАК КонтактВидыКИ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяМетаданныхКонтакта + ".КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО (КонтактнаяИнформация.Ссылка = КонтактВидыКИ.Контакт)
| И (КонтактнаяИнформация.Вид = КонтактВидыКИ.Вид)";
ГруппаВидаКонтактнойИнформации = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("Справочник" + ИмяМетаданныхКонтакта);
Запрос.УстановитьПараметр("ГруппаВидаКонтактнойИнформации", ГруппаВидаКонтактнойИнформации);
Иначе
Запрос.Текст =
"ВЫБРАТЬ
| Таблицы.АдресЭП,
| Таблицы.Вид,
| Таблицы.Представление,
| Таблицы.Вид.Наименование КАК ВидНаименование
|ИЗ
| Справочник." + ИмяМетаданныхКонтакта + ".КонтактнаяИнформация КАК Таблицы
|ГДЕ
| Таблицы.Ссылка = &Контакт
| И Таблицы.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)";
КонецЕсли;
Запрос.УстановитьПараметр("Контакт", Контакт);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
Возврат Новый Массив;
КонецЕсли;
Результат = Новый Массив;
Пока Выборка.Следующий() Цикл
Адрес = Новый Структура;
Адрес.Вставить("АдресЭП", Выборка.АдресЭП);
Адрес.Вставить("Вид", Выборка.Вид);
Адрес.Вставить("Представление", Выборка.Представление);
Адрес.Вставить("ВидНаименование", Выборка.ВидНаименование);
Результат.Добавить(Адрес);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ОтправитьПолучитьПочтуПользователяВФоне(УникальныйИдентификатор) Экспорт
ПараметрыПроцедуры = Новый Структура;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение и отправка электронной почты пользователя'");
ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне("УправлениеЭлектроннойПочтой.ОтправитьЗагрузитьПочтуПользователя",
ПараметрыПроцедуры, ПараметрыВыполнения);
Возврат ДлительнаяОперация;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Прочее
// Устанавливает предмет для массива взаимодействий.
//
// Параметры:
// МассивВзаимодействий - Массив - массив взаимодействий для которых будет установлен предмет.
// Предмет - Ссылка - предмет, на который будет выполнена замена.
// ПроверятьНаличиеДругихЦепочек - Булево - если Истина, то будет выполнена замена предмета и для взаимодействий,
// которые входят в цепочки взаимодействий первым взаимодействием которых
// является взаимодействие входящее в массив.
//
Процедура УстановитьПредметДляМассиваВзаимодействий(МассивВзаимодействий, Предмет, ПроверятьНаличиеДругихЦепочек = Ложь) Экспорт
Если ПроверятьНаличиеДругихЦепочек Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПредметыВзаимодействий.Взаимодействие КАК Ссылка
|ИЗ
| РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий
|ГДЕ
| НЕ (НЕ ПредметыВзаимодействий.Предмет В (&МассивВзаимодействий)
| И НЕ ПредметыВзаимодействий.Взаимодействие В (&МассивВзаимодействий))";
Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий);
МассивВзаимодействий = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецЕсли;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапокВзаимодействий(Блокировка, МассивВзаимодействий);
Блокировка.Заблокировать();
Если ТипЗнч(Предмет) = Тип("РегистрСведенийКлючЗаписи.СостоянияПредметовВзаимодействий") Тогда
Предмет = Предмет.Предмет;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПредметыПапкиВзаимодействий.Предмет
|ИЗ
| РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
|ГДЕ
| ПредметыПапкиВзаимодействий.Взаимодействие В(&МассивВзаимодействий)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &Предмет";
Запрос.УстановитьПараметр("Предмет", Предмет);
Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий);
ВыборкаПредметы = Запрос.Выполнить().Выбрать();
Для Каждого Взаимодействие Из МассивВзаимодействий Цикл
Взаимодействия.УстановитьПредмет(Взаимодействие, Предмет, Ложь);
КонецЦикла;
Взаимодействия.РассчитатьРассмотреноПоПредметам(Взаимодействия.ТаблицаДанныхДляРасчетаРассмотрено(ВыборкаПредметы, "Предмет"));
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
// Преобразует письмо в двоичные данные и подготавливает к сохранению на диск.
//
// Параметры:
// Письмо - ДокументСсылка.ЭлектронноеПисьмоВходящее,
// ДокументСсылка.ЭлектронноеПисьмоИсходящее - письмо, которое подготавливается к сохранению.
// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы, из которой была вызвана команда сохранения.
//
// Возвращаемое значение:
// Структура - структура, содержащая подготовленные данные письма.
//
Функция ДанныеПисьмаДляСохраненияКакФайл(Письмо, УникальныйИдентификатор) Экспорт
ДанныеФайла = СтруктураДанныхФайла();
ДанныеПисьма = Взаимодействия.ИнтернетПочтовоеСообщениеИзПисьма(Письмо);
Если ДанныеПисьма &lt;&gt; Неопределено Тогда
ДвоичныеДанные = ДанныеПисьма.ИнтернетПочтовоеСообщение.ПолучитьИсходныеДанные();
ДанныеФайла.СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
ДанныеФайла.Наименование = Взаимодействия.ПредставлениеПисьма(ДанныеПисьма.ИнтернетПочтовоеСообщение.Тема,
ДанныеПисьма.ДатаПисьма);
ДанныеФайла.Расширение = "eml";
ДанныеФайла.ИмяФайла = ДанныеФайла.Наименование + "." + ДанныеФайла.Расширение;
ДанныеФайла.Размер = ДвоичныеДанные.Размер();
ПапкаДляСохранитьКак = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляСохранитьКак");
ДанныеФайла.Вставить("ПапкаДляСохранитьКак", ПапкаДляСохранитьКак);
ДанныеФайла.ДатаМодификацииУниверсальная = ТекущаяДатаСеанса();
ДанныеФайла.ПолноеНаименованиеВерсии = ДанныеФайла.ИмяФайла;
КонецЕсли;
Возврат ДанныеФайла;
КонецФункции
Функция СтруктураДанныхФайла()
СтруктураДанныхФайла = Новый Структура;
СтруктураДанныхФайла.Вставить("СсылкаНаДвоичныеДанныеФайла", "");
СтруктураДанныхФайла.Вставить("ОтносительныйПуть", "");
СтруктураДанныхФайла.Вставить("ДатаМодификацииУниверсальная", Дата(1, 1, 1));
СтруктураДанныхФайла.Вставить("ИмяФайла", "");
СтруктураДанныхФайла.Вставить("Наименование", "");
СтруктураДанныхФайла.Вставить("Расширение", "");
СтруктураДанныхФайла.Вставить("Размер", "");
СтруктураДанныхФайла.Вставить("Редактирует", Неопределено);
СтруктураДанныхФайла.Вставить("ПодписанЭП", Ложь);
СтруктураДанныхФайла.Вставить("Зашифрован", Ложь);
СтруктураДанныхФайла.Вставить("ФайлРедактируется", Ложь);
СтруктураДанныхФайла.Вставить("ФайлРедактируетТекущийПользователь", Ложь);
СтруктураДанныхФайла.Вставить("ПолноеНаименованиеВерсии", "");
Возврат СтруктураДанныхФайла;
КонецФункции
#КонецОбласти</code></pre>