Показаны сообщения с ярлыком 1С Предприятие. Показать все сообщения
Показаны сообщения с ярлыком 1С Предприятие. Показать все сообщения

7 февр. 2021 г.

Найти объект в базе по УИД

 Один из способов найти по УИДу объект в базе

Функция ПолучитьОбъектПоУИД(УИДОбъекта)  

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

Программно добавить кнопки на форму

 Есть форма (УФ) на которой размещено две группы 

"Справочники", "Документы"

нужно вывести все справочники и документы из конфигурации в виде кнопок на эту форму в подходящую группу

Результат должен быть таким


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

Соответственно, нужно в ручном режиме добавить процедуры нажатия по примеру

&НаКлиенте
Процедура Действие_Контрагенты(Команда)
    
    ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");
    
КонецПроцедуры

&НаКлиенте
Процедура Действие_Номенклатура(Команда)
    
    ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");
    
КонецПроцедуры


Удалить спецсимволы

 Для удаления спецсимволов используем два подхода:

1.
Функция УбратьЛишниеСимволы(Строка1) Экспорт
    НовСтрока = "";
    ПравильныеСимволы = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю";
    Для Сч = 1 по СтрДлина(Строка1) Цикл
        ТекСимв = Сред(Строка1, Сч, 1);
        Если Найти(ПравильныеСимволы, ТекСимв) > 0 Тогда
            НовСтрока = НовСтрока + ТекСимв;
        КонецЕсли;
    КонецЦикла;
    
    Возврат НовСтрока;
    
КонецФункции   

2.
Функция УбратьЛишниеСимволы(Строка1)
    
    мСпецСимволов = Новый Массив;
    мСпецСимволов.Добавить(",");
    мСпецСимволов.Добавить(".");
    мСпецСимволов.Добавить("\");
    мСпецСимволов.Добавить("=");
    мСпецСимволов.Добавить("-");
    мСпецСимволов.Добавить("_");
    мСпецСимволов.Добавить("/");
    мСпецСимволов.Добавить("!");
    мСпецСимволов.Добавить("@");
    мСпецСимволов.Добавить("#");
    мСпецСимволов.Добавить("$");
    мСпецСимволов.Добавить("%");
    мСпецСимволов.Добавить("^");
    мСпецСимволов.Добавить("&amp;");
    мСпецСимволов.Добавить("""");
    мСпецСимволов.Добавить("`");
    мСпецСимволов.Добавить("'");
    мСпецСимволов.Добавить("?");
    мСпецСимволов.Добавить("*");
    мСпецСимволов.Добавить("(");
    мСпецСимволов.Добавить(")");
    мСпецСимволов.Добавить("№");
    мСпецСимволов.Добавить(";");
    мСпецСимволов.Добавить("%");
    мСпецСимволов.Добавить("");
        
    Для Каждого СпецСимвол Из мСпецСимволов Цикл 
        Строка1 = СтрЗаменить(Строка1, СпецСимвол, " ");
    КонецЦикла;
        
    Возврат Строка1;
    
КонецФункции   


Сохранить файл через браузер

 Для сохранения файла в контексте "Управляемых форм" используя браузер используем ниже подход

&НаКлиенте
Процедура СохранитьВФайл(Команда)
      
    #Если ВебКлиент Тогда      
        // Попробуем подключить расширение работы с файлами
        РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
        Если НЕ РасширениеПодключено Тогда
            // Расширение не установлено, пробуем установить
            НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("Подключение1",ЭтаФорма,));  
        КонецЕсли;
    #КонецЕсли   
    
    // Поместим табличный документ во временной хранилище как файл MS Excel
    АдресХранилища = ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабДок, "xlsx", ТипФайлаТабличногоДокумента.XLSX);
    
    Если АдресХранилища = Неопределено Тогда
        ПоказатьПредупреждение( , НСтр("ru = 'Ошибка сохранения файла'; uk = 'Помилка збереження файлу'"));
        Возврат;
    КонецЕсли;
        
    Попытка
        // Сам момент сохранения
        ПолучитьФайл(АдресХранилища, ЗаголовокДляФайла+".xlsx", Истина);
    Исключение              
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "ru = 'Не удалось записать файл. Возможно, недостаточно места на диске, диск защищен от записи или не подключено расширение для работы с файлами.'; uk = 'Не вдалося записати файл. Можливо, недостатньо місця на диску, диск захищений від запису або не має з''єднання розширення для роботи з файлами.'";
        Сообщение.Сообщить();
    КонецПопытки;
    
КонецПроцедуры
&НаСервере
Функция ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, Расширение, ТипФайла)
    
    АдресХранилища  = Неопределено;
    ИмяФайла        = ПолучитьИмяВременногоФайла(Расширение);
    
    Попытка
        ТабличныйДокумент.Записать(ИмяФайла, ТипФайла);
        АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
    Исключение
        Сообщить(ОписаниеОшибки()); ВызватьИсключение;
    КонецПопытки;
    
    Возврат АдресХранилища;
    
КонецФункции
&НаКлиенте
Процедура Подключение1(Подключено,ДопПараметры)Экспорт 
    
    Если Не Подключено Тогда
        НачатьУстановкуРасширенияРаботыСФайлами();
    КонецЕсли;
    
КонецПроцедуры
&НаКлиенте
Процедура Установка2(ДопПараметры)Экспорт 
КонецПроцедуры

Обработка заполнения табличной части

 Шаблон обработки заполнения табличной части для "Управляемых форм" выглядит так

Модуль объекта должен иметь основную экспортную функцию с именем СведениеОВнешнейОбработки()

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

В модуле формы

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт   
    БезОшибок = Истина;   
    Если БезОшибок Тогда
        ПоказатьПредупреждение(, НСтр("ru = 'Выполнено без ошибок'; uk = 'Виконано без помилок'"))
    Иначе 
        ПоказатьПредупреждение(, НСтр("ru = 'При обработке данных возникли ошибки'; uk = 'Під час обробки даних виникли помилки'")) 
    КонецЕсли;  
    //для обновления отображения
    Для Каждого стрДок Из ОбъектыНазначенияМассив Цикл 
        п = Новый Структура("Ключ", стрДок);
        Форма = ПолучитьФорму("Документ.НалоговаяНакладная.ФормаОбъекта", п);
        Форма.Прочитать();
    КонецЦикла; 
КонецПроцедуры  

Обращаю внимание на код ниже комментария
//для обновления отображения
Тут выполняется обновление табличной части, с которой был вызвана обработка заполнения

3 мар. 2020 г.

Вызов из внешней обработки Макет внешнего отчета

Потребовалось из внешнего отчета, который запущена вот этим способом получить макет отчета

Код имеет следующий вид

ВнешниеОтчеты - внешний отчет как объект, получен вот так _ВнешнийОтчет = ВнешниеОтчеты.Создать(ВнешнийОтчет.ИспользуемоеИмяФайла); СКД = _ВнешнийОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); Настройки = СКД.НастройкиПоУмолчанию;

2 мар. 2020 г.

Запуск метода внешней обработки по имени

В общий модуль помещаем процедуры и функции

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

Делаем вызов вот так

ОбработкаОбъект = ОбработаОбъектПолучить("ис_ФоновыйЗапсук_МодульИнтеграцииEDIN_0001"); СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("Источник", Источник); СтруктураПараметров.Вставить("ЗаказПокупателя", Источник.Сделка); ВыполнитьПроцедуруОбработки(ОбработкаОбъект, "исОбработкаЗаполненияРеализацияТоваровУслуг", СтруктураПараметров);

И в внешней обработке "ис_ФоновыйЗапсук_МодульИнтеграцииEDIN_0001" должна быть Экспортная процедура
"исОбработкаЗаполненияРеализацияТоваровУслуг" и один параметр "СтруктураПараметров"
из которого уже идет получение по имени значений структуры.

Обращаю внимание, что экспортная процедура должна иметь название параметра
точно такое как и передается т.е.

исОбработкаЗаполненияРеализацияТоваровУслуг(СтруктураПараметров) Экспорт
 

CopyPaste Copyright © 2017 - |- Шаблон создан O Pregador - |- Отредактирован myr4ik07