Накопитель функций для библиотеки функций
К разбору
Функция ОбъектXDTOВСтрокуXML(Знач ОбъектXDTO, Знач Фабрика = Неопределено) Экспорт
Если Фабрика = Неопределено Тогда
Фабрика = ФабрикаXDTO;
КонецЕсли;
Запись = Новый ЗаписьXML();
Запись.УстановитьСтроку();
Фабрика.ЗаписатьXML(Запись, ОбъектXDTO, , , , НазначениеТипаXML.Явное);
Возврат Запись.Закрыть();
КонецФункции
Функция СтруктураВСтроку(Структура) Экспорт
Текст = "";
Для каждого Элемент Из Структура Цикл
//добавим разделитель после предыдущего значения
Текст = Текст + ?(НЕ ПустаяСтрока(Текст), Символы.ПС, "");
//добавим представление ключа и значения:
Текст = Текст + Элемент.Ключ + " = " + Элемент.Значение;
КонецЦикла;
Возврат Текст;
КонецФункции
Функция ПолучитьНастройкуПрограммы(ИмяНастройки, ИмяПользователя = "НесуществующийПользовательДляНастроекПрограммы") Экспорт
УстановитьПривилегированныйРежим(истина);
Возврат ХранилищеОбщихНастроек.Загрузить("ОбщаяНастройкаПрограммы", ИмяНастройки, , ИмяПользователя);
КонецФункции
Процедура СохранитьНастройкуПрограммы(ИмяНастройки, Значение, ИмяПользователя = "НесуществующийПользовательДляНастроекПрограммы") Экспорт
УстановитьПривилегированныйРежим(истина);
ХранилищеОбщихНастроек.Сохранить("ОбщаяНастройкаПрограммы", ИмяНастройки, Значение, , ИмяПользователя);
КонецПроцедуры
Функция ПолучитьНастройкуПрограммыТекущегоПользователя(ИмяНастройки) Экспорт
Возврат ХранилищеОбщихНастроек.Загрузить("ОбщаяНастройкаПрограммы", ИмяНастройки);
КонецФункции
Процедура СохранитьНастройкуПрограммыТекущегоПользователя(ИмяНастройки, Значение) Экспорт
ХранилищеОбщихНастроек.Сохранить("ОбщаяНастройкаПрограммы", ИмяНастройки, Значение);
КонецПроцедуры
&наСервереБезКонтекста
Функция РеквизитОбъекта(О, Реквизит) Экспорт
Возврат О[Реквизит];
КонецФункции
Функция ПолучитьКонстанту(Имя) Экспорт
УстановитьПривилегированныйРежим(Истина);
Возврат Константы[Имя].Получить();
КонецФункци
Функция GuidСРазделителями(guid)
//На входе строка guid как 16-ричное число 32 разрядов (в навигационных ссылках), на выходе 36-разрядная строка guid с разделителями (в конструкторе guid)
Если СтрДлина(guid) = 36 Тогда
Возврат guid;
КонецЕсли;
Возврат
Сред(guid, 25, 8) + "-" +
Сред(guid, 21, 4) + "-" +
Сред(guid, 17, 4) + "-" +
Сред(guid, 1, 4) + "-" +
Сред(guid, 5, 12);
КонецФункции
Функция ПолучитьКонстанту(Имя) Экспорт
УстановитьПривилегированныйРежим(Истина);
Возврат Константы[Имя].Получить();
КонецФункции
Функция ЗначениеВСтрокуXML(Значение) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
Возврат ЗаписьXML.Закрыть();
КонецФункции
ункция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
Значение=СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Возврат Значение;
КонецФункции
24-02-08 Проверка наличия реквизита у объекта (клиент-серверная):
Функция ЕстьРеквизитОбъекта(Объект, Реквизит) Экспорт С = Новый Структура(Реквизит, NULL); ЗаполнитьЗначенияСвойств(С, Объект); Возврат С[Реквизит] <> NULL; КонецФункции
Сериализация в строку и из строки
2024-08-09 Дата из строки
Функция СтрокаДаты_ДД_ММ_ГГГГ_ВДату(Строка) Д = Число(Сред(Строка, 1, 2)); М = Число(Сред(Строка, 4, 2)); Г = Число(Сред(Строка, 7, 4)); Возврат Дата(Г, М, Д); КонецФункции Функция СтрокаДаты_ГГГГ_ММ_ДД_ВДату(Строка) Д = Число(Сред(Строка, 9, 2)); М = Число(Сред(Строка, 6, 2)); Г = Число(Сред(Строка, 1, 4)); Возврат Дата(Г, М, Д); КонецФункции Функция ДатаИзСтрокиСНазваниемМесяца(ДатаСтрокой) Экспорт //Из строки вида 2 октября 2022 М = СтрРазделить(СокрЛП(ДатаСтрокой), " ", ложь); Если М.Количество() = 3 Тогда Попытка День = Число(СокрЛП(М[0])); Месяцы = Новый Массив(); Месяцы.Добавить("ЯНВАРЯ"); Месяцы.Добавить("ФЕВРАЛЯ"); Месяцы.Добавить("МАРТА"); Месяцы.Добавить("АПРЕЛЯ"); Месяцы.Добавить("МАЯ"); Месяцы.Добавить("ИЮНЯ"); Месяцы.Добавить("ИЮЛЯ"); Месяцы.Добавить("АВГУСТА"); Месяцы.Добавить("СЕНТЯБРЯ"); Месяцы.Добавить("ОКТЯБРЯ"); Месяцы.Добавить("НОЯБРЯ"); Месяцы.Добавить("ДЕКАБРЯ"); Месяц = Месяцы.Найти(Врег(СокрЛП(М[1]))) + 1; Год = Число(СокрЛП(М[2])); Возврат Дата(Год, Месяц, День); Исключение КонецПопытки; КонецЕсли; Возврат Дата(1, 1, 1); КонецФункции Функция СтрокаДаты_ГГГГ_ММ_ДД_ЧЧ_ММ_СС_ВДату(Строка) //2012-06-21 22:30:25+00:00 Д = Число(Сред(Строка, 9, 2)); М = Число(Сред(Строка, 6, 2)); Г = Число(Сред(Строка, 1, 4)); ЧЧ = Число(Сред(Строка, 12, 2)); ММ = Число(Сред(Строка, 15, 2)); СС = Число(Сред(Строка, 18, 2)); Попытка Возврат Дата(Г, М, Д, ЧЧ, ММ, СС); Исключение КонецПопытки; КонецФункции
2024-08-09 Число из строки
Функция ЧислоИзСтроки(Знач С) Экспорт С = СокрЛП(С); С = СтрЗаменить(С, Символы.НПП, ""); С = СтрЗаменить(С, ",", "."); Если С = "" Тогда Возврат 0; КонецЕсли; Попытка Возврат Число(С); Исключение Возврат 0; КонецПопытки; КонецФункции
Сериализация объектов и форматы
2024-08-09 Сериализация JSON
Функция ДанныеВJSON(Данные) Экспорт ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON,Данные,,"ПреобразоватьДанныеJSON"); Возврат ЗаписьJSON.Закрыть(); КонецФункции Функция ПреобразоватьДанныеJSON(Свойство,Значение,ДополнительныеПараметры,Отказ) Экспорт Если Значение = Null Тогда Возврат ""; КонецЕсли; КонецФункции Функция ДанныеИзJSON(ТелоЗапроса) Экспорт ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ТелоЗапроса); Результат = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Возврат Результат; КонецФункции
2024-08-09 Сериализация таблицы значений в строку
Функция ТабличныйДокументВСтроку(ТД) Экспорт Попытка ИмяФайла=ПолучитьИмяВременногоФайла("MXL"); ТД.Записать(ИмяФайла); ДД=Новый ДвоичныеДанные(ИмяФайла); Стр=Base64Строка(ДД); ДД=Неопределено; УдалитьФайлы(ИмяФайла); Возврат Стр; Исключение Возврат Неопределено; КонецПопытки; КонецФункции Функция ТабличныйДокументИЗСтроки(ТД, Стр) Экспорт Если СокрЛП(Стр)="" Тогда Возврат ложь; КонецЕсли; Попытка ДД=Base64Значение(Стр); ИмяФайла=ПолучитьИмяВременногоФайла("MXL"); ДД.Записать(ИмяФайла); ДД=Неопределено; ТД.Прочитать(ИмяФайла); УдалитьФайлы(ИмяФайла); Возврат истина; Исключение Возврат ложь; КонецПопытки; КонецФункции
Права доступа
2024-08-08 Проверка наличия профиля доступа с заданным именем. Иногда нужен просто профиль с именем, без дополнительных прав, на который могут быть завязаны права. В БСП.
Функция ЕстьПрофильДоступа(Пользователь, ИмяПрофиля) Экспорт УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | ГруппыДоступа.Ссылка КАК Ссылка, | ГруппыДоступа.Профиль КАК Профиль |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ | ГруппыДоступа.Пользователи.Пользователь = &Пользователь | И ГруппыДоступа.Профиль.Наименование = &ИмяПрофиля"; Запрос.УстановитьПараметр("Пользователь", Пользователь); Запрос.УстановитьПараметр("ИмяПрофиля", ИмяПрофиля); Выборка = Запрос.Выполнить().Выбрать(); Возврат Выборка.Следующий(); КонецФункции
Медатанные
2024-11-05 Идентификатор значения перечисления:
Функция ПолучитьИдентификаторЗначенияПеречисления(Значение) Экспорт Если НЕ ЗначениеЗаполнено(Значение) Тогда Возврат ""; КонецЕсли; МД = Значение.Метаданные(); Возврат МД.ЗначенияПеречисления.Получить(Перечисления[МД.Имя].Индекс(Значение)).Имя; КонецФункции
2024-06-24 проверка наличия реквизита объекта (справочника, документа).
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт //Осипов С.А. 2024-06-24. Протестировано МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); Если МетаданныеОбъекта = Неопределено Тогда Возврат Ложь; КонецЕсли; Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции
Форматирование чисел, дат
2024-06-12 типовая функция 1С по форме множественного числа
// Функция преобразует строку к множественному числу // // Параметры: // Слово1 - форма слова в ед числе ("шкаф") // Слово2 - форма слова для числит 2-4 ("шкафа") // Слово3 - форма слова для числит 5-10 ("шкафов") // ЦелоеЧисло - целое число. // // Возвращаемое значение: // строку - одну из строк в зависимости от параметра ЦелоеЧисло. // // Описание: // Предназначена для формирования "правильной" подписи к числительным. // Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло) Экспорт // Изменим знак целого числа, иначе отрицательные числа будут неправильно преобразовываться. Если ЦелоеЧисло < 0 Тогда ЦелоеЧисло = -1 * ЦелоеЧисло; КонецЕсли; Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда // для нецелых чисел - всегда вторая форма Возврат Слово2; КонецЕсли; // остаток Остаток = ЦелоеЧисло%10; Если (ЦелоеЧисло >10) И (ЦелоеЧисло<20) Тогда // для второго десятка - всегда третья форма Возврат Слово3; ИначеЕсли Остаток=1 Тогда Возврат Слово1; ИначеЕсли (Остаток>1) И (Остаток<5) Тогда Возврат Слово2; Иначе Возврат Слово3; КонецЕсли; КонецФункции
Универсальные коллекции
2024-05-31 Свойство структуры
Функция СвойствоСтруктуры(Структура, Свойство, ПоУмолчанию = Неопределено) Экспорт Если Структура <> Неопределено И Структура.Свойство(Свойство) Тогда Возврат Структура[Свойство]; КонецЕсли; Возврат ПоУмолчанию; КонецФункции
Массивы
2024-08-25 Добавить в массив уникальное значение. Возврат истина, если добавлено.
Функция ДобавитьВМассивУникально(М, Зн) Экспорт Если М.Найти(Зн) = Неопределено Тогда М.Добавить(Зн); Возврат истина; КонецЕсли; Возврат ложь; КонецФункции
Картинки
2024-11-02 Определение расширения по формату картинки
Функция ФорматКартинки(Картинка, ТипДляПрочей = "unk") Экспорт ТекФормат = Картинка.Формат(); Если ТекФормат = ФорматКартинки.GIF Тогда ТипКартинки = "gif"; ИначеЕсли ТекФормат = ФорматКартинки.JPEG Тогда ТипКартинки = "jpeg"; ИначеЕсли ТекФормат = ФорматКартинки.PNG Тогда ТипКартинки = "png"; ИначеЕсли ТекФормат = ФорматКартинки.BMP Тогда ТипКартинки = "bmp"; ИначеЕсли ТекФормат = ФорматКартинки.EMF Тогда ТипКартинки = "emf"; ИначеЕсли ТекФормат = ФорматКартинки.Icon Тогда ТипКартинки = "icon"; ИначеЕсли ТекФормат = ФорматКартинки.SVG Тогда ТипКартинки = "svg"; ИначеЕсли ТекФормат = ФорматКартинки.TIFF Тогда ТипКартинки = "tiff"; ИначеЕсли ТекФормат = ФорматКартинки.WMF Тогда ТипКартинки = "wmf"; Иначе ТипКартинки = ТипДляПрочей; КонецЕсли; Возврат ТипКартинки; КонецФункции
Работа с табличным документом
2024-05-30 Удаление строк табличного документа по маркеру
Процедура ОчиститьСтрокиТабличногоДокументаСодержащиеМаркер(ДокументРезультат, Маркер, ЯчейкаЦеликом = истина) Экспорт Пока Истина Цикл Область = ДокументРезультат.НайтиТекст(Маркер,,,, ЯчейкаЦеликом); Если Область = Неопределено Тогда Возврат; КонецЕсли; //ОбластьСтрока = ДокументРезультат.Область(Область.Верх, 1, Область.Верх ,ДокументРезультат.ШиринаТаблицы); ОбластьСтрока = ДокументРезультат.Область("R" + XMLСтрока(Область.Верх)); ДокументРезультат.УдалитьОбласть(ОбластьСтрока, ТипСмещенияТабличногоДокумента.ПоВертикали); КонецЦикла; КонецПроцедуры
Обработка регистров
2024-05-29. Удаление движений документа
Процедура УдалитьДвиженияДокумента(ДокументОбъект) Экспорт Для Каждого НЗ ИЗ ДокументОбъект.Движения Цикл НЗ.Прочитать(); Если НЗ.Количество() > 0 Тогда НЗ.Очистить(); НЗ.Записать(); КонецЕсли; КонецЦикла; КонецПроцедуры

