Из общего модуля вытянуть нужный параметр

1. user1004898 28 30.01.19 10:42 Сейчас в теме
В СКД в вычисляемое поле СрокПоставки нужно вытянуть из общего функции общего модуля параметр собственно Поставки.
Функция имеет вид
Функция ОбновитьСрокиПоставки(ДокументЗаказ,Фирма_СброситьОтпустить = Ложь) Экспорт
    
    
    ПустаяДата = Дата(0001,01,01);
    Результат = ПолучитьДанныеДляОбновленияСроковПоставки(ДокументЗаказ,ПустаяДата);
    
    
    Отбор = Новый Структура("Номенклатура,КодСтроки");
    СтруктураПоискаНоменклатура = Новый Структура("Номенклатура");
    НеОтгружатьЧастям = ДокументЗаказ.НеОтгружатьЧастями;
    ДатаОтгрузкиДокумента = ДокументЗаказ.ДатаОтгрузки;
    мТовары = ДокументЗаказ.Товары.Выгрузить();
    мТовары.КОлонки.Добавить("Фирма_Особое");
    мТовары.КОлонки.Добавить("Фирма_Заморозка");
    мТовары.КОлонки.Добавить("Фирма_Распродажа");
    мТовары.КОлонки.Добавить("Фирма_Акция");
    мТовары.КОлонки.Добавить("Фирма_Тендер");
    
    
    мТовары.КОлонки.Добавить("Обработана", Новый ОписаниеТипов("Булево"));
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка В(&МассивНоменклатуры)
        |    И Номенклатура.Фирма_Услуга = ИСТИНА";
    Запрос.УстановитьПараметр("МассивНоменклатуры", мТовары.ВыгрузитьКолонку("Номенклатура"));
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаУслуг = РезультатЗапроса.Выгрузить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        МассивСрокУслуг = мТовары.НайтиСтроки(Новый Структура("Номенклатура", ВыборкаДетальныеЗаписи.Ссылка));
        Для Каждого ЭлементМассива из МассивСрокУслуг Цикл
            ЭлементМассива.Фирма_Отпустить = ЭлементМассива.Количество;
            ЭлементМассива.Обработана = Истина;
        КонецЦикла;
    КонецЦикла;
    
    
    
    Для каждого СтрокаТовара Из мТовары Цикл
        
        
        Если СтрокаТовара.Обработана Тогда
            Продолжить;
        КонецЕсли;
        
        СтрокаТовара.Фирма_Поставка = "";
        СтрокаТовара.ДатаОтгрузки = ?(НеОтгружатьЧастям,ДатаОтгрузкиДокумента,Неопределено);
        СтрокаТовара.Фирма_Отпустить = 0;
        
        Отбор.Номенклатура = СтрокаТовара.Номенклатура;
        Отбор.КодСтроки = СтрокаТовара.КодСтроки;
        НайденныеСтроки = Результат.НайтиСтроки(Отбор);
        СтруктураПоискаНоменклатура.Номенклатура = СтрокаТовара.Номенклатура;
        
        Если Не НайденныеСтроки.Количество() = 0 Тогда
        
            СтрокаНом = НайденныеСтроки[0];    
                        
            ЗаполнитьЗначенияСвойств(СтрокаТовара,СтрокаНом,"Фирма_Особое,Фирма_Заморозка,Фирма_Распродажа,Фирма_Акция,Фирма_Тендер,Склад");
            Если Фирма_СброситьОтпустить Тогда
                СтрокаТовара.Фирма_Отпустить = мин(СтрокаНом.Отгружено,СтрокаТовара.Количество);
            Иначе
                ДанныеРезерва = ?(СтрокаНом.Тендер,СтрокаНом.РезервТендер,СтрокаНом.РезервУпр);
                СтрокаТовара.Фирма_Отпустить = мин(СтрокаНом.Отгружено + ?(ДанныеРезерва<0,0,ДанныеРезерва),СтрокаТовара.Количество);
            КонецЕсли;
            
            СтрокаТовара.Фирма_ВРезерве = СтрокаНом.РезервУпр;
            
            Отгружено             = ?(НЕ СтрокаНом.Отгружено = Null,СтрокаНом.Отгружено,0);
            ОсталосьОтгрузить     = ?(НЕ СтрокаНом.ОсталосьОтгрузить = Null,СтрокаНом.ОсталосьОтгрузить,0);
            Заказано             = ?(НЕ СтрокаНом.Заказано = Null,СтрокаНом.Заказано,0);
            Резерв                 = ?(НЕ СтрокаНом.РезервУпр = Null,СтрокаНом.РезервУпр,0);
            РезервТендер         = ?(НЕ СтрокаНом.РезервТендер = Null,СтрокаНом.РезервТендер,0);
            СвободныйОстаток     = ?(НЕ СтрокаНом.СвободныйОстаток = Null,СтрокаНом.СвободныйОстаток,0); 
            ДатаОтгрузки         = ?(НеОтгружатьЧастям,ДатаОтгрузкиДокумента,ТекущаяДата());
            ИдетПриемка            = ?(Не СтрокаНом.ИдетПриемка = NULL,СтрокаНом.ИдетПриемка,0);
            СтрокаТовара.ДатаОтгрузки             = ДатаОтгрузки;
            
            мРезерв             = 0;
            мРезервТендер         = 0;
            мСвободныйОстаток     = 0;
            
            Если ОсталосьОтгрузить = 0 Тогда 
                
                Если ДокументЗаказ.Проведен тогда
                    СтрокаТовара.Фирма_Поставка         = "Всё отгружено";
                Иначе
                    СтрокаТовара.Фирма_Поставка = "";
                КонецЕсли;
                
            Иначе
                
                СтрокаТовара.Фирма_Поставка = "";
                
                
                Если ОсталосьОтгрузить <= Резерв Тогда
                    мРезерв = Мин(Резерв,ОсталосьОтгрузить);
                    СтрокаТовара.Фирма_Поставка = "Всё в резерве";
                    Если СтрокаНом.Тендер Тогда
                        
                        мРезервТендер = Мин(РезервТендер,ОсталосьОтгрузить);
                        Если ОсталосьОтгрузить <= РезервТендер Тогда
                            СтрокаТовара.Фирма_Поставка = "Всё в резерве/Всё в резерве";
                        Иначе
                            СтрокаТовара.Фирма_Поставка = "Всё в резерве/" + мРезервТендер;
                        КонецЕсли;
                    
                    КонецЕсли;            
                Иначе
                    
                    Если  СвободныйОстаток >= ОсталосьОтгрузить - Резерв Тогда 
                        СтрокаТовара.Фирма_Поставка = "Все в наличии";
                        мСвободныйОстаток     = ОсталосьОтгрузить - Резерв;
                    ИначеЕсли     СвободныйОстаток > 0 Тогда
                        СтрокаТовара.Фирма_Поставка = "В наличии: " + СвободныйОстаток;
                        мСвободныйОстаток     = СвободныйОстаток;
                    КонецЕсли;
                    
                    
                    ВремСтрока = "";
                    Если  (СтрокаНом.Тендер = Истина) И ЗначениеЗаполнено(СтрокаТовара.Фирма_ВипСчет) Тогда
                        ВремСтрока = "Поставка " + ?(Не СтрокаНом.ДатаПоступления = ПустаяДата,Лев(СтрокаНом.ВипСчет_ДатаОтгрузки,10),"?");
                    ИначеЕсли Заказано <> 0 Тогда
                        ВремСтрока = "Поставка " + ?(Не СтрокаНом.ДатаПоступления = ПустаяДата,Лев(СтрокаНом.ДатаПоступления,10),"?");
                    КонецЕсли;
                    ИнициализироватьСтрокуДанными(СтрокаТовара.Фирма_Поставка,ВремСтрока);
                    
                    
                    ВремСтрока = "";
                    Если ОсталосьОтгрузить > СвободныйОстаток + Резерв + Заказано Тогда 
                        ВремСтрока = СрокПоставкиНоменклатуры(СтрокаНом);
                    КонецЕсли;    
                    ИнициализироватьСтрокуДанными(СтрокаТовара.Фирма_Поставка,ВремСтрока);
                    
                    
                    ВремСтрока = "";
                    Если Резерв <> 0 Тогда
                        мРезерв = Мин(Резерв,ОсталосьОтгрузить);
                        мРезервТендер = Мин(РезервТендер,ОсталосьОтгрузить);
                        ВремСтрока = "В резерве: " + мРезерв + ?(СтрокаНом.Тендер,"/" + мРезервТендер,"");
                    КонецЕсли; 
                    ИнициализироватьСтрокуДанными(СтрокаТовара.Фирма_Поставка,ВремСтрока);
                КонецЕсли;
                    
                
                ВремСтрока = "";
                Если Отгружено <> 0 Тогда
                    ВремСтрока = "Отгружено: " + Отгружено;
                КонецЕсли; 
                ИнициализироватьСтрокуДанными(СтрокаТовара.Фирма_Поставка,ВремСтрока);
                    
            КонецЕсли;
        
            СтрокаНом.РезервУпр = СтрокаНом.РезервУпр - мРезерв;
            СтрокаНом.РезервТендер = СтрокаНом.РезервТендер - мРезервТендер;
            СтрокаНом.СвободныйОстаток = СтрокаНом.СвободныйОстаток - мСвободныйОстаток;
            
            
            мНайденныеСтроки = Результат.НайтиСтроки(СтруктураПоискаНоменклатура);
            Если мНайденныеСтроки.Количество() > 1 Тогда
                Для каждого мСтрокаНом Из мНайденныеСтроки Цикл
                
                    мСтрокаНом.РезервУпр         = СтрокаНом.РезервУпр;
                    мСтрокаНом.РезервТендер     = СтрокаНом.РезервТендер;
                    мСтрокаНом.СвободныйОстаток = СтрокаНом.СвободныйОстаток;
                
                КонецЦикла;
            КонецЕсли;
            
        КонецЕсли; 
    
    КонецЦикла; 
    
#КонецОбласти

    Возврат ПоместитьВоВременноеХранилище(мТовары);

КонецФункции
Показать


Так как работа с хранилищем, создал ниже свою функцию, которая вытягивает из выше указанной "предполагаемый" параметр Фирма_Поставка

Функция ОпределитьСрокПоставки(ДокументЗаказ, КодСтроки) Экспорт
    
    ТаблицаСрокПоставки = ПолучитьИзВременногоХранилища(ОбновитьСрокиПоставки(ДокументЗаказ));
    
    Отбор = Новый Структура("КодСтроки", КодСтроки);
    
    
        Итог =  ТаблицаСрокПоставки.НайтиСтроки(Отбор);
    
Возврат Итог.СтрокаТовара.Фирма_Поставка;

КонецФункции
Показать


В вычисляемое поле Добавил поле
СрокПоставки (он же и в макете СКД)
сама функция
Фирма_Общий.ОбновитьСрокиПоставки(ЗаказКлиента,КодСтроки)

При выполнении запуска вн. отчета получаю "Поле обьекта на обнаружено "СтрокаТовара"

Как определить правильно такую функцию?
Много перепробовал. Отладка по функциям этого общего модуля не проходит.
Тут идея вытянуть для параметра в СКД именно эти значения "Всё отгружено", "Все в наличии"....
По теме из базы знаний
Найденные решения
3. dhurricane 30.01.19 10:52 Сейчас в теме
Функция ОпределитьСрокПоставки(ДокументЗаказ, КодСтроки) Экспорт
    
    ТаблицаСрокПоставки = ПолучитьИзВременногоХранилища(ОбновитьСрокиПоставки(ДокументЗаказ));    
    
    СтрокаТовара =  ТаблицаСрокПоставки.Найти(КодСтроки, "КодСтроки");
    
    Возврат ?(СтрокаТовара <> Неопределено, СтрокаТовара.Фирма_Поставка, "");

