Книга знаний

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

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

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

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



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

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

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

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



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


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

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



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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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


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

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

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

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


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

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

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

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


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

Функция обУстановитьПометкуСпискаВФорме(Список, Кнопка, КнопкаУстановить=Неопределено, КнопкаСнять=Неопределено, КнопкаИнверсия=Неопределено) Экспорт
    Если Кнопка=Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    Если Кнопка=КнопкаУстановить Тогда
        обУстановитьВсеПометкиСписка(Список, истина);                
    ИначеЕсли Кнопка=КнопкаСнять Тогда
        обУстановитьВсеПометкиСписка(Список, ложь);                
    ИначеЕсли Кнопка=КнопкаИнверсия Тогда
        обУстановитьВсеПометкиСписка(Список, Неопределено);                
    КонецЕсли;
КонецФункции
#КонецЕсли


История библиотеки


...

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


...

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


...

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

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