Для удаления движений документа не нужен ни объект документа, ни чтения набора записей регистра.
А вообще вместо изобретений велосипедов — изучать БСП.
я собираю свою библиотеку функций. БСП вроде бы заявила, что ее можно без ИТС использовать, но это не точно.
Первую часть замечаний почему проигнорировал?
не понял о чем она. Там ведь не содержится информации — только отрицание приведенной информации. Если расскажете, что вы имеете ввиду, будут и комментарии.
ЕстьПрофильДоступа не будет работать для пользователей, которые входят в группу доступа не напрямую, а через членство в группе пользователей, которая входит в группу доступа
Спасибо за замечание. В БСП есть функция для подобной проверки?
Зачем это БСП? Профиль это всего лишь контейнер ролей и видов доступа. Для чего проверять конкретный профиль, если наполнение аналогичными ролями и видами доступа могут быть в ином профиле?
Возможно, возможно. Я делал по наличию профиля контроль доступа у кого-то из клиентов.
чтобы не заводить новую роль.
Это не «возможно возможно», это факты. Не надо использовать сущности не по назначению. К тому же это приводит к нарушению правила единственности ответственности. Итого нарушается сразу две концептуальные вещи архитектуры
вот только не рассказывайте мне про «правила» в типовой 1С.
На архитектуру типовых не взглянешь без слез. Особенно на права. Это боль.
1. А что конкретно не так в типовых? Ну вот конкретно хотелось бы обсудить.
2. А причем тут типовые? Мы же твою функцию в твоей библиотеки обсуждаем?
3. Даже если плохо в БСП это не повод создавать также плохо
ну разговор перешел на типовые.
в типовых все плохо. и в правах и в коде. модульность отсутствует как класс, функции плохо изолированы, не описаны структуры данных на входе, выходе, назначение функций и побочный эффект.
кроме того, 1с не использует автотесты.
Этого достаточно.
Ни на какие типовые язык не перешел, это ты пытаешься его увести туда. Кстати примера, что плохо с управлением правами «в типовых» я не так и не увидел. Автотесты ты к чему привел? разговор туда тоже перешел?
Для чего достаточно? Для создания решений, ломающих архитектуру?
у меня нет времени разжевывать вам детально недостатки типовых. Оставлю вас с мыслью, что с типовыми все хорошо, ок.
Ждите, как-нибудь напишу статью про недостатки кода типовых, ок.