КонецФункции
Показать
6. SedovSU@mail.ru 297 30.01.19 11:08 Сейчас в теме
В том случае если вы точно уверены что в результате НайтиСтроки всегда будет одна запись то можно так написать:

 Итог =  ТаблицаСрокПоставки.НайтиСтроки(Отбор);
Возврат Итог[0].СтрокаТовара.Фирма_Поставка;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1004898 28 30.01.19 10:49 Сейчас в теме
Предположительно в ИТОГ попадает массив значений.
3. dhurricane 30.01.19 10:52 Сейчас в теме
Функция ОпределитьСрокПоставки(ДокументЗаказ, КодСтроки) Экспорт
    
    ТаблицаСрокПоставки = ПолучитьИзВременногоХранилища(ОбновитьСрокиПоставки(ДокументЗаказ));    
    
    СтрокаТовара =  ТаблицаСрокПоставки.Найти(КодСтроки, "КодСтроки");
    
    Возврат ?(СтрокаТовара <> Неопределено, СтрокаТовара.Фирма_Поставка, "");

КонецФункции
Показать
4. SedovSU@mail.ru 297 30.01.19 11:01 Сейчас в теме
Вот этот год возращает не итог значений а массив значений

Функция ОпределитьСрокПоставки(ДокументЗаказ, КодСтроки) Экспорт
    
    ТаблицаСрокПоставки = ПолучитьИзВременногоХранилища(ОбновитьСрокиПоставки(ДокументЗаказ));
    
    Отбор = Новый Структура("КодСтроки", КодСтроки);
    
    
        Итог =  ТаблицаСрокПоставки.НайтиСтроки(Отбор);
    
Возврат Итог.СтрокаТовара.Фирма_Поставка;

КонецФункции
Показать
5. SedovSU@mail.ru 297 30.01.19 11:04 Сейчас в теме
Вам эту функцию нужно переписать. Например так:


Функция ОпределитьСрокПоставки(ДокументЗаказ, КодСтроки) Экспорт

ТаблицаСрокПоставки = ПолучитьИзВременногоХранилища(ОбновитьСрокиПоставки(ДокументЗаказ));

Отбор = Новый Структура("КодСтроки", КодСтроки);


Итог = ТаблицаСрокПоставки.НайтиСтроки(Отбор);
ФирмаПоставка = "";
Для Каждого СтрокаИтог Из Итог Цикл
Если ЗначениеЗаполнено(ФирмаПоставки) Тогда
ФирмаПоставки = ФирмаПоставки + ", " + СтрокаИтог.Фирма_Поставка
Иначе
ФирмаПоставки = СтрокаИтог.Фирма_Поставка;
Конеццикла

Возврат ФирмаПоставка;

КонецФункции
6. SedovSU@mail.ru 297 30.01.19 11:08 Сейчас в теме
В том случае если вы точно уверены что в результате НайтиСтроки всегда будет одна запись то можно так написать:

 Итог =  ТаблицаСрокПоставки.НайтиСтроки(Отбор);
Возврат Итог[0].СтрокаТовара.Фирма_Поставка;
7. user1004898 28 30.01.19 11:23 Сейчас в теме
(6)
вот так правильней.
Итог = ТаблицаСрокПоставки.НайтиСтроки(Отбор);
Возврат Итог[0].Фирма_Поставка;
8. user1004898 28 30.01.19 11:31 Сейчас в теме
(6)
тут кстати понял ваш вопрос.
записей по идее несколько.
потому если вдруг Итог[1].Фирма_Поставка - индекс находится за пределами массива (просто увеличил диапазон периода)
Оставьте свое сообщение

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