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