Накопитель функций для библиотеки функций
К разбору
--->
Функция СуммаКоллекции(Коллекция, Реквизит) Экспорт
//Назначение: Возвращает сумму коллекции. Годится для таблиц значений и массива строк таблицы
//ДатаСоздания: 20070906
//Автор: Fixin
//Тестирована: Нет
//СтароеИмя: СуммаОтобранныхСтрок
//$Коллекция: Массив строк таблицы значений или таблица значений
//$Реквизит: Суммируемый реквизит
Перем Р;
Р=0;
Для Каждого Эл ИЗ Коллекция Цикл
Р=Р+Эл[Реквизит];
КонецЦикла;
Возврат Р;
КонецФункции
Функция ХэшМД5Строкой(Строка) Экспорт
ХешированиеДанных = Новый ХешированиеДанных (ХешФункция.MD5) ;
ХешированиеДанных.Добавить(Строка);
ХешСумма = ХешированиеДанных.ХешСумма;
Строка = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ХешСумма));
Возврат Строка;
КонецФункции
Общ.УстановитьПользовательскийОтборДинамическогоСписка(Список, "Содержание", ПодстрокаРабот, ВидСравненияКомпоновкиДанных.Содержит, Использование, "ГлобальныйОтборПоКонтрагенту_Подстрока");
Функция УстановитьПользовательскийОтборДинамическогоСписка(Список, ИмяПоля, Значение, ВидСравнения, Использование, ИмяОтбора = Неопределено, РежимОтображения = Неопределено) Экспорт
Для Каждого ЭлементОтбора Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ОтборКомпоновкиДанных") Тогда
ПользовательскийОтбор = ЭлементОтбора.Элементы;
НовыйЭлементОтбора = Неопределено;
Для Каждого СуществующийЭлементОтбора Из ПользовательскийОтбор Цикл
Если ИмяОтбора = Неопределено Тогда
Если СуществующийЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля) Тогда
НовыйЭлементОтбора = СуществующийЭлементОтбора;
Прервать;
КонецЕсли;
Иначе
Если СуществующийЭлементОтбора.Представление = ИмяОтбора Тогда
НовыйЭлементОтбора = СуществующийЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НовыйЭлементОтбора = Неопределено Тогда
НовыйЭлементОтбора = ПользовательскийОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
НовыйЭлементОтбора.Представление = ИмяОтбора;
КонецЕсли;
НовыйЭлементОтбора.ВидСравнения = ВидСравнения;
НовыйЭлементОтбора.Использование = Использование;
Если РежимОтображения = Неопределено Тогда
НовыйЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
Иначе
НовыйЭлементОтбора.РежимОтображения = РежимОтображения;
Конецесли;
НовыйЭлементОтбора.ПравоеЗначение = Значение;
Возврат НовыйЭлементОтбора;
КонецЕсли;
КонецЦикла;
КонецФункции
ЭлементОтбора = ПолучитьОтборДинамическогоСписка(Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, "ВидЦены");
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидЦены");
ЭлементОтбора.ПравоеЗначение = Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор", "Розничная");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
Функция ПолучитьОтборДинамическогоСписка(Отбор, Представление) Экспорт
Для Каждого ЭлементОтбора ИЗ Отбор.Элементы Цикл
Если ЭлементОтбора.Представление = Представление Тогда
Возврат ЭлементОтбора;
КонецЕсли;
КонецЦикла;
ЭлементОтбора = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Представление = Представление;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = ложь;
Возврат ЭлементОтбора;
КонецФункции
Функция ВремяИзДаты(ДатаВремя) Экспорт
Возврат '00010101' + (ДатаВремя - НачалоДня(ДатаВремя));
КонецФункции
Функция СкопироватьСтруктуру(С) Экспорт
Ф = Новый ФиксированнаяСтруктура(С); //так не работает
НоваяСтруктура = Новый Структура(Ф);
Возврат НоваяСтруктура;
//Возврат ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(С));
КонецФункции
Функция НайтиВМассивеСтруктур(М, ИмяПоля, Значение) Экспорт
Для Каждого Эл ИЗ М Цикл
Если Эл[ИмяПоля] = Значение Тогда
Возврат Эл;
Конецесли;
КонецЦикла;
КонецФункции
Функция ПроверитьУникальностьКолонкиТЗ(ТаблицаЗначений, ИмяПоля) Экспорт
//Осипов 25.08.10
// ТаблицаЗначений - ТаблицаЗначений 1С
// ИмяПоля - Строка с именем колонки для проверки
Значения = Новый Соответствие();
Для Каждого Строка Из ТаблицаЗначений Цикл
Если Значения[Строка[ИмяПоля]] <> Неопределено Тогда
// Значение уже встречалось, значит не уникально
Возврат Ложь;
Иначе
Значения.Добавить(Строка[ИмяПоля]);
КонецЕсли;
КонецЦикла;
// Все значения уникальны
Возврат Истина;
КонецФункции
Функция СтрокаДаты_ДД_ММ_ГГГГ_ЧЧ_ММ_СС_ВДату(Строка)
//Примеры: 2012-06-21 22:30:25 или 2012-06-21 22:30
Попытка
Д = Число(Сред(Строка, 1, 2));
М = Число(Сред(Строка, 4, 2));
Г = Число(Сред(Строка, 7, 4));
ЧЧ = Число(Сред(Строка, 12, 2));
ММ = Число(Сред(Строка, 15, 2));
Попытка
СС = Число(Сред(Строка, 18, 2));
Исключение
СС = 0; //Если секунд нет
КонецПопытки;
Возврат Дата(Г, М, Д, ЧЧ, ММ, СС);
Исключение
КонецПопытки;
КонецФункции
Функция ПолностьюУдалитьСимволВСтроке(Строка, Символ)
ПредСтрока = Строка;
Пока Истина Цикл
НоваяСтрока = СтрЗаменить(ПредСтрока, Символ, "");
Если НоваяСтрока = ПредСтрока Тогда
Возврат НоваяСтрока;
КонецЕсли;
ПредСтрока = НоваяСтрока;
КонецЦикла;
КонецФункции
Функция ЧислоИзСтроки(Знач С) Экспорт
СИсх = С;
С = ПолностьюУдалитьСимволВСтроке(С, " ");
С = ПолностьюУдалитьСимволВСтроке(С, Символы.НПП);
//Если есть запятая, отделяющая более двух разрядов, удаляем ее, это разделитель разрядов
Пока Истина Цикл
Поз = Найти(С, ",");
//Пример 1,000 - длина 5, позиция 2 разница 3
Если Поз = 0 Тогда
Прервать;
КонецЕсли;
Если СтрДлина(Сред(С, Поз + 1)) > 2 Тогда
С = Лев(С, Поз - 1) + Сред(С, Поз + 1); //Удаляем запятую
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
С = СтрЗаменить(С, ",", ".");
Если С = "" Тогда
Возврат 0;
КонецЕсли;
//Если есть несколько точек, заменяем на одну 24.000.00 => 24.000;
Пока Истина Цикл
Поз = Найти(С, ".");
Если Поз <> 0 И Найти(Сред(С, Поз + 1), ".") <> 0 Тогда
С = Лев(С, Поз - 1) + Сред(С, Поз + 1);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Если ПротоколироватьПреобразованияЧисел Тогда
Сообщить("Число: " + СИсх + " => " + С);
КонецЕсли;
Попытка
Р = XMLЗначение(Тип("Число"), С);
Исключение
Р = 0;
КонецПопытки;
//Сообщить("" + СИсх + " -> " + Р);
Возврат Р;
КонецФункции
Процедура УдалитьНедопустимыеСимволыXML(Стр) Экспорт
//Осипов - процедура по удалению недопустимых символов
Позиция = НайтиНедопустимыеСимволыXML(Стр, , );
Пока Позиция <> 0 Цикл
Стр = Лев(Стр, Позиция-1) + Сред(Стр, Позиция+1);
Позиция = НайтиНедопустимыеСимволыXML(Стр, , );
КонецЦикла;
КонецПроцедуры
Функция КоличествоДнейМеждуДатами(Дата1, Дата2) Экспорт
// Вычисляем разницу в днях
КоличествоДней = (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400;
Возврат КоличествоДней;
КонецФункции
Функция ОкруглитьВверх(Число, Разряды) Экспорт
//Разряды только положительные, 1.1 округляется как 2 (до ближайшего целого)
Множитель = Pow(10, Разряды); // Вычисляем множитель для округления
// Округляем число вверх
ОкругленноеЧисло = Цел(Число * Множитель + 0.9999999999) / Множитель;
Возврат ОкругленноеЧисло;
КонецФункции
Функция ИзвлечьЦифрыСправа(ИсходнаяСтрока)
// Переменная для хранения результата
Результат = "";
// Начинаем с конца строки
Всего = СтрДлина(ИсходнаяСтрока);
Для Индекс = 1 ПО Всего Цикл
Поз = Всего - Индекс + 1;
Символ = Сред(ИсходнаяСтрока, Поз, 1);
// Проверяем, является ли символ цифрой
Если Символ >= "0" И Символ <= "9" Тогда
Результат = Символ + Результат; // Добавляем символ к результату
Иначе
// Если встретили нецифровой символ, выходим из цикла
Прервать;
КонецЕсли;
КонецЦикла;
// Возвращаем результат
Возврат Результат;
КонецФункции
Функция УдалитьЛидирующиеНули(ИсходнаяСтрока)
// Проверяем, является ли строка пустой
Если ИсходнаяСтрока = "" Тогда
Возврат ""; // Если строка пустая, возвращаем пустую строку
КонецЕсли;
// Ищем индекс первого ненулевого символа
ИндексПервогоНенулевого = 1; // Начинаем с первого символа
Пока ИндексПервогоНенулевого <= СтрДлина(ИсходнаяСтрока) И Сред(ИсходнаяСтрока, ИндексПервогоНенулевого, 1) = "0" Цикл
ИндексПервогоНенулевого = ИндексПервогоНенулевого + 1;
КонецЦикла;
// Если индекс превысил длину строки, значит все символы были нулями
Если ИндексПервогоНенулевого > СтрДлина(ИсходнаяСтрока) Тогда
Возврат "0"; // Возвращаем "0", если строка состояла только из нулей
КонецЕсли;
// Возвращаем подстроку, начиная с первого ненулевого символа
Результат = Сред(ИсходнаяСтрока, ИндексПервогоНенулевого, СтрДлина(ИсходнаяСтрока) - ИндексПервогоНенулевого + 1);
Возврат Результат;
КонецФункции
Сделать только на просмотр элементы:
Процедура УбратьДоступностьЭлементовФормыКромеУказанных(ГруппаРодитель,МассивДоступныхЭлементовФормы = Неопределено,МассивДоступныхЭлементовФормыСПодчиненными = Неопределено)Экспорт
//http://1c-kod.ru/topic/21
Если ТипЗнч(ГруппаРодитель) = Тип("УправляемаяФорма") Тогда
ЭлементКоманднаяПанель = ГруппаРодитель.КоманднаяПанель;
Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ЭлементКоманднаяПанель) <> Неопределено Тогда
ЭлементКоманднаяПанель = Неопределено
КонецЕсли;
ИначеЕсли ТипЗнч(ГруппаРодитель) = Тип("ТаблицаФормы") Тогда
ЭлементКоманднаяПанельТаблицы = ГруппаРодитель.КоманднаяПанель;
Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ЭлементКоманднаяПанельТаблицы) <> Неопределено Тогда
ЭлементКоманднаяПанельТаблицы = Неопределено;
КонецЕсли;
ЭлементКонтекстноеМенюТаблицы = ГруппаРодитель.КонтекстноеМеню;
Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ЭлементКонтекстноеМенюТаблицы) <> Неопределено Тогда
ЭлементКонтекстноеМенюТаблицы = Неопределено;
КонецЕсли;
Иначе
ЭлементКоманднаяПанель = Неопределено;
ЭлементКоманднаяПанельТаблицы = Неопределено;
ЭлементКонтекстноеМенюТаблицы = Неопределено;
КонецЕсли;
//С подчиненными если
Если МассивДоступныхЭлементовФормыСПодчиненными = Неопределено ИЛИ МассивДоступныхЭлементовФормыСПодчиненными.Найти(ГруппаРодитель) = Неопределено Тогда
Для Каждого ТекЭлемент Из ГруппаРодитель.ПодчиненныеЭлементы Цикл
Если МассивДоступныхЭлементовФормы <> Неопределено И МассивДоступныхЭлементовФормы.Найти(ТекЭлемент) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(ТекЭлемент) = Тип("ГруппаФормы") Или ТипЗнч(ТекЭлемент) = Тип("ТаблицаФормы") Тогда
УбратьДоступностьЭлементовФормыКромеУказанных(ТекЭлемент,МассивДоступныхЭлементовФормы,МассивДоступныхЭлементовФормыСПодчиненными);
КонецЕсли;
Если ТипЗнч(ТекЭлемент) <> Тип("ГруппаФормы") Или ТипЗнч(ТекЭлемент) = Тип("ТаблицаФормы") Тогда
//Осипов - Саму или таблицу формы тоже надо сделать только просматриваемой
//группу не делаем просматриваемой, т.к. внутри разные элементы могут вести себя по разному
Попытка
ТекЭлемент.ТолькоПросмотр = Истина;
Исключение
ТекЭлемент.Доступность = Ложь;
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЭлементКоманднаяПанель <> Неопределено Тогда
УбратьДоступностьЭлементовФормыКромеУказанных(ЭлементКоманднаяПанель,МассивДоступныхЭлементовФормы,МассивДоступныхЭлементовФормыСПодчиненными);
КонецЕсли;
Если ЭлементКоманднаяПанельТаблицы <> Неопределено Тогда
УбратьДоступностьЭлементовФормыКромеУказанных(ЭлементКоманднаяПанельТаблицы,МассивДоступныхЭлементовФормы,МассивДоступныхЭлементовФормыСПодчиненными);
КонецЕсли;
Если ЭлементКонтекстноеМенюТаблицы <> Неопределено Тогда
УбратьДоступностьЭлементовФормыКромеУказанных(ЭлементКонтекстноеМенюТаблицы,МассивДоступныхЭлементовФормы,МассивДоступныхЭлементовФормыСПодчиненными);
КонецЕсли;
КонецПроцедуры
Процедура УстановитьТолькоПросмотрЭлементовФормы(Форма, МассивЭлементовФормы, Значение) Экспорт
Для Каждого ТекЭлемент Из МассивЭлементовФормы Цикл
Попытка
ТекЭлемент.ТолькоПросмотр = Значение;
исключение
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Пример использования:
М = Новый Массив();
М.Добавить(Форма.Элементы.СрокДоговора);
М.Добавить(Форма.Элементы.ФормаЗаписать);
МП = Новый Массив();
МП.Добавить(Форма.Элементы.ГруппаПечать);
_КС.УбратьДоступностьЭлементовФормыКромеУказанных(Форма, М, МП);
Функция ТолькоЦифрыВСтроке(Знач Значение) Экспорт
Если СтрДлина(Значение) = 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат СтрДлина(
СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0;
КонецФункции
Процедура ПрисвоитьБезопасно(А, Б) Экспорт
Если А <> Б Тогда
А = Б;
КонецЕсли;
КонецПроцедуры
Функция НайтиВМассивеСтруктур(М, Поле, Значение) Экспорт
Для Каждого С ИЗ М Цикл
Если С[Поле] = Значение Тогда
Возврат С;
КонецЕсли;
КонецЦикла;
КонецФункции
Функция ЗаменитьВТабличномДокументеПоШаблонам(ТД, Шаблоны)
Для Каждого Шаблон ИЗ Шаблоны Цикл
Искомое = Шаблон.Ключ;
Замена = Шаблон.Значение;
Начало = Неопределено;
Пока Истина Цикл
ИскОбласть = ТД.НайтиТекст(Искомое, Начало);
Если ИскОбласть = Неопределено Тогда
Прервать;
КонецЕсли;
Если Замена = "[УДАЛИТЬСТРОКУ]" Тогда
ТД.УдалитьОбласть(ТД.Область(ИскОбласть.Верх,,ИскОбласть.Верх));
КонецЕсли;
ИскОбласть.Текст = СтрЗаменить(ИскОбласть.Текст, Искомое, Замена);
КонецЦикла;
КонецЦикла;
КонецФункции
Процедура ИзменитьТипКолонки(ТЗ, ИмяКолонки, Знач ОписаниеТипов = Неопределено) Экспорт
ТЗ.Колонки.Вставить(ТЗ.Колонки.Индекс(ТЗ.Колонки[ИмяКолонки]), "c385af00a52b14ed4a10af2bd790e7e12", ОписаниеТипов);
М = ТЗ.ВыгрузитьКолонку(ИмяКолонки);
ТЗ.ЗагрузитьКолонку(М, "c385af00a52b14ed4a10af2bd790e7e12");
ТЗ.Колонки.Удалить(ИмяКолонки);
ТЗ.Колонки.c385af00a52b14ed4a10af2bd790e7e12.Имя = ИмяКолонки;
КонецПроцедуры
Функция Объект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с не использует автотесты.
Этого достаточно.
Ни на какие типовые язык не перешел, это ты пытаешься его увести туда. Кстати примера, что плохо с управлением правами «в типовых» я не так и не увидел. Автотесты ты к чему привел? разговор туда тоже перешел?
Для чего достаточно? Для создания решений, ломающих архитектуру?
у меня нет времени разжевывать вам детально недостатки типовых. Оставлю вас с мыслью, что с типовыми все хорошо, ок.
Ждите, как-нибудь напишу статью про недостатки кода типовых, ок.