[РЕШЕНО] Выборка значений из ТЧ обработки

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем User, 2 окт 2014.

  1. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Помогите, пожалуйста, решить задачу. 1С УПП для Казахстана, 8.2.
    В обработке расчет плановой себестоимости материалы считаются согласно основным спецификациям номенклатуры:
    Код:
    Если мМетодРасчетаМатериальные <> Перечисления.МетодыРасчетаЗначенияПлановойСебестоимости.ПоНормативам Тогда
         Возврат;
       КонецЕсли;
       
       // Подготовим переменные.
       ТабПродукция = Новый ТаблицаЗначений;
       ТабПродукция.Колонки.Добавить("Номенклатура");
       ТабПродукция.Колонки.Добавить("ХарактеристикаНоменклатуры");
       ТабПродукция.Колонки.Добавить("ЕдиницаИзмерения");
       ТабПродукция.Колонки.Добавить("Количество");
       ТабПродукция.Колонки.Добавить("Спецификация");
       ТабПродукция.Колонки.Добавить("Цена");
       
       ТаблицаМатериалов = Неопределено;
       ТаблицаВозвратныхОтходов = Неопределено;
       
       Для Каждого Строка Из ТаблицаНоменклатуры Цикл
         Если Не ЗначениеЗаполнено(Строка.СпецификацияНоменклатуры) Тогда
           Продолжить;
         КонецЕсли;
         
         ТабПродукция.Очистить();
         НоваяСтрока = ТабПродукция.Добавить();
         НоваяСтрока.Номенклатура         = Строка.Номенклатура;
         НоваяСтрока.ХарактеристикаНоменклатуры = Строка.ХарактеристикаНоменклатуры;
         НоваяСтрока.Спецификация         = Строка.СпецификацияНоменклатуры;
         НоваяСтрока.ЕдиницаИзмерения  = Строка.Номенклатура.ЕдиницаХраненияОстатков;
         
         НоваяСтрока.Количество  = 1;
         СтруктураПараметров = Новый Структура;
         СтруктураПараметров.Вставить( "Потребности");
         СтруктураПараметров.Вставить( "ВозвратныеОтходы");
               
         СтруктПараметры = Новый Структура;
         СтруктПараметры.Вставить( "ДатаСпецификации", Дата);
         СтруктПараметры.Вставить( "ПараметрыВыпуска", Неопределено);
                 
         РазузлованиеНоменклатуры.ПолучитьПотребность(ТабПродукция, СтруктураПараметров, СтруктПараметры);
               
         ТабМатериалы = СтруктураПараметров["Потребности"];
    
         Если ТаблицаМатериалов = Неопределено Тогда
           ТаблицаМатериалов = ТабМатериалы.Скопировать();
         Иначе
           ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТабМатериалы, ТаблицаМатериалов);
         КонецЕсли;
         
         Если СтруктураПараметров.Свойство("ВозвратныеОтходы") Тогда
           ТабОтходы = СтруктураПараметров.ВозвратныеОтходы;
           Если ТаблицаВозвратныхОтходов = Неопределено Тогда
             ТаблицаВозвратныхОтходов = СтруктураПараметров.ВозвратныеОтходы.Скопировать();
           Иначе
             ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(СтруктураПараметров.ВозвратныеОтходы, ТаблицаВозвратныхОтходов);
           КонецЕсли;
         КонецЕсли;
         
       КонецЦикла;
       
       ТаблицаМатериалов.Колонки.Добавить("Сумма");
       ТаблицаМатериалов.Колонки.Добавить("Цена");
       
       МассивНоменклатуры          = ТаблицаМатериалов.ВыгрузитьКолонку("Материал");
       МассивХарактеристикНоменклатуры = ТаблицаМатериалов.ВыгрузитьКолонку("ХарактеристикаМатериала");
       
       ТекстЦеныНоменклатуры = "
       |ВЫБРАТЬ
       |   Номенклатура         КАК Номенклатура,
       |   ХарактеристикаНоменклатуры   КАК ХарактеристикаНоменклатуры,
       |   Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Коэффициент,
       |   СУММА(Сумма //ПроцентИзм //СуммаИзм) КАК Сумма
       |ИЗ (
       |   ВЫБРАТЬ
       |     РегистрЦены.Номенклатура         КАК Номенклатура,
       |     РегистрЦены.ХарактеристикаНоменклатуры   КАК ХарактеристикаНоменклатуры,
       |     РегистрЦены.Цена * КурсыВалют.Курс * &КратУпр / (&КурсУпр * КурсыВалют.Кратность)КАК Сумма
       |   ИЗ
       |     РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаНач,
       |                   Номенклатура В(&МассивНоменклатуры)
       |                   И ХарактеристикаНоменклатуры В(&МассивХарактеристикНоменклатуры)
       |                   И ТипЦен = &ТипЦен
       |                   ) КАК РегистрЦены
       |     ЛЕВОЕ СОЕДИНЕНИЕ
       |       РегистрСведений.КурсыВалют.СрезПоследних(&ДатаНач, ) КАК КурсыВалют
       |     ПО
       |       РегистрЦены.Валюта = КурсыВалют.Валюта
       |   ) КАК Цены
       |СГРУППИРОВАТЬ ПО
       |   Номенклатура,
       |   ХарактеристикаНоменклатуры
       |";
       
       ТекстЦеныПоступление = "
       |ВЫБРАТЬ
       |   Номенклатура         КАК Номенклатура,
       |   ХарактеристикаНоменклатуры   КАК ХарактеристикаНоменклатуры,
       |   Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Коэффициент,
       |   СУММА(Сумма //ПроцентИзм //СуммаИзм) КАК Сумма
       |ИЗ (
       |   ВЫБРАТЬ
       |     ПартииТоваров.Номенклатура         КАК Номенклатура,
       |     ПартииТоваров.ХарактеристикаНоменклатуры   КАК ХарактеристикаНоменклатуры,
       |     СУММА(   ВЫБОР КОГДА ПартииТоваров.КоличествоПриход = 0 ТОГДА
       |           0
       |         ИНАЧЕ
       |           ПартииТоваров.СтоимостьПриход / ПартииТоваров.КоличествоПриход
       |         КОНЕЦ) КАК Сумма
       |   ИЗ
       |     РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНач, &ДатаКон, ,
       |                         Номенклатура В(&МассивНоменклатуры)
       |                         И ХарактеристикаНоменклатуры В(&МассивХарактеристикНоменклатуры)
       |                         И СтатусПартии В(&МассивСтатусов)
       |                         ) КАК ПартииТоваров
       |   СГРУППИРОВАТЬ ПО
       |     ПартииТоваров.Номенклатура,
       |     ПартииТоваров.ХарактеристикаНоменклатуры
       |   ) КАК ПартииТоваров
       |СГРУППИРОВАТЬ ПО
       |   Номенклатура,
       |   ХарактеристикаНоменклатуры
       |";
       
       ТекстЦеныСписание = "
       |ВЫБРАТЬ
       |   Номенклатура         КАК Номенклатура,
       |   ХарактеристикаНоменклатуры   КАК ХарактеристикаНоменклатуры,
       |   Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Коэффициент,
       |   СУММА(Сумма //ПроцентИзм //СуммаИзм) КАК Сумма
       |ИЗ (
       |   ВЫБРАТЬ
       |     НезавершенноеПроизводство.Затрата         КАК Номенклатура,
       |     НезавершенноеПроизводство.ХарактеристикаЗатраты   КАК ХарактеристикаНоменклатуры,
       |     СУММА(   ВЫБОР КОГДА НезавершенноеПроизводство.КоличествоПриход = 0 ТОГДА
       |           0
       |         ИНАЧЕ
       |           НезавершенноеПроизводство.СтоимостьПриход / НезавершенноеПроизводство.КоличествоПриход
       |         КОНЕЦ) КАК Сумма
       |   ИЗ
       |     РегистрНакопления.НезавершенноеПроизводство.Обороты(&ДатаНач, &ДатаКон, ,
       |                         Затрата В(&МассивНоменклатуры)
       |                         И ХарактеристикаЗатраты В(&МассивХарактеристикНоменклатуры)
       |                         И СтатьяЗатрат.ХарактерЗатрат = &ХарактерЗатрат
       |                         И СтатьяЗатрат.ВидЗатрат = &ВидЗатрат
       |                         ) КАК НезавершенноеПроизводство
       |   СГРУППИРОВАТЬ ПО
       |     НезавершенноеПроизводство.Затрата,
       |     НезавершенноеПроизводство.ХарактеристикаЗатраты
       |   ) КАК ПартииТоваров
       |СГРУППИРОВАТЬ ПО
       |   Номенклатура,
       |   ХарактеристикаНоменклатуры
       |";
       
       Запрос = Новый Запрос;
       
       Если мМетодОпределенияСтоимости = Перечисления.МетодыОпределенияСтоимости.ПоВыбранномуТипуЦен Тогда
         Текст = ТекстЦеныНоменклатуры;
       ИначеЕсли мМетодОпределенияСтоимости = Перечисления.МетодыОпределенияСтоимости.ПоСтоимостиПоступления Тогда
         Текст = ТекстЦеныПоступление;
       ИначеЕсли мМетодОпределенияСтоимости = Перечисления.МетодыОпределенияСтоимости.ПоСтоимостиСписанияВПроизводство Тогда
         Текст = ТекстЦеныСписание;
       Иначе
         Возврат;
       КонецЕсли;
       
       Если мПроцентМатериальные <> 0 Тогда
         Текст = СтрЗаменить(Текст, "//ПроцентИзм",    "+ Сумма*&ПроцентМатериальные/100");
       Иначе
         Текст = СтрЗаменить(Текст, "//ПроцентИзм",    "");
       КонецЕсли;
       Если мСуммаМатериальные <> 0 Тогда
         Текст = СтрЗаменить(Текст, "//СуммаИзм",    "+ &СуммаМатериальные");
       Иначе
         Текст = СтрЗаменить(Текст, "//СуммаИзм",    "");
       КонецЕсли;
       Запрос.Текст = Текст;
       
       КурсВал  = ОбщегоНазначения.ПолучитьКурсВалюты(мВалютаУправленческогоУчета, мДатаНачМатериальные);
       КурсУпр  = КурсВал.Курс;
       КратУпр  = КурсВал.Кратность;
       
       Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
       Запрос.УстановитьПараметр("МассивХарактеристикНоменклатуры", МассивХарактеристикНоменклатуры);
       Запрос.УстановитьПараметр("ДатаНач", мДатаНачМатериальные);
       Запрос.УстановитьПараметр("ДатаКон", мДатаКонМатериальные);
       Запрос.УстановитьПараметр("КурсУпр", КурсУпр);
       Запрос.УстановитьПараметр("КратУпр", КратУпр);
       Запрос.УстановитьПараметр("ТипЦен",  мТипЦен);
       Запрос.УстановитьПараметр("ПроцентМатериальные", мПроцентМатериальные);
       Запрос.УстановитьПараметр("СуммаМатериальные",     мСуммаМатериальные);
       Запрос.УстановитьПараметр("ХарактерЗатрат",     Перечисления.ХарактерЗатрат.ПроизводственныеРасходы);
       Запрос.УстановитьПараметр("ВидЗатрат",           Перечисления.ВидыЗатрат.Материальные);
       
       МассивСтатусов = Новый Массив;
       МассивСтатусов.Добавить(Перечисления.СтатусыПартийТоваров.Купленный);
       МассивСтатусов.Добавить(Перечисления.СтатусыПартийТоваров.Продукция);
       Запрос.УстановитьПараметр("МассивСтатусов", МассивСтатусов);
       
       ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
       
       СтруктураПоиска = Новый Структура;
       
       Для Каждого Строка Из ТаблицаМатериалов Цикл
         
         СтруктураПоиска.Очистить();
         СтруктураПоиска.Вставить("Номенклатура",          Строка.Материал);
         СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры",    Строка.ХарактеристикаМатериала);
           
         МассивСтрок = ТаблицаРезультат.НайтиСтроки(СтруктураПоиска);
         Если МассивСтрок.Количество() = 0 Тогда
           Продолжить;
         КонецЕсли;
         Цена = МассивСтрок[0].Сумма / ?(МассивСтрок[0].Коэффициент <> 0, МассивСтрок[0].Коэффициент, 1);
         
         Если ТипЗнч(Строка.Материал) <> Тип("СправочникСсылка.Номенклатура") Тогда
           Продолжить;
         КонецЕсли;
         
         Если Не ЗначениеЗаполнено(Строка.СтатьяЗатрат) Тогда
           Строка.СтатьяЗатрат = Строка.Материал.СтатьяЗатрат;
         КонецЕсли;
         
         
         //Строка.Примечание="";
         Строка.Сумма = Строка.КоличествоСОтх * Цена * ?(Строка.ЕдиницаИзмеренияМатериала.Коэффициент <> 0, Строка.ЕдиницаИзмеренияМатериала.Коэффициент, 1);
         Если Строка.КоличествоСОтх Тогда
         Строка.Цена = Строка.Сумма / Строка.КоличествоСОтх;
       Иначе
         Строка.Цена = Строка.Сумма;
         КонецЕсли;
       КонецЦикла;
       
       ТаблицаМатериалов.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмеренияМатериала, СтатьяЗатрат, Материал, РасчетСебестоимости, Примечание", "Цена, КоличествоСОтх, Сумма");
         
       ТекНоменклатура         = Справочники.Номенклатура.ПустаяСсылка();
       ТекХарактеристикаНоменклатуры = Справочники.Номенклатура.ПустаяСсылка();
       
       Для Каждого Строка Из ТаблицаМатериалов Цикл
         
         Номенклатура          = Строка.Номенклатура;
         ХарактеристикаНоменклатуры    = Строка.ХарактеристикаНоменклатуры;
           
         Если ТекНоменклатура <> Номенклатура
          ИЛИ ТекХарактеристикаНоменклатуры <> ХарактеристикаНоменклатуры Тогда
         
             ТекНоменклатура = Номенклатура;
           ТекХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры;
         
           СтруктураПоиска.Очистить();
           СтруктураПоиска.Вставить("НоменклатураСтатьяЗатрат",    Номенклатура);
           СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры",    ХарактеристикаНоменклатуры);
         
           МассивСтрок = Новый Массив;
           Если ДеревоРезультат.Строки.Количество() <> 0 Тогда
             МассивСтрок = ДеревоРезультат.Строки.НайтиСтроки(СтруктураПоиска, Ложь);
           КонецЕсли;
         
           Если МассивСтрок.Количество() = 0 Тогда
             СтрокаНоменклатура = ДеревоРезультат.Строки.Добавить();
             СтрокаНоменклатура.НоменклатураСтатьяЗатрат  = Номенклатура;
             СтрокаНоменклатура.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры;
             СтрокаНоменклатура.ЕдиницаИзмерения = Номенклатура.ЕдиницаХраненияОстатков;
             СтрокаНоменклатура.Валюта = мВалютаУправленческогоУчета;
           Иначе
             СтрокаНоменклатура = МассивСтрок[0];
           КонецЕсли;
           
         КонецЕсли;
    
         ОкруглитьДо = мОкруглитьДоМатериальные;
         Если ОкруглитьДо <> Неопределено Тогда
           Строка.Сумма = УправлениеЦенообразованием.ОкруглитьЦену(Строка.Сумма, ОкруглитьДо, Истина);
         КонецЕсли;
         
         Если Строка.СтатьяЗатрат.СтатусМатериальныхЗатрат = Перечисления.СтатусыМатериальныхЗатратНаПроизводство.ПринятыеВПереработку Тогда
         Продолжить;
         КонецЕсли;
         НоваяСтрока = СтрокаНоменклатура.Строки.Добавить();
         НоваяСтрока.НоменклатураСтатьяЗатрат    = Строка.СтатьяЗатрат;
         НоваяСтрока.ХарактеристикаНоменклатуры    = Строка.СтатьяЗатрат.ХарактерЗатрат;
         НоваяСтрока.ВидЗатрат            = Строка.СтатьяЗатрат.ВидЗатрат;
         НоваяСтрока.Затрата            = Строка.Материал;
         НоваяСтрока.Сумма               = Строка.Сумма;
         НоваяСтрока.Валюта              = мВалютаУправленческогоУчета;
         НоваяСтрока.Количество            = Строка.КоличествоСОтх;
         НоваяСтрока.Цена              = Строка.Цена;
         НоваяСтрока.ЕдиницаИзмеренияМатериала    = Строка.ЕдиницаИзмеренияМатериала;
         НоваяСтрока.Примечание           = Строка.Примечание;
         НоваяСтрока.Спецификация          = УправлениеПланированием.ОпределитьСпецификациюПоУмолчанию(Строка.Материал, Строка.ХарактеристикаНоменклатуры, Дата);
    
    КонецЦикла;
    
    Загружаемые в дерево значений материалы тоже имеют основную спецификацию и необходимо вывести подчиненные материалы для каждого материала верхнего уровня. Для этого создаю условие:
    Код:
    Если ЗначениеЗаполнено(НоваяСтрока.Спецификация) тогда
    надо выбрать всю номенклатуру из ДеревоЗначений, разузловать и
    Код:
    НоваяСтрока.Строки.Добавить();
    Подскажите, пожалуйста, как выбрать строки из ТЧ обработки? И в правильном ли направлении я мыслю...
  2. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.988
    Симпатии:
    398
    Баллы:
    104
    Лично я вообще не понял, какой у Вас вопрос. Но строки в ТЧ ищутся методом Найти() или НайтиСтроки(). Синтакс-помощник все расскажет.
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    отвечаю, насколько понял вопрос:

    в поиске нет необходимости, т.к. дерево на то и дерево, что любая строка может являтся как веткой, так и листом дерева.
    Если в текущей строке есть спецификация, то у нее просто обязаны быть комплектующие, т.е. вложенные строки.

    Если же поиск все же необходим, то С-П в помощь, поиск в ДеревеЗначений ничем не отличается от поиска в ТаблицеЗначений
    User нравится это.
  4. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Спецификация есть, комплектующие есть, как вывести их в дерево?
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Эээ.....С-П по ДеревуЗначений читали? С ТаблицейЗначений работать умеете?
    Каждая строка дерева по сути - ТаблицаЗначений.
  6. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Никогда не получалось "подружиться" с ДЗ. Наконец-то разобралась - оказывается, все не так-то и сложно. Спасибо!
  7. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    к деревьям обычно прилагается рекурсия. В ней и обход и поиск по дереву можно организовать.
    Последнее редактирование модератором: 3 окт 2014

Поделиться этой страницей