Накопитель функций для библиотеки функций

К разбору

Функция Объект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 Тогда
			НЗ.Очистить();
			НЗ.Записать();
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 14

  1. rzd:

    Для удаления движений документа не нужен ни объект документа, ни чтения набора записей регистра.
    А вообще вместо изобретений велосипедов — изучать БСП.

    • я собираю свою библиотеку функций. БСП вроде бы заявила, что ее можно без ИТС использовать, но это не точно.

      • rzd:

        Первую часть замечаний почему проигнорировал?

        • не понял о чем она. Там ведь не содержится информации — только отрицание приведенной информации. Если расскажете, что вы имеете ввиду, будут и комментарии.

  2. naf2000:

    ЕстьПрофильДоступа не будет работать для пользователей, которые входят в группу доступа не напрямую, а через членство в группе пользователей, которая входит в группу доступа

    • Спасибо за замечание. В БСП есть функция для подобной проверки?

      • rzd:

        Зачем это БСП? Профиль это всего лишь контейнер ролей и видов доступа. Для чего проверять конкретный профиль, если наполнение аналогичными ролями и видами доступа могут быть в ином профиле?

        • Возможно, возможно. Я делал по наличию профиля контроль доступа у кого-то из клиентов.
          чтобы не заводить новую роль.

          • rzd:

            Это не «возможно возможно», это факты. Не надо использовать сущности не по назначению. К тому же это приводит к нарушению правила единственности ответственности. Итого нарушается сразу две концептуальные вещи архитектуры

          • вот только не рассказывайте мне про «правила» в типовой 1С.
            На архитектуру типовых не взглянешь без слез. Особенно на права. Это боль.

  3. rzd:

    1. А что конкретно не так в типовых? Ну вот конкретно хотелось бы обсудить.
    2. А причем тут типовые? Мы же твою функцию в твоей библиотеки обсуждаем?
    3. Даже если плохо в БСП это не повод создавать также плохо

    • ну разговор перешел на типовые.
      в типовых все плохо. и в правах и в коде. модульность отсутствует как класс, функции плохо изолированы, не описаны структуры данных на входе, выходе, назначение функций и побочный эффект.
      кроме того, 1с не использует автотесты.
      Этого достаточно.

      • rzd:

        Ни на какие типовые язык не перешел, это ты пытаешься его увести туда. Кстати примера, что плохо с управлением правами «в типовых» я не так и не увидел. Автотесты ты к чему привел? разговор туда тоже перешел?
        Для чего достаточно? Для создания решений, ломающих архитектуру?

        • у меня нет времени разжевывать вам детально недостатки типовых. Оставлю вас с мыслью, что с типовыми все хорошо, ок.
          Ждите, как-нибудь напишу статью про недостатки кода типовых, ок.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *