Как перенести процедуру из модуля объекта источника в алгоритмы с переменными.
Обмен Розница 1.0 платформа 8.1 - БП 3.0
Настраиваю выгрузку подглядывая в типовые правила, в ПКГС товары вызывается алгоритм а алгоритм обращается к процедуре источника
В модуле объекта процедура выглядит так
При выгрузке ругается "процедура не найдена". Почитал инфу, пишут что обработка в 8.1 отличается от 8.2 и поэтому не находит и нужно процедуру перенести в алгоритмы. Перенес но параметры не знаю как передать и вызвать ее в алгоритме.
Настраиваю выгрузку подглядывая в типовые правила, в ПКГС товары вызывается алгоритм а алгоритм
Выполнить(Алгоритмы.СформироватьТаблицуТоваровСКомплектующими);
Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());
В модуле объекта процедура выглядит так
Процедура ПодготовитьТаблицуТоваров(ТаблицаТоваров, СтруктураШапкиДокумента) Экспорт
При выгрузке ругается "процедура не найдена". Почитал инфу, пишут что обработка в 8.1 отличается от 8.2 и поэтому не находит и нужно процедуру перенести в алгоритмы. Перенес но параметры не знаю как передать и вызвать ее в алгоритме.
По теме из базы знаний
Найденные решения
(9) seva1405, в ПКО вашего объекта, а потом передаем всю табличную часть товары через входящие данные
ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());
ну и в свойствах ПКГС Товары ставим флаг Получить из входящих данных
передать только одну колонку Себестоимость в ТЧ товары нельзя (может кто то предложит хитрый способ?)
ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());
ну и в свойствах ПКГС Товары ставим флаг Получить из входящих данных
передать только одну колонку Себестоимость в ТЧ товары нельзя (может кто то предложит хитрый способ?)
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Код в ПКГС
Код в Алгоритме "СформироватьТаблицуТоваровСКомплектующими"
ТаблицаТоваров = Новый ТаблицаЗначений;
Выполнить(Алгоритмы.СформироватьТаблицуТоваровСКомплектующими);
Для Каждого СтрокаТоваров Из ТаблицаТоваров Цикл
Если СтрокаТоваров.ПересчитыватьНДС Тогда
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТоваров, Источник, Источник.УчитыватьНДС, Источник.СуммаВключаетНДС);
КонецЕсли;
КонецЦикла;
КоллекцияОбъектов = ТаблицаТоваров.Скопировать();
ПоказатьКод в Алгоритме "СформироватьТаблицуТоваровСКомплектующими"
МетаданныеОбъекта = Источник.Метаданные();
ЕстьСуммаНДС = ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("СуммаНДС", МетаданныеОбъекта, "Товары");
ЕстьКоличество = ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("Количество", МетаданныеОбъекта, "Товары");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| *
|ПОМЕСТИТЬ ТаблицаПоТоварам
|ИЗ
| &ТаблицаПоТоварам КАК ТаблицаПоТоварам
|;
|
|////////////////////////////////////////////////////////////////////////////////
|// Добавляет признак комплекта в таблицу товаров
|ВЫБРАТЬ
| ТаблицаПоТоварам.Номенклатура.Комплект КАК Комплект,
| *,";
Если ЕстьСуммаНДС Тогда
Запрос.Текст = Запрос.Текст + "СуммаНДС КАК НДС,";
Иначе
Запрос.Текст = Запрос.Текст + "0 КАК НДС,";
КонецЕсли;
Если ЕстьКоличество Тогда
Запрос.Текст = Запрос.Текст + "Количество КАК КоличествоТЧ";
Иначе
Запрос.Текст = Запрос.Текст + "0 КАК КоличествоТЧ";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "
|ИЗ
| ТаблицаПоТоварам КАК ТаблицаПоТоварам
|;
|
|////////////////////////////////////////////////////////////////////////////////
|// Таблица товаров без комплектов
|ВЫБРАТЬ
| *
|ИЗ
| ТаблицаПоТоварам КАК ТаблицаПоТоварам
| ГДЕ ТаблицаПоТоварам.Номенклатура.Комплект = Ложь";
Запрос.УстановитьПараметр("ТаблицаПоТоварам", Источник.Товары.Выгрузить());
РезультатЗапроса = Запрос.ВыполнитьПакет();
ТаблицаТоваров = РезультатЗапроса[1].Выгрузить();
ТаблицаПоТоварамБезКомплектов = РезультатЗапроса[2].Выгрузить();
Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());
СтруктураШапкиДокумента = Новый Структура;
СтруктураШапкиДокумента.Вставить("Дата",Источник.Дата);
Если ОбщегоНазначения.ЕстьРеквизитДокумента("Склад",МетаданныеОбъекта) тогда
СтруктураШапкиДокумента.Вставить("Склад",Источник.Склад);
КонецЕсли;
ТаблицаПоКомплектам = УправлениеЗапасами.СформироватьТаблицуКомплектующих(ТаблицаТоваров, Источник,СтруктураШапкиДокумента);
// Объединяет таблицу товаров и таблицу комплектующих
ТаблицаТоваров = Источник.Товары.ВыгрузитьКолонки();
ТаблицаТоваров.Колонки.Добавить("ПересчитыватьНДС", Новый ОписаниеТипов("Булево"));
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварамБезКомплектов, ТаблицаТоваров);
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоКомплектам, ТаблицаТоваров);
Показать
ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()) нельзя вынести в отдельный алгоритм, то есть из модуля объекта скопировать полностью процедуру ? и потом вызывать вместо Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()));
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()));
(5) seva1405, а вы уверены что в алгоритмы правильно перенесли? в реквизите Параметры нужно перечислить все входящие параметры как в в функции или процедуре
в вашем случае там должно быть: ТаблицаТоваров, СтруктураШапкиДокумента
дальше вызываем как обычную процедуру как показывали выше
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, СтруктураШапки));
в вашем случае там должно быть: ТаблицаТоваров, СтруктураШапкиДокумента
дальше вызываем как обычную процедуру как показывали выше
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, СтруктураШапки));
на самом деле все как то очень сложно, нельзя просто в пкгс все обробатывать?
примерно так:
примерно так:
КоллекцияОбъектов = Новый ТаблицаЗначений();
КоллекцияОбъектов.Колонки.Добавить("Количество");
КоллекцияОбъектов.Колонки.Добавить("Коэффициент");
КоллекцияОбъектов.Колонки.Добавить("Номенклатура");
КоллекцияОбъектов.Колонки.Добавить("СтавкаНДС");
КоллекцияОбъектов.Колонки.Добавить("СуммаВсего");
КоллекцияОбъектов.Колонки.Добавить("Сумма");
КоллекцияОбъектов.Колонки.Добавить("СуммаНДС");
Товары = Источник.Товары.Выгрузить();
Для Каждого Стр из Товары цикл
///// и тут делаешь что хочешь
НоваяСтрока = КоллекцияОбъектов.Добавить();
НоваяСтрока.Количество = Стр.Количество;
НоваяСтрока.Коэффициент = Стр.Коэффициент;
НоваяСтрока.Номенклатура = Стр.Номенклатура;
НоваяСтрока.СтавкаНДС = Стр.СтавкаНДС;
НоваяСтрока.СуммаВсего = Стр.СуммаВсего;
НоваяСтрока.Сумма = Стр.Сумма;
НоваяСтрока.СуммаНДС = Стр.СуммаНДС;
КонецЦикла;
Показать
не знаю как сейчас, а раньше было (давно уже не сталкивался с алгоритмами), что в самом алгоритме надо было использовать такие же названия параметров, как в процедуре ВыгрузитьПоПравилу, т.е. "Источник, Приемник и т.д".
Т.е. когда делаем "вызов алгортима" из кода в виде
Выполнить(Алгоритмы.Сформировать(Таблица, Параметры));
то в соответствующем алгоритме "Сформировать" обрабатываем
Таблица как Источник, а Параметры как Приемник
Т.е. когда делаем "вызов алгортима" из кода в виде
Выполнить(Алгоритмы.Сформировать(Таблица, Параметры));
то в соответствующем алгоритме "Сформировать" обрабатываем
Таблица как Источник, а Параметры как Приемник
Все получилось! Если можно спрошу сразу чтобы не открывать новую тему, не могу только себестоимость перенести. я думал эта процедура ее переносит, сейчас выгрузил стал проверять а там вообще нет данных по себестоимости.
Если я выберу данные запросом
Куда его вставить чтобы в табличной части заполнить себестоимость?
Если я выберу данные запросом
ВЫБРАТЬ
РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,
ВозвратТоваровОтПокупателяТовары.Номенклатура,
ВозвратТоваровОтПокупателяТовары.Количество КАК Количество,
ВозвратТоваровОтПокупателяТовары.Цена,
ВозвратТоваровОтПокупателяТовары.Сумма КАК Сумма,
-ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
ВозвратТоваровОтПокупателяТовары.Ссылка.Контрагент КАК Контрагент,
ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаДокумента КАК СуммаДокумента,
ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаВключаетНДС КАК СуммаВключаетНДС,
ВозвратТоваровОтПокупателяТовары.Ссылка.Дата КАК Дата
ИЗ
Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
ПО ВозвратТоваровОтПокупателяТовары.Ссылка = ПродажиОбороты.Регистратор
ПО РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом = ВозвратТоваровОтПокупателяТовары.Ссылка
ГДЕ
ВозвратТоваровОтПокупателяТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Касса = &Касса
ПоказатьКуда его вставить чтобы в табличной части заполнить себестоимость?
(9) seva1405, в ПКО вашего объекта, а потом передаем всю табличную часть товары через входящие данные
ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());
ну и в свойствах ПКГС Товары ставим флаг Получить из входящих данных
передать только одну колонку Себестоимость в ТЧ товары нельзя (может кто то предложит хитрый способ?)
ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());
ну и в свойствах ПКГС Товары ставим флаг Получить из входящих данных
передать только одну колонку Себестоимость в ТЧ товары нельзя (может кто то предложит хитрый способ?)
Блин поторопился, перед этим закомментировал вызов алгоритма в ПКГС по этому и выгрузилось, но не так как надо.
Я в алгоритме заменил строку:
На:
И он ее не находит, может в алгоритме вызов алгоритма по другому нужно прописать?
сам алгоритм "ПодготовитьТаблицуТоваров" присутствует в списке алгоритмов.
Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(7779)}: Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств
ПКО = ВозвратТоваровОтПокупателя (Документ: Возврат товаров от покупателя)
ПКГС = 4 (Товары --> Товары)
Объект = Возврат товаров от покупателя Э0000000001 от 03.01.2016 14:49:42 (Документ ссылка: Возврат товаров от покупателя)
Обработчик = ПередОбработкойВыгрузкиГруппыСвойств
ОписаниеОшибки = Метод объекта не обнаружен (ПодготовитьТаблицуТоваров)
ПозицияМодуля = (91)
КодСообщения = 48
ПКО = ВозвратТоваровОтПокупателя (Документ: Возврат товаров от покупателя)
ПКГС = 4 (Товары --> Товары)
Объект = Возврат товаров от покупателя Э0000000001 от 03.01.2016 14:49:42 (Документ ссылка: Возврат товаров от покупателя)
Обработчик = ПередОбработкойВыгрузкиГруппыСвойств
ОписаниеОшибки = Метод объекта не обнаружен (ПодготовитьТаблицуТоваров)
ПозицияМодуля = (91)
КодСообщения = 48
Я в алгоритме заменил строку:
Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());
На:
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()));
И он ее не находит, может в алгоритме вызов алгоритма по другому нужно прописать?
сам алгоритм "ПодготовитьТаблицуТоваров" присутствует в списке алгоритмов.
(12) seva1405, так вместо Новый Структура() вам нужно передавать структуру шапки документы, а не пустую структуру же) посмотрите как готовится эта структура в модуле откуда вы выдернули ПодготовитьТаблицуТоваров
так же попробуйте так вызвать:
ТаблицаТоваров = <ваша таблица выбранная запросом>
СтруктураШапкиДокумента = <подготовленная структура>
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров);
ПС: покажите скриншот как я сделал вашего алгоритма, параметры точно правильно сделали ?
так же попробуйте так вызвать:
ТаблицаТоваров = <ваша таблица выбранная запросом>
СтруктураШапкиДокумента = <подготовленная структура>
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров);
ПС: покажите скриншот как я сделал вашего алгоритма, параметры точно правильно сделали ?
А если делать запросом то получается все это мне не нужно?
Запросом делаю так:
в ПКО перед обработкой:
А в ПКГС что прописать? только галочку поставить"Получить из входящих данных"?
Запросом делаю так:
в ПКО перед обработкой:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,
| ВозвратТоваровОтПокупателяТовары.Номенклатура,
| ВозвратТоваровОтПокупателяТовары.Количество КАК Количество,
| ВозвратТоваровОтПокупателяТовары.Цена,
| ВозвратТоваровОтПокупателяТовары.Сумма КАК Сумма,
| -ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
| ВозвратТоваровОтПокупателяТовары.Ссылка.Контрагент КАК Контрагент,
| ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаДокумента КАК СуммаДокумента,
| ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаВключаетНДС КАК СуммаВключаетНДС,
| ВозвратТоваровОтПокупателяТовары.Ссылка.Дата КАК Дата
|ИЗ
| Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
| ПО ВозвратТоваровОтПокупателяТовары.Ссылка = ПродажиОбороты.Регистратор
| ПО РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом = ВозвратТоваровОтПокупателяТовары.Ссылка
|ГДЕ
| ВозвратТоваровОтПокупателяТовары.Ссылка = &Ссылка
|И РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Касса = &Касса";
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Запрос.УстановитьПараметр("Касса", Параметры.Касса);
РезультатЗапроса = Запрос.Выполнить();
ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());
ПоказатьА в ПКГС что прописать? только галочку поставить"Получить из входящих данных"?
В разных версиях источником было или ссылка или объект.
Видимо там где вызывается Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()); и при этом работает нормально Источник является объектом.
Предполагаю, что у вас заработает следующее: Источник.ПолучитьОбъект().ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура())
Тогда не нужно будет добавлять дополнительные алгоритмы как вы сделали.
Используйте отладчик.
Видимо там где вызывается Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()); и при этом работает нормально Источник является объектом.
Предполагаю, что у вас заработает следующее: Источник.ПолучитьОбъект().ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура())
Тогда не нужно будет добавлять дополнительные алгоритмы как вы сделали.
Используйте отладчик.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот