15 окт. 2016 г.

Вывести диаграмму в две колонки 1С

Например, нужно вывести две диаграммы горизонтально.
Процедура Сформировать() 

 Результат.Очистить(); // Результат - это реквизит управляемой формы с типом ТабличныйДокумент
 Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет"); 
 
 Д1Макет = Д1(Макет); // в этой функции на выход будет ТабличныйДокумент с нарисованной первой диаграммой

 Д2Макет = Д2(Макет); // в этой функции на выход будет ТабличныйДокумент с нарисованной второй диаграммой
  
 Результат.Вывести(Д1Макет); 
 Результат.Присоединить(Д2Макет); 

КонецПроцедуры


Функция Д1(Макет)
    
    График = Макет.ПолучитьОбласть("Д1|Д1Г");
    
КонецФункции

Функция Д2(Макет)
    
    График = Макет.ПолучитьОбласть("Д2|Д2Г");

КонецФункции
Вся соль в том, что в макете, который мы получаем программно, а с макета области, где расположены "рисунки" диаграммы мы задаем имя не только горизонтальной области, а и вертикальной

и как раз при получении области мы указываем не только горизонтальную, а и вертикальную область
Макет.ПолучитьОбласть("Д2|Д2Г"); 
в итоге

29 сент. 2016 г.

RLS Объект не найден Отчеты

После применения RLS к Справочники.Подразделения, типовым отчетом решил глянуть Продажи по подразделениям и в результате получил много строчек "объект не найден"


в прочем это и логично, ведь мы запретили видеть некоторые Подразделения но не запретили их выводить (не отфильтровали) сами "отчеты", а точнее таблицы откуда берут данные отчеты, а это - регистры.

Значит открываю Регистры.Продажи, добавляю правило к Действию Чтения и пишу
Продажи ГДЕ Продажи.Подразделение В
 (ВЫБРАТЬ
 НастройкиПользователей.Значение
 ИЗ
 РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
 ГДЕ
 НастройкиПользователей.Пользователь = &ТекущийПользователь
 И НастройкиПользователей.Настройка.Код = "00005")
Этим самым мы наложим фильтр через RLS, что бы видеть в результате отчет только
своих указаных в настройках пользователя Подразделения, а все другие данные по другим
подразделениям - фильтруем (отбрасываем)

Результат






RLS доступ к справочнику с иерархией элементов

Эта заметка продолжение ниже заметки.
Нужно конкретному пользователю в списке Справочники.Подразделения с иерархией элементов разрешить видеть только свои подразделения. Свои подразделения настраиваются в РегистреСведений.НастройкиПользователя.

Так как и ниже в заметке весь "секрет" ограничения заключается в том, что нужно сначала обращаться к Родителю, а потом к самому Элементу справочника, что бы пользователь при открытии Справочники.Подразделения мог видеть только разрешенные ему подразделения.

В настройке RLS в право на Чтение добавляем правило
Подразделения ГДЕ (Подразделения.Ссылка В
    (ВЫБРАТЬ
     НастройкиПользователей.Значение.Родитель
    ИЗ
     РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
    ГДЕ
     НастройкиПользователей.Пользователь = &ТекущийПользователь
     И НастройкиПользователей.Настройка.Код = "00005")
   ИЛИ Подразделения.Ссылка В
    (ВЫБРАТЬ
     НастройкиПользователей.Значение
    ИЗ
     РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
    ГДЕ
     НастройкиПользователей.Пользователь = &ТекущийПользователь
     И НастройкиПользователей.Настройка.Код = "00005"))
Результат

СправочникСписок.Отбор Иерархия элементов

Есть справочник Подразделение с иерархией элементов. Нужно при открытии этого справочника, в списке видеть только конкретный элемент иерархического справочника.

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

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

  СправочникСписок.Отбор.Ссылка.Использование = Истина;
  СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
  СправочникСписок.Отбор.Ссылка.Значение = Список;


вся соль вот в этой строчке

  Список.Добавить(Справочники.Подразделения.НайтиПоКоду("000000002").Родитель);

этим самым мы сначала пихаем в отбор Родителя, а потом и сам элемент, это все помещаем в списке значений так как вид сравнения будем использовать ВСписке

Результат


28 сент. 2016 г.

Есть ли Свойство в ЭлементыФормы

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

КонецЦикла;
КонецПроцедуры

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

20 сент. 2016 г.

Установить курсор на конкретную строку таблицы значений

Элементерно, но все же, например, нужно установить в Таблице значений управляемых формах курсор (активность) на последнюю строку

Элементы.СтрокиВыпускПродукции.ТекущаяСтрока =
ЭтаФорма.СтрокиВыпускПродукции.Получить(СтрокиВыпускПродукции.Количество()-1).ПолучитьИдентификатор();

19 сент. 2016 г.

Из Com объекта в таблицу значений

На вход передаем Com объект, на выходе будем иметь ТаблицуЗначений с наименованием колонок аналогично свойствам Com объекта + заполнена ТаблицаЗначений данными с Com объекта.
Функция ИзComВТаблицуЗначений(Com)
 //Перемещаем указатель на первую запись.
 Com.MoveFirst(); 
 
 Таблица = Новый ТаблицаЗначений; 
 ОдинРаз = Неопределено;
 
 //Начинаем перебор записей из субд
 Пока Com.EOF() = 0 Цикл
  
  //Заполним колонки
  Если ОдинРаз = Неопределено Тогда 
   Для Каждого Значение Из Com.Fields Цикл 
    Таблица.Колонки.Добавить(Значение.Name);
   КонецЦикла; 
   ОдинРаз = Истина;
  КонецЕсли;
  
  //Заполняем таблицу значений
  НовСтрока = Таблица.Добавить();
  Для Каждого Колонка Из Таблица.Колонки Цикл 
   Для Каждого Значение Из Com.Fields Цикл 
    Если Колонка.Имя = Значение.Name Тогда 
     НовСтрока[Колонка.Имя] = Значение.Value;
    КонецЕсли;    
   КонецЦикла;
  КонецЦикла;
  
  // Перемещаем указатель.
  Com.MoveNext();    
 КонецЦикла;    
 Возврат Таблица
КонецФункции

Очистка таблицы значений от ненужных строк

//Очистка ТЗ от ненужных строк, алгоритм Эльниньо

 ТЗ.ВыбратьСтроки();
 Пока ТЗ.ПолучитьСтроку() = 1 Цикл 
  
     Пока ТЗ.ЧтоТо = Ненужное Цикл
          ТЗ.УдалитьСтроку();
          Если ТЗ.НомерСтроки = 0 Тогда Прервать; КонецЕсли;
  КонецЦикла;

 КонецЦикла;

Правильное удаление строк из таблицы значений

//******************************************************************************
// ОчисткаТЗ()
// Параметры: ТЗ, которую надо очистить
// В ТЗ д.б. Колонки с идентификаторами "НадоУдалить" и "ОПС" (оригинальный порядок строк)
// Описание: очищает ТЗ от ненужных строк
Процедура глОчисткаТЗ(ТЗдляЧистки, ОПС="+ОПС", КолонкаУдалить="НадоУдалить", Режим=0) Экспорт
 
 Попытка  НадоУдалить = ТЗдляЧистки.Итог(КолонкаУдалить);
 Исключение Возврат;
 КонецПопытки;
 
 ТЗКС = ТЗдляЧистки.КоличествоСтрок();
 Если Режим <> 0 Тогда
  Сообщить("> ["+ТекущееВремя()+"]: *** удаляем "+НадоУдалить+" из "+ТЗКС+" ****"); 
 КонецЕсли;
 
 Если НадоУдалить <= 0 Тогда Возврат; КонецЕсли;
 
 Если НадоУдалить >= ТЗКС Тогда
  ТЗдляЧистки.УдалитьСтроки();
 Иначе
  ТЗРаб = СоздатьОбъект("ТаблицаЗначений"); ТЗдляЧистки.Выгрузить(ТЗРаб);
  ТЗРаб.Сортировать("+"+КолонкаУдалить); ТЗРаб.Выгрузить(ТЗдляЧистки,1,ТЗКС-НадоУдалить);
  ТЗРаб = 0;
 КонецЕсли;
 Если ПустаяСтрока(ОПС) = 1 Тогда Возврат; КонецЕсли; //сортировать не надо
 Если ОПС = "###" Тогда Возврат; КонецЕсли; //сортировать не надо
 //восстановим оригинальный порядок строк
 ТЗдляЧистки.Сортировать(ОПС);
КонецПроцедуры //глОчисткаТЗ()

Обмен сообщениями в 1С

При запуске 1С-ки в управляемом приложении подключается обработчик ожидания и обращается каждые 180 секунд к общему модулю, где в свою очередь идет обращение к функции, которая возвращает, есть ли для пользователя, который запустил 1С-ку сообщение, если сообщение есть, сообщения показывается на экран.

Отправка сообщения осуществляется с помощью обработки, в которой можно


  • выбрать одного или несколько получателей для отправки им сообщения (уведомления)
  • по кнопке "Открыть регистр сообщений" просмотреть сообщение которое будет отправлено для конкретного пользователя (пользователей)

-------------------------------------------------------------------------------------------------
!В конфигурации должен быть:
  • Справочник.Пользователи
  • ПараметрыСеанса.ТекушийПользователь
-------------------------------------------------------------------------------------------------

Для реализации обмена сообщениями в 1С в конфигурацию я добавил 

РегистрСведений СообщенияПользователям
Измерения: Пользователь = СправочникСсылка.Пользователи
Ресурс: Сообщение = Строка


Общий модуль РаботаСПользователем (Глобальный, Клиент (упр. приложение),Клиент (об. приложение))


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


где написал
Функция ПолучитьСообщенияДляКонкретногоПользователя() Экспорт
               ТекущийПользователь = Справочники.Пользователи.НайтиПоНаименованию(ПараметрыСеанса.ТекушийПользователь.Наименование,Истина);
              
               Запрос = Новый Запрос;
               Запрос.Текст =
                               "ВЫБРАТЬ
                               |              СообщенияПользователям.Сообщение
                               |ИЗ
                               |              РегистрСведений.СообщенияПользователям КАК СообщенияПользователям
                               |ГДЕ
                               |              СообщенияПользователям.Пользователь = &Пользователь";
              
               Запрос.УстановитьПараметр("Пользователь", ТекущийПользователь);
              
               РезультатЗапроса = Запрос.Выполнить().Выгрузить();
              
               Если РезультатЗапроса.Количество() = 0 Тогда
                               Возврат "";
               Иначе
                               Возврат РезультатЗапроса[0].Сообщение;
               КонецЕсли;
КонецФункции

Процедура УстановитьНовоеСообщениеДляПользователя(СообщениеДляПользователя,ТекущийПользователь) Экспорт      
               НаборЗаписей = РегистрыСведений.СообщенияПользователям.СоздатьНаборЗаписей();
               НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь);
              
               НовЗапись = НаборЗаписей.Добавить();
               НовЗапись.Пользователь = ТекущийПользователь;
               НовЗапись.Сообщение = СообщениеДляПользователя;
               НаборЗаписей.Записать(Истина);
КонецПроцедуры

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

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