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

23.12.09

Разработка - Механизмы типовых конфигураций

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

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

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

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

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

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

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

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

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

См. также

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В этой статье расскажу, как можно добавлять свои отборы в типовую обработку формирования заказов по потребностям с минимальными доработками.

27.02.2025    666    PROSTO-1C    1    

5

Механизмы типовых конфигураций HighLoad оптимизация Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Бесплатно (free)

Пример популярной пользовательской настройки плана счетов. К чему это может привести, почему «всё тормозит» и как это поправить.

18.02.2025    3147    pbelousov    10    

6

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Расчет себестоимости в типовых конфигурациях 1С – для многих «черный ящик», работающий по жестко зашитым в него алгоритмам. Реализация этого «черного ящика» может меняться в зависимости от конкретной конфигурации – УПП, БП 3.0, ERP. Но принцип работы везде одинаковый. Расскажем о том, как устроен расчет себестоимости, как его дорабатывать, и какие методы могут быть эффективны и без доработок.

27.12.2024    13463    Begemoth80    32    

87

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

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

20.08.2024    2993    PROSTO-1C    0    

22
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Reaper_1C 123 10.12.09 09:30 Сейчас в теме
Осталось сделать разузлование не по одной спецификации, а по списку спецификаций.
2. Michael_Osipov 10 10.12.09 09:39 Сейчас в теме
Вы имеете ввиду заполнение документа СборкаЗапасов списком номенклатуры ?
3. gutentag 253 12.12.09 14:47 Сейчас в теме
А почему надо лезть и править в конфигурацию? Почему нельзя сделать ввиде внешней обрабтки или обработки табличной части???
Michael_Osipov; +1 Ответить
4. Michael_Osipov 10 15.12.09 06:06 Сейчас в теме
5. grohman33 08.05.20 21:09 Сейчас в теме
Здравствуйте, сделал всё по инструкции, добавил новую процедуру, старую изменил, при проверке кода выдаёт ошибку:

{Документ.СборкаЗапасов.МодульОбъекта(53,43)}: Ожидается ключевое слово 'Тогда' ('Then')
Если Выборка.ТипСтрокиСостава<<?>> Перечисления.ТипыСтрокСоставаСпецификации.Узел Тогда (Проверка: Сервер)
6. Ermak96 21.05.20 11:19 Сейчас в теме
Посмотрите на дату публикации. 2009 год. Это я делал когда УНФ была в статусе бета. 1С использовала мой код, но время идет, все меняется. Теперь очевидно код изменился. Вам ничего делать не надо, разузлование должно быть стандартной процедурой. Ищите причину в другом месте. А УНФ я давно не занимаюсь.
Оставьте свое сообщение