gifts2017

УНФ. Увеличение вложенности узлов. Использование рекурсии.

Опубликовал Осипов Михаил (Michael_Osipov) в раздел Обработки - Обработка документов

Пытаясь внедрить "Управление небольшой фирмой" на производственном предприятии, обнаружил, что уровень вложенности узлов всего один. Другими словами, если узел состоит в свою очередь также из узлов, по кнопке "Заполнить по спецификации " заполняется только первый уровень.

Пытаясь внедрить "Управление небольшой фирмой" на производственном предприятии, обнаружил, что уровень вложенности узлов всего один. Другими словами, если узел состоит в свою очередь также из узлов, по кнопке заполняется только первый уровень.

Что-же делать, ведь только на этом предприятии уровень вложенности может доходить до 3.  Теоретически и до бесконечности, но я с этим не сталкивался.

Ответ: Использовать рекурсию. Рекурсивными называются те процедуры и функции которые вызывают сами себя.

Итак перепишем процедуру ЗаполнитьТабличнуюЧастьПоСпецификации() в модуле объекта СборкаЗапасов.

	 Процедура ЗаполнитьТабличнуюЧастьПоСпецификации() Экспорт
    Запасы.Очистить();
    ЗаполнитьПоСпецификации(Спецификация, Количество); //
КонецПроцедуры

Ну и напишем собственно рекурсивную процедуру. Она почти такая же? как старая процедура ЗаполнитьТабличнуюЧастьПоСпецификации() - даже скопирована с нее, но несколько короче.

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

Теперь узел может состоять также из узлов, а те в свою очередь из других и так далее, вплодь до бесконечности. Рекурсия будеть использоваться, пока все узлы не будут разобраны на составляющие.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Reaper_1c Reaper_1c (Reaper_1C) 10.12.09 09:30
Осталось сделать разузлование не по одной спецификации, а по списку спецификаций.
2. Осипов Михаил (Michael_Osipov) 10.12.09 09:39
Вы имеете ввиду заполнение документа СборкаЗапасов списком номенклатуры ?
3. Igоr Sаulеviсh (gutentag) 12.12.09 14:47
А почему надо лезть и править в конфигурацию? Почему нельзя сделать ввиде внешней обрабтки или обработки табличной части???
Michael_Osipov; +1 Ответить 1
4. Осипов Михаил (Michael_Osipov) 15.12.09 06:06
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа