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

23.12.09

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

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

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

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

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

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

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

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

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

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

См. также

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

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

27.12.2024    11130    Begemoth80    32    

84

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

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

20.08.2024    2355    PROSTO-1C    0    

20

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

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    2468    Vidz    0    

12

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

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1394    olja-ljaaa    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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С использовала мой код, но время идет, все меняется. Теперь очевидно код изменился. Вам ничего делать не надо, разузлование должно быть стандартной процедурой. Ищите причину в другом месте. А УНФ я давно не занимаюсь.
Оставьте свое сообщение