Имя: Пароль:
1C
1С v8
Динамический список. Отбор. Как реализовать?
, ,
0 George_e30
 
04.09.18
14:22
Всем доброго дня!

Итак вопрос вот в чем. программно создаются счета из файла (файлов) внешней обработкой. Я прикрепил к ней Динамический список со ссылкой на СчетаНаОплатуПокупателям, там отображаются все счета.
Сумел сделать отбор так, чтоб показывало только последний созданный:

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

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

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

Если убрать вот это:
Загружено.Отбор.Элементы.Очистить();
То первый загруженный (по одному) отображается, но попытка загрузить второй - приводит к пустому списку, не реагирующему и на строку поиска...

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

Но "на сервере", где выполняется создание счета, Элемент отбора - неопределенная переменная.

Подскажите, как организовать))
p.S. Я последний раз кодил в 7.7 году этак в 2003, поэтому здесь сразу столкнулся с этими трудностями "На клиенте" на сервере", где не понял, как вообще обмен переменными организовать..
1 Krolik Bezobraznik
 
04.09.18
15:02
Вы хотите чтобы в динамический список добавлялся документ по мере того, как он создается у вас при импорте из файла?
2 Пес Барбос
 
04.09.18
15:02
Может "ВидСравнения" установить = "Всписке" и "ПравоеЗначение" = массив с номера созданных документов?
3 George_e30
 
04.09.18
15:16
попробовал вот так:
    ГруппаОтбора = Загружено.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;

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

Не помогло..
4 George_e30
 
04.09.18
15:17
(1) да (2) У меня подозрение, что повторная инициализация ЭлементаОтбора и дает пропадание всего из списка..
кмк надо вынести в функцию, только как с передачей переменных быть..
5 Fragster
 
гуру
04.09.18
15:20
надо выкинуть динамический список и отображать вместо него таблицу значений со своими добавленными счетами.
6 George_e30
 
04.09.18
15:22
(5) И как это сделать?
7 Жан Пердежон
 
04.09.18
15:23
(6) позвать настоящего программиста
8 George_e30
 
04.09.18
15:31
(2) Как передать с сервера на клиент этот массив?
Идея хорошая, но создавать в цикле отбор не реально, я уже уверен, что повторно инициализировать ЭлементОтбора нельзя. В цикле я создам массив, и как передать его значение в обработку, которая ищет файлы в папке по нажатию кнопки "загрузить"?
Возврат "массив"?
9 Михаил Козлов
 
04.09.18
16:06
(6) Завести ТЧ, поместить на форму, при создании - заполнять ТЧ.
Динамический список - странный элемент для такой задачи.
10 Krolik Bezobraznik
 
04.09.18
16:53
(8) передавайте список значений, он доступен на сервере и клиенте. Передается элементарно
11 Krolik Bezobraznik
 
04.09.18
16:54
(8) А вообще не ясна цель? Просто отобразить документу, которые были созданы?
12 George_e30
 
04.09.18
16:55
(11) И по клику открыть созданный документ
13 Krolik Bezobraznik
 
04.09.18
16:56
(12) Ну так вам проще тогда так (9)
14 George_e30
 
04.09.18
16:58
(13) Пробую разобраться. Но не могу пока найти как..
15 Krolik Bezobraznik
 
04.09.18
16:58
(12) Сделайте ТЧ в обработке с реквизитом ссылка на документ и по мере создания документов добавляйте строку в ТЧ
16 George_e30
 
04.09.18
17:16
Не понял как строку добавить. Гуглю варианты)
17 George_e30
 
04.09.18
17:17
Добавил на форму ТаблицаЗначений. Сделал поле Сыылка на док. А как в него внести - не понятно
18 Krolik Bezobraznik
 
04.09.18
17:23
В той процедуре, где создаешь документы, сделай добавление в ТЧ, после успешной записи документа.

Объект обработка доступен и на сервере и на клиенте.
19 George_e30
 
04.09.18
17:23
20 D_E_S_131
 
04.09.18
17:23
"...Динамический список со ссылкой на СчетаНаОплатуПокупателям, там отображаются все счета"
и
"Но я хочу сделать, чтоб там в списке появлялся каждый созданный"

Что сделать-то в итоге хочешь сам понимаешь?
21 George_e30
 
04.09.18
17:24
22 George_e30
 
04.09.18
17:24
(20) Мне нужен список созданных счетов. Клик по строчке - открытие нужного счета
23 D_E_S_131
 
04.09.18
17:25
(22) А динамический список не выводит тебе "список созданных счетов"?
24 George_e30
 
04.09.18
17:29
(23) Он выводит список всех счетов. А "отбор" мне удалось создать только по последнему загруженному.
Изначальный вопрос и был, как сделать правильный отбор.
25 D_E_S_131
 
04.09.18
17:33
(24) При создании новых документов запоминай ссылки в массиве, а по завершении поставь этот массив как условие отбора или параметр запроса динсписка.
26 D_E_S_131
 
04.09.18
17:34
Хотя наверное правильнее все же ТЗ заполнять...
27 Chameleon1980
 
04.09.18
17:38
Заведи РС который заполняешь ссылками на свои созданные на сервере доки.

в форме уже (если так хочется) выводи ДС с РС
28 George_e30
 
04.09.18
17:46
(18) Так вот..
Загружено.Счет = Счет.Ссылка
Сохранилось без ошибок.
Но при запуске - "поле объекта не обнаружено "счет""
(фото не прикрепляется, хотя посмотреть можно)

(24) Попробовал.
&НаКлиенте
Перем ЗагрСписок Экспорт;

&НаСервере
Функция СоздатьСчет(имяфайла)
ЗагрСписок = Новый Массив;
........(создаем счет, записываем)
ЗагрСписок.Добавить(Счет.Номер)
Возврат (ЗагрСпсок)
КонецФункции

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

Результат - пустое поле
29 George_e30
 
04.09.18
17:48
(27) Ничего не понял в Сокращениях "ДС" "РС"
30 George_e30
 
04.09.18
18:09
Вставил в при открытии:

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

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

Отработало!
Копаю в сторону передачи массива между функцией СоздатьСчет (в котором соберется массив) и ЗагрузитьИзПапки в котором активизируется отбор по массиву

Хотя ТЗ - Интересно понять как
31 Garykom
 
гуру
04.09.18
18:15
(0) Хммм вам бы после древней 77 для начала понять что такое клиент-сервер и как оно работает.

Будет намного легче и дурацких идей реализовывать не придется ))
32 Garykom
 
гуру
04.09.18
18:16
(29) Динамический Список, Регистр Сведений
33 George_e30
 
04.09.18
18:17
Так вот и непонятно :)) Я и с созданием повозился, но гугл помог))
34 George_e30
 
05.09.18
12:45
Итак, уважаемые форумчане, расскажите мне как заставить вот это работать:

&НаКлиентe
Процедура ПриОткрытии(отказ)
ЗагрДок = Новый Массив;
Конец процедуры

&НаКлиентe
Процедура ЗагрузитьВсё()
//Выбрать все файлы из папки и
Цикл Пока файлы не кончились :)
СоздатьСчет(имяфайла)
КонецЦикла;

ГруппаОтбора = Загружено.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;


ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

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

&НаСервере
Функция СоздатьСчет(ИмяФайла)
//Тут значится создаем и сохраняем счет "Счет"
ЗагрДок.Добавить(Счет.номер);
Возврат ЗагрДок;
КонецФункции

.....
Как заставить это работать? чтоб переменная массива была везде доступна. В таком виде даже не сохраняется обработка - переменная ЗагрДок неопределенная.
Как ее сделать "определенной" и доступной?
В 7.7 таких проблем, сколько помню не было...
35 Вафель
 
05.09.18
12:55
добавь как реквизит формы
36 George_e30
 
05.09.18
14:28
(35) Тип "Массив" не может использоваться в данных формы.
37 George_e30
 
05.09.18
16:29
Что ж, господа, я добился своего (но не до конца) с Динамическим списком.

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

Сделал так:

&НаСервере
Функция СоздатьСчет(ИмяФайла, ЗагрДок)
    //Создаем счет "Счет", записываем
    ЗагрДок.Добавить(Счет.Номер);
    Возврат ЗагрДок;
КонецФункции

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

Мне получается надо избавится от объявления переменной ЗагрДок в процедуре "загрузить", и объявить ее ПриОткрытии, но так, чтоб она "попала" в процедуру "загрузить", чтоб в дальнейшем в нее только прибавляло значения...
Как это сделать?
Как ее передать
38 Михаил Козлов
 
05.09.18
16:40
(37) Отказаться от ДС.
39 George_e30
 
05.09.18
16:49
(38) И что сделать? ТЗ?
Я вчера вообще не понял, как ее заполнять, когда она на форме создана...

Как разберусь с ДС, попробую повторить всё то же самое с ТЗ, а пока нашему бухгалтеру надо сделать рабочий вариант)

попробовал вот так:
Если ЗагрДок = Неопределено Тогда ЗагрДок = Новый Массив;
КонецЕсли

Но... Опять "переменная не определена"(( в условии
40 Chameleon1980
 
05.09.18
17:09
Блин ну подсказали уже что такое ДС и РС

пиши при создании чего-то там в Регистр сведений (РС)
и отображай этот РС в ДС (динамический список).
никаких заморочек лишних
41 Михаил Козлов
 
05.09.18
17:47
(39) 1. Добавляете в обработку ТЧ "СозданныеСчета".
2. В реквизитах формы появляется реквизит СозданныеСчета - ТЧ обработки с реквизитами ТЧ.
3. Вытягиваете этот реквизит на форму.
4. При создании нового счета в Объект.СозданныеСчета добавляете новую строку со ссылкой на созданный документ.
42 George_e30
 
06.09.18
12:58
(41) ТЧ и ТЗ - это одно и то же?
Я добавил ТЗ, добавил ей реквизит "счет", справочникСсылка.СчетаНаОплатуПокупателям.

Как туда добавить строку? Вот чего я не понял. СозданныеСчета.Счет = Счет.Ссылка - Поле объекта не обнаружено..
...............................................

(40) Тоже пробовал посмотреть. Добавляю реквизит формы, и пробую ему присвоить тип РегистрСведений. Но их там полно, и я е нашел подходящего.. Что за РегистрСведений, и какого типа он должен быть...
43 George_e30
 
06.09.18
13:50
(41) Не СправочникСсылка, а ДокументСсылка

Нагуглил:
НовСтр = СозданныеСчета.Добавить();
НовСтр = Счет.Ссылка;
Сделал - в результате 2 пустые (2счета создаю) строки, в которые можно выбрать счет
44 Garykom
 
гуру
06.09.18
13:55
Поймите простую вещь, даже если вы были супер-пупер программистом на 1С "7.7 году этак в 2003" то писать на 8.Х УФ не выйдет.

Никак не выйдет - сложность освоить 1С8 + УФ + клиент/сервер примерно в 3 раза выше чем простую 1С 7.7
45 George_e30
 
06.09.18
14:03
(44) Не спорю) Но я упертый)) И в общем-то всему научился сам))
Счет-то я как-то создал. Причем нигде не нашел полной информации, например как СрокОплаты сделать. Кстати с этим вопросом тут и зарегился, но ответ нашел сам.
У меня что-то уже выходит с ТЗ, но кмк я все таки вернусь к результату с РС и ДС.
Подскажите только как РС использовать :)
46 Garykom
 
гуру
06.09.18
14:06
(45) Читай Радченко
47 George_e30
 
06.09.18
14:09
Спасибо! Уже скачал)
48 Chameleon1980
 
06.09.18
14:46
запись в РС менеджером примерно так выглядит:

МенеджерЗаписи=РегистрСведений.Твой.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Поле1=Значение1;
МенеджерЗаписи.Поле2=Значение2;
МенеджерЗаписи.Записать();
49 George_e30
 
06.09.18
14:50
Всем спасибо, я получил, что хотел :)

&НаКлиенте
Перем ЗагрДок Экспорт;

&НаСервере
Функция СоздатьСчет(ИмяФайла, ЗагрДок)
    //Создаем счет "Счет", записываем

    ЗагрДок.Добавить(Счет.Номер);
    Возврат ЗагрДок;
КонецФункции

&НаКлиенте
Процедура Загрузить()//Вызывается по нажатию кнопки

    //Поиск файлов в папке и

Цикл Пока "Файлы не кончились"
    СоздатьСчет(ИмяФайла, ЗагрДок);
КонецЦикла;
    //Очищаем отобор

    //Создаем отбор снова

    ЭлементОтбора.ПравоеЗначение = ЗагрДок;
КонецПроцедуры

Процедура ПриОткрытии()
    ЗагрДок = Новый Массив;
КонецПроцедуры

Отдельная благодарность  Garykom за подсказаную книжку
и  Chameleon1980 за подсказку по РегиструСведений. Сейчас буду пробовать его..

ТЗ не очень удобно - там клик по строчке не откроет счет, а даст выбрать (как номенклатуру в счете) ДС в моем случае - удобнее.
50 Михаил Козлов
 
06.09.18
16:13
(43) Так не пробовали: НовСтр.Счет = Ссылка на созданный документ "СчетНаОплатуПокупателю";
НовСтр.Счет - реквизит (ТЗ или ТЧ) нужного типа.
(49) "ТЗ не очень удобно" - Вы не правы: посмотрите свойства поля ввода. Можно "снести" возможность выбора, а кнопка открытия ставится автоматом. Можно еще использовать события поля ввода.
51 George_e30
 
12.09.18
12:47
И еще раз всем добрый день!
Вопрос вот в чем. У списка счетов есть столбец "оплачен", ПеречисленеСсылка.СтатусОплатыСчетов.
В форме списка самих счетов (а там тоже динамич.список) все ок

А у меня этот столбец называется почему-то УдалитьСтатусОплаты, имеет ссылку туда же ПеречисленеСсылка.СтатусОплатыСчетов, а на форме выглядит вот так "(не используется) Статус Оплаты), и реально не используется, т.е. не отобюражается значение.

Как заставить его использоваться?
52 hhhh
 
12.09.18
13:35
(51) нуЮ у поля на форме поменять заголовок. Вместо "(не используется) Статус Оплаты" вбить туда "Статус оплаты".
53 George_e30
 
12.09.18
13:59
(52) Заголовка не было вообще. Ввел, он появился.. Но данные в списке но отображаются... Почему и как исправить?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан