|
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_Создателя; Особая благодарность ДЕНу, за его терпение. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |