Версия для печати темы (https://pro1c.org.ua/index.php?s=a871984c4f14ac9be71fadb06003da1b&showtopic=57707)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Не срабатывает подсчет количества в запросе
Автор: svetas_l 15.03.20, 20:13
ЕСТЬ ФУНКЦИЯ -которая должна возвращать существующую характеристику или создавать новую, если текущая не найдена,
причем сам запрос в консоли запросов отрабатывает, но в функции не хочет. В результате функция создаёт к одной номенклатуре 16 характеристик одинаковых, а должна только одну.
В чем ошибка?
Код
Функция СоздатьХарактеристику(Номенклатура,Цвет)
// ХарактеристикиНоменклатуры
перем kol;
kol=0;
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| количество(ХарактеристикиНоменклатуры.Ссылка) КАК Количество_Характеристик
|ИЗ
| Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатуры
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО ХарактеристикиНоменклатуры.Ссылка.Владелец = Номенклатура.Ссылка
|ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
| ПО ХарактеристикиНоменклатуры.Свойство = ДополнительныеРеквизитыИСведения.Ссылка
|ГДЕ
| Номенклатура.Наименование = &Номенклатура_
| И ДополнительныеРеквизитыИСведения.Наименование = ""Цвет (Мотоциклы (Для характеристик))""
| И ХарактеристикиНоменклатуры.Значение = &Цвет_
|";
Запрос.УстановитьПараметр("Номенклатура_", СокрЛП(Строка(Номенклатура)));
Запрос.УстановитьПараметр("Цвет_", СокрЛП(Строка(Цвет)));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
kol=kol+ (ВыборкаДокументов.Количество_Характеристик);
КонецЦикла;
Если kol=0 Тогда
Цвет = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(СокрЛП(Строка(Цвет)));
СоздадимХарактеристику = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
СоздадимХарактеристику.УстановитьНовыйКод();
СоздадимХарактеристику.Владелец =Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Строка(Номенклатура)));
СоздадимХарактеристику.УстановитьСсылкуНового(Справочники.ХарактеристикиНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор));
СоздадимХарактеристику.Наименование = Цвет;
СоздадимХарактеристику.НаименованиеПолное= Цвет;
НовоеСвойство3=СоздадимХарактеристику.ДополнительныеРеквизиты.Добавить();
НовоеСвойство3.Свойство=ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Строка("Цвет (Мотоциклы (Для характеристик))"));
НовоеСвойство3.Значение= СокрЛП(Строка(Цвет));
НовоеСвойство3.ТекстоваяСтрока= СокрЛП(Строка(Цвет));
Попытка
СоздадимХарактеристику.Записать();
Возврат СоздадимХарактеристику.Ссылка;
Исключение
Сообщить("Не удалось записать элемент справочника. " + ОписаниеОшибки());
Возврат неопределено;
КонецПопытки;
ИначеЕсли kol>0 тогда
Запрос.УстановитьПараметр("Номенклатура_", СокрЛП(Строка(Номенклатура)));
Запрос.УстановитьПараметр("Цвет_", СокрЛП(Строка(Цвет)));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
Характеристика = ВыборкаДокументов.Характеристика;
КонецЦикла;
kol=0;
Возврат Характеристика;
КонецЕсли;
КонецФункции
Автор: svetas_l 16.03.20, 11:09
svetas_l @ Вчера, 20:13
,
Vofka а ещё раз помочь можете, пожалуйста.....
Автор: pablo 16.03.20, 13:24
В условии ДополнительныеРеквизитыИСведения.Наименование = ""Цвет (Мотоциклы (Для характеристик))"" используйте вместо равно Подобно с соответствующими литералами, поскольку длина этого поля явно больше, чем количество переданных Вами символов.
+ если у вас есть ссылки на справочник, почему Вы сравниваете не их, а строки из наименования?
Автор: alex1c 20.03.20, 19:44
svetas_l @ 15.03.20, 20:13
,
Пробуйте так:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
//| количество(ХарактеристикиНоменклатуры.Ссылка) КАК Количество_Характеристик
| ХарактеристикиНоменклатуры.Ссылка
|ИЗ
| Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатуры
//|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
//| ПО ХарактеристикиНоменклатуры.Ссылка.Владелец = Номенклатура.Ссылка
|ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
| ПО ХарактеристикиНоменклатуры.Свойство = ДополнительныеРеквизитыИСведения.Ссылка
|ГДЕ
| ХарактеристикиНоменклатуры.Ссылка.Владелец = &Номенклатура_
| И ДополнительныеРеквизитыИСведения = &Цвет_
| И ХарактеристикиНоменклатуры.Значение = &Цвет_
//| И ДополнительныеРеквизитыИСведения.Наименование = ""Цвет (Мотоциклы (Для характеристик))""
//| И ХарактеристикиНоменклатуры.Значение = &Цвет_
|";
Запрос.УстановитьПараметр("Номенклатура_", Номенклатура); // здесь ссылки
Запрос.УстановитьПараметр("Цвет_", Цвет); // здесь ссылки
//Запрос.УстановитьПараметр("Номенклатура_", СокрЛП(Строка(Номенклатура)));
//Запрос.УстановитьПараметр("Цвет_", СокрЛП(Строка(Цвет)));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Если ВыборкаДокументов.Следующий() Тогда
Возврат ВыборкаДокументов.Ссылка;
Иначе
// создаем новую
КонецЕсли;
Автор: svetas_l 21.03.20, 21:12
alex1c @ Вчера, 19:44
,
так же- без изменений...помогите,кто-нибудь...пожалуйста
Автор: alex1c 22.03.20, 10:07
Цитата(svetas_l @ 21.03.20, 21:12)
так же- без изменений...помогите,кто-нибудь...пожалуйста
Уважаемый, внимательно проверьте все типы значений, похоже что у вас это первая обработка...
Автор: svetas_l 22.03.20, 11:45
svetas_l @ Вчера, 21:12
,
все всем спасибо... дело было в типе значения характеристики
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua