Помогите пожалуйста. Конфигурация 1с 77 комплексная. Нужно вывести на печать товар по группам, где есть колонки "количество" и "сумма". При этом коде выводит на печать товар по группам и наименование верхнего уровня родителя. А вот кол-во и сумму считает только по первой подгруппе.
================================== //Здесь идет код который не имеет отношения ================================== старыйРодитель = ?(Ном = 1,ПолучитьПустоеЗначение("Справочник.ТМЦ"),старыйРодитель); Род = ТМЦ.Родитель; Роди = ТМЦ.Родитель; Пока ПустоеЗначение(Род.Родитель) = 0 Цикл Род = Род.Родитель; КонецЦикла; Если старыйРодитель<>Род Тогда ТекГруппаСтр = Строка(Род); ст = 0; Если ТЗ.НайтиЗначение(Роди,ст,"Роди")=1 Тогда грКво = ТЗ.ПолучитьЗначение(ст,"Кво"); грСуммаСНДС = Формат(Окр(ТЗ.ПолучитьЗначение(ст,"СуммаСНДС"),2),"Ч10.2"); КонецЕсли; Таб.ВывестиСекцию("Группа"); КонецЕсли; старыйРодитель = Род;
Помогите пожалуйста. Как правильно сформировать таблицу значений, чтобы считало по верхнему уровню родителя.
i
Для выделения кода имеется специальный тег
Какой тег для выделения кода??? В ВВ кодах я его не нашел.
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл ТЗ.Род=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель; Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл ТЗ.Роди=ТЗ.Роди.Родитель КонецЦикла; КонецЦикла; ТЗ.Свернуть("Роди","Кво,СуммаСНДС");
Сообщение отредактировал Cthulhu - 04.02.13, 15:01
ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл ТЗ.Род=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель; Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл ТЗ.Роди=ТЗ.Роди.Родитель КонецЦикла; КонецЦикла; ТЗ.Свернуть("Роди","Кво,СуммаСНДС");
Не, Вашим кодом ТЗ.Роди присваивается верхний уровень родителя ТМЦ. Но не считает вообще. Тут что получается. у товара родитель один, но уровни вложенности подродителей разные. Допустим есть Верхний уровень "Колбаса" -> в нем уровни "Копченая" и "Вареная" -> в копченой еще есть родитель. Так вот в моем коде считает по уровню "Копченая", а не по самому верхнему уровню "Колбаса" дабы посчитать итог К-во и Цена по Копченой и Вареной.
Так же в отладчике ругается на Родитель - Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл {Документ.Счет.Форма.Модуль(502)}: Значение не представляет агрегатный объект (Родитель)
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
а подумать хоть чуть самому и типизировать колонку "Роди"?.. (и - я не понял, при чем тут "в отладчике"? если это стандартная ругань режима предприятия - в соответствии с чем утверждение о том, как оно считает или не считает вообще лишено смысля до тех пор, пока код не отработает полностью чтобы увидеть результат)
а подумать хоть чуть самому и типизировать колонку "Роди"?..
Я вам очень благодарен за помощь. Но я уже как только не думал. Не получается. Неделю мучаюсь. По поводу отладчика я и не знал, что это нормальное явление когда вылетает отладка с такой ошибкой. Как же отследить работу программы в отладчике?
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
//ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ"); ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ");//или какого там вида справочник... // ... ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл //ТЗ.Род=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель;//ошибка моя, но видна невооруженным глазом ТЗ.Роди=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель; Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл ТЗ.Роди=ТЗ.Роди.Родитель КонецЦикла; КонецЦикла; ТЗ.Свернуть("Роди","Кво,СуммаСНДС");
"отладчик" - совсем не то, что вы думаете. "вылетает" не "отладчик", а сама программа. "отладчик" - это режим работы (строго говоря - ещё один экземпляр программы, запущенный в специ.режиме). лучше почитать по этому поводу документацию. хотя бы сначала. но это все - немного другая тема.
//ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ"); ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ");//или какого там вида справочник... // ... ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл //ТЗ.Род=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель;//ошибка моя, но видна невооруженным глазом ТЗ.Роди=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель; Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл ТЗ.Роди=ТЗ.Роди.Родитель КонецЦикла; КонецЦикла; ТЗ.Свернуть("Роди","Кво,СуммаСНДС");
Так это же тот же самый код, что и выше. Так не сворачивает по самому верхнему родителю.
ТЗ.Роди=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель;
здесь я так понял скорее всего опечатка и вторая строка должна быть ТЗ.Род=ТЗ.ТМЦ.Родитель; , но все равно это не спасает.
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
все там сворачивает. кроме пикового случая когда ТМЦ не в группе, а в корне, или просто пустой. в таком случае - доп.проверка нужна, не ожидал такой коварности:
//ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ"); ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ");//или какого там вида справочник... // ... ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ТЗ.ТМЦ.Выбран()<>1 Тогда Продолжить КонецЕсли; ТЗ.Род=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель; Если ТЗ.Роди.Выбран()<>1 Тогда Продолжить КонецЕсли; Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл ТЗ.Роди=ТЗ.Роди.Родитель КонецЦикла; КонецЦикла; ТЗ.Свернуть("Роди","Кво,СуммаСНДС");
Сообщение отредактировал Cthulhu - 04.02.13, 18:42
...вообще задание не понятно.. что-то сворачивать, что-то показывать... что-то нет... уровни какие-то...
на форму ТаблицуЗначений объект формы ( в коде //тз=Создатьобъект("ТаблицаЗначений")), и кнопку поставить, в ней Свернуть(). после всего не забыть очистить таблицу. Нагляднее будет, что там в таблице. В Отладчике точки останова поставить. Это про вопрос, что "вылетает отладка с ошибкой".
Сообщение отредактировал Домовик - 04.02.13, 19:42
//...Итоги по группам товаров в выборке уже есть. //Дальше для анализа и печати можно: Пока Запрос.Группировка("Товар")= 1 Цикл Если Товар.Уровень() =....Тогда ... КонецЕсли; КонецЦикла;
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
Цитата(Flexy @ 05.02.13, 0:08)
Имхо запросом удобней ...
Сохранять открытый (или даже новый) документ ради того, чтобы получить печ.форму?.. очень сомнительное "удобство" и несомненно грубая методологическая ошибка.
Группа: Местный
Сообщений: 224
Из: не ту страну назвали Гондурасом
Спасибо сказали: 83 раз
Рейтинг: 0
Цитата(Flexy @ 05.02.13, 10:12)
А как док, если он не новый, может быть открыт, если он не записан в БД?
"Кто на ком стоял", простите? только по секрету и только Вам: документы открывают не только для просмотра, но и для внесения в них изменений.
Цитата
А где было сказано, что документ новый, не записанный?
Документ в общем случае может быть и новый, и записанный - ибо речь ведется о контексте формы документа и без оговорок о режиме просмотра. Вами же предложен "удобный" способ, который оперирует данными не контекста формы документа, а объекта данных - каковой объект может не существовать или не совпадать с данными формы этого документа (котрые и нужно распечатать в нужном виде).
очень странно, что такие вещи приходится объяснять. и жаль, что я позволил спровоциовать себя на оффтопик. за сим, ежели возжелаете далее пытаться сохранить хорошую мину при плохой игре - вэлкам, но уже соло.
Сообщение отредактировал Cthulhu - 05.02.13, 11:09
все там сворачивает. кроме пикового случая когда ТМЦ не в группе, а в корне, или просто пустой. в таком случае - доп.проверка нужна, не ожидал такой коварности: //ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ"); ТЗ.НоваяКолонка("Роди","Спраочник.ТМЦ");//или какого там вида справочник... // ... ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ТЗ.ТМЦ.Выбран()<>1 Тогда Продолжить КонецЕсли; ТЗ.Род=ТЗ.ТМЦ.Родитель; ТЗ.Роди=ТЗ.ТМЦ.Родитель; Если ТЗ.Роди.Выбран()<>1 Тогда Продолжить КонецЕсли; Пока ТЗ.Роди.Родитель.Выбран()<>0 Цикл ТЗ.Роди=ТЗ.Роди.Родитель КонецЦикла; КонецЦикла; ТЗ.Свернуть("Роди","Кво,СуммаСНДС");
Ну не сворачивает ни как. В описании проблемы я написал весь код, который отвечает за вывод на печать секции Группа. Вот что получается при Вашем коде:
А вот, что получается с моим кодом написанным в начале темы.
Так вот в моем коде сворачивает и выводит на печать только по подгруппе "Отбеливатели", а подгруппа "Стиральные порошки " выводится, но не суммируется с подгруппой "отбеливатели." По идее должно вообще сворачивать по верхнему уровню "Ariel" обе подгруппы, какая бы вложеность у них не была. Т.е находим верхний уровень родителя и сворачиваем К-во и Сумму по самому верхнему уровню родителя все подгруппы, которые относятся к этому самому верхнему уровню.
Может здесь играет роль этот код?
Если старыйРодитель<>Род Тогда ТекГруппаСтр = Строка(Род); ст = 0; Если ТЗ.НайтиЗначение(Роди,ст,"Роди")=1 Тогда грКво = ТЗ.ПолучитьЗначение(ст,"Кво"); грСуммаСНДС = Формат(Окр(ТЗ.ПолучитьЗначение(ст,"СуммаСНДС"),2),"Ч10.2"); КонецЕсли; Таб.ВывестиСекцию("Группа"); КонецЕсли;
заполняем в таблице родителей с проверкой на уровень. сворачиваем несколько раз. загружая промеж. результат в еще в таблицы Уровень1, Уровень2,... УровеньN. И сохраняя исходнуюю только товарами. При обходе исходной таблицы, обращаемся к таблицам уровней, достаем значение.
Сообщение отредактировал Домовик - 05.02.13, 16:33
аполняем в таблице родителей с проверкой на уровень. сворачиваем несколько раз. загружая промеж. результат в еще в таблицы Уровень1, Уровень2,... УровеньN. И сохраняя исходнуюю только товарами. При обходе исходной таблицы, обращаемся к таблицам уровней, достаем значение.
М-да. Если бы я знал как это делать. Я учусь 1с-ке.
//...Итоги по группам товаров в выборке уже есть. //Дальше для анализа и печати можно: Пока Запрос.Группировка("Товар")= 1 Цикл Если Товар.Уровень() =....Тогда ... КонецЕсли; КонецЦикла;
Если не ошибаюсь, то в этом запросе 1с сама посчитает все итоги
Пока Запрос.Группировка("Товар")= 1 Цикл
Если Запрос.Товар.ЭтоГруппа() = 1 на данном цикле обхода запроса, то Запрос.Кол и Запрос.Сум будут содержать итоги по всем элементам входящим в группу и подгруппы.
Цитата(olmar @ 05.02.13, 17:07)
М-да. Если бы я знал как это делать. Я учусь 1с-ке.
Тогда, как говаривал дедушка Вирт, разделяйте и властвуйте, т.е. разделяйте всю задачу на более мелкие и решайте их, потом каждую из них делите еще на более мелкие и т.д., пока каждая из подзадач будет легко решаемой. увы. как правильно делить приходит только с опытом. так что делайте, анализируйте и делайте все сначала.
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник. ЗиУП
Тогда, как говаривал дедушка Вирт, разделяйте и властвуйте, т.е. разделяйте всю задачу на более мелкие и решайте их, потом каждую из них делите еще на более мелкие и т.д., пока каждая из подзадач будет легко решаемой. увы. как правильно делить приходит только с опытом. так что делайте, анализируйте и делайте все сначала.
Вот так вот я уже более недели мучаюсь с данным вопросом. Решил помощи на форуме найти. А меня отправляют к моим же костылям. На Инфостарте и то быстрее и конкретнее помогают решить проблему. Я хоть сразу вижу в чем ошибка и учусь быстрее. Что еще стоило ожидать от профи Корона на голове и ни какой помощи. Только Cthulhu адекватно и по человечески начал помогать.
расскажите мне, забитому пенсионеру с Короной, что такое Инфорстарт? Честно, не знаю.
Ну, вообще, чтоб тот адекватный, по-повашему, ответ получить, нужно сесть и написать код и отлаживать. У кого есть на это время? советуют общие механизмы. ту все адекватно ответили. Даже заспорили о вариантах решения. Сложность тут в том, что итоговые значения нужно выводить до перечисления вложенных элементов, и в том, что товар, может быть и на первом уровне, и на последнем.
Пока ТЗ.ПолучитьСтроку() = 1 Цикл ТекТМЦ.НайтиЭлемент(ТЗ.ТМЦ); Если ТекТМЦ.Уровень()=1 Тогда ТЗ.Уровень1=ТекТМЦ; ТЗ.Уровень2=ТекТМЦ; ИначеЕсли ТекТМЦ.Уровень()=2 Тогда ТЗ.Уровень2=ТекТМЦ; ТЗ.Уровень1=ТекТМЦ.Родитель; ИначеЕсли ТекТМЦ.Уровень()=3 Тогда ТЗ.Уровень2=ТекТМЦ.Родитель; ТЗ.Уровень1=ТЗ.Уровень2.Родитель; КонецЕсли; КонецЦикла;
// теперь у вас три таблицы. с данными третьего уровня, с итогами второго уровня, с итогами первого. // тут вам еще надо поработать, Тз.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл ТекУровень=0; Нашли= Уровень1.НайтиЗначение(ТЗ.Уровень1,ТекУровень,"Уровень1"); // пример того, как вынимать итоговые значения с других таблиц Если Нашли =1 Тогда Кво =Уровень1.ПолучитьЗначение(ТекУровень,"Кво"); Сообщить(Кво); КонецЕсли; КонецЦикла;
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!