|
Задание на 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) вот именно суть оптимизации в том, что здесь расход памяти меньше, тут немного больше данных или те-же но на меньшее время блокируем и т.п. так что Выгрузить() в общем случает не торт
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |