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

На днях получил задание реализовать поиск документа по контрагенту, указанному в нем. Все было бы элементарно просто, но структура документа была не совсем обычна. Документ регистрирует продажу долга контрагентов сторонней организации, при этом одним документом может продаваться сразу несколько долгов. Поэтому в документе есть табличная часть, состоящая из двух колонок: Контрагент и СуммаДолга.

Список документов представлен управляемой формой и динамическим списком на ней. И конечно стандартный инструмент Настройка списка дает возможность проводить отбор только по реквизитам документа, но не по реквизитам табличной части.

Рассмотрим причину возникновения этой проблемы. Дело в том, что формирование динамического списка происходит на основе запроса. Этот запрос может быть сформирован как вручную, так и автоматически, если мы указываем Основную таблицу динамического списка. Когда мы создаем форму списка по умолчанию применяется второй способ — автоматическое формирование запроса. При этом в выбираемые поля запроса попадают все реквизиты документа и табличные части. И именно по этим полям потом можно делать отбор. Но табличные части попадают в поле запроса целиком, поэтому сделать отбор по конкретному реквизиту табличной части невозможно.

Отбор в динамическом списке по реквизиту табличной части элемента

Решением проблемы может быть изменение стандартного автоматически формируемого запроса. Для этого нужно выполнить следующие действия:

  1. В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
    Отбор в динамическом списке по реквизиту табличной части элемента
  2. В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
    Отбор в динамическом списке по реквизиту табличной части элемента
  3. Далее левым соединением соединяем табличные части с самим документом.
    Отбор в динамическом списке по реквизиту табличной части элемента
  4. И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
    Отбор в динамическом списке по реквизиту табличной части элемента
  5. На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
    Отбор в динамическом списке по реквизиту табличной части элемента
    На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
    Отбор в динамическом списке по реквизиту табличной части элемента
  6. Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.

Отбор в динамическом списке по реквизиту табличной части элемента

Отбор в динамическом списке по реквизиту табличной части элемента

Отбор в управляемой форме по реквизиту

Я
   AZLK-TEAM

21.11.13 — 08:08

Привет всем! Возник вопрос по отбору в управляемой форме.

Имеется реквизит. Тип реквизита ПеречислениеСсылка.СтатусыЧековККМ. Нужно чтобы при открытии формыв табличной части не было строк со статусом архивный. Как это сделать? Посоветуйте что нибудь пожалуйста!)

  

Партнерская программа EFSOL Oblako

   Wobland

1 — 21.11.13 — 08:10

   banco

2 — 21.11.13 — 08:15

Расширение таблицы формы для табличных частей.ОтборСтрок (Form table extension for tabular sections.RowFilter)

Расширение таблицы формы для табличных частей (Form table extension for tabular sections)

ОтборСтрок (RowFilter)

Использование:

Чтение и запись.

Описание:

Тип: Неопределено; ФиксированнаяСтруктура.

Позволяет установить отбор по значению колонки.

В качестве ключа используется имя реквизита табличной части, а в качестве значения — значение, по которому осуществляется отбор.

Чтобы снять отбор нужно присвоить свойству либо значение Неопределено, либо пустую ФиксированнаяСтруктура.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.

Изменение свойства на клиенте требует обращения к серверу.

Примечание:

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

   AZLK-TEAM

3 — 21.11.13 — 08:26

&НаКлиенте

Процедура Команда1(Команда)

    ЭО=Документы.ЧекККМ.Форма.ФормаСписка.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

    ЭО.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«Архивный»);

    ЭО.ПравоеЗначение=Объект.Организация;

    ЭО.Использование=Истина;

    
    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

У меня выдает ошибку. Жалуется на документы, т. к. процедура проходит на клиенте, а к документам то можно обращаться на сервере. А форма у меня находится в документах. Что делать?

   Wobland

4 — 21.11.13 — 08:29

(3) немного сравнить с (0) из (1)

   AZLK-TEAM

5 — 21.11.13 — 08:33

(4) не понимаю(

   Wobland

6 — 21.11.13 — 08:37

вот это: ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

сравнить с этим: ЭО=Документы.ЧекККМ.Форма.ФормаСписка.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

   AZLK-TEAM

7 — 21.11.13 — 08:58

Сравнил. У меня форма то в Документах находится. А в первом случае — сразу форма пишется. В остальном тоже самое.

   Wobland

8 — 21.11.13 — 09:00

   AZLK-TEAM

9 — 21.11.13 — 09:03

Ну я знаю что Документы клиент не знает, поэтому и ошибк пишет. А что делать то? Причем тут открыть формумодально? Открываю то я её позже. Или её сначала открыть надо?

   Wobland

10 — 21.11.13 — 09:04

можно получить, наколдовать отбор, открыть. или тебе в (1) это не видно?

   AZLK-TEAM

11 — 21.11.13 — 09:08

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

    ЭО.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«Архивный»);

    ЭО.ПравоеЗначение=Объект.Организация;

    ЭО.Использование=Истина;

    
    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

Запускается без ошибок, но отбор не идет. Строки с реквизитом архивный, в табличной части сё равно присутствуют, а их не должно быть.

   Wobland

12 — 21.11.13 — 09:14

а как ты так архивный с организацией сравниваешь?

   AZLK-TEAM

13 — 21.11.13 — 09:21

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

    ЭО.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«Архивный»);

    ЭО.ПравоеЗначение=Объект.СтатусЧекаККМ;

    ЭО.Использование=Истина;

    
    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

Вот так надо?

   Wobland

14 — 21.11.13 — 09:23

хм.. в прошлый подход хоть запустил проверить..

   AZLK-TEAM

15 — 21.11.13 — 09:28

Выдает ошибку поле объекта не обнаружено (СтатусЧекаККМ)

Нажимаю подробно пишет вот что

{Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(7715)}: Поле объекта не обнаружено (СтатусЧекаККМ)

    ЭО.ПравоеЗначение=Объект.СтатусЧекаККМ;

Почему так?

   AZLK-TEAM

16 — 21.11.13 — 09:36

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

    ЭО.ЛевоеЗначение=Перечисления.СтатусыЧековККМ.Архивный;

    ЭО.ПравоеЗначение=Перечисления.СтатусыЧековККМ.Архивный;

    ЭО.Использование=Истина;

    
    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

Вот! Но теперь ругается на перечисления

   Wobland

17 — 21.11.13 — 09:38

а прикольно А с А сравнивать?

ПредопределенноеЗначение в помощь

   AZLK-TEAM

18 — 21.11.13 — 09:44

&НаСервере

функция перечислил()

Возврат(Перечисления.СтатусыЧековККМ.Архивный);    

    
конецфункции

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    Архивный=Перечислил();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

    ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=Архивный;

    ЭО.Использование=Истина;

    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

Что не правильно щас?

   Wobland

19 — 21.11.13 — 09:45

да всё нормально. отбор настроен на всегда истину

   AZLK-TEAM

20 — 21.11.13 — 09:47

Мне надо чтобы Архивный НЕВЫВОДИЛОСЬ. А оно всё равно выводится. Что не правильно?

   ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=Архивный;

Это не правильно?

   Wobland

21 — 21.11.13 — 09:48

2=2 всегда?

   Wobland

22 — 21.11.13 — 09:49

Архивный=Ложь

правильно?

   AZLK-TEAM

23 — 21.11.13 — 09:51

Не понимаю. Объясни поконкретнее пожалуйста.

   AZLK-TEAM

24 — 21.11.13 — 10:17

ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;

    ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=Архивный;

    ЭО.Использование=Истина;

Что обозначают эти четыре строчки?

особенно вот эти две?

    ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=Архивный;

Это интервал какой то или что? Я не могу понять…в хелпе про это не написано. В интернете тоже инфы нету. помогите разобраться плиз.

   Trucker

25 — 21.11.13 — 10:35

(24) Ты сам то, что с чем хочешь сравнить, что бы получился нужный тебе результат?

   Wobland

26 — 21.11.13 — 10:35

сравнение — это бинарная операция. операнды как-то традиционно называют левый и правый. у тебя оба операнда одинаковы. следовательно сравнение всегда даёт истинный результат

   Wobland

27 — 21.11.13 — 10:36

(26) *бинарная функция

   AZLK-TEAM

28 — 21.11.13 — 10:36

Мне надо чтобы не весь список выходил в табличной части, а только те, у которых Статус не равен Архивный. Что с чем сравнить надо для этого?

   AZLK-TEAM

29 — 21.11.13 — 10:37

То есть там где статус Архивный — их выводить не надо вообще. Я не могу понять что с чем сранить надо…

   Trucker

30 — 21.11.13 — 10:39

(28) > у которых Статус не равен Архивный.

Вот это напиши в виде равенства, прям здесь словами.

   Wobland

31 — 21.11.13 — 10:40

разрешаю подглядеть в (22)

   AZLK-TEAM

32 — 21.11.13 — 10:40

Скажу словами. Надо сравнить Статус и Статус.Архивный

То есть если грубо говоря СТатус=Статус.Архивный — не выводить. Правильно мысли идут?

   Wobland

33 — 21.11.13 — 10:41

(32) выводить только те, у которых статус<>архивный

   olegves

34 — 21.11.13 — 10:45

(0) если это всегда так, то лучше не отбором, а произвольным запросом ДС решить, только подзапрос к ТЧ надо будет свернуть до 1 строки, иначе ДС с ума сойдет

   Trucker

35 — 21.11.13 — 10:46

(34) Иш какой шустрый. Погоди, мы тут еще с видами сравнения не разобрались.

   AZLK-TEAM

36 — 21.11.13 — 10:48

&НаСервере

функция перечислил()

Возврат(Перечисления.СтатусыЧековККМ.Архивный);    

    
конецфункции

  &НаСервере

функция перечислил2()

Возврат(Перечисления.СтатусыЧековККМ);    

    
конецфункции

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    Архивный=Перечислил();

    Архивный2=перечислил2();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.НеРавно;

    ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=Архивный;

    ЭО.Использование=Истина;

    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

Так ведь надо? Запускается без ошибок, но когда нажимаю кнопку открытия формы — выдает ошибку

Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(7722)}: Ошибка при вызове метода контекста (перечислил2)

    Архивный2=перечислил2();

по причине:

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

по причине:

Ошибка преобразования данных XDTO:

Запись значения свойства ‘ret’:

    форма: Элемент

    имя: {http://v8.1c.ru/8.2/managed-application/modules}ret

по причине:

Ошибка отображения типов:

Отсутствует отображение для типа ‘ПеречислениеМенеджер.СтатусыЧековККМ’

Что не так опять?

   Wobland

37 — 21.11.13 — 10:50

передаёшь с сервера какую-то хню

   Wobland

38 — 21.11.13 — 10:51

сейчас ты спросишь, как надо, а я буду мерзко хихикать и ждать, когда ты сам найдёшь ответ в этой ветке ;)

   AZLK-TEAM

39 — 21.11.13 — 10:54

ЭО.ПравоеЗначение=Перечисления.СтатусыЧековККМ;

Ну так тоже нельзя. Перечисления на клиенте не работают же. Я попробовал на сервере, тоже не получилось.

   Wobland

40 — 21.11.13 — 10:58

какое следующее простое число после 13? вот там и читай

   Trucker

41 — 21.11.13 — 10:59

(39) ЭО.ПравоеЗначение=Перечисления.СтатусыЧековККМ

и какое значение будет содержать ПравоеЗначение?

Выше уже подсказали как обращаться к перечислению на клиенте.

   AZLK-TEAM

42 — 21.11.13 — 11:01

Какой пост? 17?

ПредопределенноеЗначение в помощь

Это?

   AZLK-TEAM

43 — 21.11.13 — 11:05

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    Архивный=Перечислил();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.НеРавно;

    ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=ПредопределенноеЗначение(«Перечисления.СтатусыЧековККМ»);

    ЭО.Использование=Истина;

    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

   AZLK-TEAM

44 — 21.11.13 — 11:05

Так? Ну тоже ошибку выдает. Не работает

орма.Форма.Форма(7719)}: Ошибка при вызове метода контекста (ПредопределенноеЗначение)

    ЭО.ПравоеЗначение=ПредопределенноеЗначение(«Перечисления.СтатусыЧековККМ»);

по причине:

Предопределенное значение «Перечисления.СтатусыЧековККМ» не найдено.

   Wobland

45 — 21.11.13 — 11:06

(44) надо боьше читать. там в единственном числе

   Trucker

46 — 21.11.13 — 11:12

(44) Что вас заставило открыть конфигуратор?

   AZLK-TEAM

47 — 21.11.13 — 11:14

{Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(7719)}: Ошибка при вызове метода контекста (ПредопределенноеЗначение)

    ЭО.ПравоеЗначение=ПредопределенноеЗначение(«Перечисление.СтатусыЧековККМ»);

по причине:

Предопределенное значение «Перечисление.СтатусыЧековККМ» не найдено.

Предопределенное значение «Перечисление.СтатусыЧековККМ» не найдено.

Написал в единственном — тоже самое.

   Wobland

