|
|
|
Задание на 1с 1.8 | ☑ | ||
|---|---|---|---|---|
|
0
Motick
08.03.24
✎
14:12
|
&НаСервере
Функция СоздатьТаблицу()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Наименование_ПО");
Таблица.Колонки.Добавить("Срок_действия_лицензии");
Возврат Таблица;
КонецФункции
&НаСервере
Процедура ПолучитьДанныеЛицензий(Год)
МойЗапрос = Новый Запрос;
МойЗапрос.Текст =
"ВЫБРАТЬ
| Наименование_ПО,
| Срок_действия_лицензии
|ИЗ
| Справочник.Антивирусное_программное_обеспечение КАК Антивирусное_программное_обеспечение
|ГДЕ
| Год(Срок_действия_лицензии) = &Год";
МойЗапрос.УстановитьПараметр("Год", Год);
Выборка = МойЗапрос.Выполнить().Выбрать();
Если Не Выборка.Пустой() Тогда
Таблица = СоздатьТаблицу();
Пока Выборка.Следующий() Цикл
СтрокаТаблицы = Таблица.Добавить();
СтрокаТаблицы.Наименование_ПО = Выборка.Наименование_ПО;
СтрокаТаблицы.Срок_действия_лицензии = Выборка.Срок_действия_лицензии;
КонецЦикла;
Иначе
Сообщить("Лицензии с истекающим сроком действия в указанном году не найдены");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Обработать() Экспорт
ВводнаяДата = ЭтотОбъект.ВвестиДату;
Год = Год(ВводнаяДата);
ПолучитьДанныеЛицензий(Год);
КонецПроцедуры
Почему выходит данная ошибка - Метод объекта не обнаружен (Пустой)? |
|||
|
1
Builder
07.03.24
✎
18:39
|
А потому что надо смотреть что возвращаешь....
Выборка = МойЗапрос.Выполнить(); Если Не Выборка.Пустой() Тогда |
|||
|
2
Motick
07.03.24
✎
18:44
|
И как можно решить данную проблему?
Я в 1с новичек, поэтому и не понимаю |
|||
|
3
Волшебник
07.03.24
✎
19:07
|
(1) У Вас там не выборка.
Правильно так:
РезультатЗапроса = МойЗапрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл |
|||
|
4
Motick
07.03.24
✎
21:19
|
С такими изменениями теперь вообще ничего не выводит, никакой ошибки, ничего
|
|||
|
5
nicxxx
07.03.24
✎
21:23
|
Значит результат запроса - пустой ))
|
|||
|
6
Волшебник
07.03.24
✎
21:47
|
(4) У Вас нет команды вывода в программном коде.
|
|||
|
7
Builder
08.03.24
✎
00:08
|
(3) Пффф, я уж не стал менять имена переменных :)
|
|||
|
8
MaxxiMiliSanM
08.03.24
✎
14:13
|
(3) Правильней не делать лишних вложений:
РезультатЗапроса = МойЗапрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Возврат; КонецЕсли; Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл |
|||
|
9
Chai Nic
08.03.24
✎
08:23
|
Правильнее всего ТабЗнач=Запрос.Выполнить().Выгрузить() и далее работать с нормальной таблицей значений. А выборка - отстой полный.
|
|||
|
10
rphosts
08.03.24
✎
08:31
|
(9) легче но не правильнее.
|
|||
|
11
Мимохожий Однако
08.03.24
✎
08:55
|
(4) Убедись глазками, что справочник заполнен и параметр Год соответствует однотипному реквизиту в справочнике. Только после этого смотри запрос и результаты. И традиционное: научись работать с отладчиком. Многие вопросы для форума даже не появятся
|
|||
|
12
Волшебник
08.03.24
✎
08:55
|
(9) Зависит от размера результата запроса.
(7) А надо бы обращать внимание на такие нюансы. Кстати, в обработке ТС поле ВвестиДату хорошо бы переименовать в существительное. В случае сабжа надо ещё поработать над структурой базы и справочником. 1. Убрать "_" из имён реквизитов, перейти на стандартный ГорбатыйВерблюжийРегистр. 2. Снести справочник Антивирусное_программное_обеспечение и задействовать обычный справочник Номенклатура или НМА. 3. Срок действия лицензии вынести в периодический регистр сведений, потому что он меняется, продлевается. |
|||
|
13
Chai Nic
08.03.24
✎
16:26
|
(10) Я в курсе, что 1с так не рекомендует делать (хотя и делает в типовых). Но реально, по потребляемым ресурсам разницы нет. Нет там никакого последовательно перебираемого курсора. Выборка занимает в памяти столько же, сколько и таблица значений, выгруженная из результата запроса.
|
|||
|
14
rphosts
09.03.24
✎
07:11
|
(13) пока не закрыт запрос (не уничтожен объект), расход ресурсов примерно вдвое больше.
|
|||
|
15
Garykom
гуру
09.03.24
✎
08:26
|
(14) Угу.
Но с точки зрения логики и оптимизации - результат запроса и выборка из него лишние сущности! Можно обойтись только ТЗ и ДЗ (когда нужен обход по группировкам), чтобы запрос сразу возвращал результат в них. В случае пакетного запроса возвращал массив с ТЗ/ДЗ. |
|||
|
16
Garykom
гуру
09.03.24
✎
08:25
|
(15)+ По сути это тяжелое наследие 1С 7.7
Наравне с похожим Справочник|Документ.Выбрать() и затем обходом через Пока Выборка.Следующий() Тут тоже логично было бы сразу ТЗ = СправочникМенеджер.Выбрать(). Где кстати неплохо бы возможность указывать какие поля-реквизиты (это кроме ссылки) сразу в ТЗ вытаскивать. |
|||
|
17
Guk
09.03.24
✎
08:42
|
(16) >> Тут тоже логично было бы сразу ТЗ = СправочникМенеджер.Выбрать()
хороший вариант положить сервер приложений 1С... |
|||
|
18
Garykom
гуру
09.03.24
✎
09:14
|
(17) Да можно положить в этом случае по нехватке памяти
Но в этих случаях перебор выборки будет длиться неимоверно долго, по сути запросами в цикле с опорой на ссылки-УИДы (для сервера 1С и sql) Тут логично использовать пагинацию, указывая вручную или не указывая и в этом случае вернет кол-во записей (первые 10к например) по умолчанию |
|||
|
19
СвинТуз
09.03.24
✎
09:52
|
&НаКлиенте
Процедура Обработать() Экспорт Что в итоге? Получилось на клиент таблицу значений передать? |
|||
|
20
СвинТуз
09.03.24
✎
09:53
|
(0) (19)
С помощью процедуры. |
|||
|
21
Волшебник
09.03.24
✎
09:58
|
(19) В сабже ничего не передаётся. ПолучитьДанныеЛицензий - это процедура, а не функция. Она ничего не возвращает.
|
|||
|
22
rphosts
09.03.24
✎
12:59
|
(15) вот именно суть оптимизации в том, что здесь расход памяти меньше, тут немного больше данных или те-же но на меньшее время блокируем и т.п. так что Выгрузить() в общем случает не торт
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |