1с сохранить отбор в реквизите
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
четверг, 6 марта 2014 г.
Сохранение параметров и отборов при изменении варианта отчет (толстый клиент)
Как мы знаем, при изменении варианта отчета в СКД, происходит и замена всех его настроек, включая параметры, отборы. Это не очень удобно, т.к. при каждом изменении нужно будет вводить его параметры и отборы вручную. Чтобы выполнить сохранение настроек параметров и отборов при изменении варианта отчета напишем несколько нехитрых строк кода. В качестве примера будет взят ШаблонСКД.epf и в нем доработано сохранение параметров и отборов.
Код следующий:
Процедура _СменаВариантаНастройки ( Элемент )
Для каждого Настройка Из СхемаКомпоновкиДанных . ВариантыНастроек Цикл
Если Элемент . Текст = Настройка . Представление тогда
// 1. сохраняем текущие настройки варианта отчета
ПредыдущиеНастройки = КомпоновщикНастроек . Настройки ;
// 2. загружаем новый вариант отчета
КомпоновщикНастроек . ЗагрузитьНастройки ( Настройка . Настройки );
// 3. оставляем старые параметры при изменении варианта отчета
ТекущиеНастройки = КомпоновщикНастроек . Настройки ;
Для Каждого текЭлемент Из ПредыдущиеНастройки . ПараметрыДанных . Элементы Цикл
текПараметр = ТекущиеНастройки . ПараметрыДанных . Элементы . Найти ( текЭлемент . Параметр );
Если НЕ текПараметр = Неопределено Тогда
ЗаполнитьЗначенияСвойств ( текПараметр , текЭлемент );
КонецЕсли;
КонецЦикла;
// 4. оставляем старый отбор
текОтбор = КомпоновщикНастроек . Настройки . Отбор . Элементы ;
текОтбор . Очистить ();
Для Каждого ЭлементОтбора Из ПредыдущиеНастройки . Отбор . Элементы Цикл
нЭлемент = текОтбор . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЗаполнитьЗначенияСвойств ( нЭлемент , ЭлементОтбора );
КонецЦикла;
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
суббота, 21 декабря 2013 г.
Сохранение/восстановление отборов СКД в регистр "Сохраненные настройки"
В продолжение статьи Выгрузка результата СКД в таблицу значений рассмотрим, как установить отбор для созданной нами СКД, а также сохранять и восстанавливать настройки отбора и периода.
Для сохранения будут использоваться стандартные процедуры, которые применяются в отчетах в толстом клиенте (регистр сведений "Сохраненные настройки").
1) Для начала добавим в обработку реквизит "НастройкаОтбора" - тип "Строка", неограниченной длины. В этом реквизите и будет храниться наш отбор. Сохранять отбор будем с помощью функции сохранения значений ЗначениеВСтрокуВнутр(), а восстанавливать - ЗначениеИзСтрокиВнутр().
3) Откроем форму выберем пункт меню "Форма" - "Вставить элемент управления. " и добавим табличную часть "НастройкаОтбора" вместе с командной панелью.
4) Откроем свойства табличной части и в поле "Данные" выберем тип "КомпоновщикНастроек.Настройки.Отбор". Табличная часть примет вид как на рисунке ниже.
На панели формы создадим две кнопки "Сохранить" и "Восстановить настройки", а в модуле формы определим такой код:
Перем СКД ;
Перем мТекущаяНастройка ;
Процедура КнопкаВыполнитьНажатие ( Кнопка )
Продажи . Загрузить ( РезультатКомпоновкиВТЗ ( СКД , КомпоновщикНастроек ));
Процедура ПередОткрытием ( Отказ , СтандартнаяОбработка )
СохраненнаяНастройка = ?( ЗначениеЗаполнено ( НастройкаОтбора ), ЗначениеИзСтрокиВнутр ( НастройкаОтбора ),Неопределено);
КомпоновщикНастроек . Инициализировать (Новый ИсточникДоступныхНастроекКомпоновкиДанных ( СКД ));
Настройки = ?(НЕ СохраненнаяНастройка = Неопределено, СохраненнаяНастройка , СКД . НастройкиПоУмолчанию );
КомпоновщикНастроек . ЗагрузитьНастройки ( Настройки );
// Процедура восстановления сохраненных настроек
//
Процедура ВосстановитьНастройки () Экспорт
СтруктураНастройки = Новый Структура ;
СтруктураНастройки . Вставить ( "Пользователь" , глЗначениеПеременной ( "глТекущийПользователь" ));
СтруктураНастройки . Вставить ( "ИмяОбъекта" , Строка ( ЭтотОбъект ));
СтруктураНастройки . Вставить ( "НаименованиеНастройки" , ?( мТекущаяНастройка = Неопределено, Неопределено, мТекущаяНастройка . НаименованиеНастройки ));
Результат = УниверсальныеМеханизмы . ВосстановлениеНастроек ( СтруктураНастройки );
Если Результат <> Неопределено Тогда
мТекущаяНастройка = Результат ;
ВосстановитьНастройкиИзСтруктуры ( Результат . СохраненнаяНастройка );
// Процедура сохранения настроек
//
Процедура СохранитьНастройки () Экспорт
СтруктураНастройки = Новый Структура ;
СтруктураНастройки . Вставить ( "Пользователь" , глЗначениеПеременной ( "глТекущийПользователь" ));
СтруктураНастройки . Вставить ( "ИмяОбъекта" , Строка ( ЭтотОбъект ));
СтруктураНастройки . Вставить ( "НаименованиеНастройки" , ?( мТекущаяНастройка = Неопределено, Неопределено, мТекущаяНастройка . НаименованиеНастройки ));
СтруктураНастройки . Вставить ( "СохраненнаяНастройка" , СохраненнаяНастройка );
СтруктураНастройки . Вставить ( "ИспользоватьПриОткрытии" , Ложь);
СтруктураНастройки . Вставить ( "СохранятьАвтоматически" , Ложь);
Результат = УниверсальныеМеханизмы . СохранениеНастроек ( СтруктураНастройки );
Если Результат <> Неопределено Тогда
мТекущаяНастройка = Результат ;
Иначе
мТекущаяНастройка = СтруктураНастройки ;
КонецЕсли;
// Процедура восстановления значений реквизитов
//
Процедура ВосстановитьНастройкиИзСтруктуры ( СтруктураСНастройками ) Экспорт
Если ТипЗнч ( СтруктураСНастройками ) <> Тип ( "Структура" ) Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств ( ЭтотОбъект , СтруктураСНастройками );
ЗагрузитьНастройкуОтбора ();
// Процедура сохранения значений реквизитов
//
Процедура СформироватьСтруктуруДляСохраненияНастроек ( СтруктураСНастройками ) Экспорт
Если ТипЗнч ( СтруктураСНастройками ) <> Тип ( "Структура" ) Тогда
СтруктураСНастройками = Новый Структура ;
КонецЕсли;
СтруктураСНастройками . Вставить ( "НастройкаОтбора" , ЗначениеВСтрокуВнутр ( КомпоновщикНастроек . Настройки ));
СтруктураСНастройками . Вставить ( "НачалоПериода" , НачалоПериода );
СтруктураСНастройками . Вставить ( "КонецПериода" , КонецПериода );
Процедура ДействияФормыСохранитьНастройки ( Кнопка )
Процедура ДействияФормыВосстановитьНастройки ( Кнопка )
СКД = ПолучитьМакет ( "ПродажиЗаПериод" );
Функция РезультатКомпоновкиВТЗ ( СКД , КомпоновщикНастроек ) Экспорт
НастройкиКомпоновщика = КомпоновщикНастроек . Настройки ;
ПараметрыНастройки = НастройкиКомпоновщика . ПараметрыДанных ;
// устанавливаем параметры отчета
ЗначениеПараметра = ПараметрыНастройки . НайтиЗначениеПараметра (Новый ПараметрКомпоновкиДанных ( "НачалоПериода" ));
ЗначениеПараметра . Значение = НачалоПериода ;
ЗначениеПараметра = ПараметрыНастройки . НайтиЗначениеПараметра (Новый ПараметрКомпоновкиДанных ( "КонецПериода" ));
ЗначениеПараметра . Значение = КонецДня ( КонецПериода );
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновкиДанных = КомпоновщикМакета . Выполнить ( СКД , НастройкиКомпоновщика . Тип ( "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений" ));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновкиДанных . Инициализировать ( МакетКомпоновкиДанных );
ТаблицаРезультат = Новый ТаблицаЗначений ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
ПроцессорВывода . УстановитьОбъект ( ТаблицаРезультат );
ПроцессорВывода . Вывести ( ПроцессорКомпоновкиДанных );
6) После запуска обработки можно установить параметры: начало и конец периода, а также определить отбор. Потом сохранить настройку. При последующей работе можно вернуться к этой настройке нажав кнопку восстановления настроек. Как это сделать показано на скриншоте.
Пример обработки можно скачать ЗДЕСЬ.
В этой статье разберем, как работать с сохранением данных на форме в 1С 8.3.
Сохраняемые данные формы 1С
У любой управляемой формы можно настроить сохранение данных реквизитов формы. Это значит, что форма сохранит данные введенные в поля, которые соответствуют реквизитам, при закрытии формы, а при последующем открытии формы информация в этих полях восстановятся автоматически.
Например, у меня на форме обработки имеются поля, данные в которых сохраняются при закрытии формы и восстанавливаются при последующем открытии.
Это поля Контрагент и Цена.
Для того, чтобы на управляемой форме данные из соответствующих реквизитов сохранялись, необходимо выполнить следующие действия.
Первое. У свойства формы «Автоматическое сохранение данных в настройках» установить значение «Использовать».
Второе. После того, как будет установлено значение в свойство, которое упоминали выше, у реквизитов формы появится колонка «Сохранение». Именно в этой колонке и нужно поставить флажки рядом с теми реквизитами, значения которых мы хотим сохранять при закрытии формы.
После этих действий, данные у отмеченных реквизитов будут сохраняться.
Хранилище настроек в 1С
Вышеприведенный способ позволяет сохранять последние данные, с которыми работали на форме. Но, могут возникнуть ситуации, когда нужно будет сохранять какую-то произвольную комбинацию значений реквизитов, а потом восстановить её. Если рассматривать ситуацию выше, то это может быть комбинация контрагента и цены: для одного контрагента одна цена, для другого другая и т.д.
Для того, чтобы такая возможность имелась, необходимо в свойстве «Хранилище данных настроек» управляемой формы установить значение «Использовать список».
А потом, у нужных реквизитов формы следует установить флаг у свойства «Сохраняемые данные».
После таких изменений, у формы в группе Ещё появятся команды «Сохранить параметры» и «Восстановить параметры».
Теперь мы можем сохранить любую комбинацию реквизитов Контрагент – Цена.
И можем восстановить нужную комбинацию в любой момент работы с формой, а не только при открытии.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
В предыдущей статье Работа с набором записей регистра сведений мы узнали, как использовать объект набор записей регистра сведений для группового создания записей. В процессе записи набора наш регистр или полностью очищается, или добавляются новые записи, сохраняя при этом старые. Причем контроль уникальности по измерениям во втором случае не ведется, и может возникнуть ошибка «Запись с такими ключевыми полями существует!»
Но очень часто возникают задачи, когда нужно отредактировать какие-то уже имеющиеся записи, например, сделав отбор по какому-то одному или нескольким измерениям. Эти задачи выполняются при помощи отборов набора записей.
Рассмотрим следующую задачу: в моей конфигурации есть независимый периодический регистр сведений «ЦеныНаТопливо», который имеет следующую структуру.
Нам нужно изменить все цены конкурентного поставщика за все периоды, умножив их на какой-то коэффициент. Для решения этой задачи нам нужно установить отбор по нужному нам поставщику, прочитать данные, обойти полученный набор записей и рекурсивно изменить цену.
В этом коде с помощью свойства Отбор объекта НаборЗаписей сделать так, чтобы в наборе были записи, соответствующие только нужному нам поставщику.
В отборе как к свойству объекта можно обращаться ко всем измерениям регистра сведений и к периоду, если имеем дело с периодическим регистром сведений. Если регистр сведений подчинен регистратору, то отбор возможен только по регистратору.
Когда мы обращаемся к свойству объекта Отбор посредством названия измерения, то мы получаем объект Элемент отбора, у данного объекта только один метод — Установить. Данный метод устанавливает значение отбора.
Можно производить отбор по одному полю, а можно и по нескольким. В случае отбора по нескольким полям логическая связь между полями будет осуществляться с помощью булевой операции «И».
Имейте в виду, что отбор в регистрах сведений можно устанавливать только на равенство!
После того, как мы установили отбор, нам необходимо извлечь данные из базы в объект Набор записей, осуществляется это с помощью метода Прочитать. Этот метод считывает записи из базы данных по установленному отбору и записывает их в объект НаборЗаписей.
Как Вы уже знаете, объект Набор записей является коллекцией объектов Запись регистров сведений. Поэтому после того, как мы с помощью метода Количество проверили, есть ли в принципе записи по данному отбору, мы обходим данную коллекцию с помощью цикла: Для каждого…Цикл. Где переменная НормаЗапись является объектом Запись регистров сведений. С помощью этого объекта мы получаем доступ ко всем полям записи регистра сведений и можем их изменять на свое усмотрение. После того, как мы поменяли все нужные нам записи, необходимо записать набор. Обращаю внимание, что записывается именно набор в целом, а не конкретная запись по отдельности.
Причем, с помощью отбора можно проверять наличие уже существующих записей. Например, будем записывать данные в наш регистр, но перед этим проверим, есть ли записи по нужным полям.
В этом коде мы с помощью отборов получаем определенный набор записи, который должен соответствовать установленным отборам. И если данных по установленным отборам нет, то создаем новую запись.
Имейте ввиду, что после того, как вы примените метод Прочитать к набору записей, то состав набора изменится согласно установленному отбору.
С помощью набора записей можно не только создавать новые записи, но и удалять имеющиеся. Например, решим следующую задачу: очистим все записи для определенного вида топлива.
В этом коде мы получаем данные для определенного набора и очищаем их.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
В статье будут рассмотрены варианты установки отбора в управляемых формах 1С 8.3. Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.
- Установка отбора в пользовательском режиме
- Установка отбора в конфигураторе
- Фиксированный отбор
- Динамический (программный) отбор
Установка отбора в пользовательском режиме
Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.
Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».
Рис.1 Настроить список
Рис.2 Окно настройки
На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.
Рис.3 На вкладке «Отбор»
Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.
Отбор также можно группировать по логическим условиям «И», «ИЛИ».
Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»
При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.
Рис.5 Поля быстрых отборов
Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.
Рис.6 Группа пользовательских настроек
Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.
Установка отбора в конфигураторе
Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.
Фиксированный отбор
Принцип установки фиксированного отбора в конфигураторе не отличается от установки в пользовательском режиме описанном выше. Чтобы установить отбор, мы должны открыть настройки динамического списка.
Рис.7 Фиксированный отбор
Рис.8 Окно динамического списка
Отбор задается так же, как в пользовательском режиме.
Опция «Включать в пользовательские настройки» определяет, будет ли установленный в конфигураторе отбор доступен в пользовательском режиме через пункт меню «Настроить список».
Рис.9 Настроить список
Динамический (программный) отбор
Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.
Методы
Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.
ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.
ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).
ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.
Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).
Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).
РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.
ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).
Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.
ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).
Представление Тип: Строка – представление поля компоновки.
В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».
Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».
Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».
Рис.10 Отбор в динамическом списке
Для этого к тексту запроса добавляем условие «ГДЕ Истина»…
Рис.11 Условие «ГДЕ Истина»
Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:
Если этого не учесть будет ошибка, но чтобы этого избежать, можно переделать на другую реализацию. В текс запроса добавляем такое условие:
ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))
Тут ФИО – массив.
Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.
Читайте также: