1с сбросить отбор динамического списка
Задача состояла в следующем. В форме динамического списка необходимо было показать итоговую информацию. К примеру, в журнале накладных вывести количество накладных и общую сумму. Получить необходимые данные не составляло труда - формировался запрос с условием, соответствующим текущему отбору списка и запускался на выполнение. Но неожиданно проблемой оказалось обеспечение "синхронности" между данными списка и итоговой информацией.
То есть, данные динамического списка могут изменяться по различным причинам:
1. Изменился отбор списка
2. Пользователь в текущем сеансе изменил или удалил объект из списка
3. Пользователь нажал в форме кнопку "Обновить" (либо настроено автоматическое обновление списка)
Соответственно, хотелось бы после каждого такого события сразу пересчитывать служебную информацию.
Варианты решения были следующие:
1. Использовать событие формы "ОбновлениеОтображения".
Это событие действительно реагирует на любое изменение динамического списка. Но оно также вызывается и во многих других случаях. В частности, при смене страницы формы, при активизации строки в списке (если назначена обработка этих событий) и т.д. Короче, использование этого варианта вызывало приличные тормоза из-за перерасчета итогов после каждого чиха пользователя.
2. Использовать событие табличного поля "ПриПолученииДанных".
Вариант имеет такие же недостатки, как и предыдущий, хотя и в меньшей степени. Т.е. событие (а значит, и перерасчет итогов) выполнялось не только когда данные списка действительно менялись, но и при прокрутке списка, и даже при изменении размеров формы.
3. Добавить в форму кнопочку "Рассчитать", чтобы пользователь жал на неё всякий раз, когда ему потребуются актуальные итоги по списку. Коряво, неудобно, но приходилось поступать именно так, пока не появился ВАРИАНТ 4.
Хотя решение немного через .опу
Суть: на форму добавляется скрытое табличное поле, источником данных которого служит нужный нам динамический список, и далее используется событие "ПриПолученииДанных" этого табличного поля. Так как данное табличное поле не прокручивается и не меняет размеров, то событие возникает только тогда, когда список реально требует обновления.
Правда, в процессе реализации этого варианта вылезло ещё несколько "особенностей" платформы, но почти все удалось обойти.
В результате, сервисный код упрятан в две процедуры общего модуля: ПодключитьОбработчикОбновленияСписка(. ) и ОтключитьОбработчикОбновленияСписка(. ). Первая назначает для обработки обновления списка процедуру модуля формы, вторая, соответственно, отключает обработчик. Выглядит всё это так:
Теперь ложка дёгтя.
Алгоритм не отрабатывает ситуацию, когда список полностью очищается. То есть, в списке были какие-то строки, а потом пользователь все строки удалил, либо задал такой отбор, при котором в список не попадает ни один объект. Как оказалось, 1С просто не вызывает событие "ПриПолученииДанных" для пустого списка.
Чтобы обойти эту проблему, пришлось погрузиться в .опу уже по локоть.
Используя событие "ПриАктивизацииСтроки" нашего вспомогательного табличного поля, можно отловить ситуацию, когда свойство ТекущаяСтрока табличного поля меняет значение на Неопределено, сигнализируя, что в списке больше нет ни одной строки. Но очередной сюрприз от платформы - приняв значение Неопределено, ТекущаяСтрока "фиксируется" на нем, и не меняется, даже когда в списке вновь появляются объекты. То есть, если не поменять значение текущей строки, второй раз событие "ПриАктивизацииСтроки" уже не сработает.
Трагедия в том, что узнать, что список вновь заполнен, можно только в "ПриПолученииДанных", а изменить текущую строку во время обработки данного события невозможно - 1С вылетает с критической ошибкой (желающие могут попробовать). Помогли только пляски с шаманским бубном вокруг компьютера.
В итоге, получилось следующее:
Замечание от Гений1С:
Можно попробовать подключить функцию изменения данных ПодключитьОбработчикИзмененияДанных на данные списка.
Замечание от clappa:
Мне удалось использовать ПодключитьОбработчикИзмененияДанных только для контроля за изменением отбора динамического списка. В других перечисленных случаях этот метод бесполезен. В частности, изменение порядка он "не ловит".
Часто возникают ситуации, когда в 1С 8.3 нужно произвести отбор в таблице определенных строк по определенным критериям. Рассмотрим, как это сделать в динамическом списке и в таблице значений.
Отборы в динамическом списке 1С 8.3
Тут мы имеем два пути: создать отбор на форме списка и установить отбор программно.
Отбор в настройка формы
В конфигураторе добавим динамический список на форму, назначим ему основную таблицу и зайдем в свойства списка. В свойствах есть раздел «Настройка списка», нажмем ссылку «Открыть». Появится такое вот окно:
Здесь мы можем задать любой отбор для динамического списка. Потом этим отбором можно управлять программно.
Установка отбора в динамическом списке 1С программно
Дело в том, что Отбор является свойством динамического списка. Этим мы и воспользуемся. Сначала добавим в свойство отбора новый элемент:
Чтобы отбор заработал, нужно прописать параметры «ЛевоеЗначение», «ВидСравнения» и «ПравоеЗначение». Кроме того необходимо свойство «Использование» установить в «Истина».
Получите 267 видеоуроков по 1С бесплатно:
Таким образом, мы создаем простой отбор. Кроме простого, можно задать условия по нескольким полям. Для этого используем тип данных «ГруппаЭлементовОтбораКомпоновкиДанных»:
Отборы в таблице значений 1С
Тут у нас также имеется несколько вариантов.
- Можно просто перебрать таблицу в цикле и выбрать нужные строки либо скрыть ненужные. Считаю этот способ самым неоптимальным, но для новичков пойдет.
- Второй способ – использовать метод таблицы «НайтиСтроки». Иногда очень хороший способ, но есть серьезный недостаток. Это единственный тип для сравнения – «Равно».
- Третий вариант отбора – мой любимый, так как лишен в итоге всех недостатков. В этом варианте я использую «ПостроительЗапроса». Вот пример:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Примеры по программированию в 1с 7.7, 8.1, 8.2
понедельник, 31 марта 2014 г.
1С Установка и сброс отбора динамического списка
&НаКлиенте
Процедура СегментПриИзменении(Элемент)
Сз = Новый СписокЗначений;
Если не Сегмент.Пустая() Тогда
МассивНом = ПолучитьСегмент() ;
Сз.ЗагрузитьЗначения(МассивНом);
КонецЕсли;
СсылкаОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
СсылкаОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СсылкаОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
СсылкаОтбор.ПравоеЗначение = Сз;
СсылкаОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; //Нельзя изменять
Если Сз.Количество()>0 и не Сегмент.Пустая() Тогда
СсылкаОтбор.Использование = Истина;
Элементы.Список.Отображение=ОтображениеТаблицы.Список;
Иначе
СсылкаОтбор.Использование = Ложь;
Список.Отбор.Элементы.Очистить();
Элементы.Список.Отображение=ОтображениеТаблицы.ИерархическийСписок;
КонецЕсли;
КонецПроцедуры
// Процедура устанавливает значения параметров в запросе.
// Имя – Имя параметра
// Значение – Значение для отбора
Процедура УстановитьПараметрКомпоновки ( Имя , Значение )
КомпоновкаДанныхПараметр =
КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( Имя );
Если НЕ( КомпоновкаДанныхПараметр = Неопределено) Тогда
КомпоновкаДанныхПараметр.Значение = Значение ;
КомпоновкаДанныхПараметр.Использование = Истина ;
Иначе Сообщить( "Параметр " + Имя + " не найден " );
КонецЕсли;
КонецПроцедуры
// Процедура устанавливает отбор по полям запроса.
// Имя – Имя поля
// Значение – Значение для отбора
// ВидСравнения – ВидСравненияКомпоновкиДанных
Процедура УстановтьОтборПоПолюКомпоновки ( Имя , Значение , ВидСравнения )
Для Каждого ЭлементОтбора Из КомпоновщикНастроек . Настройки . Отбор . Элементы Цикл
Если ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( Имя ) И ЭлементОтбора . ВидСравнения = ВидСравнения Тогда
КомпоновщикНастроек . Настройки . Отбор . Элементы . Удалить ( ЭлементОтбора );
КонецЕсли;
КонецЦикла;
ЭлементОтбора = КомпоновщикНастроек.Настройки . Отбор . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( Имя );
ЭлементОтбора.ВидСравнения = ВидСравнения;
ЭлементОтбора.ПравоеЗначение = Значение ;
ЭлементОтбора.Использование = Истина ;
КонецПроцедуры
// Процедура добавляет или удаляет набор данных из схемы компоновки данных
//
// Схема – СхемаКомпоновкиДанных, схема, в которой нужно добавить(удалить) набор данных
// СхемаИсточник – СхемаКомпоновкиДанных, схема из которой копируется набор данных
// ИмяНабора – Строка
// Добавить – Булево
// НаборДанныхРодитель – НаборДанныхОбъединениеСхемыКомпоновкиДанных
Процедура ДобавитьУдалитьНаборДанных ( Схема , СхемаИсточник , ИмяНабора , Добавить , НаборДанныхРодитель )
НаборДанных = НайтиНаборДанных ( Схема . НаборыДанных , ИмяНабора );
Если Добавить Тогда
Если НаборДанных = Неопределено Тогда
НаборДанныхИсточник = НайтиНаборДанных ( СхемаИсточник . НаборыДанных , ИмяНабора );
НаборДанных = НаборДанныхРодитель . Элементы . Добавить ( Тип ( "НаборДанныхЗапросСхемыКомпоновкиДанных" ));
НаборДанных . Имя = НаборДанныхИсточник.Имя ;
НаборДанных . ИсточникДанных = НаборДанныхИсточник . ИсточникДанных ;
НаборДанных . Запрос = НаборДанныхИсточник . Запрос ;
КонецЕсли;
Иначе
Если НаборДанных <> Неопределено Тогда
НаборДанныхРодитель . Элементы . Удалить ( НаборДанных );
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиНаборДанных ( НаборыДанных , Имя )
Если НаборыДанных = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли;
Для каждого НаборДанных Из НаборыДанных Цикл
Если НаборДанных . Имя = Имя Тогда
Возврат НаборДанных ;
КонецЕсли;
Если ТипЗнч ( НаборДанных) = Тип ( "НаборДанныхОбъединениеСхемыКомпоновкиДанных" ) Тогда
Результат = НайтиНаборДанных ( НаборДанных . Элементы , Имя );
Если Результат <> Неопределено Тогда
Возврат Результат ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
В озврат Неопределено;
КонецФункции
// Функция находит группировку в компоновке
// Структура – КомпоновщикНастроек.Настройки.Структура
// Имя – Имя поля в группировке
// Возвращаемое значение: ПолеКомпоновкиДанных
Функция НайтиГруппировку ( Структура , Имя , ВидГруппировки = "Поле" )
Для Каждого Элемент Из Структура Цикл
Если ТипЗнч ( Элемент ) = Тип ( "ТаблицаКомпоновкиДанных" ) Тогда
Результат = НайтиГруппировку ( Элемент . Строки , Имя );
Если Результат <> Неопределено Тогда
Возврат Результат ;
КонецЕсли;
Результат = НайтиГруппировку ( Элемент . Колонки , Имя );
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
ИначеЕсли ТипЗнч ( Элемент ) = Тип ( "ГруппировкаТаблицыКомпоновкиДанных" ) Тогда
Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
Если Поле.Поле = Новый ПолеКомпоновкиДанных ( Имя ) Тогда
Если ВидГруппировки = "Поле" Тогда
Результат = Поле ;
Иначе
Результат = Элемент ;
КонецЕсли;
Возврат Результат ;
КонецЕсли;
КонецЦикла;
Результат = НайтиГруппировку ( Элемент . Структура , Имя );
КонецЕсли;
КонецЦикла;
Возврат Результат ;
КонецФункции
// Процедура добавляет в каждую группировку отчета отбор по непустому значению
// Структура – КомпоновщикНастроек.Настройки.Структура
// ДоступныеПоляГруппировок – КомпоновщикНастроек.ДоступныеПоляГруппировок
Процедура ОтборПоНепустым ( Структура )
Для Каждого Элемент Из Структура Цикл
Если ТипЗнч ( Элемент ) = Тип ( "ТаблицаКомпоновкиДанных" ) Тогда
ОтборПоНепустым ( Элемент.Строки );
ОтборПоНепустым ( Элемент.Колонки );
ИначеЕсли ТипЗнч ( Элемент ) = Тип ( "ГруппировкаТаблицыКомпоновкиДанных" ) Тогда
Для Каждого Поле Из Элемент . ПоляГруппировки . Элементы Цикл
ЭлементОтбора = Неопределено;
Для Каждого ЭлементОтбора1 Из Элемент . Отбор.Элементы Цикл
Если ЭлементОтбора1 . Представление = "Отбор по непустому" Тогда
ЭлементОтбора = ЭлементОтбора1 ;
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Элемент . Отбор . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора . Представление = "Отбор по непустому" ;
КонецЕсли;
ЭлементОтбора . ЛевоеЗначение = Поле . Поле ;
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных . Заполнено ;
ЭлементОтбора.Использование = Истина;
Параметр = Элемент . ПараметрыВывода . НайтиЗначениеПараметра( Новый ПараметрКомпоновкиДанных ( "FilterOutput" ));
Параметр . Использование = Истина;
Параметр . Значение = ТипВыводаТекстаКомпоновкиДанных . НеВыводить ;
КонецЦикла;
ОтборПоНепустым ( Элемент . Структура );
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Процедура добавляет значения интервалов в пользовательское поле
// ПолеИнтервалы – ПользовательскоеПолеВыборКомпоновкиДанных
// Интервал – Строка содержащия границы интервалов: 30,60,90
Процедура УстановитьПользовательскоеПолеИнтервал ( ПолеИнтервалы , Интервал )
Если ПустаяСтрока ( Интервал ) Тогда
Возврат;
КонецЕсли;
Стр = Интервал ;
Стр = СтрЗаменить ( Стр , "," , Символы . ПС );
ПредИнтервал = "0" ;
Для Счетчик = 1 По СтрЧислоСтрок ( Стр ) Цикл
ТекИнтервал = СокрЛП ( СтрПолучитьСтроку ( Стр , Счетчик ));
Вариант = ПолеИнтервалы . Варианты . Элементы . Добавить ();
Вариант . Использование = Истина;
Если Счетчик = 1 Тогда
Вариант . Значение = "До " + ТекИнтервал ;
Вариант . Представление = "До " + ТекИнтервал ;
Иначе
Вариант . Значение = "От " + ПредИнтервал + " до " + ТекИнтервал ;
Вариант . Представление = "От " + ПредИнтервал + " до " + ТекИнтервал ;
КонецЕсли;
Группа = Вариант . Отбор . Элементы . Добавить ( Тип ( "ГруппаЭлементовОтбораКомпоновкиДанных" ));
Группа.Использование = Истина;
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных . ГруппаИ ;
Если Счетчик > 1 Тогда
ЭлементОтбора = Группа . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора . Использование = Истина;
ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "ДнейПросрочки" );
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно ;
ЭлементОтбора . ПравоеЗначение = Число ( ПредИнтервал );
КонецЕсли;
ЭлементОтбора = Группа . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "ДнейПросрочки" );
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных . Меньше ;
ЭлементОтбора.ПравоеЗначение = Число ( ТекИнтервал );
ПредИнтервал = ТекИнтервал ;
Вариант = ПолеИнтервалы . Варианты.Элементы . Добавить ();
Вариант . Значение = "Более " + ПредИнтервал ;
Вариант . Представление = "Более " + ПредИнтервал ;
Группа = Вариант . Отбор . Элементы . Добавить ( Тип ( "ГруппаЭлементовОтбораКомпоновкиДанных" ));
Группа . ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных . ГруппаИ ;
ЭлементОтбора = Группа . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "ДнейПросрочки" );
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных . БольшеИлиРавно ;
ЭлементОтбора . ПравоеЗначение = Число ( ПредИнтервал );
КонецПроцедуры
Рассмотрим работу с динамическими списками на примере конфигурации 1С.Управление торговлей. Для примера разберем динамический список для справочника «Контрагенты».
Запустим 1С в режиме «Конфигуратор».
В конфигурации найдем справочник «Контрагенты».
Откроем форму «Форма Списка».
Рассмотрим форму списка справочника. Реквизит «Список» имеет тип «ДинамическийСписок».
Двойным щелчком откроем свойства реквизита.
Нас интересует свойство «Произвольный запрос». Если для данного свойства установлен флаг, то для вывода информации в динамический список мы можем использовать собственный запрос.
Нажмем теперь «Открыть» у свойства «Настройка списка».
Перед нами открывается окно настройки запроса динамического списка. Первая вкладка «Запрос».
Мы можем ка написать запрос вручную в поле «Запрос», так и воспользоваться кнопкой «Конструктор запросов».
На данной вкладке так же стоит обратить внимание на флаги «Динамическое считывание данных» и «Автозаполнение доступных полей».
Флаг «Динамическое считывание данных» определяет размер «части» возвращаемых запросом данных. Т.е. Если флаг установлен, то «части» имеют не большой размер, но при прокрутке динамического списка может происходить небольшое подвисания из-за до получения «частей». Если флаг не установлен, то возвращаемые данные мы получаем большими «частями». Это означает, что первоначально запрос может отрабатывать дольше, но подвисаний в процессе прокрутки не будет.
Флаг «Автозаполнение доступных полей» определяет поля доступные для отбора. Если флаг установлен, то поля верхней выборки становятся доступными для установки отбора.
Вторая вкладка «Настройки».
На данной вкладке мы можем установить некоторые отборы. Стоит обратить внимание на флаг «Включать в пользовательские настройки».
Если мы установили отбор и флаг, то пользователь сможет самостоятельно отключить отбор, воспользовавшись командой «Настроить список».
Так же на вкладке «Настройки» мы можем задавать «Порядок», «Группировки» и «Условное оформление.
В случае, если мы в запросе использовали какие-либо параметры, то необходимо заполнить их значения. Установим значение параметров в модуле формы в процедуре «ПриСозданииНаСервере». Для этого воспользуемся стандартным кодом для установки параметров.
Как оптимизировать работу с программой?
В работе с 1С периодически можно столкнуться с вопросами, который не в состоянии решить обыкновенный пользователь. Если у вас в штате нет специалистов 1С или они решают более стратегические задачи, от которых отвлекать их попросту нерационально, мы приглашаем обратиться за помощью к команде профессионалов.
Мы предлагаем услуги по сопровождению 1С , в рамках которого наши сотрудники смогут оперативно решать подобные и многие другие проблемы. Большой опыт работ и сертифицированные специалисты позволят обеспечить бесперебойную работу с программой, защиту информации и оптимизацию бизнес-процессов.
Вы еще не внедрили 1С или необходимо установить программу в новый филиал компании? Обратитесь за внедрением и настройкой к нам — вы сэкономите свое время и избежите возможных ошибок и проблем в дальнейшем.
Позвоните по номеру телефона, указанному на сайте или заполните форму обратной связи, чтобы наши сотрудники сориентировали по стоимости работ, подобрали оптимальное решение и рассказали, как начать сотрудничество. Ждем вас!
В статье будут рассмотрены варианты установки отбора в управляемых формах 1С 8.3. Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.
- Установка отбора в пользовательском режиме
- Установка отбора в конфигураторе
- Фиксированный отбор
- Динамический (программный) отбор
Установка отбора в пользовательском режиме
Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.
Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».
Рис.1 Настроить список
Рис.2 Окно настройки
На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.
Рис.3 На вкладке «Отбор»
Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.
Отбор также можно группировать по логическим условиям «И», «ИЛИ».
Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»
При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.
Рис.5 Поля быстрых отборов
Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.
Рис.6 Группа пользовательских настроек
Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.
Установка отбора в конфигураторе
Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.
Фиксированный отбор
Принцип установки фиксированного отбора в конфигураторе не отличается от установки в пользовательском режиме описанном выше. Чтобы установить отбор, мы должны открыть настройки динамического списка.
Рис.7 Фиксированный отбор
Рис.8 Окно динамического списка
Отбор задается так же, как в пользовательском режиме.
Опция «Включать в пользовательские настройки» определяет, будет ли установленный в конфигураторе отбор доступен в пользовательском режиме через пункт меню «Настроить список».
Рис.9 Настроить список
Динамический (программный) отбор
Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.
Методы
Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.
ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.
ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).
ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.
Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).
Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).
РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.
ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).
Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.
ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).
Представление Тип: Строка – представление поля компоновки.
В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».
Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».
Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».
Рис.10 Отбор в динамическом списке
Для этого к тексту запроса добавляем условие «ГДЕ Истина»…
Рис.11 Условие «ГДЕ Истина»
Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:
Если этого не учесть будет ошибка, но чтобы этого избежать, можно переделать на другую реализацию. В текс запроса добавляем такое условие:
ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))
Тут ФИО – массив.
Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.
Часто возникают ситуации, когда в 1С 8.3 нужно произвести отбор в таблице определенных строк по определенным критериям. Рассмотрим, как это сделать в динамическом списке и в таблице значений.
Отборы в динамическом списке 1С 8.3
Тут мы имеем два пути: создать отбор на форме списка и установить отбор программно.
Отбор в настройка формы
В конфигураторе добавим динамический список на форму, назначим ему основную таблицу и зайдем в свойства списка. В свойствах есть раздел «Настройка списка», нажмем ссылку «Открыть». Появится такое вот окно:
Здесь мы можем задать любой отбор для динамического списка. Потом этим отбором можно управлять программно.
Установка отбора в динамическом списке 1С программно
Дело в том, что Отбор является свойством динамического списка. Этим мы и воспользуемся. Сначала добавим в свойство отбора новый элемент:
Чтобы отбор заработал, нужно прописать параметры «ЛевоеЗначение», «ВидСравнения» и «ПравоеЗначение». Кроме того необходимо свойство «Использование» установить в «Истина».
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>Таким образом, мы создаем простой отбор. Кроме простого, можно задать условия по нескольким полям. Для этого используем тип данных «ГруппаЭлементовОтбораКомпоновкиДанных»:
Отборы в таблице значений 1С
Тут у нас также имеется несколько вариантов.
- Можно просто перебрать таблицу в цикле и выбрать нужные строки либо скрыть ненужные. Считаю этот способ самым неоптимальным, но для новичков пойдет.
- Второй способ – использовать метод таблицы «НайтиСтроки». Иногда очень хороший способ, но есть серьезный недостаток. Это единственный тип для сравнения – «Равно».
- Третий вариант отбора – мой любимый, так как лишен в итоге всех недостатков. В этом варианте я использую «ПостроительЗапроса». Вот пример:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Читайте также: