Как добавить в запрос внешний источник данных?

1. work.1c 18.02.13 21:06 Сейчас в теме
Расскажу кратко. Программа УТ 10.3. Надо Выбрать из документа УстановкаЦенНоменклатуры Колонку Номенклатура и соединить ее с РегистромСведений.ЦеныНоменклатуры.СрезПоследних, чтобы получить последнюю цену по данной номенклатуре. Текст запроса не окончательный, пока ругается на несоответствие типов параметра и невозможность соединения. Если честно я не знаю даже возможно это или нет, все методом тыка. Спросить тоже не у кого, кроме вас.


&НаСервере
Процедура ПолучитьНоменклатуру()
    ТабНом = Новый ТаблицаЗначений;
    ТабНом = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
    Запрос = Новый Запрос;
    ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ВнешнийИсточник.Номенклатура,
        |   ЦеныНоменклатурыСрезПоследних.Цена
        |ПОМЕСТИТЬ ВремТабл
        |ИЗ
        |   &ВнешнийИсточник КАК ВнешнийИсточник
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
        |       ПО ВнешнийИсточник.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";

    Запрос.УстановитьПараметр("ВнешнийИсточник", );
    Запрос.УстановитьПараметр("ТипЦен", ТипЦен);

    Результат = Запрос.Выполнить().Выгрузить();
   
    КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. work.1c 18.02.13 21:13 Сейчас в теме
Как бы мне понятно что я выгружаю колонку в результате получаю массив, этот массив я должен загрузить в новую ТЗ.
Что-то типа
ТабНом = Новый ТаблицаЗначений;
Ном = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
ТабНом.ЗагрузитьКолонку("Номенклатура", Ном);
3. work.1c 18.02.13 21:24 Сейчас в теме
Чуть подправил, ошибок при загрузке колонок нет, но почему-то не загружает, вернее там пусто...

Загружаю так:

ТабНом = Новый ТаблицаЗначений;
    Ном = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
    ТабНом.Колонки.Добавить("Номенклатура");
    ТабНом.ЗагрузитьКолонку(Ном, "Номенклатура");



Может быть дело в следующем... На форме данные ТЗ: "ТаблицаЦен".
Может быть дело в том что я получаю пустой объект. Щас подумаю как получить ТЗ уже с данными. Что типа: ЭлементыФормы.ТаблицаЦен...
Есть вероятность что я не разобрался с самим документом... Там как то странно он получает данные, имеется табличная часть Товары, на форме которая заполняется пользователем. Но в моем случае документ формируется на основании поступления и значения вроде бы передаются именно в ТЗ, а затем уже в табличную часть. Я пока не имею большого опыта и не получается разобраться в типовом документе, путаюсь...


А может быть задумка с соединением таблицы с запросом в корне не верна, в любом случае не узнаю, пока не попробую...

В любом случае не хочу я делать отдельно запрос к регистру а потом делать цикл в цикле переребором по номенклатуре... Или решение еще хуже, в цикле перебора ТЗ, через параметр выбирать номенклатуру по срезу последних, легче всего, но думаю это тупо...
4. work.1c 18.02.13 21:54 Сейчас в теме
Блин, понимаю что тупых вопросов куча, но все же... Сделал так:

ТабНом = Новый ТаблицаЗначений;
    СтрокаТабличнойЧасти = ЭлементыФормы.ТаблицаЦен;
    ТабНом.Колонки.Добавить("Номенклатура");
    НоваяСтрока = ТабНом.Добавить();
    Для Каждого СтрокаТабличнойЧасти Из ТаблицаЦен Цикл
        НоваяСтрока.Номенклатура               = СтрокаТабличнойЧасти.Номенклатура;
        КонецЦикла;


В результате в таблицу попала только первая запись, а почему? Ткните носом плз...
5. Kom-off 18.02.13 22:07 Сейчас в теме
(4) Мне кажется, что этот разговор самим с собой надо разбавить. Для начала посмотри отладчиком, какой тип имеет СтрокаТабличнойЧасти после второй строки и чему она равна теле цикла. Я чего-то этой логики не понимаю.
6. visard2 18.02.13 22:11 Сейчас в теме
ТабНом = Новый ТаблицаЗначений;
ТабНом.Колонки.Добавить("Номенклатура");

Для Каждого Строка Из ТЧНомИзУстЦен Цикл
НоваяСтрока = ТабНом.Добавить();
НоваяСтрока.Номенклатура = Строка.Номенклатура
КонецЦикла;
7. work.1c 18.02.13 22:19 Сейчас в теме
{Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента.Форма(2437)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить().Выгрузить();
по причине:
При выборе данных из объекта в запросе не могут присутствовать соединения и объединения


Видимо все-таки нельзя соединять ТЗ с запросом... Ладно я завтра добью этот вопрос, поздно уже... 0:19, Спасибо за советы.
8. KonstB 180 19.02.13 00:33 Сейчас в теме
Код получения последних цен:
МассивНомен = Документ_УстановкаЦенНомен.Товары.ВыгрузитьКолонку("Номенклатура");
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	|	ЦеныНоменклатурыСрезПоследних.Цена
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
	|			&Дата2,
	|			ТипЦен = &ТипЦен
	|				И Номенклатура В (&МассивНомен)) КАК ЦеныНоменклатурыСрезПоследних";
	
	Дата2 = ТекущаяДата();  //Дата2 = Документ_УстановкаЦенНомен.Дата;  - что Вам надо
	
	Запрос.УстановитьПараметр("Дата2", Дата2);
	Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
	Запрос.УстановитьПараметр("МассивНомен", МассивНомен);
	
	Результат = Запрос.Выполнить().Выгрузить();
Показать



Что-то я запамятовал... возможно надо почистить массив, если цен в документе больше 1
9. ljn8320 19.02.13 06:07 Сейчас в теме
можно соединить тз с запросом только тз эту нужно поместиь во временную таблицу запроса

ТабНом = ТаблицаЦен.Выгрузить(,"Номенклатура");

Запрос = Новый Запрос;
ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.Номенклатура
|ПОМЕСТИТЬ ВремТабл
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВремТабл.Номенклатура,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| ВремТабл КАК ВремТабл
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО ВремТабл.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";

Запрос.УстановитьПараметр("ВнешнийИсточник", ТабНом);
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);

Результат = Запрос.Выполнить().Выгрузить();
10. work.1c 19.02.13 09:52 Сейчас в теме
    ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
	Период = (ДокументОбъект.Дата - 1);

	//------------Типизируем ТЗ, перед соединением с временной таблицей-------------------------
	Массив = Новый Массив;
	КС = Новый КвалификаторыСтроки(100);
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС = Новый ОписаниеТипов(Массив, , , , КС);
	Массив.Очистить();
	//------------------------------------------------------------------------------------------
	ТабНом = Новый ТаблицаЗначений;
    ТабНом.Колонки.Добавить("Номенклатура", ОписаниеТиповС);
    
    Для Каждого СтрокаТабличнойЧасти Из ТаблицаЦен Цикл
        НоваяСтрока = ТабНом.Добавить();
        НоваяСтрока.Номенклатура               = СтрокаТабличнойЧасти.Номенклатура;
        КонецЦикла;

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ВнешнийИсточник.Номенклатура
		|ПОМЕСТИТЬ ВремТабл
		|ИЗ
		|	&ВнешнийИсточник КАК ВнешнийИсточник
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ВремТабл.Номенклатура,
		|	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
		|ИЗ
		|	ВремТабл КАК ВремТабл
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
		|		ПО ВремТабл.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";


	Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
	Запрос.УстановитьПараметр("ВнешнийИсточник", ТабНом);
	Запрос.УстановитьПараметр("Период", Период);


	Результат = Запрос.Выполнить().Выгрузить();
Показать


Все работает, но есть одна проблемка... Цены почему то с нулями попадают. Останавливаю в отладчике в тз.результат попадает вся номенклатура из документа а цены по нулям... буду думать, а как проще всего потом вставить полученные данные в документ?
В принципе я думаю сделать так: вывести кнопку на форму, событие нажатие кнопки. Пользователь либо вручную вводит либо на основании другого документа позиции номенклатуры, затем нажимает кнопку, а результате чего происходит запрос, срез последних и в ее тз на форме добавляется колонка в которой располагаются все предыдущие остатки по позициям. Т.к. сортировка остается той же можно так же выгрузить целиком колонку, не заморачиваясь с поиском номенклатуры для цены...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот