Как заполнить тч документа из справочника?
Привет, нужна помощь. Мне необходимо из справочника Комплектующие заполнить тч Расход материалов документа Заказ. Целиком картина выглядит так - есть документ Заказ с тч Состав Заказа, где я выбираю Оконную Конструкцию из справочника ПараметрыОкон. Также есть справочник Комплектующие, в котором каждой Оконной Конструкции из справочника Параметры Окон соответствует набор материалов из справочника Материалы. И надо записать в тч Расход Материалов документа соответствующий список материалов. Фух, надеюсь не слишком запутанно. Прикладываю скрины, чтобы стало понятнее
Прикрепленные файлы:
По теме из базы знаний
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2
- Пример создания кадрового отчета для ЗУП 3.1
- Привилегированные отчеты
- Гарантированное проведение документов (подключаемое расширение)
- Универсальный журнал документов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)в обработчике события "при изменении" для поля "оконная конструкция" пишем что-то вроде этого:
Для того, чтобы корректно отработало УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции) в ТЧ "РасходМатериалов" должна быть ссылка на ОконнаяКонструкция для которой указанный материал, либо идентификатор строки ТЧ "СоставЗаказа". Во втором случае ПредыдущееЗначениеОконнойКострукции будет равно значению идентификатора текущей строки, для которой в данный момент производится заполнение материалов.
Если ни того, ни другого нет, то заполнять материалы советую в обработчике "ПередЗаписью" модуля объекта документа, чтобы быть уверенным, что состав ТЧ "СоставЗаказа" больше не изменится.
&НаКлиенте
Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)
ТекущаяСтрока = Элементы.СоставЗаказа.ТекущаяСтрока;
ЗаполнитьКоплектующиеНаСервере(ТекущаяСтрока);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьКоплектующиеНаСервере(ИдентификаторСтроки)
СтрокаТЧ = Объект.СоставЗаказа.НайтиПоИдентификатору(ИдентификаторСтроки);
УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции);
Если ЗначениеЗаполнено(СтрокаТЧ.ОконнаяКонструкция) Тогда
Для Каждого Стр ИЗ СтрокаТЧ.ОконнаяКонструкция.Материалы Цикл
ЗаполнитьЗначенияСвойств(Объект.РасходМатериалов.Добавить(), Стр);
КонецЦикла;
КонецЕсли;
ПредыдущееЗначениеОконнойКонструкции = СтрокаТЧ.ОконнаяКонструкция;
КонецПроцедуры
ПоказатьДля того, чтобы корректно отработало УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции) в ТЧ "РасходМатериалов" должна быть ссылка на ОконнаяКонструкция для которой указанный материал, либо идентификатор строки ТЧ "СоставЗаказа". Во втором случае ПредыдущееЗначениеОконнойКострукции будет равно значению идентификатора текущей строки, для которой в данный момент производится заполнение материалов.
Если ни того, ни другого нет, то заполнять материалы советую в обработчике "ПередЗаписью" модуля объекта документа, чтобы быть уверенным, что состав ТЧ "СоставЗаказа" больше не изменится.
(11)
Добавляемый реквизит будет заполнятся при заполнении материалами тч РасходМатериалов. Это нужно для того, что бы при изменении оконной конструкции удалить нужные материалы.
Но необходимо добавить еще и реквизит формы.
Вы его должны будете заполнять при активации строки тч СоставЗаказа текущим значением ОконнаяКонструкция, а так же после изменения ОконнаяКонструкция в текущей строке.
По значению этого реквизита будет выполнятся удаление материалов при изменении Оконной конструкции.
Добавляемый реквизит будет заполнятся при заполнении материалами тч РасходМатериалов. Это нужно для того, что бы при изменении оконной конструкции удалить нужные материалы.
Но необходимо добавить еще и реквизит формы.
Вы его должны будете заполнять при активации строки тч СоставЗаказа текущим значением ОконнаяКонструкция, а так же после изменения ОконнаяКонструкция в текущей строке.
По значению этого реквизита будет выполнятся удаление материалов при изменении Оконной конструкции.
(27)Нет, не правильно.
Вы должны очистить ТЧ только от тех строк, в которых на момент очистки ОконнаяКонструкция = ПредыдущееЗначениеОконнойКострукции, а после очистки добавить строки с материалами текущей
ОконнаяКонструкция и "запомнить" это же значение в ПредыдущееЗначениеОконнойКострукции.
Вы должны очистить ТЧ только от тех строк, в которых на момент очистки ОконнаяКонструкция = ПредыдущееЗначениеОконнойКострукции, а после очистки добавить строки с материалами текущей
ОконнаяКонструкция и "запомнить" это же значение в ПредыдущееЗначениеОконнойКострукции.
(28)
Вот такое нашел, похоже на способ удаления конкретных строк?
ОбъектДок = СсылкаДок.ПолучитьОбъект();
СтруктураДляПоиска = Новый Структура("Количество", 0);
ТабличнаяЧастьДок = ОбъектДок.Товары;
МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);
Для каждого Строка Из МассивПустыхСтрок Цикл
ТабличнаяЧастьДок.Удалить(Строка);
КонецЦикла;
ОбъектДок.Записать();
ПоказатьВот такое нашел, похоже на способ удаления конкретных строк?
(34)нет, необходимо адаптировать под свои реалии код:
СтруктураДляПоиска = Новый Структура("Количество", 0);
ТабличнаяЧастьДок = ОбъектДок.Товары;
МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);
Для каждого Строка Из МассивПустыхСтрок Цикл
ТабличнаяЧастьДок.Удалить(Строка);
КонецЦикла;
(35)
Не понял, как твой код выше адаптировать. Написал что-то такое. Близко к правде?
&НаКлиенте
Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)
ТекущаяСтрока = Элементы.СоставЗаказа.ТекущаяСтрока;
ЗаполнитьКоплектующиеНаСервере(ТекущаяСтрока);
КонецПроцедуры
Процедура УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции)
Счетчик = Объект.РасходМатериалов.Количество() - 1;
Пока Счетчик > 0 Цикл
Если Объект.РасходМатериалов[Счетчик] = Объект.РасходМатериалов[Счетчик-1] Тогда
Объект.РасходМатериалов[Счетчик].Удалить();
КонецЕсли;
Счетчик = Счетчик-1;
КонецЦикла
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьКоплектующиеНаСервере(ИдентификаторСтроки)
СтрокаТЧ = Объект.СоставЗаказа.НайтиПоИдентификатору(ИдентификаторСтроки);
Если ЗначениеЗаполнено(СтрокаТЧ.ОконнаяКонструкция) Тогда
Для Каждого Стр ИЗ СтрокаТЧ.ОконнаяКонструкция.Материалы Цикл
ЗаполнитьЗначенияСвойств(Объект.РасходМатериалов.Добавить(), Стр);
КонецЦикла;
КонецЕсли;
ПредыдущееЗначениеОконнойКонструкции = СтрокаТЧ.ОконнаяКонструкция;
КонецПроцедуры
ПоказатьНе понял, как твой код выше адаптировать. Написал что-то такое. Близко к правде?
(4)код из (2) полностью для модуля формы документа.
В модуле объекта только если использовать ПередЗаписью, но в таком случае код будет другим и код для модуля формы не нужен вообще.
Код для модуля объекта:
В модуле объекта только если использовать ПередЗаписью, но в таком случае код будет другим и код для модуля формы не нужен вообще.
Код для модуля объекта:
Процедура ПередЗаписью(Отказ)
......тут типовой код, если есть.....
РасходМатериалов.Очистить();
Для каждого Стр из СоставЗаказа цикл
Материалы = Стр.ОконнаяКонструкция.Материалы;
Для Каждого Строка Из Материалы Цикл
ЗаполнитьЗначенияСвойств(РасходМатериалов.Добавить(), Строка);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Показать
Разумнее все это делать следующим образом. Передавать на сервер из клиента текущее содержимое состава заказа, а на сервере к нужным материалам обращаться через запрос. Данную процедуру подцепить к обработчику событий ПриИзменении для нужных полей таблицы и к обработчику события ПослеУдаления для таблицы.
&НаКлиенте
Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)
ДанныеФормыСоставЗаказа = Объект.СоставЗаказа;
ЗаполнитьРасходМатериаловПоСпискуОконныхКонструкций(ДанныеФормыСоставЗаказа);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьРасходМатериаловПоСпискуОконныхКонструкций(ДанныеФормыСоставЗаказа);
Объект.РасходМатериалов.Очистить();
ТЗ=Новый ТаблицаЗначений;
ТЗ=ДанныеФормыСоставЗаказа.Выгрузить();
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| ЗаказСоставЗаказа.ОконнаяКонструкция КАК ОконнаяКонструкция,
| ВЫБОР
| КОГДА ЗаказСоставЗаказа.Количество = 0
| ТОГДА 1
| ИНАЧЕ ЗаказСоставЗаказа.Количество
| КОНЕЦ КАК Количество
|ПОМЕСТИТЬ ВТ_СоставЗаказа
|ИЗ
| &ВнешняяТаблицаОконныхКонструкций КАК ЗаказСоставЗаказа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТ.ОконнаяКонструкция КАК ОконнаяКонструкция,
| ВТ.Количество КАК Количество,
| Комплектующие.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТ_СоставЗаказаССылкойНаКомплектующие
|ИЗ
| ВТ_СоставЗаказа КАК ВТ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Комплектующие КАК Комплектующие
| ПО ВТ.ОконнаяКонструкция = Комплектующие.ОконнаяКонструкция
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| КомплектующиеМатериалы.Материал КАК Материал,
| СУММА(ВТ_СоставЗаказаССылкойНаКомплектующие.Количество * КомплектующиеМатериалы.Количество) КАК КоличествоМатериалов
|ИЗ
| ВТ_СоставЗаказаССылкойНаКомплектующие
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Комплектующие.Материалы КАК КомплектующиеМатериалы
| ПО ВТ_СоставЗаказаССылкойНаКомплектующие.Ссылка = КомплектующиеМатериалы.Ссылка
|
|СГРУППИРОВАТЬ ПО
| КомплектующиеМатериалы.Материал";
Запрос.УстановитьПараметр("Док", Объект.Ссылка);
Запрос.УстановитьПараметр("ВнешняяТаблицаОконныхКонструкций", ТЗ);
РезультатЗапроса=Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НоваяСтрокаРасходМатериалов=Объект.РасходМатериалов.Добавить();
НоваяСтрокаРасходМатериалов.Материал=ВыборкаДетальныеЗаписи.Материал;
НоваяСтрокаРасходМатериалов.Количество=ВыборкаДетальныеЗаписи.КоличествоМатериалов;
КонецЦикла;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот