Как добавить в запрос внешний источник данных?
Расскажу кратко. Программа УТ 10.3. Надо Выбрать из документа УстановкаЦенНоменклатуры Колонку Номенклатура и соединить ее с РегистромСведений.ЦеныНоменклатуры.СрезПоследних, чтобы получить последнюю цену по данной номенклатуре. Текст запроса не окончательный, пока ругается на несоответствие типов параметра и невозможность соединения. Если честно я не знаю даже возможно это или нет, все методом тыка. Спросить тоже не у кого, кроме вас.
&НаСервере
Процедура ПолучитьНоменклатуру()
ТабНом = Новый ТаблицаЗначений;
ТабНом = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
Запрос = Новый Запрос;
ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена
|ПОМЕСТИТЬ ВремТабл
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
| ПО ВнешнийИсточник.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
Запрос.УстановитьПараметр("ВнешнийИсточник", );
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
Результат = Запрос.Выполнить().Выгрузить();
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Объектная модель запроса "Схема запроса" - теория и примеры использования
- Внешние источники данных. Примеры (добавление, изменение, удаление). Реализовано в версии 8.3.5.1068 и позднее
- Как я собрал для себя высокопроизводительный и бесплатный облачный бекенд для 1С на PosgreSQL + PostgREST
- Запросы 1С СКД. Возможности и ограничения
- Как работать настоящим программистом и стоит ли стремиться уйти из 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Как бы мне понятно что я выгружаю колонку в результате получаю массив, этот массив я должен загрузить в новую ТЗ.
Что-то типа
ТабНом = Новый ТаблицаЗначений;
Ном = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
ТабНом.ЗагрузитьКолонку("Номенклатура", Ном);
Что-то типа
ТабНом = Новый ТаблицаЗначений;
Ном = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
ТабНом.ЗагрузитьКолонку("Номенклатура", Ном);
Чуть подправил, ошибок при загрузке колонок нет, но почему-то не загружает, вернее там пусто...
Загружаю так:
Может быть дело в следующем... На форме данные ТЗ: "ТаблицаЦен".
Может быть дело в том что я получаю пустой объект. Щас подумаю как получить ТЗ уже с данными. Что типа: ЭлементыФормы.ТаблицаЦен...
Есть вероятность что я не разобрался с самим документом... Там как то странно он получает данные, имеется табличная часть Товары, на форме которая заполняется пользователем. Но в моем случае документ формируется на основании поступления и значения вроде бы передаются именно в ТЗ, а затем уже в табличную часть. Я пока не имею большого опыта и не получается разобраться в типовом документе, путаюсь...
А может быть задумка с соединением таблицы с запросом в корне не верна, в любом случае не узнаю, пока не попробую...
В любом случае не хочу я делать отдельно запрос к регистру а потом делать цикл в цикле переребором по номенклатуре... Или решение еще хуже, в цикле перебора ТЗ, через параметр выбирать номенклатуру по срезу последних, легче всего, но думаю это тупо...
Загружаю так:
ТабНом = Новый ТаблицаЗначений;
Ном = ТаблицаЦен.ВыгрузитьКолонку("Номенклатура");
ТабНом.Колонки.Добавить("Номенклатура");
ТабНом.ЗагрузитьКолонку(Ном, "Номенклатура");
Может быть дело в следующем... На форме данные ТЗ: "ТаблицаЦен".
Может быть дело в том что я получаю пустой объект. Щас подумаю как получить ТЗ уже с данными. Что типа: ЭлементыФормы.ТаблицаЦен...
Есть вероятность что я не разобрался с самим документом... Там как то странно он получает данные, имеется табличная часть Товары, на форме которая заполняется пользователем. Но в моем случае документ формируется на основании поступления и значения вроде бы передаются именно в ТЗ, а затем уже в табличную часть. Я пока не имею большого опыта и не получается разобраться в типовом документе, путаюсь...
А может быть задумка с соединением таблицы с запросом в корне не верна, в любом случае не узнаю, пока не попробую...
В любом случае не хочу я делать отдельно запрос к регистру а потом делать цикл в цикле переребором по номенклатуре... Или решение еще хуже, в цикле перебора ТЗ, через параметр выбирать номенклатуру по срезу последних, легче всего, но думаю это тупо...
Блин, понимаю что тупых вопросов куча, но все же... Сделал так:
В результате в таблицу попала только первая запись, а почему? Ткните носом плз...
ТабНом = Новый ТаблицаЗначений;
СтрокаТабличнойЧасти = ЭлементыФормы.ТаблицаЦен;
ТабНом.Колонки.Добавить("Номенклатура");
НоваяСтрока = ТабНом.Добавить();
Для Каждого СтрокаТабличнойЧасти Из ТаблицаЦен Цикл
НоваяСтрока.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
КонецЦикла;
В результате в таблицу попала только первая запись, а почему? Ткните носом плз...
{Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента.Форма(2437)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить().Выгрузить();
по причине:
При выборе данных из объекта в запросе не могут присутствовать соединения и объединения
Видимо все-таки нельзя соединять ТЗ с запросом... Ладно я завтра добью этот вопрос, поздно уже... 0:19, Спасибо за советы.
Результат = Запрос.Выполнить().Выгрузить();
по причине:
При выборе данных из объекта в запросе не могут присутствовать соединения и объединения
Видимо все-таки нельзя соединять ТЗ с запросом... Ладно я завтра добью этот вопрос, поздно уже... 0:19, Спасибо за советы.
Код получения последних цен:
Что-то я запамятовал... возможно надо почистить массив, если цен в документе больше 1
МассивНомен = Документ_УстановкаЦенНомен.Товары.ВыгрузитьКолонку("Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Дата2,
| ТипЦен = &ТипЦен
| И Номенклатура В (&МассивНомен)) КАК ЦеныНоменклатурыСрезПоследних";
Дата2 = ТекущаяДата(); //Дата2 = Документ_УстановкаЦенНомен.Дата; - что Вам надо
Запрос.УстановитьПараметр("Дата2", Дата2);
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
Запрос.УстановитьПараметр("МассивНомен", МассивНомен);
Результат = Запрос.Выполнить().Выгрузить();
ПоказатьЧто-то я запамятовал... возможно надо почистить массив, если цен в документе больше 1
можно соединить тз с запросом только тз эту нужно поместиь во временную таблицу запроса
ТабНом = ТаблицаЦен.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.Номенклатура
|ПОМЕСТИТЬ ВремТабл
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВремТабл.Номенклатура,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| ВремТабл КАК ВремТабл
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО ВремТабл.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
Запрос.УстановитьПараметр("ВнешнийИсточник", ТабНом);
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
Результат = Запрос.Выполнить().Выгрузить();
ТабНом = ТаблицаЦен.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.Номенклатура
|ПОМЕСТИТЬ ВремТабл
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|;
|
|////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВремТабл.Номенклатура,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| ВремТабл КАК ВремТабл
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО ВремТабл.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
Запрос.УстановитьПараметр("ВнешнийИсточник", ТабНом);
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
Результат = Запрос.Выполнить().Выгрузить();
ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000003");
Период = (ДокументОбъект.Дата - 1);
//------------Типизируем ТЗ, перед соединением с временной таблицей-------------------------
Массив = Новый Массив;
КС = Новый КвалификаторыСтроки(100);
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , , , КС);
Массив.Очистить();
//------------------------------------------------------------------------------------------
ТабНом = Новый ТаблицаЗначений;
ТабНом.Колонки.Добавить("Номенклатура", ОписаниеТиповС);
Для Каждого СтрокаТабличнойЧасти Из ТаблицаЦен Цикл
НоваяСтрока = ТабНом.Добавить();
НоваяСтрока.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.Номенклатура
|ПОМЕСТИТЬ ВремТабл
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВремТабл.Номенклатура,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| ВремТабл КАК ВремТабл
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
| ПО ВремТабл.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
Запрос.УстановитьПараметр("ВнешнийИсточник", ТабНом);
Запрос.УстановитьПараметр("Период", Период);
Результат = Запрос.Выполнить().Выгрузить();
ПоказатьВсе работает, но есть одна проблемка... Цены почему то с нулями попадают. Останавливаю в отладчике в тз.результат попадает вся номенклатура из документа а цены по нулям... буду думать, а как проще всего потом вставить полученные данные в документ?
В принципе я думаю сделать так: вывести кнопку на форму, событие нажатие кнопки. Пользователь либо вручную вводит либо на основании другого документа позиции номенклатуры, затем нажимает кнопку, а результате чего происходит запрос, срез последних и в ее тз на форме добавляется колонка в которой располагаются все предыдущие остатки по позициям. Т.к. сортировка остается той же можно так же выгрузить целиком колонку, не заморачиваясь с поиском номенклатуры для цены...
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот