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

1. Sp1ke666 13.05.21 18:17 Сейчас в теме
Привет, нужна помощь. Мне необходимо из справочника Комплектующие заполнить тч Расход материалов документа Заказ. Целиком картина выглядит так - есть документ Заказ с тч Состав Заказа, где я выбираю Оконную Конструкцию из справочника ПараметрыОкон. Также есть справочник Комплектующие, в котором каждой Оконной Конструкции из справочника Параметры Окон соответствует набор материалов из справочника Материалы. И надо записать в тч Расход Материалов документа соответствующий список материалов. Фух, надеюсь не слишком запутанно. Прикладываю скрины, чтобы стало понятнее
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 13.05.21 20:04 Сейчас в теме
(1)в обработчике события "при изменении" для поля "оконная конструкция" пишем что-то вроде этого:

&НаКлиенте

Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)

ТекущаяСтрока = Элементы.СоставЗаказа.ТекущаяСтрока;

ЗаполнитьКоплектующиеНаСервере(ТекущаяСтрока);

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

&НаСервере
Процедура ЗаполнитьКоплектующиеНаСервере(ИдентификаторСтроки)

СтрокаТЧ = Объект.СоставЗаказа.НайтиПоИдентификатору(ИдентификаторСтроки);

УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции);

Если ЗначениеЗаполнено(СтрокаТЧ.ОконнаяКонструкция) Тогда
       Для Каждого Стр ИЗ СтрокаТЧ.ОконнаяКонструкция.Материалы Цикл
                 ЗаполнитьЗначенияСвойств(Объект.РасходМатериалов.Добавить(), Стр);
       КонецЦикла;
КонецЕсли;

ПредыдущееЗначениеОконнойКонструкции = СтрокаТЧ.ОконнаяКонструкция;

КонецПроцедуры
Показать


Для того, чтобы корректно отработало УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции) в ТЧ "РасходМатериалов" должна быть ссылка на ОконнаяКонструкция для которой указанный материал, либо идентификатор строки ТЧ "СоставЗаказа". Во втором случае ПредыдущееЗначениеОконнойКострукции будет равно значению идентификатора текущей строки, для которой в данный момент производится заполнение материалов.

Если ни того, ни другого нет, то заполнять материалы советую в обработчике "ПередЗаписью" модуля объекта документа, чтобы быть уверенным, что состав ТЧ "СоставЗаказа" больше не изменится.
3. Sp1ke666 13.05.21 20:32 Сейчас в теме
(2) Спасибо тебе огромное за отзывчивость! Сейчас пойду пробовать. Только краткий вопрос, а можно ли это сделать по кнопке? Или ни к чему?
5. nomad_irk 72 13.05.21 21:34 Сейчас в теме
(3)можно и по кнопке, но опять же пользователь может забыть ее нажать.
6. Sp1ke666 13.05.21 21:40 Сейчас в теме
(5) Ошибку кстати так и не удалось пофиксить. Не знаешь, в чем дело?
8. nomad_irk 72 13.05.21 21:43 Сейчас в теме
(6)дело в том, что код из (2) - для модуля формы документа, а не для модуля объекта.
9. Sp1ke666 13.05.21 21:46 Сейчас в теме
(8) Да, конечно, прости, жутко невнимательный. Исправился. Но конфигуратор все равно ругается(
Прикрепленные файлы:
10. nomad_irk 72 13.05.21 22:10 Сейчас в теме
(9)нужно добавить реквизит формы и в него запоминать текущее значение оконной конструкции текущей строки тч "СоставЗаказа".
11. Sp1ke666 13.05.21 22:20 Сейчас в теме
(10) Так, я вот здесь создаю реквизит(он ведь и в форме отразится) и потом перед строкой Удалить... должен написать - Реквизит1 = СтрокаТЧ.ОконнаяКонструкция?
Прикрепленные файлы:
12. nomad_irk 72 13.05.21 22:40 Сейчас в теме
(11)
Добавляемый реквизит будет заполнятся при заполнении материалами тч РасходМатериалов. Это нужно для того, что бы при изменении оконной конструкции удалить нужные материалы.

Но необходимо добавить еще и реквизит формы.

Вы его должны будете заполнять при активации строки тч СоставЗаказа текущим значением ОконнаяКонструкция, а так же после изменения ОконнаяКонструкция в текущей строке.
По значению этого реквизита будет выполнятся удаление материалов при изменении Оконной конструкции.
13. Sp1ke666 13.05.21 22:53 Сейчас в теме
(12) Так, вот я создал реквизит формы. Теперь в нужном месте? Код в модуль формы тобой написанный выше внес. Не можешь помочь с его корректировкой?
Прикрепленные файлы:
14. nomad_irk 72 13.05.21 22:58 Сейчас в теме
(13)создал - в нужном месте. Обзови его как он в коде называется или в коде измени его название и установи тип значения ОконныеКонструкции.
15. Sp1ke666 13.05.21 23:07 Сейчас в теме
(14) В типе указал ссылку на справочник Комплектующие, где хранится, какой ОконнойКонструкции, какие материалы соответствуют. А как его обозвать не очень понял. Я смотрю твой код и не понимаю, где этот реквизит фигурирует)
16. nomad_irk 72 14.05.21 05:59 Сейчас в теме
(15)Я в коде назвал его ПредыдущееЗначениеОконнойКострукции
17. Sp1ke666 14.05.21 11:15 Сейчас в теме
(16) Привет, переименовал. Но функцию Удалить все равно не определяет(
Прикрепленные файлы:
18. nomad_irk 72 14.05.21 11:16 Сейчас в теме
(17)Так ее создать нужно и наполнить кодом. Код по удалению строк в ТЧ - домашнее задание.
19. Sp1ke666 14.05.21 11:47 Сейчас в теме
(18) Даже запустилось, но после выбора ОконнойКонструкции в РасходМатериалов материалы так записывать и не стало(
Прикрепленные файлы:
20. nomad_irk 72 14.05.21 11:50 Сейчас в теме
(19)Не надо очищать всю ТЧ, нужно ее очистить от материалов для определенной ОконнойКонструкции, которая была до изменения.

Код не подразумевает запись, код только заполняет.

Вы обработчик события "ПриИзменении" назначили элементу формы в свойствах?
21. Sp1ke666 14.05.21 11:58 Сейчас в теме
(20) Это ведь оно? И да, спасибо, сейчас сижу, пытаюсь переписать код, чтобы удалять не все, а лишь для определенной ОконнойКонструкции
Прикрепленные файлы:
22. nomad_irk 72 14.05.21 12:00 Сейчас в теме
(21)Оно. Внутри этого обработчика должен быть код, что я привел в (2), тот, что &НаКлиенте.
23. Sp1ke666 14.05.21 12:19 Сейчас в теме
(22) Тогда там и добавил твой код. Снова получилось запустить, но в самом тонком клиенте пишет при выборе ОконнойКонструкции, что поле не обнаружено
Прикрепленные файлы:
24. nomad_irk 72 14.05.21 12:40 Сейчас в теме
(23)Я нигде не указывал такой код :)
Элемент - тут явно лишний.
25. Sp1ke666 14.05.21 12:41 Сейчас в теме
(24) Это я уже самостоятельно пытаюсь процедуру для удаления написать)))
26. nomad_irk 72 14.05.21 12:43 Сейчас в теме
(25)Я понял. Ход мыслей абсолютно в пустоту.
27. Sp1ke666 14.05.21 12:55 Сейчас в теме
(26) Но я правильно понимаю, что нужно, чтобы когда текущее значение оконной конструкции равно предыдущему, тогда я очищаю?
28. nomad_irk 72 14.05.21 13:00 Сейчас в теме
(27)Нет, не правильно.
Вы должны очистить ТЧ только от тех строк, в которых на момент очистки ОконнаяКонструкция = ПредыдущееЗначениеОконнойКострукции, а после очистки добавить строки с материалами текущей
ОконнаяКонструкция и "запомнить" это же значение в ПредыдущееЗначениеОконнойКострукции.
29. Sp1ke666 14.05.21 13:04 Сейчас в теме
(28) Спасибо, пойду пробовать писать!
30. Sp1ke666 14.05.21 13:43 Сейчас в теме
(28) Так, можно еще вопрос, а мы выполняем тобой описанное выше в процедуре Удаление?
33. nomad_irk 72 14.05.21 15:34 Сейчас в теме
(30)В процедуре удаления выполняется ТОЛЬКО удаление.
после ее завершения происходит заполнение ТЧ новыми материалами.
31. Sp1ke666 14.05.21 15:16 Сейчас в теме
(28)
 ОбъектДок = СсылкаДок.ПолучитьОбъект(); 
     СтруктураДляПоиска = Новый Структура("Количество", 0);       
     ТабличнаяЧастьДок = ОбъектДок.Товары;            
     МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);      
     Для каждого Строка Из МассивПустыхСтрок Цикл      
      ТабличнаяЧастьДок.Удалить(Строка);      
     КонецЦикла;   
     ОбъектДок.Записать(); 
Показать

Вот такое нашел, похоже на способ удаления конкретных строк?
32. nomad_irk 72 14.05.21 15:33 Сейчас в теме
34. Sp1ke666 14.05.21 19:51 Сейчас в теме
(32) Прости, я все равно не слишком понял, как реализовать удаление. Мне лучше идти как-то снизу и сравнивать, но как это вообще сравнивать?
35. nomad_irk 72 14.05.21 22:10 Сейчас в теме
(34)нет, необходимо адаптировать под свои реалии код:

СтруктураДляПоиска = Новый Структура("Количество", 0);       
ТабличнаяЧастьДок = ОбъектДок.Товары;            
МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);      
Для каждого Строка Из МассивПустыхСтрок Цикл      
   ТабличнаяЧастьДок.Удалить(Строка);      
КонецЦикла;
36. Sp1ke666 15.05.21 11:26 Сейчас в теме
(35)
&НаКлиенте

Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)

ТекущаяСтрока = Элементы.СоставЗаказа.ТекущаяСтрока;

ЗаполнитьКоплектующиеНаСервере(ТекущаяСтрока);

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

Процедура УдалитьМатериалыПредыдущейОконнойКонструкции(ПредыдущееЗначениеОконнойКострукции)
	Счетчик = Объект.РасходМатериалов.Количество() - 1;
    Пока Счетчик > 0 Цикл
        Если Объект.РасходМатериалов[Счетчик] = Объект.РасходМатериалов[Счетчик-1] Тогда
            Объект.РасходМатериалов[Счетчик].Удалить();
        КонецЕсли;
    Счетчик = Счетчик-1;
    КонецЦикла
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьКоплектующиеНаСервере(ИдентификаторСтроки)

СтрокаТЧ = Объект.СоставЗаказа.НайтиПоИдентификатору(ИдентификаторСтроки);

Если ЗначениеЗаполнено(СтрокаТЧ.ОконнаяКонструкция) Тогда
       Для Каждого Стр ИЗ СтрокаТЧ.ОконнаяКонструкция.Материалы Цикл
                 ЗаполнитьЗначенияСвойств(Объект.РасходМатериалов.Добавить(), Стр);
       КонецЦикла;
КонецЕсли;

ПредыдущееЗначениеОконнойКонструкции = СтрокаТЧ.ОконнаяКонструкция;

КонецПроцедуры
Показать


Не понял, как твой код выше адаптировать. Написал что-то такое. Близко к правде?
37. nomad_irk 72 15.05.21 12:01 Сейчас в теме
(36) при изменении оконной конструкции в ТЧ СоставЗаказа будет очищатся вся ТЧ РасходМатериалов.

Если в СоставЗаказа будет только одна ОконнаяКонструкция ВСЕГДА, то этот вариант будет работать.
38. Sp1ke666 15.05.21 12:05 Сейчас в теме
(37) Но в самом тонком клиенте при выборе оконной конструкции, даже когда она одна, пишет, что "Поле Материалы не обнаружено"( Что это вообще значит?
39. nomad_irk 72 15.05.21 12:23 Сейчас в теме
(38)Это значит, что "Материалы" могут называться по-другому.
Найти место в коде, где есть "Материалы" и понять, почему работает.
4. Sp1ke666 13.05.21 20:45 Сейчас в теме
(2) Прости, а что мне нужно вместо этой переменной поставить? Вместо ПредыдущееЗначениеОконнойКонструкции? Вызываю в модуле документа. Это ли ты имел ввиду?)
Прикрепленные файлы:
7. nomad_irk 72 13.05.21 21:42 Сейчас в теме
(4)код из (2) полностью для модуля формы документа.

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

Код для модуля объекта:

Процедура ПередЗаписью(Отказ)
......тут типовой код, если есть.....

РасходМатериалов.Очистить();

Для каждого Стр из СоставЗаказа цикл
      Материалы = Стр.ОконнаяКонструкция.Материалы;
     Для Каждого Строка Из Материалы Цикл
     ЗаполнитьЗначенияСвойств(РасходМатериалов.Добавить(), Строка);
     КонецЦикла;

КонецЦикла;

КонецПроцедуры
Показать
40. azmon 1 16.05.21 02:07 Сейчас в теме
Разумнее все это делать следующим образом. Передавать на сервер из клиента текущее содержимое состава заказа, а на сервере к нужным материалам обращаться через запрос. Данную процедуру подцепить к обработчику событий ПриИзменении для нужных полей таблицы и к обработчику события ПослеУдаления для таблицы.

&НаКлиенте
Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)
	
	ДанныеФормыСоставЗаказа = Объект.СоставЗаказа;
	
	ЗаполнитьРасходМатериаловПоСпискуОконныхКонструкций(ДанныеФормыСоставЗаказа);

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

&НаСервере


Процедура ЗаполнитьРасходМатериаловПоСпискуОконныхКонструкций(ДанныеФормыСоставЗаказа);

	Объект.РасходМатериалов.Очистить();
	
	ТЗ=Новый ТаблицаЗначений;
	ТЗ=ДанныеФормыСоставЗаказа.Выгрузить();
	
	МенеджерВТ = Новый МенеджерВременныхТаблиц;
	Запрос = Новый Запрос;
	
	Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
	
	Запрос.Текст = "ВЫБРАТЬ
	|	ЗаказСоставЗаказа.ОконнаяКонструкция КАК ОконнаяКонструкция,
	|	ВЫБОР
	|		КОГДА ЗаказСоставЗаказа.Количество = 0
	|			ТОГДА 1
	|		ИНАЧЕ ЗаказСоставЗаказа.Количество
	|	КОНЕЦ КАК Количество
	|ПОМЕСТИТЬ ВТ_СоставЗаказа
	|ИЗ
	|	&ВнешняяТаблицаОконныхКонструкций КАК ЗаказСоставЗаказа
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВТ.ОконнаяКонструкция КАК ОконнаяКонструкция,
	|	ВТ.Количество КАК Количество,
	|	Комплектующие.Ссылка КАК Ссылка
	|ПОМЕСТИТЬ ВТ_СоставЗаказаССылкойНаКомплектующие
	|ИЗ
	|	ВТ_СоставЗаказа КАК ВТ
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Комплектующие КАК Комплектующие
	|		ПО ВТ.ОконнаяКонструкция = Комплектующие.ОконнаяКонструкция
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	КомплектующиеМатериалы.Материал КАК Материал,
	|	СУММА(ВТ_СоставЗаказаССылкойНаКомплектующие.Количество * КомплектующиеМатериалы.Количество) КАК КоличествоМатериалов
	|ИЗ
	|	ВТ_СоставЗаказаССылкойНаКомплектующие 
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Комплектующие.Материалы КАК КомплектующиеМатериалы
	|		ПО ВТ_СоставЗаказаССылкойНаКомплектующие.Ссылка = КомплектующиеМатериалы.Ссылка
	|
	|СГРУППИРОВАТЬ ПО
	|	КомплектующиеМатериалы.Материал";
	
	Запрос.УстановитьПараметр("Док", Объект.Ссылка);
	Запрос.УстановитьПараметр("ВнешняяТаблицаОконныхКонструкций", ТЗ);
	РезультатЗапроса=Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		НоваяСтрокаРасходМатериалов=Объект.РасходМатериалов.Добавить();
		НоваяСтрокаРасходМатериалов.Материал=ВыборкаДетальныеЗаписи.Материал;
		НоваяСтрокаРасходМатериалов.Количество=ВыборкаДетальныеЗаписи.КоличествоМатериалов;
		
	КонецЦикла;
КонецПроцедуры
Показать
41. user1135816 4 17.05.21 13:55 Сейчас в теме
А почему не использовать Форму подбора в документе со всеми вытекающими?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот