Как правильно организовать заполнение табличной части.

Версия для печатиPDF-версия

Платформа:

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

В первой табличной части я создал реквизиты типа число( для ввода размеров помещения), Реквизит типа Перечисления.Ссылка для более удобного с моей точки зрения разграничения и обращения к данным значениям(Если это не имеет смысла, прошу одернуть ;) ) и дополнительное поле типа строка, что бы дать человеческое пояснение и проще идентифицировать само помещение.

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

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

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

 

Заранее благодарю за ответ!

Что-то я не понял о заполнении какой таблицы речь.

Вы хотите рассчитать общую площадь пола всех помещений?

ПС. Если перечисление используется для обозначения помещений, то это не имеет смысла. Вполне можно обойтись Строкой или Числом.

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

Но мне не понятен механизм кода, который будет это исполнять. Мне получается нужно что бы из значений первой таблицы считалась допустим площадь общая стен, после чего, вычитались значения второй и третьей таблицы, что бы в "Рабочие параметры" заносилось уже расчитаное из тех таблиц значение. Как я понимаю, проще будет организовать предварительный расчет площади в тех таблицах, после чего максимально простым выражением, получить значение в эту. Если на пальцах то я хочу, ввести Ширину, Длину и высоту помещения в 1 таблице ПриИзменений этих параметров я получу допустим число 32 кв.м. для помещения А, 40кв.м. для помещения Б, введу размеры любого количества дверей с идентификаторами А и Б, для понимания к какому помещению относится дверь, там же допустим получу площадь каждой двери, с этим у меня проблем не возникнет. Аналогично с таблицей Окон. И после этого, по нажатию кнопки, в таблицу Рабочие параметры" получить значение выражения ПлощадьСтенОбщаяА - ПлощадьДверейА - ПлощадьОконА и аналогично для данных с идентификатором Б.

Но как реализовать этот механизм, что бы обходился весь список окон и дверей и их площадь с идентификатором А вычиталась из площади помещения из первой таблицы с идентификатором А, а Площади с идентификатором Б из площади помещения с идентификатором Б.

Либо как вариант, я вот сейчас думаю, делать таблицу "Рабочие параметры" следующего содержания...

Первый реквизит помещение, будет идентифицировать помещение для расчета.

Следом будет выбор "Пол" или "Стены" ПриИзменении которых 

В третий реквизит будет попадать соответствующая рабочая площадь

Следом в четвертом реквизите будет выбиратся вид работы, в зависимости от выбраной поверхности, то есть если "пол", то одни виды работ, если "стены" то другие, 

Пятым реквизитом Выбиратся материал, выбор которого не велик и в большинстве случаев не требуется

Шестым реквизитом дополнительные параметры для вида работ, допустим для штукатурки это "Маяк" или "Плинтус" или "Правило", а для шпатлевки количество слоев и т.д.

И после этого получать значения в следующую таблицу, в которой уже будет сам материал, его цена, стоимость, количество...

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

 

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

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

Получать площадь дверей и окон по каждому из помещений можно следующими способами:

1. В цикле обходите строки таблицы Помещения и отбираете все строки таблиц Окна и Двери с таким же значением помещения. Делаете обход отобранных строк и вычисляете общую площадь окон и дверей по каждому помещению. Примерно так:

Для Каждого СтрокаПомещения Из Объект.Помещения Цикл 
	ПлощадьПомещения = (СтрокаПомещения.Длина + СтрокаПомещения.Ширина) * 2 * СтрокаПомещения.Высота;
	ПлощадьДверей = 0;
	ПлощадьОкон = 0;
	СтруктураОтбора = Новый Структура("Помещение", СтрокаПомещения.Помещение);
	НайденныеСтроки = Объект.Двери.НайтиСтроки(СтруктураОтбора);
	Для Каждого СтрокаДвери Из НайденныеСтроки Цикл 
		ПлощадьДверей = ПлощадьДверей + СтрокаДвери.Длина * СтрокаДвери.Ширина;
	КонецЦикла;
	НайденныеСтроки = Объект.Окна.НайтиСтроки(СтруктураОтбора);
	Для Каждого СтрокаОкна Из НайденныеСтроки Цикл 
		ПлощадьОкон = ПлощадьОкон + СтрокаОкна.Длина * СтрокаОкна.Ширина;
	КонецЦикла;
	НоваяСтрока = Объект.РабочиеПараметры.Добавить();
	НоваяСтрока.Помещение = СтрокаПомещения.Помещение; 
	НоваяСтрока.Площадь = ПлощадьПомещения - ПлощадьДверей - ПлощадьОкон; 
КонецЦикла;

2. Нужно добавить колонку Площадь и рассчитывать её при изменении Длины и Ширины. Для расчета общих площадей окон и дверей по каждому помещению выгружаете ТЧ Окна и Двери в таблицы значений. Сворачиваете полученные таблицы. Колонка группировки - "Помещение", колонка суммирования - "Площадь". Получаете таблицу значений с общей площадью окон/дверей по каждому помещению. Примерно так:

тзДвери = Объект.Двери.Выгрузить();
тзДвери.Свернуть("Помещение", "Площадь");
тзОкна = Объект.Окна.Выгрузить();
тзОкна.Свернуть("Помещение", "Площадь");
Для Каждого СтрокаПомещения Из Объект.Помещения Цикл 
	ПлощадьПомещения = (СтрокаПомещения.Длина + СтрокаПомещения.Ширина) * 2 * СтрокаПомещения.Высота;
	СтрокаДвери = тзДвери.Найти(СтрокаПомещения.Помещение, "Помещение");
	Если Не СтрокаДвери = Неопределено Тогда 
		ПлощадьПомещения = ПлощадьПомещения - СтрокаДвери.Площадь;
	КонецЕсли;
	СтрокаОкна = тзОкна.Найти(СтрокаПомещения.Помещение, "Помещение");
	Если Не СтрокаОкна = Неопределено Тогда 
		ПлощадьПомещения = ПлощадьПомещения - СтрокаОкна.Площадь;
	КонецЕсли;
	НоваяСтрока = Объект.РабочиеПараметры.Добавить();
	НоваяСтрока.Помещение = СтрокаПомещения.Помещение; 
	НоваяСтрока.Площадь = ПлощадьПомещения;
КонецЦикла;

Второй способ выполняется только на сервере.

Огромное, человеческое спасибо, уважаемый!!! Именно об этом способе обхода я и думал, но не имея практических навыков, не мог его представить в виде кода! Ваш сайт лучший для новичков и во всех возможных местах соприкосновения с сетью, даю слово, рассказать о нем! Сегодня, завтра, поработаю над документом и сообща о своих успехах, возможно данному примеру, найдётся место в вашей коллекции примеров для новичков, так как результат, думаю, будет охватывать множество аспектов работы с табличными частями! Так же, я продолжу посещать Ваш замечательный ресурс, ведь документ подразумевает расширение в сторону электрички и сантехники, порядок реализации которых, я ещё не обдумывал, но буду рад быть Вашим учеником на практике, уважаемый Сен Сэй!

Меня ещё никто так не называл)))

Конничи-ва Сен Сей! ;)

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

Благодаря Вашей подсказке и примеру, я добился корректного расчета рабочей площади стен и пола, для "любого" количества помещений, с любым количеством окон и дверей любого размера! Все работает и работает корректно!

Единственное, что хотелось бы тут улучшить вот что...

В первой таблице, где я ввожу размеры помещения, я использую, возможно и правда не нужное перечисление. Так как в последующих таблицах, оказалось не так удобно ориентироватся в помещениях по латинскому алфавиту значений перечисления. Заранее знать все варианты таких названий, так же не возможно, может быть и кладовка и кладовка2, балкон2, закуток и т.д. То есть названия этих "помещений"(квадратов для расчета) по сути будет даватся на месте, при производстве замеров.

В процессе написания, я предположил, возможно тут стоит использовать не перечисление, а справочник "НазванияПомещений" В котором будут предопределенные Кухня, Ванна, Прихожая, Балкон допустим, а если вдруг появится необходимость дополнительного названия, его всегда будет просто добавить... И после заполнения первой таблицы, в следующих однозначно будет возможность выбрать нужный идентификатор из того же справочника...

 

Тем самым, решить эту проблему и упростить заполнение и идентификацию этих помещений в любой таблице.. А то я уже думал, чуть ли не составной тип прикручивать к таблицам двери и окна, что бы при выборе помещения в этих таблицах, получать "значение перечисления + "строку из комментария" " при выборе помещения, что то типо такого..))

Надеюсь понятно объяснил от чего хотелось бы избавится)

Посоветуете что нибудь, или все таки именно справочник, является правильным решением задачи? Спасибо за Ваш труд, Вы правда, очень сильно помогаете мне! Всех благ Вам уважаемый! Я в долгу не останусь, время покажет!

 

Доброго времени суток уважаемый!

Последний вопрос не актуален. Сделал и понял, что да, именно справочник нужен в моем случае, как идентификатор помещения! Начинаю работу над таблицей заполнения видов работ, так что ждите новых вопросов! ;) Еще раз спасибо Вам за помощь, оперативные, содержательные ответы в виде практически готовых решений, каждое из которых идеально подходит для решения описаных задач!

Ps Скромная финансовая помощь проекту возможна только через WM? Хотел вчера подкинуть копеечку, но не смог не одним доступным способом...

По поводу помощи проекту написал на почту.

Пока нет желания и необходимости заморачиваться с подключением других платёжных систем к сайту.

Для того, чтобы написать правильный код надо сделать следующее

Добравить в табличные части следующие реквизиты площадь потолка, площадь пола, площадь стен

Все они численные то есть тип значения - число

Затем создать общий модуль  и обозвать его Рассчет площади

и поместить туда следующий текст

ПроцедураРассчитатьПлощадьПотолка(СтрокаТабличнойЧасти)Экспорт

СтрокаТабличнойЧасти.ПлощадьПотолка=СтрокаТабличнойЧасти.Длина*СтрокаТабличнойЧасти.Ширина;

КонецПроцедуры

ПроцедураРассчитатьПлощадьПола(СтрокаТабличнойЧасти)Экспорт

СтрокаТабличнойЧасти.ПлощадьПола=СтрокаТабличнойЧасти.Длина*СтрокаТабличнойЧасти.Ширина;

КонецПродедуры

Площадь же стен рассчитывается гораздо сложнее 

Поместим в модуль следующий текст

ПроцедураРассчитатьПлощадьСтен (СтрокаТабличнойЧасти) Экспрот

СтрокаТабличнойЧастиПлощадьСтен=СтрокаТабличнойЧасти.Длинна*СтрокаТабличнойЧасти.Высота*2+СтрокаТабличнойЧасти.Ширина*СтрокаТабличнойЧасти.Высота*2

Не забудьте в модуле поставить флажок Управляемое приложение

Затем Вы создаете форму документа, выбираете опцию длина при изменении, ширина при изменении, высота при призменении и вставляете следующий текст в обработчик прраметры созданные системой не изменяете

СтрокаТабличнойЧасти=Элементы.ПараметрыПомещения.ТекущиеДанные;

 РассчетПлощади.РассчитатьПлощадьПола (СтрокаТабличнойЧасти);

РассчетПлощади.РасссчитатьПлощадьПотолка (СтрокаТабличнойЧасти)

РассчетПлощади.РассчитатьПлощадьСтен (СтрокаТабличнойЧасти)

Закрываете модуль и работаете с площадьми

Где то так

С уважением Осипов Михаил Юрьевич

Не забутьте в конце каждой строки поставтить точки с запятой