Все функции писал сам (может быть, пару функций где-то позаимствовал, но сейчас уже не вспомню, где и когда). Не буду претендовать на оригинальность, возможно, ряду функций существует достаточно аналогов, в т.ч. на данном сайте.
Надеюсь, кому-нибудь они будут полезны.
#Область РаботаСПримитивнымиТипами
#Область РаботаСоСтроками
Функция ЦифровыеСимволы() Экспорт
Возврат "0123456789";
КонецФункции // ()
Функция ПустойУИД() Экспорт
Возврат "00000000-0000-0000-0000-000000000000";
КонецФункции // ()
Функция ИнвертироватьСтроку(Знач Строка) Экспорт
НоваяСтрока = "";
Если Строка <> "" Тогда
ДлинаСтроки = СтрДлина(Строка);
Для Индекс = 0 По ДлинаСтроки-1 Цикл
НоваяСтрока = НоваяСтрока+Сред(Строка,ДлинаСтроки-Индекс,1)
КонецЦикла;
КонецЕсли;
Возврат НоваяСтрока;
КонецФункции // ()
Функция СтрОбрезатьСправа(Знач Строка,ЧислоСимволов) Экспорт
Возврат Лев(Строка,СтрДлина(Строка)-ЧислоСимволов);
КонецФункции
Функция СтрОбрезатьСлева(Знач Строка,ЧислоСимволов) Экспорт
Возврат Прав(Строка,СтрДлина(Строка)-ЧислоСимволов);
КонецФункции
Функция СтрЗаменитьСправа(Знач Строка,ЧислоСимволов,СтрокаЗамены) Экспорт
Возврат СтрОбрезатьСправа(Строка,ЧислоСимволов)+СтрокаЗамены;
КонецФункции
Функция СтрЗаменитьСлева(Знач Строка,ЧислоСимволов,СтрокаЗамены) Экспорт
Возврат СтрокаЗамены+СтрОбрезатьСлева(Строка,ЧислоСимволов);
КонецФункции
Функция СобратьПредставлениеЗначений(МассивЗначений,Разделитель = " ",ФорматнаяСтрока = "") Экспорт
МассивСоединения = Новый Массив;
Форматировать = не ПустаяСтрока(ФорматнаяСтрока);
Если Форматировать Тогда
ФорматныйТип = Новый ОписаниеТипов("Число,Дата,Булево");
Иначе
ФорматныйТип = Неопределено;
КонецЕсли;
Для каждого ЭлементМассива Из МассивЗначений Цикл
Если Форматировать и ФорматныйТип.СодержитТип(ТипЗнч(ЭлементМассива)) Тогда
МассивСоединения.Добавить(Формат(ЭлементМассива,ФорматнаяСтрока));
Иначе
МассивСоединения.Добавить(Строка(ЭлементМассива));
КонецЕсли;
КонецЦикла;
Возврат СтрСоединить(МассивСоединения,Разделитель);
КонецФункции // ()
Процедура ДобавитьСтрокуТекста(Текст,Строка) Экспорт
Если не ПустаяСтрока(Строка) Тогда
Текст = Текст+?(ПустаяСтрока(Текст),"","
|")+Строка;
КонецЕсли;
КонецПроцедуры
Функция СтрУбратьНедопустимыеСимволы(Знач Строка,ДопустимыеСимволы) Экспорт
НоваяСтрока = "";
ЧислоСимволов = СтрДлина(Строка);
Для Индекс = 1 По ЧислоСимволов Цикл
Символ = Сред(Строка,Индекс,1);
Если Найти(ДопустимыеСимволы,Символ) > 0 Тогда
НоваяСтрока = НоваяСтрока+Символ;
КонецЕсли;
КонецЦикла;
Возврат НоваяСтрока;
КонецФункции // ()
Функция ПолучитьВхожденияПодстроки(Знач Строка,ПодстрокаПоиска) Экспорт
СтрокаВхождений = Строка;
МассивВхождений = Новый Массив;
ДлинаПодстроки = СтрДлина(ПодстрокаПоиска);
Обрезано = 0;
Пока Истина Цикл
Поиск = Найти(СтрокаВхождений,ПодстрокаПоиска);
Если Поиск > 0 Тогда
МассивВхождений.Добавить(Обрезано+Поиск);
СтрокаВхождений = СтрОбрезатьСлева(СтрокаВхождений,Поиск+ДлинаПодстроки-1);
Обрезано = Обрезано+Поиск+ДлинаПодстроки-1;
Иначе
Прервать;
КонецЕсли;
Если СтрДлина(СтрокаВхождений) < ДлинаПодстроки Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат МассивВхождений;
КонецФункции
Процедура СтрГрупповаяЗамена(Строка,СоответствиеЗамен) Экспорт
Для каждого ЭлементСоответствия Из СоответствиеЗамен Цикл
Строка = СтрЗаменить(Строка,ЭлементСоответствия.Ключ,ЭлементСоответствия.Значение);
КонецЦикла;
КонецПроцедуры
Процедура СтрУбратьПодрядидущиеСимволы(Строка,СтрокаЗамены) Экспорт
Для Индекс = 1 По СтрДлина(СтрокаЗамены) Цикл
СимволЗамены = Сред(СтрокаЗамены,Индекс,1);
Пока Истина Цикл
ПодстрокаЗамены = СимволЗамены+СимволЗамены;
Если Найти(Строка,ПодстрокаЗамены) > 0 Тогда
Строка = СтрЗаменить(Строка,ПодстрокаЗамены,СимволЗамены);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьЧислоИзСтроки(Знач Строка,ВернутьЧисло = Ложь) Экспорт
Ошибка = ПустаяСтрока(Строка);
Если Ошибка Тогда
Возврат ?(ВернутьЧисло,0,Неопределено);
КонецЕсли;
ЕстьРазделитель = Ложь;
Строка = СтрЗаменить(СокрЛП(Строка)," ","");
Отрицательное = Лев(Строка,1) = "-";
ЦифровойРяд = ЦифровыеСимволы();
Если Отрицательное Тогда
Строка = СтрОбрезатьСлева(Строка,1);
КонецЕсли;
Для Индекс = 1 По СтрДлина(Строка) Цикл
Знак = Сред(Строка,Индекс,1);
Если Знак = "," или Знак = "." Тогда
Если ЕстьРазделитель Тогда
Ошибка = Истина;
Прервать;
Иначе
ЕстьРазделитель = Истина;
КонецЕсли;
ИначеЕсли Найти(ЦифровойРяд,Знак) = 0 Тогда
Ошибка = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Отрицательное Тогда
Строка = "-"+Строка;
КонецЕсли;
Возврат ?(Ошибка,?(ВернутьЧисло,0,Неопределено),Число(Строка));
КонецФункции
#КонецОбласти
Функция _Число(Значение) Экспорт
Если Значение = Неопределено Тогда
Возврат 0;
Иначе
Возврат Значение;
КонецЕсли;
КонецФункции
Функция ПроверкаДеления(Делимое,Делитель) Экспорт
Возврат ?(Делитель = 0,0,Делимое/Делитель);
КонецФункции
Функция ЗначенияЗаполнены(МассивЗначений) Экспорт
Результат = Истина;
Для каждого ЭлементМассива Из МассивЗначений Цикл
Результат = Мин(Результат,ЗначениеЗаполнено(ЭлементМассива));
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ДатыРавны(Дата1,Дата2) Экспорт
Возврат НачалоДня(Дата1) = НачалоДня(Дата2);
КонецФункции // ()
#КонецОбласти
#Область РаботаСМассивом
Функция СоздатьМассив(Элемент1 = Неопределено,
Элемент2 = Неопределено,
Элемент3 = Неопределено,
Элемент4 = Неопределено,
Элемент5 = Неопределено,
Элемент6 = Неопределено,
Элемент7 = Неопределено,
Элемент8 = Неопределено) Экспорт
МассивЭлементов = Новый Массив;
ДобавитьЭлементВМассив(МассивЭлементов,Элемент1);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент2);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент3);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент4);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент5);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент6);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент7);
ДобавитьЭлементВМассив(МассивЭлементов,Элемент8);
Возврат МассивЭлементов;
КонецФункции
Процедура ДобавитьЭлементВМассив(Массив,Элемент) Экспорт
Если Элемент <> Неопределено Тогда
Массив.Добавить(Элемент);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьМассивЗначенийКлючей(Знач Источник,Знач СтрокаКлючей,Разделитель = ",") Экспорт
МассивКлючей = СтрРазделить(СтрокаКлючей,Разделитель);
МассивЗначений = Новый Массив;
Для каждого ЭлементМассива Из МассивКлючей Цикл
МассивЗначений.Добавить(Источник[ЭлементМассива]);
КонецЦикла;
Возврат МассивЗначений;
КонецФункции // ()
#КонецОбласти
#Область РаботаССоответствием
Процедура ВставитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,Значение) Экспорт
ТекущееСоответствие = Соответствие;
ЧислоКлючей = МассивКлючей.Количество();
Если ЧислоКлючей > 1 Тогда
Для Индекс = 0 По ЧислоКлючей-2 Цикл
Элемент = МассивКлючей[Индекс];
ДанныеСоответствия = ТекущееСоответствие[Элемент];
Если ДанныеСоответствия = Неопределено Тогда
ТекущееСоответствие.Вставить(Элемент,Новый Соответствие);
КонецЕсли;
ТекущееСоответствие = ТекущееСоответствие[Элемент];
КонецЦикла;
КонецЕсли;
ТекущееСоответствие.Вставить(МассивКлючей[ЧислоКлючей-1],Значение);
КонецПроцедуры
Функция ПолучитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей) Экспорт
ТекущееСоответствие = Соответствие;
Для каждого Элемент Из МассивКлючей Цикл
ДанныеСоответствия = ТекущееСоответствие[Элемент];
Если ДанныеСоответствия = Неопределено Тогда
Возврат Неопределено;
Прервать;
КонецЕсли;
ТекущееСоответствие = ДанныеСоответствия;
КонецЦикла;
Возврат ДанныеСоответствия;
КонецФункции
Процедура АгрегироватьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,Значение) Экспорт
ТекущееЗначение = ПолучитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей);
Если ТипЗнч(ТекущееЗначение) = Тип("Число") Тогда
ВставитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,ТекущееЗначение+Значение);
Иначе
ВставитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,Значение);
КонецЕсли;
КонецПроцедуры
Функция СоздатьСоответствиеТаблицы(МенеджерТаблицы,ИмяРеквизита) Экспорт
СоответствиеТаблицы = Новый Соответствие;
Выборка = МенеджерТаблицы.Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеТаблицы.Вставить(Выборка.Ссылка,Выборка[ИмяРеквизита]);
КонецЦикла;
Возврат СоответствиеТаблицы;
КонецФункции
#КонецОбласти
#Область РаботаСоСтруктурой
Функция ПолучитьСтруктуруПоКлючам(СтрокаКлючей,ДанныеЗаполнения = Неопределено,МассивЗначений = Неопределено,БазоваяСтруктура = Неопределено) Экспорт
СтруктураПараметров = Новый Структура(СтрокаКлючей);
Если ДанныеЗаполнения <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СтруктураПараметров,ДанныеЗаполнения);
КонецЕсли;
Если МассивЗначений <> Неопределено Тогда
Индекс = 0;
Количество = МассивЗначений.Количество();
Для каждого ЭлементСтруктуры Из СтруктураПараметров Цикл
Если Индекс >= Количество Тогда
Прервать;
КонецЕсли;
СтруктураПараметров[ЭлементСтруктуры.Ключ] = МассивЗначений[Индекс];
Индекс = Индекс+1;
КонецЦикла;
КонецЕсли;
Если БазоваяСтруктура <> Неопределено Тогда
Для каждого ЭлементСтруктуры Из СтруктураПараметров Цикл
БазоваяСтруктура.Вставить(ЭлементСтруктуры.Ключ,ЭлементСтруктуры.Значение);
КонецЦикла;
КонецЕсли;
Возврат СтруктураПараметров;
КонецФункции // ()
Функция СравнитьЗначенияКлючей(СтрокаКлючей,Источник1,Источник2) Экспорт
МассивКлючей = СтрРазделить(СтрокаКлючей,",");
Равны = Истина;
Для каждого ЭлементМассива Из МассивКлючей Цикл
Если Источник1[ЭлементМассива] <> Источник2[ЭлементМассива] Тогда
Равны = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Равны;
КонецФункции // ()
#КонецОбласти
#Если не (ТонкийКлиент или ВебКлиент) Тогда
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа со списком значений
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ВыгрузитьСписокЗначенийВТаблицуЗначений(Знач Источник,ОписаниеТиповЗначения) Экспорт
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Значение",ОписаниеТиповЗначения);
ТЗ.Колонки.Добавить("Пометка",Новый ОписаниеТипов("Булево"));
ТЗ.Колонки.Добавить("Представление",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(256)));
Для каждого ЭлементСписка Из Источник Цикл
Строка = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(Строка,ЭлементСписка);
КонецЦикла;
Возврат ТЗ;
КонецФункции // ()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа с таблицей значений
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Процедура ДобавитьСтрокиТаблицыЗначений(ТаблицаПриемник,Знач Источник) Экспорт
Для каждого Строка Из Источник Цикл
НоваяСтрока = ТаблицаПриемник.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
КонецЦикла;
КонецПроцедуры
Процедура УдалитьСтрокиТаблицыЗначений(Таблица,СтруктураПоиска = Неопределено,МассивЭлементов = Неопределено) Экспорт
Если СтруктураПоиска <> Неопределено Тогда
МассивЭлементов = Таблица.НайтиСтроки(СтруктураПоиска);
ИначеЕсли МассивЭлементов = Неопределено Тогда
МассивЭлементов = Новый Массив;
КонецЕсли;
Для каждого ЭлементМассива Из МассивЭлементов Цикл
Таблица.Удалить(ЭлементМассива);
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа с деревом значений
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт
Если Таблица = Неопределено Тогда
Таблица = Новый ТаблицаЗначений;
Для Каждого Колонка Из Дерево.Колонки Цикл
Таблица.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЦикла;
КонецЕсли;
Для Каждого СтрокаДерева Из Дерево.Строки Цикл
ЗаполнитьЗначенияСвойств(Таблица.Добавить(), СтрокаДерева);
ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтрокаДерева, Таблица);
КонецЦикла;
Возврат Таблица;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Запросы
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ПолучитьРеквизитыПоСсылкам(Знач МассивСсылок,Знач СтрокаРеквизитов,Знач СтрокаРеквизитов1 = Неопределено) Экспорт
ОдинРеквизит = Неопределено;
РеквизитИсточник = Неопределено;
ОднаСсылка = Неопределено;
ВторойУровень = Ложь;
МассивРеквизитов = СтрРазделить(СтрокаРеквизитов,",");
Если МассивРеквизитов.Количество() = 1 и СтрокаРеквизитов1 <> Неопределено Тогда
РеквизитИсточник = МассивРеквизитов[0];
МассивРеквизитов = СтрРазделить(СтрокаРеквизитов1,",");
ВторойУровень = Истина;
КонецЕсли;
Если ТипЗнч(МассивСсылок) <> Тип("Массив") Тогда
ОднаСсылка = МассивСсылок;
МассивСсылок = СоздатьМассив(МассивСсылок);
КонецЕсли;
Запрос = Новый Запрос;
ТекстЗапроса = "";
Номер = 0;
Для каждого Ссылка Из МассивСсылок Цикл
Номер = Номер+1;
ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();
ТекстЗапроса = ТекстЗапроса+"
|ВЫБРАТЬ ПЕРВЫЕ 1
| Таблица.Ссылка,";
Для каждого Реквизит Из МассивРеквизитов Цикл
ТекстЗапроса = ТекстЗапроса+"
| Таблица."+?(ВторойУровень,РеквизитИсточник+"."+Реквизит,Реквизит)+" КАК "+Реквизит+",";
КонецЦикла;
ТекстЗапроса = СтрОбрезатьСправа(ТекстЗапроса,1);
ТекстЗапроса = ТекстЗапроса+"
|ИЗ "+ИмяТаблицы+" КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Ссылка"+Номер+";";
Запрос.УстановитьПараметр("Ссылка"+Номер,Ссылка);
КонецЦикла;
Запрос.Текст = ТекстЗапроса;
РезультатПакета = Запрос.ВыполнитьПакет();
СоответствиеРезультатов = Новый Соответствие;
Если МассивРеквизитов.Количество() = 1 Тогда
ОдинРеквизит = МассивРеквизитов[0];
КонецЕсли;
Для Индекс = 0 По Номер-1 Цикл
Выборка = РезультатПакета[Индекс].Выбрать();
Если Выборка.Следующий() Тогда
СоответствиеРезультатов.Вставить(Выборка.Ссылка,
?(ОдинРеквизит = Неопределено,ПолучитьСтруктуруПоКлючам(
?(СтрокаРеквизитов1 = Неопределено,СтрокаРеквизитов,СтрокаРеквизитов1),Выборка),Выборка[ОдинРеквизит]));
КонецЕсли;
КонецЦикла;
Если ОднаСсылка <> Неопределено Тогда
Возврат СоответствиеРезультатов[ОднаСсылка];
Иначе
Возврат СоответствиеРезультатов;
КонецЕсли;
КонецФункции
Функция ПолучитьЗаписиТаблицы(ПутьТаблицы,СтруктураОтбора,СтрокаРеквизитов = "Ссылка",КоличествоЗаписей = 0) Экспорт
Запрос = Новый Запрос;
ИмяТаблицы = СтрЗаменить(ПутьТаблицы,".","");
МассивРеквизитов = СтрРазделить(СтрокаРеквизитов,",");
БезРеквизитов = МассивРеквизитов.Количество() = 1;
ТекстЗапроса =
"ВЫБРАТЬ"+?(КоличествоЗаписей = 0,""," ПЕРВЫЕ "+Формат(КоличествоЗаписей,"ЧГ=0"));
Для каждого ЭлементМассива Из МассивРеквизитов Цикл
ТекстЗапроса = ТекстЗапроса+"
| "+ИмяТаблицы+"."+ЭлементМассива+",";
КонецЦикла;
ТекстЗапроса = СтрОбрезатьСправа(ТекстЗапроса,1);
ТекстЗапроса = ТекстЗапроса+"
|ИЗ "+ПутьТаблицы+" КАК "+ИмяТаблицы+"
|ГДЕ
| ИСТИНА";
Для каждого ЭлементСтруктуры Из СтруктураОтбора Цикл
Запрос.УстановитьПараметр(ЭлементСтруктуры.Ключ,ЭлементСтруктуры.Значение);
ТекстЗапроса = ТекстЗапроса+"
| И "+ИмяТаблицы+"."+ЭлементСтруктуры.Ключ+" В (&"+ЭлементСтруктуры.Ключ+")";
КонецЦикла;
Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить();
Если КоличествоЗаписей = 1 Тогда
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Если БезРеквизитов Тогда
Возврат Выборка[МассивРеквизитов[0]]; //значение
Иначе
Возврат Выборка; //элемент выборки
КонецЕсли;
КонецЕсли;
ИначеЕсли БезРеквизитов Тогда
Возврат Результат.Выгрузить().ВыгрузитьКолонку(МассивРеквизитов[0]); //массив
Иначе
Возврат Результат.Выбрать(); //выборка
КонецЕсли;
КонецФункции // ()
#Область РаботаСОтчетами
Процедура СкомпоноватьОтчет(Объект,НаборДанных,ДокументРезультат,ДанныеРасшифровки) Экспорт
Настройки=Объект.КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки=КомпоновщикМакета.Выполнить(Объект.СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);
ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,НаборДанных,ДанныеРасшифровки);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Процедура УстановитьПараметрОтчета(Настройки,ИмяПараметра,Значение) Экспорт
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ИмяПараметра,Значение);
КонецПроцедуры
Процедура ПолучитьПараметрОтчета(Настройки,ИмяПараметра) Экспорт
Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
КонецПроцедуры
#КонецОбласти
#КонецЕсли
#Область РаботаСПроизвольнымиКоллекциями
Функция ПолучитьЗначениеПоКлючу(Источник,Ключ,ТипЗначения = Неопределено) Экспорт
Значение = Неопределено;
Если Источник <> Неопределено Тогда
Приемник = Новый Структура(Ключ);
ЗаполнитьЗначенияСвойств(Приемник,Источник);
Значение = Приемник[Ключ];
КонецЕсли;
Если ТипЗначения <> Неопределено Тогда
ОписаниеТипов = Новый ОписаниеТипов(СоздатьМассив(ТипЗначения));
Значение = ОписаниеТипов.ПривестиЗначение(Значение);
КонецЕсли;
Возврат Значение;
КонецФункции
Процедура УстановитьЗначениеПоКлючу(Источник,Ключ,Значение) Экспорт
Если Источник <> Неопределено Тогда
Приемник = Новый Структура(Ключ);
ЗаполнитьЗначенияСвойств(Приемник,Источник);
Если Приемник[Ключ] <> Неопределено Тогда
Источник[Ключ] = Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПроверитьЗаполнениеРеквизитов(Источник,СтрокаРеквизитов,
ПолнаяПроверка = Истина,
ФормироватьСообщение = Истина,
ВыводитьСообщение = Истина,
ВызовИсключения = Ложь) Экспорт
СтруктураВозврата = Новый Структура;
МассивОшибок = Новый Массив;
МассивКлючей = СтрРазделить(СтрокаРеквизитов,",",Ложь);
ТекстСообщения = "";
Для каждого Ключ Из МассивКлючей Цикл
Если не ЗначениеЗаполнено(Источник[Ключ]) Тогда
МассивОшибок.Добавить(Ключ);
Если не ПолнаяПроверка Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если МассивОшибок.Количество() > 0 Тогда
Если ФормироватьСообщение Тогда
ТекстСообщения = "Ошибка! Не заполнены значения реквизитов: "+СтрСоединить(МассивОшибок,", ")+".";
Если ВыводитьСообщение и не ВызовИсключения Тогда
Сообщить(ТекстСообщения);
КонецЕсли;
КонецЕсли;
Если ВызовИсключения Тогда
ВызватьИсключение ТекстСообщения;
КонецЕсли;
КонецЕсли;
СтруктураВозврата.Вставить("МассивОшибок",МассивОшибок);
СтруктураВозврата.Вставить("ТекстСообщения",ТекстСообщения);
СтруктураВозврата.Вставить("РезультатПроверки",МассивОшибок.Количество() = 0);
Возврат СтруктураВозврата;
КонецФункции
Процедура ЗаполнитьЗначенияРеквизитов(Источник,СтрокаРеквизитов,Заполненные = Истина,Значение = Неопределено) Экспорт
МассивКлючей = СтрРазделить(СтрокаРеквизитов,",");
Для каждого Ключ Из МассивКлючей Цикл
Если не Заполненные или ЗначениеЗаполнено(Источник[Ключ]) Тогда
Источник[Ключ] = Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#Если не (ТонкийКлиент или ВебКлиент) Тогда
Функция СоздатьКопиюОбъекта(Источник) Экспорт
Возврат ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Источник));
КонецФункции
Функция ИмяЭлементаПеречисления(ЭлементПеречисления) Экспорт
ИмяПеречисления = ЭлементПеречисления.Метаданные().Имя;
Возврат Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[Перечисления[ИмяПеречисления].Индекс(ЭлементПеречисления)].Имя;
КонецФункции
#КонецЕсли
#КонецОбласти
#Если не (ТонкийКлиент или ВебКлиент) Тогда
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа с транзакциями
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Процедура ЗафиксироватьАктивнуюТранзакцию() Экспорт
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецПроцедуры
Процедура ОтменитьАктивнуюТранзакцию() Экспорт
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПроцедуры
Процедура ЗавершитьАктивнуюТранзакцию(Отказ) Экспорт
Если Отказ Тогда
ОтменитьАктивнуюТранзакцию();
Иначе
ЗафиксироватьАктивнуюТранзакцию();
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Шифрование
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ПолучитьЗашифрованныеДанные(ИдентификаторДанных,ДанныеШифрования,КлючШифрования) Экспорт
Попытка
Путь = КаталогВременныхФайлов()+"\"+ИдентификаторДанных;
ПутьФайла = Путь+".txt";
ПутьАрхива = Путь+".zip";
ЗаписьТекста = Новый ЗаписьТекста(ПутьФайла);
ЗаписьТекста.Записать(ДанныеШифрования);
ЗаписьТекста.Закрыть();
ЗаписьАрхива = Новый ЗаписьZipФайла(ПутьАрхива,КлючШифрования,,,,МетодШифрованияZIP.AES256);
ЗаписьАрхива.Добавить(ПутьФайла);
ЗаписьАрхива.Записать();
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьАрхива);
Возврат Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ПолучитьРасшифрованныеДанные(ИдентификаторДанных,ХранилищеДанных,КлючШифрования) Экспорт
Попытка
КаталогСохранения = КаталогВременныхФайлов();
Путь = КаталогСохранения+"\"+ИдентификаторДанных;
ПутьАрхива = Путь+".zip";
ХранилищеДанных.Получить().Записать(ПутьАрхива);
ЧтениеАрхива = Новый ЧтениеZipФайла(ПутьАрхива,КлючШифрования);
ЭлементАрхива = ЧтениеАрхива.Элементы[0];
ЧтениеАрхива.Извлечь(ЭлементАрхива,КаталогСохранения);
ЧтениеАрхива.Закрыть();
ЧтениеТекста = Новый ЧтениеТекста(КаталогСохранения+"\"+ЭлементАрхива.Имя);
Данные = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
Возврат Данные;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Прочее
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Функция ПопыткаЗаписиОбъекта(Объект,ТекстОшибки = "",
ВключатьОписаниеОшибки = Ложь,
ВыводитьСообщение = Ложь,
Статус = Неопределено,
ПредставлениеМетода = Неопределено,
ТекстОшибок = Неопределено,
Отказ = Ложь) Экспорт
Если не ЗначениеЗаполнено(ПредставлениеМетода) Тогда
ПредставлениеМетода = "Записать()";
КонецЕсли;
Попытка
Выполнить("Объект."+ПредставлениеМетода);
Исключение
Отказ = Истина;
ТекстСообщения = ТекстОшибки+?(ВключатьОписаниеОшибки," "+ОписаниеОшибки(),"");
Если ВыводитьСообщение Тогда
Сообщить(ТекстСообщения,Статус);
КонецЕсли;
Если ТекстОшибок <> Неопределено Тогда
ДобавитьСтрокуТекста(ТекстОшибок,ТекстСообщения);
КонецЕсли;
Возврат ТекстСообщения;
КонецПопытки;
КонецФункции
Функция ИнициализироватьCOMОбъект(Имя) Экспорт
Попытка
COMОбъект = Новый COMОбъект(Имя);
Возврат COMОбъект;
Исключение
Сообщить("Произошла ошибка инициализации "+Имя);
КонецПопытки;
КонецФункции // ()
#КонецЕсли