Проект

Общее

Профиль

Универсальные процедуры и функции » История » Версия 32

« Предыдущее - Версия 32/38 (Разница(diff)) - Следующее » - Текущая версия
Всеволод Дорофеев, 08.12.2021 14:28


Универсальные процедуры и функции


h3. Проверить, что описание типа состоит из единственного типа значения и совпадает с нужным типом.

// Проверить, что описание типа состоит из единственного типа значения и 
// совпадает с нужным типом.
//
// Возвращаемое значение:
//   Булево      - Совпадает или нет
//
Функция ОписаниеТипаСостоитИзТипа(ОписаниеТипа, ТипЗначения) Экспорт

    Если ОписаниеТипа.Типы().Количество() = 1
       И ОписаниеТипа.Типы().Получить(0) = ТипЗначения Тогда
        Возврат Истина;
    КонецЕсли;

    Возврат Ложь;

КонецФункции

УТ11:
    ОписаниеСвойства.Булево = ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип("Булево"));

Функция ЕстьРеквизитОбъекта - проверяет наличие у произвольного объекта реквизита с указанным именем (УТ11.ОбщегоНазначенияУТКлиентСервер)

#Область МетодыРаботыСРеквизитамиОбъектов

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

    КлючУникальности   = Новый УникальныйИдентификатор;
    СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);

    ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);

    Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;

КонецФункции

#КонецОбласти

Проверка битых ссылок

ЭтоБитаяСсылка = не ЗначениеЗаполнено(Ссылка.ВерсияДанных);

МенеджерИсторииРаботыПользователя

// Добавить событие в историю работы пользователя
ИсторияРаботыПользователя.Добавить(ПолучитьНавигационнуюСсылку(Объект.Ссылка));

ОтображениеСостояния

Очистка окна сообщений

Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Пример:

ОчиститьСообщения();

Отбор в таблице значений (табличной части) с помощью построителя запроса

&НаСервере
Функция ПолучитьКоличествоПодобраноПоСтрокеНаСервере(ИсходнаяНоменклатура)

   ПостроительЗапр = Новый ПостроительЗапроса;
   ПостроительЗапр.ИсточникДанных = Новый ОписаниеИсточникаДанных(Объект.НоваяНоменклатура.Выгрузить());
   Отбор = ПостроительЗапр.Отбор.Добавить("ИсходнаяНоменклатура");
   Отбор.ВидСравнения = ВидСравнения.Равно;
   Отбор.Значение = ИсходнаяНоменклатура;
   Отбор.Использование = Истина;
   ПостроительЗапр.Выполнить();
   ПостроительЗапр.Результат.Выгрузить().Итог("Количество");

КонецФункции

Запись справочника

Функция ЗаписатьСправочник(ТекущийОбъект,Заголовок="",РежимСообщений="Все",РежимЗагрузки=Ложь) Экспорт

    ДействиеВыполнено  = Ложь;

    ВыводитьОшибки     = ?(РежимСообщений="Все" ИЛИ РежимСообщений="Ошибки",Истина,Ложь);
    ВыводитьИнформацию = ?(РежимСообщений="Все",Истина,Ложь);

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

    Возврат ДействиеВыполнено;
КонецФункции //ЗаписатьПровестиДокумент()

Запись и проведение документа

// Процедура выполняет запись/проведение/отмену проведения документа.
//
// Параметры:
//  ТекущийОбъект  – ДокументОбъект,СправочникОбъект.
//  РежимЗаписи    - РежимЗаписиДокумента.
//  Заголовок      - Строка.
//  РежимСообщений - Строка: "Нет","Все","Ошибки".
//
// Возвращаемое значение:
//   ДействиеВыполнено   – Булево.
//
Функция ЗаписатьПровестиДокумент(ТекущийОбъект,РежимЗаписи,Заголовок="",РежимСообщений="Все") Экспорт

    ДействиеВыполнено  = Ложь;

    ВыводитьОшибки     = ?(РежимСообщений="Все" ИЛИ РежимСообщений="Ошибки",Истина,Ложь);
    ВыводитьИнформацию = ?(РежимСообщений="Все",Истина,Ложь);

    Если РежимЗаписи = РежимЗаписиДокумента.Запись ИЛИ РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

        Попытка

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

    КонецЕсли; 

    Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

        Попытка

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

    КонецЕсли; 

    Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда

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

    КонецЕсли; 

    Возврат ДействиеВыполнено;
КонецФункции // ЗаписатьПровестиДокумент()

Проверка на пустую дату

Пустая дата

Дата("00010101");
Дата(1, 1, 1);
Дата("00010101000000");
Дата("0001-01-01");

Создание пустой таблицы значение на основании табличной части Документа

    Товары = Документы.ПоступлениеТоваровУслуг.ПустаяСсылка().Товары.ВыгрузитьКолонки();

Создание структуры со свойствами, как колонки таблицы, переданной строки

// Функция СтрокаТаблицыЗначенийВСтруктуру создает
// структуру со свойствами, как колонки таблицы
// значений передаваемой строки
// и устанавливает этим свойствам значения
// из строки таблицы значений.
// 
// Параметры:
//  СтрокаТаблицыЗначений - СтрокаТаблицыЗначений.
//
// ВозвращаемоеЗначение:
//  Структура
//
Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт

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

    Возврат Структура;

КонецФункции

Загрузка таблицы/соответствия из макета с помощью построителя отчета

Функция ЗаполнитьСоответствиеИзМакета(ИмяМакета)

    Макет = ПолучитьМакет(ИмяМакета);
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Макет.Область());
    ТЗ = ПостроительЗапроса.Результат.Выгрузить();

    Результат = Новый Соответствие;
    Для каждого Стр Из ТЗ Цикл
        Результат.Вставить(Стр.Колонка1, Стр.Колонка2);
    КонецЦикла;

    Возврат Результат;

КонецФункции

Получение прописью месяца в родительном падеже

ОбластьТела.Параметры.ДатаУдостоверенияМесяц = Сред(Формат(ДатаУдостоверения, "ДФ=ddMMMM"),3);

Число прописью

//
ЧислоПрописью(СтруктураОснований.Сумма, "Л=ru_RU;ДП=Истина", "рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2");

//без дробной части
Числопрописью = ЧислоПрописью(ДанныеПечати.МассаБрутто, "Л=ru_RU; НП=Ложь",",,,,,,,,0")

Склонения по падежам

https://spb.koderline.ru/expert/programming/article-sklonenie-v-1s/#jakor6

//Возвращает массив
Массив = ПолучитьСклоненияСтрокиПоЧислу("место", ДанныеПечати.ссылка.г_КоличествоМестТН, "", "ЧС=Количественное", "ПД=Именительный")

Варианты преобразования даты из строки (конвертация строки в дату)

Проще всего преобразовать строку вида «20151215204222» используя метод «Дата»:

Дата(«20151215204222»)  // 15.12.2015 20:42:22

Со строкой «15.12.2015 20:42:22» также прекрасно справляется типовой метод:

Дата(«15.12.2015 20:42:22»)  //15.12.2015 20:42:22

Второй вариант, если мы знаем отдельные составляющие даты в строковом формате: год, месяц, день и т.д:

Дата(«2015″,»12″,»15″,»20″,»42″,»22»)  // 15.12.2015 20:42:22

Пример преобразования строки вида «2015-12-15 20:42:22»:

СтроковаяДата = «2015-12-15 20:42:22»;
СтроковаяДата = СтрЗаменить(СтроковаяДата , «-«,»»);
СтроковаяДата = СтрЗаменить(СтроковаяДата , «:»,»»);
НоваяДата = Дата(СтроковаяДата ); // 15.12.2015 20:42:22

Если дата указан так «20:42:22 2015/12/15» можно преобразовать её следующим образом:

СтроковаяДата = «20:42:22 2015/12/15»;
СтроковаяДата = СтрЗаменить(СтроковаяДата , «/»,»»);
СтроковаяДата = СтрЗаменить(СтроковаяДата , «:»,»»);
НоваяДата = Дата(Прав(СтроковаяДата , 8) + Лев(СтроковаяДата ,6));

Генератор случайных чисел

        ГСЧ = Новый ГенераторСлучайныхЧисел();
        СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 100000);

Пересохранение книги в Эксель (Excel) с отображением листов

http://infostart.ru/public/323606/
Код:

Для v8:

ТабДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS);

Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ПолноеИмяФайла); 
Excel.Visible = 0;

Excel.ActiveWindow.DisplayWorkbookTabs = 1; 
Excel.ActiveWindow.TabRatio = 0.6;         

FullName = Excel.ActiveWorkbook.FullName;            
Excel.DisplayAlerts = false;
Excel.ActiveWorkbook.SaveAs(FullName, 18); // 18 - xls 97-2003; 51 - xlsx 2007-2013

//Excel.Visible = 1;       // если нужно поработать дальше с книгой
//Excel.Application.Quit() // если просто выходим

Для v7.7:


ТабДокумент.Записать(ПолноеИмяФайла, "XLS");

Excel = СоздатьОбъект("Excel.Application");
Excel.WorkBooks.Open(ПолноеИмяФайла); 
Excel.Visible = 0; 

Excel.ActiveWindow.DisplayWorkbookTabs = 1; 
Excel.ActiveWindow.TabRatio = 0.6;

FullName = Excel.ActiveWorkbook.FullName;            
Excel.DisplayAlerts = false;
Excel.ActiveWorkbook.SaveAs(FullName, 18); // 18 - xls 97-2003; 51 - xlsx 2007-2013

//Excel.Visible = 1;       // если нужно поработать дальше с книгой
//Excel.Application.Quit() // если просто выходим

Функция ВернутьТолькоЦифры

Функция ВернутьТолькоЦифры(прСтрока)

    Рез = "";
    Для п = 1 По СтрДлина(прСтрока) Цикл
        Симв = Сред(прСтрока, п, 1);
        Если Симв>="0" И Симв<="9" Тогда
            Рез = Рез + Симв;
        КонецЕсли;
    КонецЦикла;

    Возврат Рез;

КонецФункции

Установить новую ссылку для еще не записанного объекта.

Например, в модуле объекта


    Если ЭтоНовый() Тогда

        СсылкаНаОбъект = ПолучитьСсылкуНового();

        Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда

            СсылкаНаОбъект = Документы.ЗаданиеНаПеревозку.ПолучитьСсылку();
            УстановитьСсылкуНового(СсылкаНаОбъект);

        КонецЕсли;

    Иначе

        СсылкаНаОбъект = Ссылка;

    КонецЕсли;     

Получение документа (паспорт) физического лица

#Паспорт #УТ11 ФизЛицо #РегистрСведений.ДокументыФизическихЛиц

    ПаспортныеДанные = ?(ЗначениеЗаполнено(РезультатШапкаДокументов.Ссылка.Водитель), 
            ФизическиеЛицаУТ.ПолучитьДокументФизическогоЛицаПоУмолчанию(РезультатШапкаДокументов.Ссылка.Водитель,Справочники.ВидыДокументовФизическихЛиц.ПаспортРФ, РезультатШапкаДокументов.Дата),
            "");