Как перенести процедуру из модуля объекта источника в алгоритмы с переменными.

1. Artem1405 25 12.02.16 09:33 Сейчас в теме
Обмен Розница 1.0 платформа 8.1 - БП 3.0
Настраиваю выгрузку подглядывая в типовые правила, в ПКГС товары вызывается алгоритм а алгоритм
Выполнить(Алгоритмы.СформироватьТаблицуТоваровСКомплектующими);
обращается к процедуре источника
Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());

В модуле объекта процедура выглядит так
Процедура ПодготовитьТаблицуТоваров(ТаблицаТоваров, СтруктураШапкиДокумента) Экспорт


При выгрузке ругается "процедура не найдена". Почитал инфу, пишут что обработка в 8.1 отличается от 8.2 и поэтому не находит и нужно процедуру перенести в алгоритмы. Перенес но параметры не знаю как передать и вызвать ее в алгоритме.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
11. AllexSoft 12.02.16 10:17 Сейчас в теме
(9) seva1405, в ПКО вашего объекта, а потом передаем всю табличную часть товары через входящие данные

ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());

ну и в свойствах ПКГС Товары ставим флаг Получить из входящих данных

передать только одну колонку Себестоимость в ТЧ товары нельзя (может кто то предложит хитрый способ?)
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
18. Xershi 1535 12.02.16 14:48 Сейчас в теме
(1) seva1405, алгоритмы это темный лес. Обмен разовый? Тогда в чем проблема запустить обмен конвертировав базу на 8.2?
19. Artem1405 25 12.02.16 20:41 Сейчас в теме
Всем спасибо все получилось наконец то!)
(18) Xershi, Выгрузка будет проходить раз в месяц после закрытия месяца. НУ доходы-расходы, деваться некуда нужно выгружать правильно.
2. Artem1405 25 12.02.16 09:39 Сейчас в теме
Код в ПКГС
ТаблицаТоваров = Новый ТаблицаЗначений;


Выполнить(Алгоритмы.СформироватьТаблицуТоваровСКомплектующими);



Для Каждого СтрокаТоваров Из ТаблицаТоваров Цикл
	Если СтрокаТоваров.ПересчитыватьНДС Тогда
		ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТоваров, Источник, Источник.УчитыватьНДС, Источник.СуммаВключаетНДС);
	КонецЕсли;
КонецЦикла;
КоллекцияОбъектов = ТаблицаТоваров.Скопировать();
Показать


Код в Алгоритме "СформироватьТаблицуТоваровСКомплектующими"
МетаданныеОбъекта = Источник.Метаданные();
ЕстьСуммаНДС = ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("СуммаНДС", МетаданныеОбъекта, "Товары");
ЕстьКоличество = ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("Количество", МетаданныеОбъекта, "Товары");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	*
|ПОМЕСТИТЬ ТаблицаПоТоварам
|ИЗ
|	&ТаблицаПоТоварам КАК ТаблицаПоТоварам
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|// Добавляет признак комплекта в таблицу товаров
|ВЫБРАТЬ
|	ТаблицаПоТоварам.Номенклатура.Комплект КАК Комплект,
|	*,";
Если ЕстьСуммаНДС Тогда
	Запрос.Текст = Запрос.Текст + "СуммаНДС КАК НДС,";
Иначе
	Запрос.Текст = Запрос.Текст + "0 КАК НДС,";
КонецЕсли;
Если ЕстьКоличество Тогда
	Запрос.Текст = Запрос.Текст + "Количество КАК КоличествоТЧ";
Иначе
	Запрос.Текст = Запрос.Текст + "0 КАК КоличествоТЧ";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "
|ИЗ
|	ТаблицаПоТоварам КАК ТаблицаПоТоварам
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|// Таблица товаров без комплектов
|ВЫБРАТЬ
|	*
|ИЗ
|	ТаблицаПоТоварам КАК ТаблицаПоТоварам
|	ГДЕ ТаблицаПоТоварам.Номенклатура.Комплект = Ложь";
Запрос.УстановитьПараметр("ТаблицаПоТоварам", Источник.Товары.Выгрузить());

РезультатЗапроса              = Запрос.ВыполнитьПакет();
ТаблицаТоваров                = РезультатЗапроса[1].Выгрузить();
ТаблицаПоТоварамБезКомплектов = РезультатЗапроса[2].Выгрузить();




Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());





СтруктураШапкиДокумента = Новый Структура;
СтруктураШапкиДокумента.Вставить("Дата",Источник.Дата);
Если ОбщегоНазначения.ЕстьРеквизитДокумента("Склад",МетаданныеОбъекта) тогда
	СтруктураШапкиДокумента.Вставить("Склад",Источник.Склад);
КонецЕсли;

ТаблицаПоКомплектам = УправлениеЗапасами.СформироватьТаблицуКомплектующих(ТаблицаТоваров, Источник,СтруктураШапкиДокумента);

// Объединяет таблицу товаров и таблицу комплектующих
ТаблицаТоваров = Источник.Товары.ВыгрузитьКолонки();
ТаблицаТоваров.Колонки.Добавить("ПересчитыватьНДС", Новый ОписаниеТипов("Булево"));
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварамБезКомплектов, ТаблицаТоваров);
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоКомплектам,           ТаблицаТоваров);
Показать
3. BaHgaJI 31 12.02.16 09:49 Сейчас в теме
ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()) нельзя вынести в отдельный алгоритм, то есть из модуля объекта скопировать полностью процедуру ? и потом вызывать вместо Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());

Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()));
5. Artem1405 25 12.02.16 09:52 Сейчас в теме
(3) BaHgaJI, я и спрашиваю как это сделать, сейчас попробую сделать как вы написали.
6. AllexSoft 12.02.16 10:01 Сейчас в теме
(5) seva1405, а вы уверены что в алгоритмы правильно перенесли? в реквизите Параметры нужно перечислить все входящие параметры как в в функции или процедуре
в вашем случае там должно быть: ТаблицаТоваров, СтруктураШапкиДокумента
дальше вызываем как обычную процедуру как показывали выше
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, СтруктураШапки));
8. adva 45 12.02.16 10:09 Сейчас в теме
судя по (6) работа с параметрами из (7) изменилась, значит как в (6).
4. BaHgaJI 31 12.02.16 09:52 Сейчас в теме
на самом деле все как то очень сложно, нельзя просто в пкгс все обробатывать?

примерно так:
КоллекцияОбъектов = Новый ТаблицаЗначений();
КоллекцияОбъектов.Колонки.Добавить("Количество");
КоллекцияОбъектов.Колонки.Добавить("Коэффициент");
КоллекцияОбъектов.Колонки.Добавить("Номенклатура");
КоллекцияОбъектов.Колонки.Добавить("СтавкаНДС");
КоллекцияОбъектов.Колонки.Добавить("СуммаВсего");
КоллекцияОбъектов.Колонки.Добавить("Сумма");
КоллекцияОбъектов.Колонки.Добавить("СуммаНДС");


Товары = Источник.Товары.Выгрузить();
Для Каждого Стр из Товары цикл
///// и тут делаешь что хочешь
	НоваяСтрока       			         = КоллекцияОбъектов.Добавить();
НоваяСтрока.Количество 			         = Стр.Количество;

НоваяСтрока.Коэффициент       = Стр.Коэффициент;
НоваяСтрока.Номенклатура     = Стр.Номенклатура;
НоваяСтрока.СтавкаНДС       = Стр.СтавкаНДС;
НоваяСтрока.СуммаВсего  = Стр.СуммаВсего;
НоваяСтрока.Сумма  = Стр.Сумма;
НоваяСтрока.СуммаНДС        = Стр.СуммаНДС;
КонецЦикла;
Показать
7. adva 45 12.02.16 10:06 Сейчас в теме
не знаю как сейчас, а раньше было (давно уже не сталкивался с алгоритмами), что в самом алгоритме надо было использовать такие же названия параметров, как в процедуре ВыгрузитьПоПравилу, т.е. "Источник, Приемник и т.д".

Т.е. когда делаем "вызов алгортима" из кода в виде

Выполнить(Алгоритмы.Сформировать(Таблица, Параметры));

то в соответствующем алгоритме "Сформировать" обрабатываем

Таблица как Источник, а Параметры как Приемник
9. Artem1405 25 12.02.16 10:12 Сейчас в теме
Все получилось! Если можно спрошу сразу чтобы не открывать новую тему, не могу только себестоимость перенести. я думал эта процедура ее переносит, сейчас выгрузил стал проверять а там вообще нет данных по себестоимости.
Если я выберу данные запросом
ВЫБРАТЬ
	РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,
	ВозвратТоваровОтПокупателяТовары.Номенклатура,
	ВозвратТоваровОтПокупателяТовары.Количество КАК Количество,
	ВозвратТоваровОтПокупателяТовары.Цена,
	ВозвратТоваровОтПокупателяТовары.Сумма КАК Сумма,
	-ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
	ВозвратТоваровОтПокупателяТовары.Ссылка.Контрагент КАК Контрагент,
	ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаДокумента КАК СуммаДокумента,
	ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаВключаетНДС КАК СуммаВключаетНДС,
	ВозвратТоваровОтПокупателяТовары.Ссылка.Дата КАК Дата
ИЗ
	Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
			ПО ВозвратТоваровОтПокупателяТовары.Ссылка = ПродажиОбороты.Регистратор
		ПО РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом = ВозвратТоваровОтПокупателяТовары.Ссылка
ГДЕ
	ВозвратТоваровОтПокупателяТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
	И РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Касса = &Касса

Показать

Куда его вставить чтобы в табличной части заполнить себестоимость?
11. AllexSoft 12.02.16 10:17 Сейчас в теме
(9) seva1405, в ПКО вашего объекта, а потом передаем всю табличную часть товары через входящие данные

ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());

ну и в свойствах ПКГС Товары ставим флаг Получить из входящих данных

передать только одну колонку Себестоимость в ТЧ товары нельзя (может кто то предложит хитрый способ?)
20. Xershi 1535 12.02.16 23:25 Сейчас в теме
(11) AllexSoft, ну да. Передаются все строки или часть их это результат запроса делает. Я без входящих даных обхожусь, просто заполняю колекцию в перед выгрузкой кодом.
10. Artem1405 25 12.02.16 10:13 Сейчас в теме
Из этого запроса нужно только себестоимость заполнить в табличную часть применика
12. Artem1405 25 12.02.16 11:09 Сейчас в теме
Блин поторопился, перед этим закомментировал вызов алгоритма в ПКГС по этому и выгрузилось, но не так как надо.

Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(7779)}: Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств
ПКО = ВозвратТоваровОтПокупателя (Документ: Возврат товаров от покупателя)
ПКГС = 4 (Товары --> Товары)
Объект = Возврат товаров от покупателя Э0000000001 от 03.01.2016 14:49:42 (Документ ссылка: Возврат товаров от покупателя)
Обработчик = ПередОбработкойВыгрузкиГруппыСвойств
ОписаниеОшибки = Метод объекта не обнаружен (ПодготовитьТаблицуТоваров)
ПозицияМодуля = (91)
КодСообщения = 48


Я в алгоритме заменил строку:
Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура());

На:
Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()));


И он ее не находит, может в алгоритме вызов алгоритма по другому нужно прописать?

сам алгоритм "ПодготовитьТаблицуТоваров" присутствует в списке алгоритмов.
13. AllexSoft 12.02.16 11:27 Сейчас в теме
(12) seva1405, так вместо Новый Структура() вам нужно передавать структуру шапки документы, а не пустую структуру же) посмотрите как готовится эта структура в модуле откуда вы выдернули ПодготовитьТаблицуТоваров
так же попробуйте так вызвать:


ТаблицаТоваров = <ваша таблица выбранная запросом>
СтруктураШапкиДокумента = <подготовленная структура>

Выполнить(Алгоритмы.ПодготовитьТаблицуТоваров);

ПС: покажите скриншот как я сделал вашего алгоритма, параметры точно правильно сделали ?
14. Artem1405 25 12.02.16 11:48 Сейчас в теме
15. Artem1405 25 12.02.16 11:57 Сейчас в теме
А если делать запросом то получается все это мне не нужно?
Запросом делаю так:
в ПКО перед обработкой:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,
|	ВозвратТоваровОтПокупателяТовары.Номенклатура,
|	ВозвратТоваровОтПокупателяТовары.Количество КАК Количество,
|	ВозвратТоваровОтПокупателяТовары.Цена,
|	ВозвратТоваровОтПокупателяТовары.Сумма КАК Сумма,
|	-ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
|	ВозвратТоваровОтПокупателяТовары.Ссылка.Контрагент КАК Контрагент,
|	ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаДокумента КАК СуммаДокумента,
|	ВозвратТоваровОтПокупателяТовары.Ссылка.СуммаВключаетНДС КАК СуммаВключаетНДС,
|	ВозвратТоваровОтПокупателяТовары.Ссылка.Дата КАК Дата
|ИЗ
|	Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
|			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты
|			ПО ВозвратТоваровОтПокупателяТовары.Ссылка = ПродажиОбороты.Регистратор
|		ПО РасходныйКассовыйОрдерРасшифровкаПлатежа.ДокументРасчетовСКонтрагентом = ВозвратТоваровОтПокупателяТовары.Ссылка
|ГДЕ
|	ВозвратТоваровОтПокупателяТовары.Ссылка = &Ссылка
|И РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.Касса = &Касса";
Запрос.УстановитьПараметр("Ссылка",	Источник.Ссылка);	 
Запрос.УстановитьПараметр("Касса",	Параметры.Касса);
РезультатЗапроса = Запрос.Выполнить();
ВходящиеДанные.Вставить("Товары", РезультатЗапроса.Выгрузить());
Показать

А в ПКГС что прописать? только галочку поставить"Получить из входящих данных"?
16. AllexSoft 12.02.16 12:22 Сейчас в теме
(15) seva1405, все верно ) лишь бы названия полей в запросе совпадали с полями которые в ТЧ товары у вас..
17. invertercant 22 12.02.16 14:44 Сейчас в теме
В разных версиях источником было или ссылка или объект.
Видимо там где вызывается Источник.ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура()); и при этом работает нормально Источник является объектом.
Предполагаю, что у вас заработает следующее: Источник.ПолучитьОбъект().ПодготовитьТаблицуТоваров(ТаблицаТоваров, Новый Структура())
Тогда не нужно будет добавлять дополнительные алгоритмы как вы сделали.
Используйте отладчик.
Оставьте свое сообщение

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