8.х Создание документов из части с условием

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем daab, 24 мар 2015.

  1. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    в код не вдавалась, по делу как тотак
    Код:
    Док = Неопределено;
    
    Для Каждого стр из ТЗ цикл
    док = ?(док=Неопределено, Документы.ПоступлениеТоваровУслуг.СоздатьДокумент(), док);
    //тут ваши действия
    
    //когда заполнили док до упора, проверка какого то условия
    Док.Записать();
    Док = неопределено;
    //если условие не выполнено идем в следующую итерацию цикла
    КонецЦикла;
  2. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    не совсем понимаю, два раза перебирать строки из ТЗ чтоли надо? как товар то добавлять в документ?
  3. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    зачем 2 раза то? ваш цикл используйте, я лишь показала как внутри вашего цикла создавать документ. Кстати, вы думали об обработке исходной тз? если вы уже учли строку в документе, вам ее надо как то выделить в исходной тз, чтоб не попалась, ну или количество знать, если вы только часть товара в документ перетащили
  4. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    айай так при таком условии как вы описали, один товар в один документ попадает
  5. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    нет, не один, читайте внимательно.... мы скоро дойдем до того, что я вам код напишу ))))
  6. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    так я уже написал код, у меня все позиции попадают которые надо при условии, я же параллельно тестю
    по вашему коду создается один документ с одной позицией, извините
    Строки в документе мы же церез цикл заполняем + по вашему коду еще туди и создание документа загоняем. Получается каша
    Последнее редактирование: 24 мар 2015
  7. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    по вашему коду создается один документ. Я не вижу нескольких. я вам предлагаю создавать документ в цикле и то только если он до этого был не создан... было бы время, я бы вам код набросала, примерный...
  8. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    мне все таки стало интересно, вот такое набросала... доки не создаю правда, так как в пустой конфе делала.. я создала на форме табполе, чтоб заполнить исходную ТЗ с колонками Товар, Цена, Количество и Сумма. На форме же задаю лимит для суммы документа. Так как это прототип, все упрощенно.
    Код:
    Процедура РазбитьНажатие(Элемент)
       
        счДок = 0;
        тз = ЭлементыФормы.ТабличноеПоле3.Значение.Скопировать();
        тз.Сортировать("Сумма Возр, Колво Возр");
        ЭлементыФормы.ТабличноеПоле3.Значение = тз;
        тзН = тз.Скопировать();
        тзН.Очистить();
        мРазбивкаТЗНаДоки(тз, Число(ЭлементыФормы.ПолеВвода1.Значение), тзН);
       
    КонецПроцедуры
    
    Процедура мРазбивкаТЗНаДоки(тз, сум, тзН)
       
        счДок = счДок + 1; //в вашем случае тут документ надо создавать
       
        сч = тз.Количество() - 1;
        Пока сч >= 0 Цикл
            стр = тз[сч]; //идем от большего к малому
            Если тзН.Итог("Сумма") + стр.Сумма <= сум Тогда //полностью берем строку, т.е. уаляем из исходной тз
                нс = тзН.Добавить();
                мЗаполнитьСтроку(нс, стр.Товар, стр.Цена, стр.Колво, стр.Сумма);
                тз.Удалить(Стр);
            Иначе     //может часть только возьмем
                Для к = 1 По стр.Колво Цикл
                    Если тзН.Итог("Сумма") + стр.Цена * к > сум Тогда  //если превысили лимит, берем предпоследнюю итерацию
                        Если к > 1 Тогда //чтоб не записывать строку с колвом = 0
                            нс = тзН.добавить();
                            мЗаполнитьСтроку(нс, стр.Товар, стр.Цена, к - 1, стр.Цена * (к - 1));
                            стр.Колво = стр.Колво - к + 1;
                            стр.Сумма = стр.Цена * стр.Колво;
                        КонецЕсли;
                        Прервать;
                    КонецЕсли;
                    Если тзН.Итог("Сумма") + стр.Цена * к = сум Тогда  //ровно уперлись в лимит, берем текущее колво
                        нс = тзН.добавить();
                        мЗаполнитьСтроку(нс, стр.Товар, стр.Цена, к, стр.Цена * к);
                        стр.Колво = стр.Колво - к;
                        стр.Сумма = стр.Цена * стр.Колво;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
            сч = сч - 1;
        КонецЦикла;
       
        Сообщить(счДок);
        Для Каждого стр Из тзН Цикл   //а тут не выводить тз в сообщения, а заполнить новый документ
            Сообщить(стр.Товар + " " + стр.Цена + " " + стр.Колво + " " + стр.Сумма);
        КонецЦикла;
        тзН.Очистить();
       
        Если тз.Количество() > 0 Тогда
            мРазбивкаТЗНаДоки(тз, сум, тзН); //создаем новый док
        КонецЕсли;
       
    КонецПроцедуры
    
    Процедура мЗаполнитьСтроку(нс, Товар, Цена, Колво, Сумма)
       
        нс.Товар = Товар;
        нс.Цена = Цена;
        нс.Колво = Колво;
        нс.Сумма = Сумма;
       
    КонецПроцедуры
    
    попробуйте адаптировать под себя.
  9. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    ой огромное благодарю! я б такое год наверное писал, щас опробуем.
  10. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    только один нюанс, у меня управляемая форма и я встрял на первой же процедуре))
    если применить объект.выгрузить() как тогда сравнить ТЗшки, а при копировании применяется процедура Элементы.СкопироватСтроку() перебирать мне кажеться ето лишнее
    Последнее редактирование: 25 мар 2015
  11. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    этот ньюанс оговаривают при создании темы. Адаптируйте. В принципе у вас вся обработка пойдет на сервере.
  12. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    повторюсь
    если применить объект.выгрузить() как тогда сравнить ТЗшки, а при копировании применяется процедура Элементы.СкопироватСтроку() перебирать мне кажеться ето лишнее
  13. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    к чему это вы? чего выгружать хотите? При чем тут СкопироватьСтроку?
  14. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    процедура скопировать не работает

    тз = ЭлементыФормы.ТабличноеПоле3.Значение.Скопировать(); - в управляемой форме нет Значения и процедура Скопировать() выдает ошибку, поэтому додумался только выгрузить ТЗ
    тз.Сортировать("Сумма Возр, Колво Возр");


    ЭлементыФормы.ТабличноеПоле3.Значение = тз; - здесь условия для приравнивание не нашел пока ответа как сделать

    тзН = тз.Скопировать();
    тзН.Очистить();
    мРазбивкаТЗНаДоки(тз, Число(ЭлементыФормы.ПолеВвода1.Значение), тзН);
  15. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну начнем с того, что я работала с обработкой, я не знаю где вы формируете свою тз. Мне ее взять неоткуда, потому брала с формы и следовательно загоняла ее для просмотра туда же.
    Код:
    ЭлементыФормы.ТабличноеПоле3.Значение = тз;
    это надо было для того чтоб после рандомного заполнения увидеть отсортированную и ручками проверить расчеты программы. Вам то оно не надо. Отображение можно и пропустить - вы же доки создавать сразу будете
    --- Объединение сообщений, 25 мар 2015 ---
    вот этот параметр процедуры Число(ЭлементыФормы.ПолеВвода1.Значение) - это значение лимита по сумме документа. Я также не знаю откуда оно у вас
  16. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    все работает шикарно в отличии от моей кривизны) с меня пиво -Bookworm-

    единственно проверку на ноль надо сделать для поля ввода значения
  17. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну я задавалась идее показать вам принцип, а уж до ума довести - это ваша задача.
  18. TopicStarter Overlay
    daab
    Offline

    daab Опытный в 1С

    Регистрация:
    14 окт 2011
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    честно говоря моему мозгу в построении всех связей указанных в процедуре разбивки еще потребуется некоторое время)) Спасибки
  19. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну возможно потому без примера кода мы друг друга и не понимали. Удачи. Дорогу осилит идущий (с)

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