Имя: Пароль:
1C
1С v8
1c 8.2 Решение проблемы с програмым отбором данных
0 mulder_mulder
 
13.06.15
17:15
Добрый день.
Решил написать для знакомого конфигурацию простенькую. Но столкнулся с непростой задачей.

Надо из кучи записей справочника показать только те, которые помечены специальным ID. ТО есть отбор произвести всего-лишь по одному единственному параметру.

Честно, везде облазил, нашёл только тут: htt_p://1c-programs.ru/chastye-voprosy-po-1s/kak-otkryt-formu-vybora-s-opredelennym-otborom-v-1s-82.html
Хоть как-то понятное объяснение, без излишеств, от которых и так не легко.

Но и тут вышла загвоздка.

создал: ссс = список.Отбор(этаформа.Элементы.ID_СоздателяДокумента,истина);
Где "список" это табличная форма, которая отображает записи справочника, с перечнем данных.

Может пока не очень ясно излагаю, но "соль в том", что все страницы с советами излагают одну и ту-же практику. Которая, хоть и не выдаёт ошибки, при проверке, но при запуске в исполнении говорит о том, что (метод объекта не обнаружен(отбор)).

То есть если написать "пробка = список.отбор" - он будет, но что дальше писать? ведь, по точке, ничего не открывается, и в книжке и справке весьма скудно написано. что к чему.

За ранееблагодарен.
1 Dен
 
13.06.15
18:01
А зачем табличное поле?
Обращайся сразу к динамическому списку, там есть свойство отбор.
2 Dен
 
13.06.15
18:02
Вот пример:

Функция ДобавитьЭлементОтбораВДинамическийСписок(ДинамическийСписок, ЛевоеЗначение, ПравоеЗначение, ВидСравнения = Неопределено, Использование = Истина, РежимОтображения = Неопределено) Экспорт
    
    Если ТипЗнч(ЛевоеЗначение) = Тип("Строка") Тогда
        ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЛевоеЗначение);
    КонецЕсли;
    
    Если ВидСравнения = Неопределено Тогда
        ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    КонецЕсли;
    
    Если РежимОтображения = Неопределено Тогда
        РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    КонецЕсли;
    
    ЭлементОтбора = Неопределено;
    Для Каждого Элемент Из ДинамическийСписок.Отбор.Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
            Если ЛевоеЗначение = Элемент.ЛевоеЗначение Тогда
                ЭлементОтбора = Элемент;
                Прервать;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Если ЭлементОтбора = Неопределено Тогда
        ЭлементОтбора = ДинамическийСписок.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    КонецЕсли;
    ЭлементОтбора.ЛевоеЗначение    = ЛевоеЗначение;
    ЭлементОтбора.ПравоеЗначение   = ПравоеЗначение;
    ЭлементОтбора.ВидСравнения     = ВидСравнения;
    ЭлементОтбора.Использование    = Использование;
    ЭлементОтбора.РежимОтображения = РежимОтображения;
    
    Возврат ЭлементОтбора;
    
КонецФункции
3 mulder_mulder
 
13.06.15
18:47
Вот этого-то я и боялся :)
Благодарю, конечно. Этот пример мне пригодится, но по позже, когда буду сводить всё что понаписал в нужный ему документ.

Эх,если бы я каждый день такими операциями ворошил, то с такой силищей в голове, по оперированию данными и с отбором в таблице проблем бы не возникло ;)

Интересно, часть кода будет работать под моими объектами?

Тут дело в другом. Есть автоматически созданная формаСписка. Которая выдаёт всё, что было заведено через вспомогательную, тоже, автоматически программой, созданную ФормуЭлемента.

Нужна маленькая мелочь, пару строчек, максимум 7, которые покажут не всё, а к примеру те строки, где, скажем в наименовании встречаются рядом стоящие буквы "Лар" Или по какому либо другому, одному параметру.

Если можно, кусочек, небольшой кода.
4 Dен
 
13.06.15
19:13
Так подойдет?

ДобавитьЭлементОтбораВДинамическийСписок(ДинамическийСписок, ЛевоеЗначение, "Лар", ВидСравненияКомпоновкиДанных.Содержит);

Сама функция в (2).
5 Dен
 
13.06.15
19:15
+(4)
ЛевоеЗначение = "Наименование";
6 mulder_mulder
 
13.06.15
19:19
Сделал так:
ДобавитьЭлементОтбораВДинамическийСписок(этаформа.Список, элементы.ID_СоздателяДокумента, "1", ВидСравненияКомпоновкиДанных.Содержит);

Правильно?
    

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'v':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/uobjects}v
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'FilterItem':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/dynamic-list}FilterItem
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'left':
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data-composition-system/settings}left
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы.

Наверное я где-то ошибся. Работа такая раз в год заставляют в 1с программировать, а я с прошлого уже всё позабыл. :)
7 Dен
 
13.06.15
19:22
Почему?
этаформа.Список, элементы.ID_СоздателяДокумента

Зачем здесь элементы формы? Есть же реквизиты формы, отвечающией за Список и ID_СоздателяДокумента. Их и нужно передавать.
8 Dен
 
13.06.15
19:24
И на сервер тянуть не обязательно.
9 mulder_mulder
 
13.06.15
19:34
Как добраться до этих реквизитов?
Можно пример? Чего-то я уже никакой. документы.ПротоколАктивности.реквизит.список?
Или вв =     документы.ПротоколАктивности.ПолучитьФормуВыбора()
   вв. ...?
10 mulder_mulder
 
13.06.15
19:38
Понимаю, глупо, Но кому то, тоже это может помочь.
11 Dен
 
13.06.15
19:39
Формы управляемые?
Код в модуле формы пишется?

Реквизиты управляемой формы описаны в правом верхнем углу окна редактирования формы.
12 mulder_mulder
 
13.06.15
19:50
Это я знаю. И вижу их, я же их там и понаделал. Как к ним добраться через код, Если не через "ЭтаФорма...."
Видимо я не вижу очевидного.Эта мелочь приводит меня в ступор, мы не видим этого одинакого. Я из-за громадных размеров, а вы из-за крошечных.

Опять проблема из-за путаницы экземпляров объектов и самих объектов это где-то было.
Покажите, как вы добираетесь до реквизитов?
Извините за тупость. Каждый год одни и те-же грабли.
13 Dен
 
13.06.15
19:55
Просто:
ИмяРеквизита
14 Dен
 
13.06.15
19:57
Если имена реквизитов и элементов формы совпадают, то

ДобавитьЭлементОтбораВДинамическийСписок(Список, ID_СоздателяДокумента, "1", ВидСравненияКомпоновкиДанных.Содержит);
15 mulder_mulder
 
13.06.15
20:03
{Документ.ПротоколАктивности.Форма.ФормаСписка.Форма(54,50)}: Переменная не определена (ID_СоздателяДокумента)

Как указать правильно, если она не определена. А она есть.
Баг может? сейчас перезагружу программу.
16 mulder_mulder
 
13.06.15
20:06
Перезагрузил, всёравно ругается на неопределённую переменную.
17 Dен
 
13.06.15
20:06
Где этот реквизит "ID_СоздателяДокумента"?
Может быть
Объект.ID_СоздателяДокумента
18 mulder_mulder
 
13.06.15
20:12
Этот реквизит лежит в списках реквизитов документа "ПротоколаАктивности". Таблица формируется из него и из других, лежащих рядом с ним реквизитов. Может быть целесообразней создать отдельно табличную часть и загнать нужные реквизиты туда? Может быть в этом заключается ошибка моя?
19 mulder_mulder
 
13.06.15
20:14
На "Объект" он тоже ругается. (Переменная не определена (обьект))
20 mulder_mulder
 
13.06.15
20:14
обьект.ID_СоздателяДокумента
21 Dен
 
13.06.15
20:17
>> Может быть целесообразней создать отдельно табличную часть и загнать нужные реквизиты туда? Может быть в этом заключается ошибка моя?

Со своей стороны гадать не вижу смысла.
22 mulder_mulder
 
13.06.15
20:21
Меня эта мысль навела на прошлые из искания, в прошлый раз была подобная проблема с обращением объектам и реквизитам....
Благодарю, что натолкнули меня та эту мысль. Попробую,отпишусь.
23 mulder_mulder
 
14.06.15
00:50
Решено.
Нарыл ещё одну страницу в интернете. Мало чего тут понял, но это действительно работает. и как оговаривалось до 7 строчек.
хотя, признаться, почти дописал свою функцию отбора, потом получил очередной ступор, полез и в интернет,и нашёл ответ на прошлый "затык".

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

Особая благодарность ДЕНу, за его терпение.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой