Заполнение табличной части документа "Установка цен номенклатуры".

1. Intercititude 15.01.20 09:51 Сейчас в теме
Всем доброе время суток ! Пытаюсь заполнить табличную часть документа "Установка цен номенклатуры" из файла excel. Что делаю не так ?
Проблема в том, что на форме объекта табличная часть это реквизит, а не объект. В связи с этим вылазит ошибка, мол "Заполнение ТЧ не произведено!
Поле объекта не обнаружено (ТаблицаЦен)"
Подскажите как решить.

Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт;
	
	ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];
	
	ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбора.Заголовок = "Выберите файл";
	
	Если ДиалогВыбора.Выбрать() Тогда
		ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
	КонецЕсли;	
	
	//подключаемся к эксель
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(ИмяФайла);
		Состояние("Обработка файла Microsoft Excel...");
	Исключение
		Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	Попытка
		//Открываем необходимый лист
		Excel.Sheets(1).Select(); // лист 1, по умолчанию
	Исключение
		//Закрываем Excel
		Excel.ActiveWorkbook.Close();
		Excel = 0;
		Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
		ОтменитьТранзакцию();
		Возврат;
	КонецПопытки;
	
	//Получим количество строк и колонок.
	//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
	Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
	Если Версия = "8" тогда
		ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
		ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
	Иначе
		ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
		ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
	Конецесли;	
	Для а = 2 по ФайлСтрок Цикл  
		Для Каждого Стр из ТабличнаяЧасть Цикл
        	Стр.Номенклатура = СокрЛП(Excel.Cells(а,4).Value);
		КонецЦикла;
	КонецЦикла;

	Excel.DisplayAlerts = 0; 
	Excel.Quit();
	Excel.DisplayAlerts = 1;	
	
	
КонецПроцедуры

Показать
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
44. Intercititude 15.01.20 13:57 Сейчас в теме +0.56 $m
(42) Ну по сути я у своей обработки создам форму в которой будет тч заполняться данными из Excel и потом уже переноситься в документ со всеми этими махинациями с открытием и прочим. Так ?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FetisovAN 15.01.20 10:07 Сейчас в теме
УТ 10? В документе объекте 2 тч, Цены и Товары. а на форме отображается "сводная" таблица.
3. Intercititude 15.01.20 10:09 Сейчас в теме
(2) Да. Я приложил скрин,где возможен выбор только одной таблицы при загрузке внешней обработки.
4. FetisovAN 15.01.20 10:12 Сейчас в теме
ну я это собстувенно и имел ввиду.

стандартная обработка загрузки из эксель не подходит, потому что в документе установка - 2 тч. Во второй тч перечислены типы цен, но если 2-я тч не заполнена ничего корректно не будет работать
5. Intercititude 15.01.20 10:15 Сейчас в теме
(4) Как быть ? Подразумевается,что сперва пользователь выбирает ТипЦен. А затем жмёт заполнить с помощью обработки. И из файла Excel в которым три колонки Код|Наименование|Цена заполняется тч.
7. Intercititude 15.01.20 10:18 Сейчас в теме
8. FetisovAN 15.01.20 10:20 Сейчас в теме
(7) ну тогда напиши сам ... Тип цен у тебя скорее всего 1-ин. Нужно только заполнить таблицу товаров из экселя
Intercititude; +1 Ответить
9. Intercititude 15.01.20 10:21 Сейчас в теме
(8) имеете ввиду через форму, без модуля объекта "инициализировать" ?
10. FetisovAN 15.01.20 10:29 Сейчас в теме
нет, прям конкретно загрузки цен нет готовой.

я бы на твоем месте взял любую загрузку из эксель и переделал её под заполнение табличной части Товары конкретного документа Установка цен, с одним типом цены.
11. Intercititude 15.01.20 11:12 Сейчас в теме
(10) тоже вот не нашёл. В итоге сделал так, но не могу найти где то подвох. Ничего не заполняет. Может вы опытный взглядом подскажете ?
Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено , ТабличноеПоле = Неопределено  ) Экспорт;
	
	ТабличнаяЧасть = Объект.Товары;
	ТабличнаяЧасть.Очистить();
	
	ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбора.Заголовок = "Выберите файл";
	Фильтр ="(*.xls)|*.xlsx";
	ДиалогВыбора.Фильтр = Фильтр;
	
	Если ДиалогВыбора.Выбрать() Тогда
		ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
	КонецЕсли;	
	
	//подключаемся к эксель
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(ИмяФайла);
		Состояние("Обработка файла Microsoft Excel...");
	Исключение
		Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	Попытка
		//Открываем необходимый лист
		Excel.Sheets(1).Select(); // лист 1, по умолчанию
	Исключение
		//Закрываем Excel
		Excel.ActiveWorkbook.Close();
		Excel = 0;
		Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
		ОтменитьТранзакцию();
		Возврат;
	КонецПопытки;
	
	//Получим количество строк и колонок.
	//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
	Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
	Если Версия = "8" тогда
		ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
		ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
	Иначе
		КоличествоСтрок  = Excel.Cells(1,1).SpecialCells(11).Row;
		КоличествоКолонок  = Excel.Cells(1,1).SpecialCells(11).Column;
	Конецесли;
	
	// Проверка корректности заполнения колонок
	// Имена колонок в Excel файле должны совпадать с именами реквизитов табличной части, в которую загружаются данные
	// Переменная МассивКолонок содержит список номеров колонок, которые будут перегружаться
	
	МассивКолонок = Новый ТаблицаЗначений;
	МассивКолонок.Колонки.Добавить("НомерКолонки");
	МассивКолонок.Колонки.Добавить("НазваниеКолонки");
	
	Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл
		ИмяКолонки = Excel.Cells(1, КолонкаОтсчета).Text;
		
		НовСтрока = МассивКолонок.Добавить();
		НовСтрока.НомерКолонки = КолонкаОтсчета;
		НовСтрока.НазваниеКолонки = ИмяКолонки;
		
	КонецЦикла;	
	
	// Если есть колонки для загрузки
	// и есть колонка "Номенклатура, которая является обязательным к заполнению реквизитом
	
	Если МассивКолонок.Количество() <> 0 Тогда
		
		// Заполнение табличной части "Товары"
		// Переменная СтрокаОтсчета - номер строки в Excel, с которой начинается заполнение
		Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
			
			НСтр = ТабличнаяЧасть.Добавить();
			
			Для каждого СтрокаМассив из МассивКолонок Цикл
				
				ОбработкаПрерыванияПользователя();
				ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;			
				// Получение имени колонки
				ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;
				
				// Заполнение строки данными
				Если ИмяКолонки = "Наименование " Тогда
					
					НСтр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекущееЗначение, Истина);
					
				ИначеЕсли ИмяКолонки = "цена" Тогда
					
					НСтр.Цена = ТекущееЗначение;
					
				ИначеЕсли ИмяКолонки = "Код" Тогда					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЦикла;
		
	Иначе
		
		Сообщить("В Excel файле не достаточно данных для заполнения документа!");
		
	КонецЕсли;		
	
	Excel.DisplayAlerts = 0; 
	Excel.Quit();
	Excel.DisplayAlerts = 1;	
	
	
КонецПроцедуры


Показать
12. FetisovAN 15.01.20 11:38 Сейчас в теме
(11) Эта загрузка заполняет только цену и номенклатуру. Нужно добавить заполнения ТипаЦены в каждой строчке тч Товары, и ещё единицу измерения, можно взять из номенклатуры умолчальную.
13. Intercititude 15.01.20 11:40 Сейчас в теме
(12) Как раз с этим и вожусь сейчас. То есть как смогу заполнить ТипаЦены то всё заполнится ?
Вот в этом месте достаточно будет ?НСтр.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию(ТипЦен, Истина);
		
		// Заполнение табличной части "Товары"
		// Переменная СтрокаОтсчета - номер строки в Excel, с которой начинается заполнение
		Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
			
			НСтр = ТабличнаяЧасть.Добавить();
			НСтр.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию(ТипЦен, Истина);
			
			Для каждого СтрокаМассив из МассивКолонок Цикл
Показать
14. FetisovAN 15.01.20 11:42 Сейчас в теме
По идеи да. Код не полный, я так понимаю он вызывается для уже созданного документа. Т.е. в документе должн быть выбран какойто тип цен (в тч ТипыЦен будет создана строкас типом цены).
потом заполняя из эксель тчт товары с указанием этого типа цен, всё должно сложиться
15. Intercititude 15.01.20 11:44 Сейчас в теме
(14) Тестировал на новом пустом созданном документе. Как с указанием типа цен, как и без. Всё равно абсолютно ничего не заполняет...
16. FetisovAN 15.01.20 11:46 Сейчас в теме
(15) в тч товары добавили заполнение реквизита типцен ?
17. Intercititude 15.01.20 11:48 Сейчас в теме
(16) В (13) указал как добавил заполнение. Сомневаюсь в этом.
18. FetisovAN 15.01.20 11:51 Сейчас в теме
(17) ну по идет так ... а в переменной "типцен" что лежит ? посмотри в отладке, тип цен находится, проставляется в новую созданную строку или нет
20. Intercititude 15.01.20 12:04 Сейчас в теме
(18) Думаю, что проблема в том, что при загрузке обработки предлагается выбор только одной ТЧ ТаблицаЦен(создана как реквизит на форме объекта) . А я пытаюсь заполнить ТЧ Товары. Не пойму как решить этот вопрос.
19. Intercititude 15.01.20 11:52 Сейчас в теме
(18) Проверил отладчиком . ТабличнаяЧасть заполняется данными из excel наименованием. типом цен и ценой. Но в итоге в табличную часть документа не выводит..
21. FetisovAN 15.01.20 12:54 Сейчас в теме
а в документе самом выбираешь типцен ? отладчиком посмотри есть строка в табличной части ТипыЦен ? Должна быть 1 строка с твоим типом цены.
alekshihanov; +1 Ответить
22. Intercititude 15.01.20 12:59 Сейчас в теме
(21) Выбираю да. Есть строка ТЧ ТипыЦен с необходимым значением.
23. alekshihanov 15.01.20 12:59 Сейчас в теме
(21) Поддерживаю, при записи все строки табличной части "Товары" с Типом цен, отсутствующим в табличной части "ТипыЦен" игнорируются. Табличную части "ТипыЦен" так же нужно заполнять.
24. Intercititude 15.01.20 13:01 Сейчас в теме
(23) У каждой позиции(номенклатуры) проставляется ТипЦен. в (12) кусок кода который это делает.
26. FetisovAN 15.01.20 13:07 Сейчас в теме
а у тебя эта загрузка внешней обработкой ? выложи посмотреть.

Потому что если тч типыцен заполнгена, и в каждой строке товаров такой же тип цен должно работать ... а единицу измерения заполнил ?
30. Intercititude 15.01.20 13:16 Сейчас в теме
(26) https://my-files.ru/bg7uo5

всё заполнено. Всё-таки склоняюсь к тому, что тч формы выбора не тч объекта.
25. Intercititude 15.01.20 13:06 Сейчас в теме
(21) То есть вся табличная часть "Товары" заполняется те ми же данными, что и в Excel . Правда некоторые позиции номенклатуры пустые,так как видимо нету их в базе. Ума не приложу в чем дело.. почему не заполняется документ "Установка цен номенклатуры".
27. alekshihanov 15.01.20 13:10 Сейчас в теме
еще возможно что считаный из ячейки .Text (если колонка = "Цена") когда к типу числовому приводится превращается в ноль. А нулевые цены игнорируются.
Надо .Value
28. Intercititude 15.01.20 13:12 Сейчас в теме
(27) Как раз таки с ценами проблем нету. Абсолютно все попали.
29. FetisovAN 15.01.20 13:15 Сейчас в теме
(28) добавь все таки заполнения единицы измерения (можно взять базовую из номенклатуры).
32. Intercititude 15.01.20 13:17 Сейчас в теме
(29) Отправил в (31) обработку внешнюю. Ед.измерения так же добавлены туда
33. FetisovAN 15.01.20 13:19 Сейчас в теме
(32) единицу измерения ты добавил плохо, нужно искать с указанием владельца ... это подчиненный справочник.


Записи документа нет !!!
31. Intercititude 15.01.20 13:16 Сейчас в теме
(33) тоже думаю, что дело не в этом.
34. FetisovAN 15.01.20 13:21 Сейчас в теме
(31) а где ты документ записываешь ? тч заполняются, а записи нет.
alekshihanov; +1 Ответить
36. Intercititude 15.01.20 13:23 Сейчас в теме
(34) Не посчитал нужным,так как не создаю программно сам документ. В (37) же механизм описан.
35. alekshihanov 15.01.20 13:23 Сейчас в теме
Нужно переоткрыть форму документа. Реквизит формы ТаблицаЦен заполняется при открытии. ПередЗаписью из него все пишется в табличную часть Товары. Т.е. форму закрыть без сохранения если модифицированность.
И да... этот документ придется записывать. Автоматом он не обновится. Только в ПриОткрытии идет заполнение

Получается ты все табличные части заполнил. Управление вернулось на форму. А форме от этого ни холодно ни жарко - она показывает реквзит ТаблицаЦен который остался прежним.
37. Intercititude 15.01.20 13:25 Сейчас в теме
(35) Это же обработка заполнения табличной части. То есть пользователь создал документ. Выбрал тип цен. Потом только уже в ТЧ выбирает "Заполнить из Excel". Выбирает файл Excel и вуаля.
38. FetisovAN 15.01.20 13:25 Сейчас в теме
40. Intercititude 15.01.20 13:31 Сейчас в теме
42. alekshihanov 15.01.20 13:40 Сейчас в теме
(40) Для пользователей можно написать обработку - интерфейс установки цен. Которая по какой то логике будет и эксель читать, и предварительно результат показывать, и документы "Установка цен номенклатуры" создавать/ изменять. Это если конфигурацию нельзя менять.

FetisovAN, вы согласны с выводами? Может быть есть еще варианты?
43. FetisovAN 15.01.20 13:43 Сейчас в теме
(42) кстати да ... у меня загрузка реализована через отдельную форму, которая по результату оповещает обработку выбора
44. Intercititude 15.01.20 13:57 Сейчас в теме +0.56 $m
(42) Ну по сути я у своей обработки создам форму в которой будет тч заполняться данными из Excel и потом уже переноситься в документ со всеми этими махинациями с открытием и прочим. Так ?
46. FetisovAN 15.01.20 13:58 Сейчас в теме
39. Intercititude 15.01.20 13:29 Сейчас в теме
41. alekshihanov 15.01.20 13:37 Сейчас в теме
(39)Это я по названию процедуры и переменным догадался. Вспомнил что делал так же обработку заполнения табличной части для этого документа. Только там не эксель, но не суть. Проблема в том что мы в этой процедуре на сервере можем менять объект, можем менять его табличные части, но форму и её реквизиты мы поменять не можем.
Поэтому если мы изменили табличную часть "Товары" и управление вернулось на форуму, в случае если это какой то обычный документ (например Заказ) где на форме отображается табличная часть "Товары" то наши изменения мы сразу и увидим.
А с этим документом так не получится. На форме отображается таблица, являющаяся реквизитом формы. Этот реквизит был заполнен при открытии формы. При сохранении, опять же в событии формы из этого реквизита будет перезаполнена табличная часть Товары.

В итоге некрасивый неудобный вариант - в обработке табличной части объект записать. По возврату управления на форму - форму переоткрыть. Меня в свое время устроило потому что делал для разового использования и для себя. Для пользователя этот подход конечно не подойдет.
Intercititude; +1 Ответить
47. Intercititude 16.01.20 10:50 Сейчас в теме
(41) А можете подсказать, как программно сделать в обработке
По возврату управления на форму - форму переоткрыть
?

Других вариантов решения для пользователя не нашёл. Может Вы знаете, что можно сделать в этом случае.
45. FetisovAN 15.01.20 13:58 Сейчас в теме
(39) код заполнения самой табличной части - рабочий. Добавил в конец обработки Объект.Записать() и открыл и запустил её просто как внешнюю - т.ч. заполняется. А вот работа в режиме "обработка заполнения табличной части" - что-то не так ... Если честно этим почти не пользуюсь, не могу подсказать что не так.
Оставьте свое сообщение

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