7.7 Цикл

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Hedinnk, 29 июн 2011.

  1. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Возможно ли как то переделать код:
    Код:
    Пока ПолучитьСтроку() = 1 Цикл
    Если Комплектующие.Комплект = Перечисление.Булево.ЗначениеПоНомеру(1) Тогда
    Спр = СоздатьОбъект("Справочник.Комплектация");
    Спр.ИспользоватьВладельца(Комплектующие);
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если Спр.Товар.Комплект = Перечисление.Булево.ЗначениеПоНомеру(1) Тогда
    Спр1 = СоздатьОбъект("Справочник.Комплектация");
    Спр1.ИспользоватьВладельца(Спр.Товар);
    Спр1.ВыбратьЭлементы();
    Пока Спр1.ПолучитьЭлемент() = 1 Цикл
    ...
    КонецЦикла;
    Иначе
    oVT.NewLine();
    oVT.ТабКомплектующие = Спр.Товар;
    oVT.ТабКоличество = Спр.Количество * Количество;
    КонецЕсли;
    КонецЦикла;
    Иначе
    oVT.NewLine();
    oVT.ТабКомплектующие = Комплектующие;
    oVT.ТабКоличество = Количество;
    oVT.ТабКомплектующие.Примечание = ПримечаниеТабличное;
    КонецЕсли;
    КонецЦикла;
    
    
    
    Вопрос по переделке возник в связи с тем, что если мы не знаем точно, сколько раз может повторится условие
    Код:
    Если СпрХ.Товар.Комплект = Перечисление.Булево.ЗначениеПоНомеру(1)
    
    .
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    не можно, а просто жизненно НУЖНО.
    Используйте рекурсию
  3. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    т.е. вместо всего моего кода, мне надо вставить:
    Код:
    Пока ПолучитьСтроку() = 1 Цикл
    oVT.ТабКоличество = Количество;
    Комплекты(Комплектующие);
    КонецЦикла;
    
    
    
    
    
    
    и добавить процедуру
    Код:
    Процедура Комплекты(Комплектующие)
    Если Комплектующие.Комплект = Перечисление.Булево.ЗначениеПоНомеру(1) Тогда
    Спр = СоздатьОбъект("Справочник.Комплектация");
    Спр.ИспользоватьВладельца(Комплектующие);
    Спр.ВыбратьЭлементы();
    oVT.ТабКоличество = oVT.ТабКоличество*Количество;
    Комплекты(Комплектующие);
    Иначе
    oVT.NewLine();
    oVT.ТабКомплектующие = Комплектующие;
    oVT.ТабКоличество = Количество;
    oVT.ТабКомплектующие.Примечание = ПримечаниеТабличное;
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    
    
    
    
    
    
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Совершенно верно. Позаоботьтесь только возможности зацикливания (беда рекурсии). Т.е. перекрестные ссылки (комплект ссылается на себя)

    Ну и замерьте в отладчике производительность....

    Перечисление.Булево.ЗначениеПоНомеру(1)
    и
    Перечисление.Булево.Да (или что там у вас)
  5. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    А можно вот тут чуть-чуть по-подробнее. Просто я не давно начал работать с 1С и не совсем все понимаю.
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Создаем список значений в котоый добавляем все обработанные комплекты. При входе в процедуру проверям на наличие комплекта в списке (выход без входа в рекурсию если нашли)

    Инач если будет комплект типа БолтИГайка содержит комплект БолтИГайка из цикла вы никогла не выйдите и 1с завалится когда кончится память....
  7. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    т.е. надо сделать так:

    Код:
    ...
    СЗ = СоздатьОбъект("СписокЗначений");
    СЗ.ВставитьСтроку(,"НаименованиеКомплект");
    Пока ПолучитьСтроку() = 1 Цикл
    oVT.ТабКоличество = Количество;
    Комплекты(Комплектующие);
    КонецЦикла;
    ...
    Процедура Комплекты(Комплектующие)
    Если Комплектующие.Комплект = Перечисление.Булево.Да Тогда
    СЗ.НоваяСтрока();
    СЗ.НаименованиеКомплект = Комплектующие;
    Если СЗ.НайтиЗначение(Комплектующие) = 1 Тогда
    Предупреждение(Комплектующие+" зациклен сам на себя");
    Прервать;
    Иначе
    Спр = СоздатьОбъект("Справочник.Комплектация");
    Спр.ИспользоватьВладельца(Комплектующие);
    Спр.ВыбратьЭлементы();
    oVT.ТабКоличество = oVT.ТабКоличество*Количество;
    Комплекты(Комплектующие);
    КонецЕсли;
    Иначе
    oVT.NewLine();
    oVT.ТабКомплектующие = Комплектующие;
    oVT.ТабКоличество = Количество;
    oVT.ТабКомплектующие.Примечание = ПримечаниеТабличное;
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    ...
    
    
    
  8. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Если не правильно мыслю, поправьте пожалуйста.
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не правильно...

    Код:
    Процедура Комплекты(Комплектующие)    
    Если СЗ.НайтиЗначение(Комплектующие)<>0 Тогда
    Возврат; 
    КонецЕсли;
    СЗ.ДобавитьЗначение(Комплектующие.ТекущийЭлемент());
    ....
    КонецПроцедуры
    
    
  10. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Изменил код:
    Код:
    ....
    СЗ = СоздатьОбъект("СписокЗначений");
    СЗ.ВставитьСтроку(,"НаименованиеКомплект");
    Пока ПолучитьСтроку() = 1 Цикл
    oVT.ТабКоличество = Количество;
    Комплекты(Комплектующие);
    КонецЦикла;
    ....
    Процедура Комплекты(Комплектующие)
    Если СЗ.НайтиЗначение(Комплектующие) <> 0 Тогда
    Возврат;
    КонецЕсли;
    Если Комплектующие.Комплект = Перечисление.Булево.Да Тогда
    СЗ.ДобавитьЗначение(Комплектующие.ТекущийЭлемент());
    Спр = СоздатьОбъект("Справочник.Комплектация");
    Спр.ИспользоватьВладельца(Комплектующие);
    Спр.ВыбратьЭлементы();
    oVT.ТабКоличество = oVT.ТабКоличество * Количество;
    Комплекты(Комплектующие);
    Иначе
    oVT.NewLine();
    oVT.ТабКомплектующие = Комплектующие;
    oVT.ТабКоличество = Количество;
    oVT.ТабКомплектующие.Примечание = ПримечаниеТабличное;
    КонецЕсли;
    КонецПроцедуры
    
    
    
    Теперь выдает сообщения:
    Переменная не определена (СЗ)
    Переменная не определена (Спр)
    Переменная не определена (oVT)
  11. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Как объявлена СЗ? Она должна быть общей перемнной модуля
  12. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Вроде бы сделал общей переменной модуля, теперь начало выдавать сообщение:
    Код:
    Если СЗ.НайтиЗначение(Комплектующие) <> 0 Тогда
    
    
    Недостаточное число параметров передано при вызове функции/процедуры объекта.

    В общем, прилагаю текст модуля который хочу довести до ума, т.к. там все сделано по-большей части по незнанию.

    Вложения:

  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Могу только предположить что СЗ вы объявили как ТАБЛИЦУзначений (методы одноименные - параметры разные)
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    исправьте...
    СЗ = СоздатьОбъект("ТаблицаЗначений");

    на
    СЗ = СоздатьОбъект("СписокЗначений");
  15. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Исправил, но теперь не расшифровывает комплекты.
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Где именно? Вы используете СЗ в таблице отчета?
  17. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Прикрепляю файл .md. Документ "Заявка"

    Вложения:

    • 1Cv7.rar
      Размер файла:
      34,8 КБ
      Просмотров:
      23
  18. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Условие зацикливания возможно только в комплекте...

    Код:
    Если Комплектующие.Комплект = Перечисление.Булево.Да Тогда
    Если СЗ.НайтиЗначение(Комплектующие) = 1 Тогда
    Возврат;
    КонецЕсли;	
    СЗ.ДобавитьЗначение(Комплектующие.ТекущийЭлемент());
    ......... 
    Комплекты(Комплектующие);
    Иначе
    oVT.NewLine();
    .........
    КонецЕсли;
    
    
  19. TopicStarter Overlay
    Hedinnk
    Offline

    Hedinnk

    Регистрация:
    21 апр 2011
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Сделал вот так:
    Код:
    Процедура Комплекты(Комплектующие)
    Если Комплектующие.Комплект = Перечисление.Булево.ЗначениеПоНомеру(1) Тогда
    Если СЗ.НайтиЗначение(Комплектующие) = 1 Тогда
    Возврат;
    КонецЕсли;
    СЗ.ДобавитьЗначение(Комплектующие.ТекущийЭлемент());
    Спр = СоздатьОбъект("Справочник.Комплектация");
    Спр.ИспользоватьВладельца(Комплектующие.ТекущийЭлемент());
    Спр.ВыбратьЭлементы();
    //		oVT.ТабКоличество = oVT.ТабКоличество * Количество;    
    Комплекты(Комплектующие);                              
    Иначе
    oVT.NewLine();
    oVT.ТабКомплектующие = Комплектующие;
    oVT.ТабКоличество = Количество;
    oVT.ТабКомплектующие.Примечание = ПримечаниеТабличное;
    КонецЕсли;
    КонецПроцедуры
    
    Код:
    		Пока ПолучитьСтроку() = 1 Цикл                  
    //			oVT.ТабКоличество = Количество;
    Комплекты(Комплектующие);
    КонецЦикла;
    
    Теперь то, что является не комплектом, выводится в печатную форму, а вот расшифрованные комплекты нет.
  20. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Вот тут не правильно
    Код:
    Спр.ВыбратьЭлементы();
    //инициализировали выборку... и что?
    Комплекты(Комплектующие);                              
    
    

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