Книга знаний

1С:Предприятие

Библиотека продвинутых функцй

В этой статье я буду собирать полезные функции для 1С. Это даст программистам готовый, отлаженный функционал и избавит их от необходимости "изобретать велосипед". Вы можете также поучавствовать в составлении библиотеки, находя ошибки и добавляя свои полезные функции. Автор статьи: Гений 1С | Редакторы: Волшебник, BlackTiger,
Последняя редакция №5 от 05.10.06 | История
URL: http://kb.mista.ru/article.php?id=373

Библиотека продвинутых функций



Лучше использовать библиотеку целиком, тогда не надо выявлять, какая из функций использует другие функции.

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

Если вы хотите добавить свою функцию, допишите ее в разделе "Добавьте свои функции ЗДЕСЬ", потому что основной текст затирается из общего модуля, в котором я веду список функций и ваши изменения будут затерты, если вы их вносите в библиотеку.
Выявленные ощибки и замечания о нерациональностях оставляйте в конце, в разделе "Замечания и выявленные баги".

История библиотеки записана в комментариях в конце кода.

Код библиотеки




//Библиотека функций для продвинутой работы в 1С 80.  
//Версия от 20061005
//Создатель и ведущий библиотеки: Гений 1С
//Локальные переменные в функциях не обязательно объявляются
//Предполагается, что глобальные переменные именуются с использованием префикса
//Предполагается также, что эти функции располагаются в общих модулях, а не в модулях форм
//Префиксы всех функций начинаются на "об" или "pub" для англоязычных функций
//Библиотеки расположены в алфавитном порядке
//На данный момент включены библиотеки:
//    Внешние обработки
//    Встроенный язык
//    Даты
//    Коллекции
//    Контексты
//    Метаданные
//    Навигация
//    ОЛЕ
//    Отчеты - функции для вывода отчетов
//    Отладка
//    Строки
//    Сериализация - функции по сохраниению/восстанавлению значений
//    Типы
//    Уникальный идентификатор
//    Файлы 
//    Формы

//Функции, которые используют методы/свойства клиента, заключаются в скобки #Если Клиент, причем эта конструкция должна располагаться внутри функции, т.к. каждая функция должна использоваться самостоятельно
//У каждой функции указано назначение параметров и список функций, которые вызываются непосредственно из нее.

//Библиотека:ВНЕШНИЕ ОБРАБОТКИ
//Содержит функции для работы с внешними обработками

//Создает внешнюю обработку по переданному имени файла обработки
//Если файла нет, возвращает неопределено
//Возврат:
//Статус - ФайлНеСуществует,НеУказаноИмяФайла 
Функция обСоздатьВнешнююОбработку(Знач ФайлОбработки, Статус=Неопределено) Экспорт
    ФайлОбработки = СокрЛП(ФайлОбработки);
    Если ФайлОбработки="" Тогда
        Статус="НеУказаноИмяФайла";
        Возврат Неопределено;
    КонецЕсли;
    
    ФайлДляПроверки = Новый Файл(ФайлОбработки);
    Если НЕ ФайлДляПроверки.Существует() Тогда
        Статус="ФайлНеСуществует";
        Возврат Неопределено;
    КонецЕсли; 
    Возврат ВнешниеОбработки.Создать(ФайлОбработки);
КонецФункции 

//Библиотека:ВСТРОЕННЫЙ ЯЗЫК
//Усовершенствования встроенного языка

//Результат присваивается в первое слагаемое
Функция обПрисвоитьСумма(А,Б)  Экспорт
    А=А+Б;
    Возврат А;
КонецФункции

//Результат присваивается в уменьшаемое
Функция обПрисвоитьРазность(А,Б)  Экспорт
    А=А-Б;
    Возврат А;
КонецФункции

//Частное присваивается в делимое
Функция обПрисвоитьДеление(А,Б)  Экспорт
    А=А-Б;
    Возврат А;
КонецФункции

//Если делитель равен нулю, возвращает ноль
//Есть возможность округления
//Результат присваивается обратно в делимое
Функция обПрисвоитьБезопасноеДеление(А,Б,Окр=Неопределено)  Экспорт
    А=обБезопасноеДеление(А,Б,Окр);
    Возврат А;
КонецФункции

//Если делитель равен нулю, возвращает ноль
//Есть возможность округления
Функция обБезопасноеДеление(А,Б,Окр=Неопределено) Экспорт
    Рез=?(Б=0,0,А/Б);
    Если Окр<>Неопределено Тогда
        Рез=Окр(Рез, Окр);
    КонецЕсли;
    Возврат Рез;
КонецФункции

//Присваивает значение Б переменной А только если значение реально изменилось
//Удобно, когда нужно защититься от модифицированности
Функция обПрисвоитьБезопасно(А,Б) Экспорт
    Если А<>Б Тогда
        А=Б;
    КонецЕсли;
    Возврат А;
КонецФункции


//Библиотека:Даты, время
//Содержит функции для работы с датами 

//Количество дней, прошедших после Дата2 до даты Дата1, т.е. Дата1-Дата2
Функция обРазностьДней(Дата1,Дата2) Экспорт
    Возврат (НачалоДня(Дата1)-НачалоДня(Дата2))/86400; //60*60*24
КонецФункции

//Задержка на указанное число секунд
Функция обЗадержка(Секунд) Экспорт
    Перем Начало, Конец;
    Начало=ТекущаяДата();
    Конец=Начало+Секунд;
    Пока ТекущаяДата()<=Конец Цикл
#Если Клиент Тогда

        ОбработкаПрерыванияПользователя();
#КонецЕсли

    КонецЦикла;
КонецФункции

//Библиотека:ЗНАЧЕНИЯ
//Работа со значениями


//Возвращает ссылку на объект или Неопределено, если объект не имеет ссылки
Функция обСсылка(Объект) Экспорт
КонецФункции

//Проверяет, является ли значение пустым
//Еще не реализована
Функция обПусто(Объект) Экспорт
КонецФункции

//Проверяет, что значение не заполнено
//Еще не реализована
Функция обНеПусто(Объект) Экспорт
    Возврат НЕ обПусто(Объект);
КонецФункции

//Получаем значения свойств
Функция обПолучитьЗначенияСвойств(Свойства, Объект)  Экспорт
    Стр=Новый Структура(Свойства);
    ЗаполнитьЗначенияСвойств(Стр, Объект);
    Возврат Стр;
КонецФункции


//Если объекту не назначена ссылка, назначает эту ссылку
Функция обДатьТочнуюСсылку(Объект) Экспорт
    Перем Ссылка, Вид;
    
    Ссылка=Объект.Ссылка;
    Если Ссылка.Пустая() Тогда
        Ссылка = Объект.ПолучитьСсылкуНового();
        Если Ссылка.Пустая() Тогда
            Вид=обМетаданные(Объект);
            Ссылка = обМенеджерОбъекта(Объект)[Вид].ПолучитьСсылку();
            Объект.УстановитьСсылкуНового(Ссылка);
        КонецЕсли;
    КонецЕсли;
    Возврат Ссылка;
КонецФункции


//Библиотека:КОЛЛЕКЦИИ
//Содержит функции для работы с коллекциями 
//Коллекция элементов коллекции
Функция обРазмерКоллекции(К) Экспорт
КонецФункции

//Массив элементов коллекции, для дальнейшего перебора
Функция обЭлементыКоллекции(К) Экспорт
КонецФункции
Функция обЭлементКоллекцииПоИндексу(К, Индекс) Экспорт
КонецФункции
Функция обИндексЭлементаКоллекции(К, Эл) Экспорт
КонецФункции
Функция обДобавитьВКоллекцию(К, Эл) Экспорт
КонецФункции
Функция обВставитьВКоллекцию(К, Эл, Позиция) Экспорт
КонецФункции
Функция обСортироватьКоллекцию(К, Порядок) Экспорт
КонецФункции
Функция обОбъединитьКоллекции(К1, К2, Новая=истина) Экспорт
КонецФункции
Функция обПересечьКоллекции(К1, К2, Новая=истина) Экспорт
КонецФункции
Функция обСоединитьКоллекции(К1, К2, Новая=истина) Экспорт
КонецФункции

//Подбиблиотека: СПИСКИ ЗНАЧЕНИЙ

//Функция для установки/сброса/инверсии всех пометок списка
//Список:СписокЗначений
//Зн:(истина,ложь,Неопределено) - истина - установить пометки, ложь - сбросить, Неопределено - инвертировать
//Отлажена: 20060922 Гений 1С
Функция обУстановитьВсеПометкиСписка(Список, Зн) Экспорт
    Для Каждого Поз Из Список Цикл
        Если Зн=истина Тогда
            Поз.Пометка=Истина;
        ИначеЕсли Зн=ложь Тогда
            Поз.Пометка=ложь;
        Иначе //инверсия
            Поз.Пометка=Не Поз.Пометка;
        КонецЕсли;
    КонецЦикла;    
КонецФункции

//Функция для установки пометок списка-получателя согласно пометок списка-источника
//Источник:СписокЗначений - источник пометок
//Получатель:СписокЗначений - получатель пометок
//Возврат: Получатель
//Отлажена: 20060925 Гений 1С
Функция    обУстановитьПометкуСпискаСогласноДругогоСписка(Получатель, Источник) Экспорт
    Для Каждого Эл из Источник Цикл
        Зн=Получатель.НайтиПоЗначению(Эл.Значение);
        Если Зн<>Неопределено Тогда
            Зн.Пометка=Эл.Пометка;
        КонецЕсли;
    КонецЦикла;
    Возврат Получатель;
КонецФункции

//Список, состоящий из элементов, которые есть в обоих списков
//Не отлаживалась
Функция обОбъединитьСписки(К1, К2, Уникальность=истина, флНовый=истина) Экспорт
    Если флНовый Тогда
        Получатель=К1.Скопировать();
    Иначе
        Получатель=К1;
    КонецЕсли;
    
    Для Каждого Эл ИЗ К2 Цикл
        Если Получатель.НайтиПоЗначению(Эл.Значение) Тогда
            Продолжить;
        КонецЕсли;
        Получатель.Добавить(Эл);
    КонецЦикла;
    
    Возврат Получатель;
КонецФункции

//В хвост списка К1 добавляется К2
//Не отлаживалась
Функция обСклеитьСписки(К1, К2, флНовый=истина) Экспорт
    Если флНовый Тогда
        Получатель=К1.Скопировать();
    Иначе
        Получатель=К1;
    КонецЕсли;
    
    Для Каждого Эл ИЗ К2 Цикл
        Получатель.Добавить(Эл.Значение);
    КонецЦикла;
    
    Возврат Получатель;
КонецФункции

//Список, состоящий из элементов, которые есть в обоих списков
//Не отлаживалась
Функция обПересечьСписки(К1, К2, флНовый=истина) Экспорт
    Получатель=Новый СписокЗначений();
    Для Каждого Эл ИЗ К2 Цикл
        Если К1.НайтиПоЗначению(Эл.Значение) Тогда
            Получатель.Добавить(Эл.Значение);
        КонецЕсли;
    КонецЦикла;
    
    Если НЕ флНовый Тогда
        К1=Получатель;
    КонецЕсли;
    
    Возврат Получатель;
КонецФункции


//Подбиблиотека: КОНВЕРТАЦИЯ
//Конвертация одних коллекций в другие

Функция обСкопироватьМассив(М) Экспорт
    Рез=Новый Массив();
    Для Каждого Эл ИЗ М Цикл
        Рез.Вставить(Эл);
    КонецЦикла;
    Возврат Рез;
КонецФункции

Функция обОбъединитьМассивы(М12, флНовый=ложь) Экспорт
    Если флНовый Тогда
        Получатель=обСкопироватьМассив(М1);
    Иначе
        Получатель=М1;
    КонецЕсли;
    
    Для Каждого Эл ИЗ М2 Цикл
        Получатель.Вставить(Эл);
    КонецЦикла;
    
    Возврат Получатель;
КонецФункции

Функция обКоллекцияВМассив(Коллекция, Реквизит) Экспорт
    Рез=Новый Массив();
    Для Каждого Эл Из Коллекция Цикл
        Рез.Добавить(Эл[Реквизит]);
    КонецЦикла;
    Возврат Рез;
КонецФункции

Функция обКоллекцияВТаблицуЗначений(Коллекция, Реквизиты) Экспорт
    Поля=Новый Структура();
    Рез=Новый ТаблицаЗначений();
    Для Каждого Поле Из Поля Цикл
        Рез.Колонки.Добавить(Поле);
    КонецЦикла;
    
    Для Каждого Эл Из Коллекция Цикл
        Стр=Рез.Добавить();
        Для Каждого Поле Из Поля Цикл
            Рез.Колонки.Добавить(Эл[Поле]);
        КонецЦикла;
    КонецЦикла;
    Возврат Рез;
КонецФункции



//Библиотека:КОНТЕКСТЫ
//Содержит функции для работы с контекстами

//Позволяет из любого общего модуля получить переменную приложения
//Требует наличия в базе обработки "обПолучитьПеременнуюПриложения", без формы, модуль которой содержит код:
//Функция Получить(Имя) Экспорт
//Возврат Вычислить(Имя);
//КонецФункции
Функция обПолучитьПеременнуюПриложения(Имя) Экспорт 
    Возврат Обработки.обПолучитьПеременнуюПриложения.Получить(Имя); 
КонецФункции

//Функция определяет, определена ли в данном контексте функция 
//Причем возвращает количество параметров функции
//Работаетс только для функций с 0-10 параметрами
//Нужно отладить
Функция обОпределенаЛиФункция(ИмяФункции, КоличествоПараметров=Неопределено)
    Параметры="";
    Для Инд=0 По 10 Цикл
        Параметры=Параметры+?(Параметры="","",",")+"0";
        Код="Р=истина; "+ИмяФункции+"("+Параметры+");";
        Попытка
            Выполнить(Код);
            КоличествоПараметров=Инд;
            Возврат истина;
        Исключение
        КонецПопытки;
    КонецЦикла;
    Возврат ложь;
КонецФункции

//Библиотека:МЕТАДАННЫЕ
//Содержит функции для работы с метаданными 

//Функция осуществляет более быстрый поиск метаданных, чем Объект.Метаданные()
Функция обМетаданные(Объект) Экспорт
    Если ТипЗнч(Объект)=Тип("Тип") Тогда
        Иск=Объект;
    Иначе
        Иск=ТипЗнч(Объект);
    КонецЕсли;
    Возврат Метаданные.НайтиПоТипу(Иск);
КонецФункции

//Функция проверяет, что ТипМастер является владельцем ТипРаб
//ТипМастер:Тип
//ТипРаб:Тип
//Результат:Булево
Функция обТипЯвляетсяВладельцемТипа(ТипМастер, ТипРаб) Экспорт
    МДРаб=обМетаданные(ТипРаб);
    МДМастер=обМетаданные(ТипМастер);
    Если МДРаб=Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Если обЭтоЗначениеМенеджера(ТипРаб, Справочники) Тогда //сыро
        Если МДРаб.Владельцы.Содержит(МДМастер) Тогда
            Возврат истина;
        КонецЕсли;
    Иначе
        Возврат ложь;
    КонецЕсли;
    Возврат ложь;
КонецФункции




//Библиотека:НАВИГАЦИЯ
//Содержит функции для навигации по базе данных 

//Библиотека:ОЛЕ
//Содержит функции для навигации по базе данных 
//Добавление этой функции в базу позволяет выполнить любой код в базе.
//Т.к. к сожалению нет функции, которая была бы аналогом оператора Выполнить(Execute)
Function pubRunScript(AnyCode) Export
    try
        Execute (AnyCode);
        Возврат истина;
    except
        Возврат ОписаниеОшибки();
    endtry
EndFunction

//Библиотека:ОТЛАДКА
//Содержит функции, упрощающие отладку приложений

//Присваивает значению А значение Б
//Используется для изменения значения в табло и прерывания кода, путем присваивания переменной значения, которое вызовет ошибку
Функция обПрисвоить(А,Б) Экспорт
    А=Б;
    Возврат А;
КонецФункции

Функция обПрекратитьФорму(ЭтаФорма) Экспорт
    ЭтаФорма.Закрыть();
    Возврат истина;
КонецФункции

Функция обДу(Код, П=Неопределено) Экспорт
    Перем Р;
    Выполнить(Код);
    Возврат Р;
КонецФункции

Функция обСоо(Сообщение) Экспорт
    Сообщить(Сообщение);
КонецФункции

//Библиотека:ОТЧЕТЫ
//Содержит функции для вывода отчетов 


Функция обВывестиДанныеВОтчет(П) Экспорт
    Перем Источник, Таб, Макет, спзГруппы, спзИтоги, ПараметрыПостроителя, ПостроительОтчета;
    Перем 
        ПараметрыШапки, //Параметры, передаваемые в шапку
        ПараметрыПодвала,//Параметры, передаваемые в подвал
        ИмяШапки,    //Имя шапки в макете
        ИмяСтроки, //Имя строки в макете
        ИмяПодвала, //Имя подвала
        Показывать; //Показывать ли таблицу, по умолчанию истина

    П.Свойство("Источник", Источник);
    П.Свойство("Таб", Таб);
    П.Свойство("Макет", Макет);
    П.Свойство("Группы", спзГруппы);
    П.Свойство("Итоги", спзИтоги);
    П.Свойство("ПараметрыПостроителя", ПараметрыПостроителя);
    
    //Данные по умолчанию
    Если спзИтоги=Неопределено Тогда
        спзИтоги=Новый СписокЗначений();
    КонецЕсли;
    Если спзГруппы=Неопределено Тогда
        спзГруппы=Новый СписокЗначений();
    КонецЕсли;
    Если Таб=Неопределено Тогда
        Таб=Новый ТабличныйДокумент();
        П.Вставить("Таб", Таб);
    КонецЕсли;
    П.Свойство("ПараметрыШапки", ПараметрыШапки);
    П.Свойство("ПараметрыПодвала", ПараметрыПодвала);
    Если НЕ П.Свойство("ИмяШапки", ИмяШапки) Тогда
        П.Вставить("ИмяШапки", "Шапка");
    КонецЕсли;
    Если НЕ П.Свойство("ИмяСтроки", ИмяСтроки) Тогда
        П.Вставить("ИмяСтроки", "Строка");
    КонецЕсли;
    Если НЕ П.Свойство("ИмяПодвала", ИмяПодвала) Тогда
        П.Вставить("ИмяПодвала", "Подвал");
    КонецЕсли;
    Если НЕ П.Свойство("Показывать", Показывать) Тогда
        П.Вставить("Показывать", Истина);
    КонецЕсли;

    //Выводим шапку, если надо
    Если ИмяШапки<>Неопределено Тогда
        Шапка=Макет.ПолучитьОбласть(П.ИмяШапки);
        Если ПараметрыШапки<>Неопределено Тогда
            Шапка.Параметры.Заполнить(ПараметрыШапки);
        КонецЕсли;
        Таб.Вывести(Шапка);
    КонецЕсли;
    
    ПостроительОтчета=Новый ПостроительОтчета();
    Если ТипЗнч(Источник)=Тип("ОписаниеИсточникаДанных") Тогда
        ПостроительОтчета.ИсточникДанных=Источник;
    Иначе
        ПостроительОтчета.ИсточникДанных=Новый ОписаниеИсточникаДанных(Источник);
    КонецЕсли;
    обУстановитьИзмеренияПостроителяОтчета(ПостроительОтчета, спзГруппы);
    обУстановитьИтогиПостроителяОтчета(ПостроительОтчета, спзИтоги);

    ПостроительОтчета.ЗаполнитьНастройки();
    обСкорректироватьПорядокИзмеренийПостроителяОтчета(ПостроительОтчета, спзГруппы);
    ПостроительОтчета.Выполнить();
    Если Макет<>Неопределено Тогда
        ПостроительОтчета.Макет=обПреобразоватьМакетПостроителя(Макет, спзГруппы);
    КонецЕсли;
    Если ПараметрыПостроителя<>Неопределено Тогда
        ЗаполнитьЗначенияСвойств(ПостроительОтчета, ПараметрыПостроителя);
    КонецЕсли;
    обПреобразоватьМакетПостроителя(Макет, спзГруппы);
    Если Таб<>Неопределено Тогда
        ПостроительОтчета.Вывести(Таб);
    КонецЕсли;
    
    П.Вставить("ПостроительОтчета", ПостроительОтчета);
    

    //Выводим подвал, если надо
    Если ИмяПодвала<>Неопределено Тогда
        Подвал=Макет.ПолучитьОбласть(П.ИмяПодвала);
        Если ПараметрыПодвала<>Неопределено Тогда
            Подвал.Параметры.Заполнить(ПараметрыПодвала);
        КонецЕсли;
        Таб.Вывести(Подвал);
    КонецЕсли;
    
    Если П.Свойство("ПараметрыТаблицы") Тогда
        ЗаполнитьЗначенияСвойств(Таб, П.ПараметрыТаблицы);
    КонецЕсли;
    
    Если П.Показывать Тогда
        Таб.Показать();
    КонецЕсли;

    Возврат ПостроительОтчета;
КонецФункции


Функция обУстановитьИзмеренияПостроителяОтчета(ПостроительОтчета, спзГруппы) Экспорт
    Перем Эл;
    Для Каждого Эл из спзГруппы Цикл
        ПостроительОтчета.ИсточникДанных.Колонки[Эл.Значение].Измерение=истина;
    КонецЦикла;
КонецФункции

Функция обУстановитьИтогиПостроителяОтчета(ПостроительОтчета,спзИтоги) Экспорт
    Перем Эл;
    Для Каждого Эл Из спзИтоги Цикл
        ПостроительОтчета.ИсточникДанных.Колонки[Эл.Значение].Итог = ""+Эл.Представление+"("+Эл.Значение+")";
    КонецЦикла;
КонецФункции

Функция обСкорректироватьПорядокИзмеренийПостроителяОтчета(ПостроительОтчета, спзГруппы) Экспорт
    Перем Уровень, Эл, ИмяГруппировки, Элементы, Элемент;
    Уровень=0;
    Для Каждого Эл из спзГруппы Цикл
        ИмяГруппировки=Эл.Значение;
        Элементы=ПостроительОтчета.ИзмеренияСтроки;
        Элемент=Элементы.Найти(ИмяГруппировки);
        Если Элемент<>Неопределено Тогда
            Элементы.Сдвинуть(Элемент, Уровень-Элементы.Индекс(Элемент));
            Уровень=Уровень+1;
        КонецЕсли;
    КонецЦикла;
КонецФункции




//Заменяет названия уровней на конкретные названия полей
Функция обПреобразоватьМакетПостроителя(Макет, спзГруппы) Экспорт
    Перем Эл, Уровень, ИмяУровня, ИмяГруппы, НазваниеГруппы, сУровеньПуть;
    
    Для Каждого Эл ИЗ спзГруппы Цикл
        Уровень=спзГруппы.Индекс(Эл);
        ИмяУровня="Уровень"+Уровень;
        ИмяГруппы=Эл.Значение;
        НазваниеГруппы=Эл.Представление;
        обЗаменитьТекстМакета(Макет, "Параметр", ИмяУровня, ИмяГруппы);
        обЗаменитьТекстМакета(Макет, "Текст", "имя"+ИмяУровня, НазваниеГруппы);
        обПереименоватьОбластьМакета(Макет, ""+ИмяУровня, ИмяГруппы);
    КонецЦикла;
    
    сУровеньПуть="";
    Для Каждого Эл ИЗ спзГруппы Цикл
        сУровеньПуть=сУровеньПуть+?(сУровеньПуть="","",Символы.ПС)+Эл.Представление;
    КонецЦикла;
    обЗаменитьТекстМакета(Макет, "Текст", "УровеньПуть", сУровеньПуть);
    
    //Убираем ненужные группировки и реквизиты в колонках
    Уровень=спзГруппы.Количество();
    Пока Истина Цикл
        ИмяУровня="кУровень"+Уровень;
        Область=Макет.Области.Найти(ИмяУровня);
        Если Область=Неопределено Тогда
            Прервать;
        КонецЕсли;
        Макет.УдалитьОбласть(Область,ТипСмещенияТабличногоДокумента.ПоГоризонтали);
        Уровень=Уровень+1;
    КонецЦикла;

    Возврат Макет;
КонецФункции

Функция обЗаменитьТекстМакета(Макет, Параметр, сИсточник, сЗамена) Экспорт
    Перем Область, СледОбласть;
    СледОбласть=Неопределено;
    Пока (истина) Цикл
        Область=Макет.НайтиТекст(сИсточник,СледОбласть);
        Если Область=Неопределено Тогда
            Прервать;
        КонецЕсли;
        Если Область[Параметр]=сИсточник тогда
            Область[Параметр]=сЗамена;
        КонецЕсли;
        СледОбласть=Область;
    КонецЦикла;
КонецФункции

Функция обПереименоватьОбластьМакета(Макет, сИсточник, сЗамена) Экспорт
    Перем Область;
    Область=Макет.Области.Найти(сИсточник);
    Если Область<>Неопределено Тогда
        Область.Имя=сЗамена;
    КонецЕсли;
КонецФункции


//Библиотека:СЕРИАЛИЗАЦИЯ
//Прочие полезные функции с коллекциями

//Функция загружает весь макет в таблицу значений
//Первая строка содержит подписи колонок (должны быть правильные идентификаторы)
//Пустые строки (состоящией из пробелов, переводов строки и т.п.) заменяет на Неопределено
//Если в ячейке есть значение, в ячейку таблицы значений попадает именно это значение
//Отлажено:20060929
//Автор:Гений1С
Функция обМакетВТаблицуЗначений(Макет) Экспорт
    Перем ТЗ;
    
    ТЗ=Новый ТаблицаЗначений();
#Если Клиент Тогда

    //Считываем колонки
    Для Стр=1 По Макет.ВысотаТаблицы Цикл
        Если Стр>1 Тогда
            ТекСтр=ТЗ.Добавить();
        КонецЕсли;
        ПустаяСтрока=истина;
        Для Кол=1 По Макет.ШиринаТаблицы Цикл
            Яч=Макет.Область(Стр, Кол);
            Если Яч.СодержитЗначение Тогда
                Зн=Яч.Значение;
            Иначе
                Зн=Яч.Текст;
            КонецЕсли;
            Если ТипЗнч(Зн)=Тип("Строка") И ПустаяСтрока(Зн) Тогда
                Зн=Неопределено;
            КонецЕсли;
            
            //Добавляем колонку
            Если Стр=1 Тогда
                ТЗ.Колонки.Добавить(Зн);
            Иначе
                ТекСтр[Кол-1]=Зн;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
#КонецЕсли

   Возврат ТЗ;
КонецФункции


//Библиотека:СТРОКИ
//Содержит функции для работы со строками
Функция обПрисвоитьСтрЗаменить(Стр, Иск, Замена) Экспорт
    Стр=СтрЗаменить(Стр, Иск, Замена);
КонецФункции

//Проверяет, является ли символ цифрой
Функция обЭтоЦифра(С) Экспорт
    Возврат Найти("0123456789", С)<>0;
КонецФункции

//Проверяет, является ли символ буквой
Функция обЭтоБуква(С) Экспорт
    Возврат Найти("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ", ВРег(С))<>0;
КонецФункции

Функция обЭтоИдентификатор(С) Экспорт
    Для Инд=1 По СтрДлина(С) Цикл
        Симв=Сред(С, Инд, 1);
        Если Инд=1 И обЭтоЦифра(Симв) Тогда
            Возврат ложь;
        ИначеЕсли НЕ (обЭтоБуква(Симв) ИЛИ Симв="_") Тогда
            Возврат ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат истина;
КонецФункции

//Библиотека:ТИПЫ
//Содержит функции для работы с типами 

//Проверяет, является ли объект ссылкой или экземпляром объекта менеджера
Функция обЭтоЗначениеМенеджера(Объект, Менеджер) Экспорт
    Возврат обЭтоСсылкаМенеджера(Объект, Менеджер) ИЛИ обЭтоЭкземплярМенеджера(Объект, Менеджер);
КонецФункции

//Проверяет, что объект - это экземпляр объекта менеджера
Функция обЭтоЭкземплярМенеджера(Объект, Менеджер) Экспорт
    Возврат обСодержитСсылку(Объект) И обЭтоСсылкаМенеджера(Объект.Ссылка, Менеджер) И Объект.Ссылка<>Объект;
КонецФункции

//Проверяет, что объект - это ссылка на объект менеджера
Функция обЭтоСсылкаМенеджера(Объект, Менеджер) Экспорт
    Возврат Менеджер.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект)) И Объект<>Неопределено; 
КонецФункции

//Проверяет, что это объект, который содержит реквизит Ссылка
Функция обСодержитСсылку(Объект) Экспорт
    //Проверяем только для прикладных объектов
    Если обМетаданные(Объект)=Неопределено Тогда
        Возврат ложь;
    КонецЕсли;
    Стр=Новый Структура("Ссылка");
    ЗаполнитьЗначенияСвойств(Стр, Объект);
    //Нет ссылки
    Если Стр.Ссылка=Неопределено Тогда
        Возврат ложь;
    КонецЕсли;
    Возврат истина;
КонецФункции

//Проверяет, что это ссылка
Функция обЭтоСсылка(Объект) Экспорт
    Возврат обСодержитСсылку(Объект) И Объект=Объект.Ссылка;
КонецФункции

//Проверяет, что это экземпляр прикладного объекта
Функция обЭтоЭкземпляр(Объект) Экспорт
    Возврат обСодержитСсылку(Объект) И Объект<>Объект.Ссылка;
КонецФункции

//Проверяет, что объект является менеджером
Функция обЭтоМенеджер(Объект) Экспорт
    СтруктураМенеджеров=обСтруктураМенеджеров();
    Для Каждого Эл Из СтруктураМенеджеров Цикл
        Если Эл.Значение=Объект Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
КонецФункции

//Возвращает список всех менеджеров и соответствующих им названий метаданных
Функция обСтруктураМенеджеров() Экспорт
    Возврат Новый Структура(
    "
    |Справочники,
    |Документы,
    |Перечисления,
    |Константы,
    |БизнесПроцессы,
    |КритерииОтбора,
    |Последовательности,
    |ЖурналыДокументов,
    |Отчеты,
    |Обработки,
    |ПланыВидовХарактеристик,
    |ПланыСчетов,
    |ПланыВидовРасчета,
    |Задачи,
    |РегистрыСведений,
    |РегистрыНакопления,
    |РегистрыРасчета,
    |ПланыОбмена
    |",
    Справочники,
    Документы,
    Перечисления,
    Константы,
    БизнесПроцессы,
    КритерииОтбора,
    Последовательности,
    ЖурналыДокументов,
    Отчеты,
    Обработки,
    ПланыВидовХарактеристик,
    ПланыСчетов,
    ПланыВидовРасчета,
    Задачи,
    РегистрыСведений,
    РегистрыНакопления,
    РегистрыРасчета,
    ПланыОбмена
    );
КонецФункции


//Возвращает менеджер объекта, например для справочника возвращает Справочники
//Нужно дописать для всех прикладных объектов
//Отлажена: 20060922 Гений 1С
Функция обМенеджерОбъекта(Объект) Экспорт
    МД=обМетаданные(Объект);
    СтруктураМенеджеров=обСтруктураМенеджеров();
    Для Каждого Эл Из СтруктураМенеджеров Цикл
        Если Метаданные[Эл.Ключ].Содержит(МД) Тогда
            Возврат Эл.Значение;
        КонецЕсли;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции


//Библиотека:УникальныйИдентификатор
//Содержит функции для работы с уникальным идентификатором

Функция обГУИДВЧисло(GUID) Экспорт
    СтрGUID=обГУИДВСтроку(GUID);
    Сумма=0; Множитель=1;
    Для Инд=1 По СтрДлина(СтрGUID) Цикл
        Симв=ВРЕГ(Сред(СтрGUID, Инд, 1));
        Поз=Найти("123456789ABCDEF", Симв);
        Сумма=Сумма+Поз*Множитель;
        Множитель=Множитель*16;
    КонецЦикла;
    
    Возврат Сумма;
КонецФункции

//В 32-разрядную строку
Функция обГУИДВСтроку(GUID) Экспорт
    Возврат СтрЗаменить(GUID, "-", "");
КонецФункции

//Выдает новый уникальный идентификатор, который можно использовать в 1С везде, где требуется обычный идентификатор
//В структурах, в параметрах запросов и т.п.
Функция обУникальныйИдентификатор(GUID) Экспорт
    Возврат "_"+обГУИДВСтроку(Новый УникальныйИдентификатор);
КонецФункции

//Библиотека:ФАЙЛЫ
//Содержит функции для работы с файлами

//Функция корректирует путь - удаляет из него краевые пробелы и если в конце нет символа слеша, добавляет его
//Примеры: 
//    c: -> c:\
//    c:\ -> c:\
//Возврат:Строка
//Автор:Гений1С
Функция обПутьСоСлешем(ИсходныйПуть) Экспорт
    Рез=СокрЛП(ИсходныйПуть);
    Если Прав(Рез,1)="/" Тогда
        Возврат Рез;
    Иначе
        Возврат Рез+"/";
    КонецЕсли;
КонецФункции


//Библиотека:ФОРМЫ
//Содержит функции для работы с формами

#Если Клиент Тогда

//Еще сырая
Функция обЭтоФормаДокумента(Форма, Вид) Экспорт 
    Попытка 
        Если Форма.ЭтотОбъект.Метаданные().Имя=Вид Тогда
            Возврат истина;
        КонецЕсли;
    Исключение КонецПопытки;
    Попытка 
        Если ТипЗнч(Форма.ДокументСписок)=Тип("ДокументСписок."+Вид) Тогда
            Возврат истина;
        КонецЕсли;
    Исключение КонецПопытки;
    Возврат ложь;