48 — 21.11.13 — 11:16

а дай скрин из пофигуратора с таким перечислением

   Wobland

49 — 21.11.13 — 11:16

тьху, плин. какой статус имеется в виду?

   AZLK-TEAM

50 — 21.11.13 — 11:16

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    Архивный=Перечислил();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.НеРавно;

    ЭО.ЛевоеЗначение=Архивный;

    ЭО.ПравоеЗначение=ПредопределенноеЗначение(«Перечисление.СтатусыЧековККМ»);

    ЭО.Использование=Истина;

    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

   AZLK-TEAM

51 — 21.11.13 — 11:17

Не работает этот код. Хотя ПеречислениЕ написал. В ед. значении

   AZLK-TEAM

52 — 21.11.13 — 11:18

Ну Помогите пожалуйста, что не так?((((

   Wobland

53 — 21.11.13 — 11:20

(52) какой статус?

   AZLK-TEAM

54 — 21.11.13 — 11:23

Статус — реквизит  в табличной части.

Имеется реквизит. Тип реквизита ПеречислениеСсылка.СтатусыЧековККМ.

Вот какой статус.

   Wobland

55 — 21.11.13 — 11:28

(54) который из статусов?

   AZLK-TEAM

56 — 21.11.13 — 11:31

Я не понимаю вашего вопроса. Можете задать полный вопрос.

я же объяснил:

Статус — реквизит  в табличной части.

Имеется реквизит. Тип реквизита ПеречислениеСсылка.СтатусыЧековККМ.

Статус одни он может быть : архивный, пробитый, отложенный анулированный.

Мне нужно чтобы там где архивный — не выводилось в табличную часть, а выводилось только робитый, отложенный анулированный.

   Trucker

57 — 21.11.13 — 11:35

(56) У ПеречислениеСсылка.СтатусыЧековККМ есть несколько значений, архивный, пробитый, отложенный анулированный.

Какое значение перечисления хранится в  ЭО.ПравоеЗначение= ?

   AZLK-TEAM

58 — 21.11.13 — 11:37

никакого. Там в общем идет. Мы же должны сравнить архивный, со всеми статусами, поэтому я не указал значение. Не правильно что ли?

   bazvan

59 — 21.11.13 — 11:38

Выбрать ВСЕ кроме архивный

   Trucker

60 — 21.11.13 — 11:40

(58) Ну раз никакого, то и результат никакой.

   Wobland

61 — 21.11.13 — 11:41

(58) ты должен сравнить поле в своём списке с каким-то конкретным значением

   AZLK-TEAM

62 — 21.11.13 — 11:54

Я понял. Но как выбрать всё кроме архивный?

Перечисление.СтатусыЧековККМ.ВыбратьВсеКромеАрхивный

Так что ли?

   Wobland

63 — 21.11.13 — 12:01

(62) не равные архивному штоль?

   olegves

64 — 21.11.13 — 12:04

(62) тебе лучше другое занятие подискать — пофигуратор, похоже, не твое

   George Wheels

65 — 21.11.13 — 12:10

Господа, ну хоть по кусочкам подскажите ему.

В (3) ЛевоеЗначение правильное.

   AZLK-TEAM

66 — 21.11.13 — 12:12

&НаСервере

функция перечислил()

Возврат(Перечисления.СтатусыЧековККМ.Архивный);    

    
конецфункции

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    Архивный=Перечислил();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.НеРавно;

    ЭО.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«СтатусЧекаККМ»);

    ЭО.ПравоеЗначение=Архивный;

    ЭО.Использование=Истина;

    
    ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ОбновитьФорму();

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

Вот так сделал. Работает без ошибок, но не отбирает(((

   Wobland

67 — 21.11.13 — 12:16

это всё потому, что отбор ставишь на одной форме, а открываешь другую

   George Wheels

68 — 21.11.13 — 12:16

(66) Подумай, какую форму открываешь? И где же у неё отбор?

   George Wheels

69 — 21.11.13 — 12:24

СП -> Интерфейс (управляемый) -> Управляемая форма -> УправляемаяФорма

   AZLK-TEAM

70 — 21.11.13 — 12:39

&НаСервере

функция перечислил()

Возврат(Перечисления.СтатусыЧековККМ.Архивный);    

    
конецфункции

функция перечислил1()

Возврат(НачалоДня(ТекущаяДата()));    

    
конецфункции

&НаКлиенте

Процедура Команда1(Команда)

    Форма=ПолучитьФорму(«Документ.ЧекККМ.Форма.ФормаСписка»);

    ЭО=Форма.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    Архивный=Перечислил();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.НеРавно;

    ЭО.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«СтатусЧекаККМ»);

    ЭО.ПравоеЗначение=Архивный;

    ЭО.Использование=Истина;

    
    Дата=перечислил1();

    ЭО.ВидСравнения=ВидСравненияКомпоновкиДанных.БольшеИлиРавно;

    ЭО.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(«Дата»);

    ЭО.ПравоеЗначение=Дата;

    ЭО.Использование=Истина;

    Форма.ОткрытьМодально();

    
    //ПараметрыФормы = Новый Структура(«ДатаНач»,    НачалоДня(ТекущаяДата()));

    ////ОткрытьФормуМодально(«Документ.ЧекККМ.Форма.ФормаСписка»,ПараметрыФормы);    

    ////ОбновитьФорму();

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

Вот как должно быть! Вот так работает. А вы мне голову морочите!)))

Но всё равно спасибо! Без вас бы не справился.

  

Wobland

71 — 21.11.13 — 15:28

воспитание а-ля Шао-Линь работает всё-таки..

Содержание:

1.      Способы отбора строк в 1С

2.      Варианты применения программного наложения отбора строк в 1С  

1. Способы отбора строк в 1С

В данной статье обратимся к вопросу программного отбора строк по условию в таблице формы (управляемое приложение). Рассмотрим несколько способов выполнения подобной задачи:

1 способ:

Элемент управления формы «Таблица формы» связан с данными табличной части формы какого-либо объекта метаданных (например, Документа Заказ покупателя табличная часть – «Услуги»). Благодаря этому, при обращении на встроенном языке программирования к таблице формы (Элементы.<ИмяТаблицы>) становятся доступны методы расширения таблицы формы для табличных частей.

Если требуется выполнить отбор над строками табличной части формы которые видимы в таблице формы можно обратиться к методу расширения таблицы — «ОтборСтрок».

Для управляемых форм свойство «ОтборСтрок» может принимать значения – Фиксированная Структура или Неопределено.

Рассмотрим пример подобного действия:

//в таблице формы «Услуги» показывать строки, имеющих в поле «Номенклатура» указанную услуга, значение которой хранится в переменной ПеремУслуга:

Элементы.Услуги.ОтборСтрок = Новый ФиксированнаяСтруктура(«Номенклатура», ПеремУслуга);

Ключ структуры — имя реквизита табличной части формы, значение структуры – конкретное значение, по которому требуется осуществить отбор.

Для отмены отбора, свойству «ОтборСтрок» присваивается один из двух вариантов: значение Неопределено, либо ФиксированнаяСтруктура.

Дополнительно:

В случае, если после назначения отбора в табличной части формы меняется ход выполнения кода, то отбор нужно установить повторно, для его отработки и на измененных строках.

Отбор для строковых значений выполняется по условию вхождения значения. Например, если в колонке есть ячейки со значением «Партия 1», «Партия 2», …, «Партия 10», «Партия 11», … и устанавливается отбор по значению «Партия 1», то в таблицу будут отобраны строки со значениями «Партия 1», «Партия 10», «Партия 11» и т.д.

2 способ:

Свойство «ОтборСтрок» можно использовать и в случае расширения таблицы формы для таблицы значений, т.е. когда таблица формы не связана с табличной частью какого-либо объекта, а заполняется программно. В качестве ключа структуры нужно указать имя колонки таблицы значений. В качестве значения – значение, по которому осуществляется отбор.

3 способ:

Если таблица формы является динамическим списком (например, в форме списка справочника для вывода элементов справочника используется таблица формы с типом «Динамический список»), то используется свойство списка «Отбор». Динамический список — это интерфейсный объект и строится он на основе СКД. Поэтому тип значения, возвращаемого свойством «Отбор» будет – Отбор Компоновки Данных и заполняться он должен как в компоновке данных.

(в приведенном ниже примере переменная Список – реквизит формы)

//Элементы – коллекция элементов отбора

//метод Добавить() – добавляет новый элемент отбора и возвращает его значение.

ЭлОтбора = Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

//ИмяПоляКомпоновки в данном случае должно совпадать с именем колонки (реквизита) по //которой мы осуществляем отбор списка.

ЭлОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ИмяПоляКомпоновки»);

ЭлОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлОтбора.Использование = Истина;

ЭлОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;

//Значение отбора

ЭлОтбора.ПравоеЗначение = ЗначениеПоляОтбора;   

2. Варианты применения программного наложения отбора строк в 1С

Варианты применения:

Программное наложение отбора на табличную часть требуется, в основном, в двух случаях:

● Для предоставления пользователю дополнительных интерфейсных возможностей наложения отбора. Например, кнопка (команда), отбирающая строки с незаполненными важными реквизитами.

● В реализации задачи подчиненных табличных частей. Задача заключается в том, чтобы связать две ТЧ. И, например, при активизации строки в первой ТЧ, во второй – отображались, только строки, связанные с данной строкой первой ТЧ. Так же, при удалении строки из первой ТЧ, должны удаляться строки из второй ТЧ, связанные с ней. И т.д. Обязательным условием связи двух табличных частей, в данном случае, будет являться наличие в обоих одинакового реквизита (ключа), по которому и будет происходить связывание строк. Таких реквизитов может быть несколько. Тогда ключом связи будет комбинация значений из этих реквизитов.

В качестве примера взаимосвязанных табличных частей формы можно привести документ, регистрирующий время работы сотрудниками на технике за смену. В документе есть две ТЧ: «Сотрудники» и «Техника». В первой отображаются сотрудники, работавшие в конкретную смену, во второй — техника, на которой они работали. При активизации строки с сотрудником, в «Технике» должна отображаться только та техника, на которой работал данный сотрудник. В обоих табличных частях, присутствует реквизит-ключ «Сотрудник», на основании которого их строки связываются. Отбор на ТЧ «Техника» накладывается в Событии При Активизации Строки() Таблицы формы «Сотрудники», исполняемом при позиционировании одной из строк.

//При позиционировании на строке ТЧ «Сотрудники»: отображать только технику по текущему сотруднику

&НаКлиенте

Процедура СотрудникиПриАктивизацииСтроки(Элемент)

    ТекДанные = Элементы.Сотрудники.ТекущиеДанные;

    Если ТекДанные = Неопределено Тогда

        //При активизации строки ТекДанные не заполонены, значит ТЧ «Сотрудники» — пустая

        Элементы.Техника.ОтборСтрок = Неопределено;

    Иначе

        // Для ТЧ «Техника» устанавливаем отбор по текущему сотруднику

        ТекСотрудник = ТекДанные.Сотрудник;

        Элементы.Техника.ОтборСтрок = Новый ФиксированнаяСтруктура(«Сотрудник», ТекСотрудник);

   КонецЕсли;

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

    Специалист компании «Кодерлайн»

 Марина Анапольская

Опубликовано ср, 18/04/2012 — 00:07 пользователем guru

1. Создаём Критерий отбора.

Создание Критерия отбора

Создание Критерия отбора

2. Выбираем тип данных, по которому будет производиться отбор в списке документов.

Создание Критерия отбора

3. Выбираем справочники и документы, в которых будет применяться отбор.

Состав Критерия отбора

4. Создаём новую форму списка копированием.

Создание формы списка копированием

5. Добавляем реквизит формы с  типом данных как и в критерии отбора.

Добавление реквизита формы списка

Свойства реквизита формы списка

6. Добавляем на форму поле ввода. (Данные – реквизит формы, созданный в п.5. Выбор групп и элементов – Элементы.)

Добавление поля ввода

Свойства поля ввода

7. Создаём обработчик события ПриИзменении.

Создание обработчика события ПриИзменении

//Отбор по номенклатуре
Процедура НоменклатураПриИзменении(Элемент)
	Если ЗначениеЗаполнено(Номенклатура) Тогда
		Отбор.ОтборПоНоменклатуре.Установить(Номенклатура);
	Иначе
		Отбор.ОтборПоНоменклатуре.Использование = Ложь;
	КонецЕсли;
КонецПроцедуры

8. Устанавливаем созданную форму в качестве основной формы списка.

Установка новой формы списка в качестве основной

© При копировании материалов сайта ссылка на оригинал обязательна.

Часто возникает задача показать только нужные строки в табличной части документа или справочника (или другого объекта). Для этого можно использовать замечательное свойство:

в обычном приложении параметр для ОтборСтрок — Отбор…

в управляемом приложении — ФиксированнаяСтруктура

ОтборСтрок, которое входит в расширение табличного поля, связанного с табличной частью.

Управляемые формы

Код 1C v 8.3

 СписокЗаказовНаФорме.ОтборСтрок = Новый ФиксированнаяСтруктура("Клиент", СписокЗаказовНаФорме.ТекущиеДанные.Клиент);    

пример:

Код 1C v 8.3

 СписокЗаказовНаФорме = ЭтаФорма.Элементы.СписокЗаказов; 
ТекНомер = Неопределено; 
Для НомерСтроки = 0 По СписокЗаказов.Количество()-1 Цикл 
Сообщение = Новый СообщениеПользователю; 
Если СписокЗаказовНаФорме.ПроверитьСтроку(НомерСтроки) Тогда 
СписокЗаказовНаФорме.ТекущаяСтрока = НомерСтроки; 
Если ТекНомер = Неопределено Тогда 
Если ЗначениеЗаполнено(СписокЗаказовНаФорме.ТекущиеДанные.Машина) Тогда 
ТекНомер = СписокЗаказовНаФорме.ТекущиеДанные.Машина; 
Иначе 
Сообщение = Новый СообщениеПользователю; 
Сообщение.Текст = "Установите нужный номер автомобиля в первой строке списка"; 
Сообщение.Поле = "СписокЗаказов[" + НомерСтроки + "].Машина"; 
Сообщение.Сообщить(); 
СписокЗаказовНаФорме.ОтборСтрок = Новый ФиксированнаяСтруктура("Клиент", СписокЗаказовНаФорме.ТекущиеДанные.Клиент); 
Возврат; 
КонецЕсли; 
Иначе 
СписокЗаказовНаФорме.ТекущиеДанные.Машина = ТекНомер; 
КонецЕсли; 
КонецЕсли; 
КонецЦикла; 

или такой динамический отбор

Код 1C v 8.3

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

//очистка отбора (подставьте свои элементы) 
&НаКлиенте
Процедура ОчиститьОтбор(Команда)
    этаформа.Список.Отбор.Элементы.Очистить();
КонецПроцедуры

Обычные формы

Использовать его очень просто:

Код 1C v 8.х

 //установить отбор 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(ЗначениеОтбора); 

//отключить отбор 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(,Ложь); 

или 2-й вариант:

Код 1C v 8.х

 ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Использование = Истина; 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.ВидСравнения = ВидСравнения.Равно; 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Значение = ЗначениеОтбора; 

А теперь конкретные примеры:

Код 1C v 8.х

 //выбрать строки с ценой = 100 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Установить(100); 

-------- 
//выбрать строки с ценой 100 и опр. валютой 
ЭлементыФормы.тпТовары.ОтборСтрок.Валюта.Установить(ВалютаУпр); 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Установить(200); 

-------- 
//выбрать строки с ценой >= 100 (неравенство) 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Использование = Истина; 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ВидСравнения = ВидСравнения.БольшеИлиРавно; 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Значение = 100; 

-------- 
//выбрать строки с ценой от 100 до 200 (интервал) 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Использование = Истина; 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ВидСравнения = ВидСравнения.Интервал; 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ЗначениеС = 100; 
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ЗначениеПо = 200; 

-------- 
//выбрать строки с определенными товарами по списку 

ЭлементыФормы.тпТовары.ОтборСтрок.Товар.Использование = Истина; 
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.ВидСравнения = ВидСравнения.ВСписке; 
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.Значение.Добавить(Товар1); 
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.Значение.Добавить(Товар2); 

Подчиненные табличные части в 8.х

С помощью свойства ОтборСтрок можно реализовать подчиненные (связанные) табличные части. При смене текущей строки в первой табличной части вторая табличная часть показывает только связанную информаци. Например, таким образом можно реализовать работу с комплектами: 1-я таб. часть — комплекты, вторая — состав комплекта.

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

В событии ПриАктивизацииСтроки для первого табличного поля пишем:

Код 1C v 8.х

 ЭлементыФормы.СоставКомплекта.ОтборСтрок.Комплект.Установить(Комплект);    

При добавлении новой строки во вторую табличную часть, нужно следить за тем, чтобы идентификационная колонка была установлена.

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

Еще раз напомню, что ОтборСтрок входит в расширение табличного поля табличной части, т.е. табличное поле должно быть связано с табличной частью. Если же оно связано с динамическим списком типа СправочникСписок, то здесь нужно использовать свойство Отбор для объекта типа СправочникСписок.

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

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

15 Comments

  1. В запросе соединение надо в фигурные скобки заключить, иначе будете иметь соединение даже при отключенном отборе, что для динамических списков бывает болезненно. И вместо группировки лучше использовать «Различные». На производительность это скорее всего не повлияет, но смотрится лучше, и методически правильнее.

    Reply

  2. Да, согласен. Спасибо за замечание.

    Reply

  3. Вот оно, спасибо автору за раскрытие.

    Reply

  4. Вроде как всегда хватало просто Ctrl + F на соответствующей табличной части и получим отбор по одному полю.

    Ctrl + Q — отключение отбора.

    Reply

  5. (4) mxm2, Верно, эти комбинации клавиш действительно управляют отбором табличной части самого документа, но здесь речь про журнал(список) документов, в котором нужно управлять отбором по полям реквизитов табличных частей документа.

    Reply

  6. (5) Каюсь… Не въехал сразу. )

    Reply

  7. Хорошо, доступно оформленная мысль. Автору спасибо. Для кого-то будет шпаркалкой.

    Reply

  8. (1) Armando, вопрос сравнения производительности и выбора конструкций distinct (различные) и group by довольно часто поднимается и однозначного ответа на него нет. Уж больно все разнится на разных субд и разных запросах 🙂

    Да, «различные» проще и красивее выглядит, но не всегда быстрее 🙂

    Reply

  9. (8) nixel, я тоже точно не знаю. Надо план запроса смотреть. Просто привык, что вместе с группировкой используются агрегатные функции. А тут конкретно уникальные строки получить надо.

    Reply

  10. Спасибо за статью! Но у меня почему-то пропадают значки документов в списке после указанных действий ((( Кто сталкивался с такой проблемой?

    Reply

  11. (12) 7nightfly7, сложно диагностировать без скриншотика, картинки строк настраиваются в свойствах списка на закладке Использование (свойство ПутьКДаннымКартинкиСтроки обычно равно значению Список.СтандартнаяКартинка). Если же в списке использовалось свое собственное поле картинки, то нужно проследить, что реквизит списка, связанный с картинкой строк, присутствует в выбранных полях текста запроса.

    Reply

  12. Столкнулся с тем, что при такой схеме не корректно работают отборы с условиями с НЕ (НЕ равно, НЕ в списке) для поля с табличной частью

    Reply

  13. Просто

    СГРУППИРОВАТЬ ПО
    ДокументТабельУчетаРабочегоВремени.Ссылка

    тоже замечательно работает

    Reply

  14. Чуть было не изобрел велосипед! Спасибо автору ⭐

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Перейти к содержанию

Как установить отбор в табличной части программно

На чтение 2 мин Просмотров 8к. Опубликовано 21.06.2017

Иногда в зависимости от каких-то действий пользователя необходимо программно установить отбор в табличной части. Рассмотрим как это сделать.

Наиболее часто программно наложить отбор на табличную часть (ТЧ) требуется:

  • Для предоставления пользователю дополнительных интерфейсных возможностей наложения отбора. Например, в документе «Пересчет товаров» флаг для отображения только строк, в которых есть расхождения.
  • При использовании двух взаимосвязанных ТЧ. Т.е. когда при активизации строки в главной ТЧ, в подчиненной ТЧ выводятся только связанные с этой строкой данные. При таком подходе в обоих табличных частях должны быть колонки, по которым будет производиться связывание строк (ключ).

В качестве примера взаимосвязанных табличных частей можно привести обработку, в которой есть две ТЧ: «Контрагенты» и «Договоры». В первой отображаются контрагенты, во второй — договоры этих контрагентов. При активизации строки с контрагентом должен выводиться список договоров только текущего контрагента. Для связи двух ТЧ в каждой присутствует колонка-ключ «Контрагент», по которой производится связь. Отбор на ТЧ с договорами накладывается в событии ПриАктивизацииСтроки() при позиционировании на контрагенте.

Для наложения отбора на табличную часть используется расширение табличных частей — свойство ОтборСтрок, которое позволяет установить отбор по значению одной или нескольких колонок. Свойству ОтборСтрок может быть присвоено значение Неопределено или значение типа ФиксированнаяСтруктура. Значение Неопределено присваивается для снятия отборов. В случае использования фиксированной структуры в качестве ключа указывается имя реквизита ТЧ, а в качестве значения — значение для отбора.

Приведем примеры наложения отборов:

// В ТЧ "Товары" отображать только те строки, у которых в колонке "Отменено" содержится значение Ложь
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Отменено", Ложь);

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

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии