Табличная часть "ТаблицаЦен" документа "Установка цен номенклатуры".

1. Intercititude 16.01.20 15:29 Сейчас в теме
Добрый день. Обычные формы.

Пытаюсь реализовать заполнение табличной части документа "Установка цен номенклатуры" с помощью внешней обработки из файла Excel. Прикладываю код модуля объекта обработки:

Процедура Инициализировать(ДокументСсылка, ИмяТабличнойЧасти, ТабличноеПолеОбъекта = Неопределено) Экспорт
	
	ТЧТовары = ДокументСсылка["Товары"];
	
	Если ТЧТовары.Количество() > 0 Тогда
		ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , Метаданные().Представление());
		Если Ответ = КодВозвратаДиалога.Нет Тогда
			Возврат;
		КонецЕсли;
		
		ТЧТовары.Очистить();
	КонецЕсли;
	
	ДокументСсылка.Дата = ТекущаяДатаСеанса();	
	
	Если ПолучитьФорму("Форма").ОткрытьМодально() = "ОК" Тогда
		Для Каждого Строка из Таблица Цикл                  
			НоваяСтрока								= ТЧТовары.Добавить();
			Переменная = Справочники.Номенклатура.НайтиПоНаименованию(Строка["Наименование"],Истина);
			Если ЗначениеЗаполнено(Переменная) Тогда
				НоваяСтрока["Номенклатура"]				= Справочники.Номенклатура.НайтиПоНаименованию(Строка["Наименование"],Истина);
				НоваяСтрока["Цена"]						= Строка["Цена"];
				Для Каждого Стр из ДокументСсылка.ТипыЦен Цикл
					НоваяСтрока["ТипЦен"] 					= Стр.ТипЦен;
					НоваяСтрока["Валюта"]         			= Стр.ТипЦен.ВалютаЦены;
				КонецЦикла;
				НоваяСтрока["ЕдиницаИзмерения"]         = Справочники.Номенклатура.НайтиПоНаименованию(Строка["Наименование"],Истина).ЕдиницаИзмеренияМест;
			Иначе
				ТЧТовары.Удалить(НоваяСтрока);
				Сообщить(" В базе отсутствует номенклатура: " + Строка["Наименование"] + " с кодом : " + Строка["Код"]);
			КонецЕсли;
			
		КонецЦикла;
	КонецЕсли;	
	
	ДокументСсылка.Записать();	
	ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
	ТекФорма.Закрыть();
	//ОткрытьФорму(ТекФорма);
	
КонецПроцедуры

Показать


Так как у документа основная таблица формы реализована как реквизит, то столкнулся со следующей проблемой.
Для того, что бы мои данные из Excel появились в документе, необходимо форму документ закрыть и открыть заново.
Если Программно "Закрыть()", а после "Открыть()", то натыкаюсь на ошибку при открытии "ФормыДокумента" в процедуре УстановитьКнопкиПодменюЗаполненияТЧ(); => Процедура ОбработатьНажатиеНаДополнительнуюКнопкуЗаполненияТЧ(СтрокаКнопки,ЭтотОбъект) Экспорт


{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(310)}: Ошибка при вызове метода контекста (Добавить)
Кнопка = Кнопки.Добавить(СтрокаКнопки.Имя,СтрокаКнопки.ТипКнопки, СтрокаКнопки.Текст, СтрокаКнопки.Действие);
по причине:
Не уникальное имя!



Подскажите как это обойти, или может вообще есть способ без закрытия-открытия формы ?!
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
15. ZergKRSK 129 17.01.20 05:43 Сейчас в теме
(14) не надо программно вызывать "Закрыть()" и "Открыть()".
Достаточно посмотреть в процедуре ПриОткрытии() как заполняется реквизит документа ТаблицаЦен.
			ДокументСсылка.Записать();
			
			//==========================================================­
			ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
			
			мСоответствиеТиповЦен = Новый Соответствие;
			Для Каждого СтрокаТипаЦен Из ДокументСсылка.ТипыЦен Цикл
				НомерСоответствияТекущейКолонки = ДокументСсылка.ТипыЦен.Индекс(СтрокаТипаЦен);
				мСоответствиеТиповЦен.Вставить(СтрокаТипаЦен.ТипЦен, НомерСоответствияТекущейКолонки);
			КонецЦикла;
			
			Если ДокументСсылка.ТипыЦен.Количество() = 0 Тогда // ничего делать не надо
				Возврат;
			КонецЕсли;
			
			ТаблицаТоваров = ДокументСсылка.Товары.Выгрузить();
			ТаблицаТоваров.Сортировать("ИндексСтрокиТаблицыЦен, Номенклатура, ХарактеристикаНоменклатуры");
			
			ТекущийИндексСтрокиТаблицыЦен = Неопределено;
			НоваяСтрока = Неопределено;
			Для Каждого СтрокаТаблицыТоваров Из ДокументСсылка.Товары Цикл
				Если ТекущийИндексСтрокиТаблицыЦен <> СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен
				 Или НоваяСтрока.Номенклатура <> СтрокаТаблицыТоваров.Номенклатура
				 Или НоваяСтрока.ХарактеристикаНоменклатуры <> СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры Тогда
					НоваяСтрока = ТекФорма.ТаблицаЦен.Добавить();
					НоваяСтрока.Номенклатура = СтрокаТаблицыТоваров.Номенклатура;
					НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры;
					ТекущийИндексСтрокиТаблицыЦен = СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен;
				КонецЕсли;

				НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТаблицыТоваров.ТипЦен];

				НоваяСтрока["цена" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Цена;
				НоваяСтрока["СпособРасчета" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.СпособРасчетаЦены;
				НоваяСтрока["валюта" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Валюта;
				НоваяСтрока["единица" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ЕдиницаИзмерения;
				НоваяСтрока["процент" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ПроцентСкидкиНаценки;
			КонецЦикла;
			
			ТекФорма.ЭлементыФормы.ТаблицаЦен.СоздатьКолонки();
			//==========================================================­
Показать
kniga888; markw; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. mrChOP93 96 16.01.20 15:46 Сейчас в теме
А реализовать заполнение в форме самого документа не вариант?
4. Intercititude 16.01.20 16:23 Сейчас в теме
(2) Что вы имеете ввиду ?
6. mrChOP93 96 16.01.20 16:27 Сейчас в теме
(4) не внешней обработкой заполнять, а сделать команду заполнения прямо в форме документа "Установка цен номенклатуры"
7. Intercititude 16.01.20 16:32 Сейчас в теме
(6) Ну конфигурация типовая. Зачем бы я тогда делал через обработку вообще ?
9. mrChOP93 96 16.01.20 16:50 Сейчас в теме
(7)
Зачем бы я тогда делал через обработку вообще ?

Риторический вопрос)
Имхо, если не планируется обновлений, то проще допилить форму.
10. Intercititude 16.01.20 16:53 Сейчас в теме
(9) К сожалению не я решаю такие моменты,а начальство. Так что увы )
3. soft_wind 16.01.20 15:57 Сейчас в теме
и еще вопрос, а зачем еще какие-то кнопки добавлять? у вас что динамически формируемая форма?
если кнопки Нужны/НеНужны используйте Видимость/Доступность
5. Intercititude 16.01.20 16:24 Сейчас в теме
(3) Ну вообще это типовой код. Он используется при открытии формы как ни крути. О чём вы ? Как я в обработке управлять видимостью могу ?
8. maxmax83 16.01.20 16:42 Сейчас в теме
(1) Табличное поле же передается в параметре процедуры. ТабличноеПолеОбъекта.Значение - это и будет реквизит формы. Заполняйте его.
11. Intercititude 16.01.20 16:53 Сейчас в теме
(8) Об этом не подумал, сейчас попробую.
12. Intercititude 16.01.20 16:58 Сейчас в теме
(8) Ругается мол поле объекта не обнаружено. Как обратиться к нему подскажите пожалуйста.

Так ?
ТаблицаЦен = ДокументСсылка[ТабличноеПолеОбъекта.Значение];

Просто логика такая, что сперва заполняется тч объекта "Товары" . А потом уже передаётся в тч реквизит формы "ТаблицаЦен".
То есть у "ТаблицаЦен" нету поля "цена" даже к примеру. Как его заполнять ? запутался..
13. kniga888 16.01.20 18:13 Сейчас в теме
А получить объект по ссылке и записать в него? Вариант 2 для УФ - ДанныеФормыВЗначение->Заполнение->ЗначениеВДанныеФормы.
14. Intercititude 16.01.20 21:59 Сейчас в теме
(13) Обычные формы у меня.
В моём случае я и так получаю объект и помещаю данные в тч "Товары" и записываю! ( Но данные появляются только после переоткрытия формы) программно не могу обойти это, в этом и сложность.

И у формыдокумента тч как реквизит формы.
15. ZergKRSK 129 17.01.20 05:43 Сейчас в теме
(14) не надо программно вызывать "Закрыть()" и "Открыть()".
Достаточно посмотреть в процедуре ПриОткрытии() как заполняется реквизит документа ТаблицаЦен.
			ДокументСсылка.Записать();
			
			//==========================================================­
			ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
			
			мСоответствиеТиповЦен = Новый Соответствие;
			Для Каждого СтрокаТипаЦен Из ДокументСсылка.ТипыЦен Цикл
				НомерСоответствияТекущейКолонки = ДокументСсылка.ТипыЦен.Индекс(СтрокаТипаЦен);
				мСоответствиеТиповЦен.Вставить(СтрокаТипаЦен.ТипЦен, НомерСоответствияТекущейКолонки);
			КонецЦикла;
			
			Если ДокументСсылка.ТипыЦен.Количество() = 0 Тогда // ничего делать не надо
				Возврат;
			КонецЕсли;
			
			ТаблицаТоваров = ДокументСсылка.Товары.Выгрузить();
			ТаблицаТоваров.Сортировать("ИндексСтрокиТаблицыЦен, Номенклатура, ХарактеристикаНоменклатуры");
			
			ТекущийИндексСтрокиТаблицыЦен = Неопределено;
			НоваяСтрока = Неопределено;
			Для Каждого СтрокаТаблицыТоваров Из ДокументСсылка.Товары Цикл
				Если ТекущийИндексСтрокиТаблицыЦен <> СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен
				 Или НоваяСтрока.Номенклатура <> СтрокаТаблицыТоваров.Номенклатура
				 Или НоваяСтрока.ХарактеристикаНоменклатуры <> СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры Тогда
					НоваяСтрока = ТекФорма.ТаблицаЦен.Добавить();
					НоваяСтрока.Номенклатура = СтрокаТаблицыТоваров.Номенклатура;
					НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры;
					ТекущийИндексСтрокиТаблицыЦен = СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен;
				КонецЕсли;

				НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТаблицыТоваров.ТипЦен];

				НоваяСтрока["цена" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Цена;
				НоваяСтрока["СпособРасчета" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.СпособРасчетаЦены;
				НоваяСтрока["валюта" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Валюта;
				НоваяСтрока["единица" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ЕдиницаИзмерения;
				НоваяСтрока["процент" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ПроцентСкидкиНаценки;
			КонецЦикла;
			
			ТекФорма.ЭлементыФормы.ТаблицаЦен.СоздатьКолонки();
			//==========================================================­
Показать
kniga888; markw; +2 Ответить
16. Intercititude 17.01.20 09:25 Сейчас в теме
(15) Я посмотрел. Но как я в обработке передам нужную мне информацию для корректного заполнения и открытия ?!
17. ZergKRSK 129 17.01.20 09:45 Сейчас в теме +0.57 $m
(16) я уже весь нужный код дописал в вашу обработку заполнения ТЧ.
18. Intercititude 17.01.20 09:47 Сейчас в теме
(17)А-аа. Сейчас протестю.
19. Intercititude 17.01.20 10:00 Сейчас в теме
(17) Единственное Но. Во всех документах "Установка цен номенклатуры" появились колонки "Артикул" и "Код". Ранее их не было )
20. ZergKRSK 129 17.01.20 10:05 Сейчас в теме
(19) в самом конце моего кода, после создания колонок:
мПоказыватьКод                 = ВосстановитьЗначение("УстановкаЦенНоменклатуры_ПоказыватьКод");
мПоказыватьАртикул             = ВосстановитьЗначение("УстановкаЦенНоменклатуры_ПоказыватьАртикул");
мПоказыватьКод                 = ?(мПоказыватьКод = Неопределено, Ложь, мПоказыватьКод);
мПоказыватьАртикул             = ?(мПоказыватьАртикул = Неопределено, Ложь, мПоказыватьАртикул);
мКолонкиТовары = ТекФорма.ЭлементыФормы.ТаблицаЦен.Колонки;
мКолонкиТовары.Код.Видимость = мПоказыватьКод;
мКолонкиТовары.Артикул.Видимость = мПоказыватьАртикул;
21. Intercititude 17.01.20 10:15 Сейчас в теме
(20) Всё-равно есть ненужные колонки.
22. ZergKRSK 129 17.01.20 10:21 Сейчас в теме
(21) колонки в какой момент появляются?
23. Intercititude 17.01.20 10:23 Сейчас в теме
(22) Сразу после заполнения документа. И если открывать уже ранее созданные документы, то они тоже есть. Редактировать их нельзя конечно. Но в типовом механизме их нету.
24. Intercititude 17.01.20 10:31 Сейчас в теме
(22) Хм и если ещё раз заполнять документ из обработки, то ТЧ не очищается. Этот кусок не работает выходит

  Если ТЧТовары.Количество() > 0 Тогда
        ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
        Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , Метаданные().Представление());
        Если Ответ = КодВозвратаДиалога.Нет Тогда
            Возврат;
        КонецЕсли;
        
        ТЧТовары.Очистить();
    КонецЕсли;
Показать


То есть ТЧтовары очищает. Но тч ТаблицаЦен нет.

P.S. Всё-таки очищает, но данные обновляются только после переоткрытия формы...
25. ZergKRSK 129 17.01.20 10:36 Сейчас в теме
(24) в самом начале моего кода добавить нижнюю строку:
//==========================================================­
ТекФорма = ДокументСсылка.ПолучитьФорму("ФормаДокумента");
ТекФорма.ТаблицаЦен.Очистить(); // ВОТ ЭТУ СТРОКУ
Intercititude; +1 Ответить
26. Intercititude 17.01.20 10:46 Сейчас в теме
(25) А с кодом артикулом так и остановить думаете ?
27. ZergKRSK 129 17.01.20 10:52 Сейчас в теме
(26) если честно не до конца понимаю что у вас там происходит.
Начнем сначала. Создаете вы новый документ установку цен. В шапке выбираете нужный тип цен. Колонки "Код" и "Артикул" появляются или нет?
28. Intercititude 17.01.20 11:07 Сейчас в теме
(27) Ну вообще при создании документа "Код" и "Артикул" уже сразу есть. Так стало после того как я добавил ваш код в обработку для всех документов "Установка цен номенклатуры". Благо это копия базы.
Это появилось после того, как я создал документ, выбрал тип цен. Открыл свою обработку, выбрал Excel ,данные попали в таблицу на моей форме обработки.Потом нажал перенести в документ. Отработал мой код и появились "Код" и "Артикул",в том числе и для всех документов так стало.


В оригинале если создавать документ. То есть только две колонки "№" и "Номенклатура". При выборе цен появляются только Колонки - ТипЦен.СпособРасчета.Валюта.Единица и % скидки.
29. ZergKRSK 129 17.01.20 11:09 Сейчас в теме
(28) ну вот откройте любой готовый документ Установка цен, скройте колонки Код Артикул и закройте документ.
Intercititude; +1 Ответить
30. Intercititude 17.01.20 11:16 Сейчас в теме
(29) Извиняюсь, постоянно сталкиваюсь с этой проблемой и забываю. Спасибо огромное !
Оставьте свое сообщение

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