КонецФункции

//Еще сырая
Функция обЭтоФормаСправочника(Форма, Вид) Экспорт 
    Попытка 
        Если Форма.ЭтотОбъект.Метаданные().Имя=Вид Тогда
            Возврат истина;
        КонецЕсли;
    Исключение КонецПопытки;
    Попытка 
        Если ТипЗнч(Форма.СправочникСписок)=Тип("СправочникСписок."+Вид) Тогда
            Возврат истина;
        КонецЕсли;
    Исключение КонецПопытки;
    Возврат ложь;
КонецФункции


Функция обСправочникСписок_ВидСправочника(ТипСправочникСписок) Экспорт
    Для Каждого Эл Из Метаданные.Справочники Цикл
        Если Тип("СправочникСписок."+Эл.Имя)=ТипСправочникСписок Тогда
            Возврат Эл.Имя;
        КонецЕсли;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции

Функция обДокументСписок_ВидДокумента(ТипДокументСписок) Экспорт
    Для Каждого Эл Из Метаданные.Документы  Цикл
        Если Тип("ДокументСписок."+Эл.Имя)=ТипДокументСписок Тогда
            Возврат Эл.Имя;
        КонецЕсли;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции

//Еще сырая
//Возвращает ссылку на объект, форма которого открыта или текущего элемента 
//Возврат:Статус - ЭтотОбъект, ТекущийЭлемент
Функция обПолучитьСсылкуИзФормы(Форма, Статус=Неопределено) Экспорт
    Ссылка=Неопределено;
    Попытка
        Ссылка=Форма.ЭтотОбъект.Ссылка;
    Исключение
    КонецПопытки;
    

    
    Если Ссылка=Неопределено Тогда
        Для н=0 по Форма.ЭлементыФормы.Количество()-1 Цикл
            ТекДанные=Форма.ЭлементыФормы[н].Данные;
            Если ТекДанные<>"" И Найти(Строка(Форма[ТекДанные]),"ДокументСписок")<>0 Тогда
                СписокФормы=Форма.ЭлементыФормы[н];
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если СписокФормы<>Неопределено Тогда
            Если СписокФормы.ТекущиеДанные<>Неопределено Тогда
                Ссылка=СписокФормы.ТекущиеДанные.Ссылка;
            Иначе
                Сообщить("Не могу найти в данной форме текущий элемент.",СтатусСообщения.Важное);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Возврат Ссылка;
КонецФункции


//Устанавливает/сбрасывает/инвертирует пометку всем элементам указанного списка 
//Список:СписокЗначений
//Кнопка:Кнопка - кнопка, которой нажата 
//КнопкаУстановить:Кнопка - кнопка, котороя устанавливает все пометки 
//КнопкаСнять:Кнопка - кнопка, которая снимает все пометки
//КнопкаИнверсия:Кнопка - кнопка, которая инвертирует все пометки
//Пример вызова:
//Процедура УстановитьФлажки(Элемент)
//    обУстановитьПометкуСпискаВФорме(СписокОтчетов, Элемент, ЭлементыФормы.КнПометитьВсе, ЭлементыФормы.КнСнятьВсе);
//КонецПроцедуры
//Отлажена: 20060922 Гений 1С
Функция обУстановитьПометкуСпискаВФорме(Список, Кнопка, КнопкаУстановить=Неопределено, КнопкаСнять=Неопределено, КнопкаИнверсия=Неопределено) Экспорт
    Если Кнопка=Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    Если Кнопка=КнопкаУстановить Тогда
        обУстановитьВсеПометкиСписка(Список, истина);                
    ИначеЕсли Кнопка=КнопкаСнять Тогда
        обУстановитьВсеПометкиСписка(Список, ложь);                
    ИначеЕсли Кнопка=КнопкаИнверсия Тогда
        обУстановитьВсеПометкиСписка(Список, Неопределено);                
    КонецЕсли;
КонецФункции


#КонецЕсли


//20060926 добавил 
//    обОбъединитьМассивы, обСкопироватьМассив,обКоллекцияВМассив,обКоллекцияВТаблицуЗначений
//20060926 добавил функции для быстрого вывода таблиц значений в отчет
//    обВывестиДанныеВОтчет
//    обУстановитьИзмеренияПостроителяОтчета, обУстановитьИтогиПостроителяОтчета, обСкорректироватьПорядокИзмеренийПостроителяОтчета
//    обПреобразоватьМакетПостроителя, обЗаменитьТекстМакета, обПереименоватьОбластьМакета
//20060927 добавил
//    обПутьСоСлешем, обМакетВТаблицуЗначений, обЭтоБуква, обЭтоЦифра, обЭтоИдентификатор
//20061004 добавил
//    обОбъединитьСписки, обСклеитьСписки


Добавьте свои функции ЗДЕСЬ


...

Замечания и выявленные баги


...

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика