Передать ТЗ с сервера на клиента

1. parker_j 22.01.19 21:02 Сейчас в теме
Ребят, Получил на Сервере ТЗ список листов в эксель файле
&НаСервере
Процедура ОткрытьНаСервере(Наименование)
	

	 Ексель = Новый COMОбъект("Excel.Application");
	 НомерЛиста = 2;
     файл = Ексель.WorkBooks.Open(ПолеВвода);
	 Лист = файл .WorkSheets(НомерЛиста);
	 
	 СписокЛистов = Новый СписокЗначений;
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл
     СписокЛистов.Добавить(ТекущийЛист.Name);
КонецЦикла;
Показать


Создал поле выбора листа на форме

&НаКлиенте
Процедура ВыберитеНомерЛистаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

Что надо написать, чтобы в этом поле отобразился полученный список листов?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 22.01.19 21:11 Сейчас в теме
(1)
СтандартнаяОбработка = Ложь;
ДанныеВыбора = СписокЛистов;
3. parker_j 22.01.19 21:22 Сейчас в теме
(2) Не, так не катит. Переменная не найдена(списокЛистов)
4. dhurricane 22.01.19 21:34 Сейчас в теме
(3) Вы ведь на сервере формируете этот список. Его и используйте. Можно вовсе не использовать событие "НачалоВыбора", а загрузить полученный список в свойство "СписокВыбора" поля ввода имени листа, а также установить флаг "РежимВыбораИзСписка" (как-то так).
5. parker_j 22.01.19 22:10 Сейчас в теме
(4)ЧЕ то и так и сяк...В списокВыбора нашел как добавить вручную, а можно ли загрузить туда значения из переменной?
6. coollerinc 195 22.01.19 22:32 Сейчас в теме
&НаСервере 
Процедура ОткрытьНаСервере(Наименование) 


Ексель = Новый COMОбъект("Excel.Application"); 
НомерЛиста = 2; 
файл = Ексель.WorkBooks.Open(ПолеВвода); 
Лист = файл .WorkSheets(НомерЛиста); 

СписокЛистов = Элементы.НомерЛиста.СписокВыбора; 
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл 
СписокЛистов.Добавить(ТекущийЛист.Name); 
КонецЦикла;
Показать
7. parker_j 22.01.19 22:38 Сейчас в теме
(6)
&НаСервере
Процедура ОткрытьНаСервере(Наименование)
	
	 //C:\Users\бух\Desktop\клапана.xlsx
	 
	 Ексель = Новый COMОбъект("Excel.Application");
	 НомерЛиста = 2;
     файл = Ексель.WorkBooks.Open(ПолеВвода);
	 Лист = файл .WorkSheets(НомерЛиста);
	 
	 СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора;
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл
     СписокЛистов.Добавить(ТекущийЛист.Name);
КонецЦикла;
Показать

Значения заполняются...Но когда открываю обработку списка листов нет
9. coollerinc 195 22.01.19 22:43 Сейчас в теме
Создайте на форме обработчик события ПриСозданииНаСервере, в него можно написать так, если там всегда есть имя файла, также этот код можно засунуть в обработчик при изменении имени файла
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Если значениеЗаполнено(Наименование) Тогда
                ОткрытьНаСервере(Наименование) 
     КонецЕсли;
	
КонецПроцедуры
8. parker_j 22.01.19 22:41 Сейчас в теме
(6)Сори, что то изменилось =) Спасибо...буду дальше косяки исправлять. при каждом запуске список увеличивается на кол-во листов
10. coollerinc 195 22.01.19 22:45 Сейчас в теме
СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора;
СписокВыбора.Очистить();
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл
СписокЛистов.Добавить(ТекущийЛист.Name);
11. parker_j 22.01.19 22:52 Сейчас в теме
(10) Спасибо! Вот только СписокВыбора переменная не определена. и еще вопрос...
&НаСервере
Процедура ОткрытьНаСервере(Наименование)
	
	 
	 Ексель = Новый COMОбъект("Excel.Application");
	 НомерЛиста = 2;
     файл = Ексель.WorkBooks.Open(ПолеВвода);
	 Лист = файл .WorkSheets(НомерЛиста);
	 
	 СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора;
	 //СписокВыбора.Очистить();
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл
     СписокЛистов.Добавить(ТекущийЛист.Name);
КонецЦикла;
Показать


При открытии обработки список пуст, делаю разовый запуск, список появляется, выбираю другой лист, отличный от "номерЛиста = 2" загружается все равно второй лист(логично конечно), но как переписать код, чтоб список до запуска появился и не отчищался при следующем запуске обработки
12. coollerinc 195 22.01.19 23:05 Сейчас в теме
СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора;
СписокЛистов.Очистить();

Тут весь код выкладывать надо. Но похоже что то с логикой не то. В какой момент заполнится имя файла, что бы загрузить список листов?
13. parker_j 22.01.19 23:08 Сейчас в теме
(12)
&НаСервере
Процедура ОткрытьНаСервере(Наименование)
	
	 //C:\Users\бух\Desktop\клапана.xlsx
	 
	 Ексель = Новый COMОбъект("Excel.Application");
	 НомерЛиста = 2;
     файл = Ексель.WorkBooks.Open(ПолеВвода);
	 Лист = файл .WorkSheets(НомерЛиста);
	 
	 СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора;
	 //СписокВыбора.Очистить();
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл
     СписокЛистов.Добавить(ТекущийЛист.Name);
КонецЦикла;

     
	 ДокДляЗаписи = РежимЗагрузки.ПолучитьОбъект();

	 
	 //ОСНОВНЫЕ РЕКВИЗИТЫ
	 //док1 = Справочники.Номенклатура.НайтиПоНаименованию("Диван Монте-Карло");
	 //док = Документы.КоммерческоеПредложениеКлиенту.НайтиПоНомеру("ПР00-000001", Дата("20190101000000"));
	 Материал1 = сокрЛП(Лист.Cells(19, 2).text);
	 Себестоимость2 = сокрЛП(Лист.Cells(20, 2).text);
	 Высота1 = сокрЛП(Лист.Cells(2, 2).text);
	 Ширина2 = сокрЛП(Лист.Cells(2, 3).text);
	 Количество3 = сокрЛП(Лист.Cells(2, 4).text);
	 ЦенаМатериала4 = сокрЛП(Лист.Cells(2, 5).text);
	 ЦенаПродажи5 = сокрЛП(Лист.Cells(2, 6).text);
	 РозничнаяЦена6 = сокрЛП(Лист.Cells(2, 7).text);
	 Цена7 = сокрЛП(Лист.Cells(2, 8).text);
	 Сумма8 = сокрЛП(Лист.Cells(2, 9).text);
	 Скидка9 = сокрЛП(Лист.Cells(2, 10).text);
	 
	 ДокДляЗаписи.Материал = Материал1;
	 ДокДляЗаписи.Себестоимость = Себестоимость2;
	 ДокДляЗаписи.Высота = Высота1;
	 ДокДляЗаписи.Ширина = Ширина2;
	 ДокДляЗаписи.Количество = Количество3;
	 ДокДляЗаписи.ЦенаМатериала = ЦенаМатериала4;
	 ДокДляЗаписи.ЦенаПродажи = ЦенаПродажи5;
	 ДокДляЗаписи.РозничнаяЦена = РозничнаяЦена6;
	 ДокДляЗаписи.Цена = Цена7;
	 ДокДляЗаписи.Сумма = Сумма8;
	 ДокДляЗаписи.Скидка = Скидка9;
	 
	 //ТЧ
		 
	 ДокДляЗаписи.ТабличнаяЧасть1.Очистить();
	 
	 //ПЕРЕМЕННЫЕ//////////////////////////////////////////
	 
	 НомерСтр = 7;
	 НомерСтроки = 7;
	 НомерКолонкиДлина = 11;
	 НомерКолонкиКоличество = 11;
	 НомерКолонки = 11;
	 
	 
															 
	 Пока ЗначениеЗаполнено(Лист.Cells(НомерСтроки, 6).text) цикл	  
	 ТекущаяНоменклатура = сокрЛП(Лист.Cells(НомерСтроки, 6).text);	 
	 КолонкаДляОтбора = (Лист.Cells(1, НомерКолонки).text);	 
	 КолонкаДляОтбораДлина = (Лист.Cells(1, НомерКолонки).text);	 
	 КолонкаДляОтбораКоличество = (Лист.Cells(1, НомерКолонки).text);
	 
	 НайденнаяСтрока = СтрНайти(КолонкаДляОтбора, ТекущаяНоменклатура);	 
	 Значение2 = "мм";
	 НайденнаяСтрока2 = СтрНайти(КолонкаДляОтбора, Значение2);	 
	 Значение3 = "шт";
	 НайденнаяСтрока3 = СтрНайти(КолонкаДляОтбора, Значение3);	 
	 Значение4 = "компл";
	 НайденнаяСтрока4 = СтрНайти(КолонкаДляОтбора, Значение4);	 
	 Значение5 = "Заготовка";
	 НайденнаяСтрока5 = СтрНайти(КолонкаДляОтбораКоличество, Значение5);
	 
	 Если НайденнаяСтрока >= 1 И НайденнаяСтрока2 >= 1 Тогда
		  СтрокаТЧ = ДокДляЗаписи.ТабличнаяЧасть1.Добавить();
		  СтрокаТЧ.Длина = сокрЛП(Лист.Cells(2, НомерКолонки).text);
		  СтрокаТЧ.Номенклатура = ТекущаяНоменклатура;
		  СтрокаТЧ.Цена = сокрЛП(Лист.Cells(НомерСтроки, 10).text);
		  НомерСтроки = НомерСтроки + 1;
		  
			  ИначеЕсли НайденнаяСтрока = 0 Тогда
		  НомерКолонки = НомерКолонки + 1;
		  
	 		  
	  ИначеЕсли НайденнаяСтрока2 = 0 И НайденнаяСтрока3 >= 1 ИЛИ НайденнаяСтрока4 >=1 Тогда
		       СтрокаТЧ = ДокДляЗаписи.ТабличнаяЧасть1.Добавить();
			   СтрокаТЧ.Номенклатура = ТекущаяНоменклатура;
		       СтрокаТЧ.Количество = сокрЛП(Лист.Cells(2, НомерКолонки).text);
			   СтрокаТЧ.Цена = сокрЛП(Лист.Cells(НомерСтроки, 10).text);
		       НомерСтроки = НомерСтроки + 1;
			   НомерКолонки = 11;
		   КонецЕсли;
		   
		   Если НайденнаяСтрока >= 1 И НайденнаяСтрока2 >= 1 И НайденнаяСтрока5 >= 1 Тогда
			    НомерКолонки = НомерКолонки + 1;
		        СтрокаТЧ.Количество = сокрЛП(Лист.Cells(2, НомерКолонки).text);
				НомерКолонки = 11;  //восстанавливаю счетчик
			КонецЕсли;
			
			Если КолонкаДляОтбора = "" Тогда
				Сообщить("Проверьте правила заполнения шаблона Эксель, номенклатура не найдена в строке поиска");
		  Прервать;
		  

            КонецЕсли;
			
		   КонецЦикла;
		   
		  
		   

		   //СОЗДАНИЕ НОМЕНКЛАТУРЫ
		   НоменклатураДляЗаписиВРегистрСведений = сокрЛП(Лист.Cells(6, 6).text); 
           НомерСтрокиНоменклатура = 6;		
		   Запрос = Новый Запрос;
		   Запрос.Текст = "ВЫБРАТЬ
		                  |	Номенклатура.Наименование КАК Наименование
		                  |ИЗ
		                  |	Справочник.Номенклатура КАК Номенклатура
		                  |ГДЕ
		                  |	Номенклатура.Наименование = &Наименование";
		  		  
		   Пока ЗначениеЗаполнено(Лист.Cells(НомерСтрокиНоменклатура, 6).text) Цикл
		    ЭлементНоменклатуры = сокрЛП(Лист.Cells(НомерСтрокиНоменклатура, 6).text);
		    Запрос.УстановитьПараметр("Наименование", ЭлементНоменклатуры);
		    РезультатЗапроса = Запрос.Выполнить();
		    
            // ПРОВЕРКА УНИКАЛЬНОСТИ НОМЕНКЛАТУРЫ
			
		    Если РезультатЗапроса.Пустой() Тогда
		    НовыйЭлементНоменклатуры = Справочники.Номенклатура.СоздатьЭлемент();
		    НовыйЭлементНоменклатуры.Наименование = ЭлементНоменклатуры;
			НовыйЭлементНоменклатуры.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
		    НовыйЭлементНоменклатуры.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Клапана №2");
		    НовыйЭлементНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;

		    НовыйЭлементНоменклатуры.Записать();

		    	 НомерСтрокиНоменклатура = НомерСтрокиНоменклатура + 1;
		     Иначе
		      НомерСтрокиНоменклатура = НомерСтрокиНоменклатура + 1;
		    
		  КонецЕсли;
		  
	  КонецЦикла;
	  
	  //ЗАПИСЬ НАИМЕНОВАНИЯ НОМЕНКЛАТУРЫ В РЕКВИЗИТ ВЫХОДНОЕИЗДЕЛИЕ
	  
	  ДокДляЗаписи.ВыходноеИзделие = Справочники.Номенклатура.НайтиПоНаименованию(НоменклатураДляЗаписиВРегистрСведений);
	  
	  //ЗАПИСЬ ЦЕНЫ В РЕГИСТР СВЕДЕНИЙ
	  
	  //ЗаписьЦеныВРегистр = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
	  //ЗаписьЦеныВРегистр.Отбор.Регистратор.Установить(ДокДляЗаписи);
	  //ЗаписьЦеныВРегистр.Прочитать();
	  // 
	  //НоваяЗаписьЗаписьЦеныВРегистр = ЗаписьЦеныВРегистр.Добавить();
	  //НоваяЗаписьЗаписьЦеныВРегистр.Регистратор = Документы.Клапана.НайтиПоНомеру(ДокДляЗаписи.Номер);
	  //НоваяЗаписьЗаписьЦеныВРегистр.Период = ДокДляЗаписи.Дата;
	  //НоваяЗаписьЗаписьЦеныВРегистр.Номенклатура = ДокДляЗаписи.ВыходноеИзделие; 
	  //НоваяЗаписьЗаписьЦеныВРегистр.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Основной");
	  //НоваяЗаписьЗаписьЦеныВРегистр.Цена = ДокДляЗаписи.Цена;
	  //НоваяЗаписьЗаписьЦеныВРегистр.Валюта = Справочники.Валюты.НайтиПоНаименованию("руб.");
	 
////	  ЗаписьЦеныВРегистр.Записать(Истина);
		
		//СОЗДАНИЕ ВАРИАНТА КОМПЛЕКТАЦИИ НОМЕНКЛАТУРЫ
		 
	       НомерКолонкиНовый = 11;
	       НомерСтрокиНовый = 7;
		   
		   ИщуНоменклатуру = сокрЛП(Лист.Cells(6, 6).text); 
	       КомплектацияСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ИщуНоменклатуру);
		   
		   Если НЕ КомплектацияСсылка = Справочники.ВариантыКомплектацииНоменклатуры.ПустаяСсылка() Тогда
			   СозданиеВариантаКомплектации = КомплектацияСсылка.ПолучитьОбъект();
		   иначе
			   СозданиеВариантаКомплектации = КомплектацияСсылка.ПолучитьСсылку();
			   СозданиеВариантаКомплектации = КомплектацияСсылка.ПолучитьОбъект();
		   КонецЕсли;
		   
		   ЗаписатьНоменклатуру = сокрЛП(Лист.Cells(6, 6).text);
	       НовыйЭлементНоменклатуры2 = Справочники.ВариантыКомплектацииНоменклатуры.СоздатьЭлемент();
		   
		   НовыйЭлементНоменклатуры2.Владелец = справочники.Номенклатура.НайтиПоНаименованию(СозданиеВариантаКомплектации.Наименование);
	       НовыйЭлементНоменклатуры2.Наименование = сокрЛП(Лист.Cells(6, 6).text);
		   НовыйЭлементНоменклатуры2.Количество = 1;
		   НовыйЭлементНоменклатуры2.КоличествоУпаковок = 1;
		   
		   
		   //ТЧ ВАРИАНТА КОМПЛЕКТАЦИИ
		   
		   Пока ЗначениеЗаполнено(Лист.Cells(НомерСтрокиНовый, 6).text) цикл
			   
			   АктуальнаяНоменклатура = сокрЛП(Лист.Cells(НомерСтрокиНовый, 6).text);
			   КолонкаДляОтбораНоменклатуры = (Лист.Cells(1, НомерКолонкиНовый).text);
			   НайденнаяСтрокаНоменклатура = СтрНайти(КолонкаДляОтбораНоменклатуры, АктуальнаяНоменклатура);
			   Значение6 = "Заготовка";
			   НайденнаяСтрока5Номенклатура = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение6);
			   ИщемКоличествоШтуки = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение3);
			   ИщемКоличествоКомплекты = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение4);
			   ИщемДлинуММ = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение2);
			   ЗначениеМатериала = "материала";
			   ИщемЗначениеМатериала = СтрНайти(КолонкаДляОтбораНоменклатуры, ЗначениеМатериала);
			   
			   Если НайденнаяСтрокаНоменклатура >= 1 И НайденнаяСтрока5Номенклатура >= 1 Тогда
				   
				   ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить();
				   ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура);
				   
				   НомерСтрокиНовый = НомерСтрокиНовый + 1;
				   
				   			   ИначеЕсли НайденнаяСтрокаНоменклатура = 0 Тогда
				   НомерКолонкиНовый = НомерКолонкиНовый + 1;
				   
			   ИначеЕсли НайденнаяСтрокаНоменклатура >= 1 И ИщемДлинуММ >= 1 И НайденнаяСтрока5Номенклатура = 0 Тогда
				   
				    ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить();
				   ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура);
				   ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("мм");
				   ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text);
				   ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество; 
				   НомерСтрокиНовый = НомерСтрокиНовый + 1;
				   НомерКолонкиНовый = 11;
			   КонецЕсли;
			   
			   Если НайденнаяСтрокаНоменклатура >= 1 И ИщемКоличествоШтуки >= 1 Тогда
				   ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить();
				   ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура);
				   ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(796);
			       ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text);
				   ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество;
				   НомерСтрокиНовый = НомерСтрокиНовый + 1;
			       НомерКолонкиНовый = 11;
			   ИначеЕсли НайденнаяСтрокаНоменклатура >= 1 И ИщемКоличествоКомплекты >= 1 Тогда
				   ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить();
				   ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура);
				   ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(796);
			       ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text);
				   ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество;
				   НомерСтрокиНовый = НомерСтрокиНовый + 1;
			       НомерКолонкиНовый = 11;
			   КонецЕсли;
			   
			   Если НайденнаяСтрокаНоменклатура >= 1 И ИщемДлинуММ >= 1 И НайденнаяСтрока5Номенклатура >= 1 Тогда  
			     НомерКолонкиНовый = НомерКолонкиНовый + 1;
			       ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(796);
			       ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text);
			       ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество;
				  
			       НомерКолонкиНовый = 11;
			   КонецЕсли;
			   
			   
			   
			   Если КолонкаДляОтбораНоменклатуры = "" Тогда
				   Сообщить("Проверьте правила заполнения шаблона Эксель, номенклатура не найдена в строке поиска");
				   Прервать;
		  
		  КонецЕсли;
			
						   
			//Прервать;   			   
		   КонецЦикла;
НовыйЭлементНоменклатуры2.Записать();

	 Ексель.Quit();
	 Ексель = 0;
	 ДокДляЗаписи.Записать(РежимЗаписиДокумента.Запись);
	 
	 
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьНаКлиенте(Команда, Наименование)

	ОткрытьНаСервере(Наименование);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолеВводаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выбор файла";
	Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра = 0;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.ПроверятьСуществованиеФайла = Истина;
	Диалог.МножественныйВыбор = Ложь; 
	Диалог.ПолноеИмяФайла = ПолеВвода;
	
	Если Диалог.Выбрать() Тогда
		ПолеВвода = Диалог.ПолноеИмяФайла;
	КонецЕсли;
КонецПроцедуры
Показать
Прикрепленные файлы:
клапана.xlsx
14. coollerinc 195 22.01.19 23:33 Сейчас в теме
Как то так, нужно разделить заполнение списка и создание документа
&НаСервере 
Процедура ОткрытьНаСервере(Наименование) 
	
	Ексель = Новый COMОбъект("Excel.Application"); 
	НомерЛиста = ВыберитеНомерЛиста; 
	файл = Ексель.WorkBooks.Open(ПолеВвода); 
	Лист = файл .WorkSheets(НомерЛиста); 
	
	//СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора; 
	////СписокВыбора.Очистить(); 
	//Для Каждого ТекущийЛист Из файл .WorkSheets Цикл 
	//	СписокЛистов.Добавить(ТекущийЛист.Name); 
	//КонецЦикла; 

	
	ДокДляЗаписи = РежимЗагрузки.ПолучитьОбъект(); 
	
	
	//ОСНОВНЫЕ РЕКВИЗИТЫ 
	//док1 = Справочники.Номенклатура.НайтиПоНаименованию("Диван Монте-Карло"); 
	//док = Документы.КоммерческоеПредложениеКлиенту.НайтиПоНомеру("ПР00-000001", Дата("20190101000000")); 
	Материал1 = сокрЛП(Лист.Cells(19, 2).text); 
	Себестоимость2 = сокрЛП(Лист.Cells(20, 2).text); 
	Высота1 = сокрЛП(Лист.Cells(2, 2).text); 
	Ширина2 = сокрЛП(Лист.Cells(2, 3).text); 
	Количество3 = сокрЛП(Лист.Cells(2, 4).text); 
	ЦенаМатериала4 = сокрЛП(Лист.Cells(2, 5).text); 
	ЦенаПродажи5 = сокрЛП(Лист.Cells(2, 6).text); 
	РозничнаяЦена6 = сокрЛП(Лист.Cells(2, 7).text); 
	Цена7 = сокрЛП(Лист.Cells(2, 8).text); 
	Сумма8 = сокрЛП(Лист.Cells(2, 9).text); 
	Скидка9 = сокрЛП(Лист.Cells(2, 10).text); 
	
	ДокДляЗаписи.Материал = Материал1; 
	ДокДляЗаписи.Себестоимость = Себестоимость2; 
	ДокДляЗаписи.Высота = Высота1; 
	ДокДляЗаписи.Ширина = Ширина2; 
	ДокДляЗаписи.Количество = Количество3; 
	ДокДляЗаписи.ЦенаМатериала = ЦенаМатериала4; 
	ДокДляЗаписи.ЦенаПродажи = ЦенаПродажи5; 
	ДокДляЗаписи.РозничнаяЦена = РозничнаяЦена6; 
	ДокДляЗаписи.Цена = Цена7; 
	ДокДляЗаписи.Сумма = Сумма8; 
	ДокДляЗаписи.Скидка = Скидка9; 
	
	//ТЧ 
	
	ДокДляЗаписи.ТабличнаяЧасть1.Очистить(); 
	
	//ПЕРЕМЕННЫЕ////////////////////////////////////////// 
	
	НомерСтр = 7; 
	НомерСтроки = 7; 
	НомерКолонкиДлина = 11; 
	НомерКолонкиКоличество = 11; 
	НомерКолонки = 11; 
	
	
	
	Пока ЗначениеЗаполнено(Лист.Cells(НомерСтроки, 6).text) цикл	
		ТекущаяНоменклатура = сокрЛП(Лист.Cells(НомерСтроки, 6).text);	
		КолонкаДляОтбора = (Лист.Cells(1, НомерКолонки).text);	
		КолонкаДляОтбораДлина = (Лист.Cells(1, НомерКолонки).text);	
		КолонкаДляОтбораКоличество = (Лист.Cells(1, НомерКолонки).text); 
		
		НайденнаяСтрока = СтрНайти(КолонкаДляОтбора, ТекущаяНоменклатура);	
		Значение2 = "мм"; 
		НайденнаяСтрока2 = СтрНайти(КолонкаДляОтбора, Значение2);	
		Значение3 = "шт"; 
		НайденнаяСтрока3 = СтрНайти(КолонкаДляОтбора, Значение3);	
		Значение4 = "компл"; 
		НайденнаяСтрока4 = СтрНайти(КолонкаДляОтбора, Значение4);	
		Значение5 = "Заготовка"; 
		НайденнаяСтрока5 = СтрНайти(КолонкаДляОтбораКоличество, Значение5); 
		
		Если НайденнаяСтрока >= 1 И НайденнаяСтрока2 >= 1 Тогда 
			СтрокаТЧ = ДокДляЗаписи.ТабличнаяЧасть1.Добавить(); 
			СтрокаТЧ.Длина = сокрЛП(Лист.Cells(2, НомерКолонки).text); 
			СтрокаТЧ.Номенклатура = ТекущаяНоменклатура; 
			СтрокаТЧ.Цена = сокрЛП(Лист.Cells(НомерСтроки, 10).text); 
			НомерСтроки = НомерСтроки + 1; 
			
		ИначеЕсли НайденнаяСтрока = 0 Тогда 
			НомерКолонки = НомерКолонки + 1; 
			
			
		ИначеЕсли НайденнаяСтрока2 = 0 И НайденнаяСтрока3 >= 1 ИЛИ НайденнаяСтрока4 >=1 Тогда 
			СтрокаТЧ = ДокДляЗаписи.ТабличнаяЧасть1.Добавить(); 
			СтрокаТЧ.Номенклатура = ТекущаяНоменклатура; 
			СтрокаТЧ.Количество = сокрЛП(Лист.Cells(2, НомерКолонки).text); 
			СтрокаТЧ.Цена = сокрЛП(Лист.Cells(НомерСтроки, 10).text); 
			НомерСтроки = НомерСтроки + 1; 
			НомерКолонки = 11; 
		КонецЕсли; 
		
		Если НайденнаяСтрока >= 1 И НайденнаяСтрока2 >= 1 И НайденнаяСтрока5 >= 1 Тогда 
			НомерКолонки = НомерКолонки + 1; 
			СтрокаТЧ.Количество = сокрЛП(Лист.Cells(2, НомерКолонки).text); 
			НомерКолонки = 11; //восстанавливаю счетчик 
		КонецЕсли; 
		
		Если КолонкаДляОтбора = "" Тогда 
			Сообщить("Проверьте правила заполнения шаблона Эксель, номенклатура не найдена в строке поиска"); 
			Прервать; 
			
			
		КонецЕсли; 
		
	КонецЦикла; 
	
	
	
	
	//СОЗДАНИЕ НОМЕНКЛАТУРЫ 
	НоменклатураДляЗаписиВРегистрСведений = сокрЛП(Лист.Cells(6, 6).text); 
	НомерСтрокиНоменклатура = 6;	
	Запрос = Новый Запрос; 
	Запрос.Текст = "ВЫБРАТЬ 
	|	Номенклатура.Наименование КАК Наименование 
	|ИЗ 
	|	Справочник.Номенклатура КАК Номенклатура 
	|ГДЕ 
	|	Номенклатура.Наименование = &Наименование"; 
	
	Пока ЗначениеЗаполнено(Лист.Cells(НомерСтрокиНоменклатура, 6).text) Цикл 
		ЭлементНоменклатуры = сокрЛП(Лист.Cells(НомерСтрокиНоменклатура, 6).text); 
		Запрос.УстановитьПараметр("Наименование", ЭлементНоменклатуры); 
		РезультатЗапроса = Запрос.Выполнить(); 
		
		// ПРОВЕРКА УНИКАЛЬНОСТИ НОМЕНКЛАТУРЫ 
		
		Если РезультатЗапроса.Пустой() Тогда 
			НовыйЭлементНоменклатуры = Справочники.Номенклатура.СоздатьЭлемент(); 
			НовыйЭлементНоменклатуры.Наименование = ЭлементНоменклатуры; 
			НовыйЭлементНоменклатуры.СтавкаНДС = Перечисления.СтавкиНДС.НДС20; 
			НовыйЭлементНоменклатуры.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Клапана №2"); 
			НовыйЭлементНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар; 
			
			НовыйЭлементНоменклатуры.Записать(); 
			
			НомерСтрокиНоменклатура = НомерСтрокиНоменклатура + 1; 
		Иначе 
			НомерСтрокиНоменклатура = НомерСтрокиНоменклатура + 1; 
			
		КонецЕсли; 
		
	КонецЦикла; 
	
	//ЗАПИСЬ НАИМЕНОВАНИЯ НОМЕНКЛАТУРЫ В РЕКВИЗИТ ВЫХОДНОЕИЗДЕЛИЕ 
	
	ДокДляЗаписи.ВыходноеИзделие = Справочники.Номенклатура.НайтиПоНаименованию(НоменклатураДляЗаписиВРегистрСведений); 
	
	//ЗАПИСЬ ЦЕНЫ В РЕГИСТР СВЕДЕНИЙ 
	
	//ЗаписьЦеныВРегистр = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); 
	//ЗаписьЦеныВРегистр.Отбор.Регистратор.Установить(ДокДляЗаписи); 
	//ЗаписьЦеныВРегистр.Прочитать(); 
	// 
	//НоваяЗаписьЗаписьЦеныВРегистр = ЗаписьЦеныВРегистр.Добавить(); 
	//НоваяЗаписьЗаписьЦеныВРегистр.Регистратор = Документы.Клапана.НайтиПоНомеру(ДокДляЗаписи.Номер); 
	//НоваяЗаписьЗаписьЦеныВРегистр.Период = ДокДляЗаписи.Дата; 
	//НоваяЗаписьЗаписьЦеныВРегистр.Номенклатура = ДокДляЗаписи.ВыходноеИзделие; 
	//НоваяЗаписьЗаписьЦеныВРегистр.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Основной"); 
	//НоваяЗаписьЗаписьЦеныВРегистр.Цена = ДокДляЗаписи.Цена; 
	//НоваяЗаписьЗаписьЦеныВРегистр.Валюта = Справочники.Валюты.НайтиПоНаименованию("руб."); 
	
	////	ЗаписьЦеныВРегистр.Записать(Истина); 
	
	//СОЗДАНИЕ ВАРИАНТА КОМПЛЕКТАЦИИ НОМЕНКЛАТУРЫ 
	
	НомерКолонкиНовый = 11; 
	НомерСтрокиНовый = 7; 
	
	ИщуНоменклатуру = сокрЛП(Лист.Cells(6, 6).text); 
	КомплектацияСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ИщуНоменклатуру); 
	
	Если НЕ КомплектацияСсылка = Справочники.ВариантыКомплектацииНоменклатуры.ПустаяСсылка() Тогда 
		СозданиеВариантаКомплектации = КомплектацияСсылка.ПолучитьОбъект(); 
	иначе 
		СозданиеВариантаКомплектации = КомплектацияСсылка.ПолучитьСсылку(); 
		СозданиеВариантаКомплектации = КомплектацияСсылка.ПолучитьОбъект(); 
	КонецЕсли; 
	
	ЗаписатьНоменклатуру = сокрЛП(Лист.Cells(6, 6).text); 
	НовыйЭлементНоменклатуры2 = Справочники.ВариантыКомплектацииНоменклатуры.СоздатьЭлемент(); 
	
	НовыйЭлементНоменклатуры2.Владелец = справочники.Номенклатура.НайтиПоНаименованию(СозданиеВариантаКомплектации.Наименование); 
	НовыйЭлементНоменклатуры2.Наименование = сокрЛП(Лист.Cells(6, 6).text); 
	НовыйЭлементНоменклатуры2.Количество = 1; 
	НовыйЭлементНоменклатуры2.КоличествоУпаковок = 1; 
	
	
	//ТЧ ВАРИАНТА КОМПЛЕКТАЦИИ 
	
	Пока ЗначениеЗаполнено(Лист.Cells(НомерСтрокиНовый, 6).text) цикл 
		
		АктуальнаяНоменклатура = сокрЛП(Лист.Cells(НомерСтрокиНовый, 6).text); 
		КолонкаДляОтбораНоменклатуры = (Лист.Cells(1, НомерКолонкиНовый).text); 
		НайденнаяСтрокаНоменклатура = СтрНайти(КолонкаДляОтбораНоменклатуры, АктуальнаяНоменклатура); 
		Значение6 = "Заготовка"; 
		НайденнаяСтрока5Номенклатура = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение6); 
		ИщемКоличествоШтуки = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение3); 
		ИщемКоличествоКомплекты = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение4); 
		ИщемДлинуММ = СтрНайти(КолонкаДляОтбораНоменклатуры, Значение2); 
		ЗначениеМатериала = "материала"; 
		ИщемЗначениеМатериала = СтрНайти(КолонкаДляОтбораНоменклатуры, ЗначениеМатериала); 
		
		Если НайденнаяСтрокаНоменклатура >= 1 И НайденнаяСтрока5Номенклатура >= 1 Тогда 
			
			ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить(); 
			ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура); 
			
			НомерСтрокиНовый = НомерСтрокиНовый + 1; 
			
		ИначеЕсли НайденнаяСтрокаНоменклатура = 0 Тогда 
			НомерКолонкиНовый = НомерКолонкиНовый + 1; 
			
		ИначеЕсли НайденнаяСтрокаНоменклатура >= 1 И ИщемДлинуММ >= 1 И НайденнаяСтрока5Номенклатура = 0 Тогда 
			
			ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить(); 
			ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура); 
			ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("мм"); 
			ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text); 
			ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество; 
			НомерСтрокиНовый = НомерСтрокиНовый + 1; 
			НомерКолонкиНовый = 11; 
		КонецЕсли; 
		
		Если НайденнаяСтрокаНоменклатура >= 1 И ИщемКоличествоШтуки >= 1 Тогда 
			ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить(); 
			ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура); 
			ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(796); 
			ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text); 
			ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество; 
			НомерСтрокиНовый = НомерСтрокиНовый + 1; 
			НомерКолонкиНовый = 11; 
		ИначеЕсли НайденнаяСтрокаНоменклатура >= 1 И ИщемКоличествоКомплекты >= 1 Тогда 
			ТЧспрНоменклатура = НовыйЭлементНоменклатуры2.Товары.Добавить(); 
			ТЧспрНоменклатура.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(АктуальнаяНоменклатура); 
			ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(796); 
			ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text); 
			ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество; 
			НомерСтрокиНовый = НомерСтрокиНовый + 1; 
			НомерКолонкиНовый = 11; 
		КонецЕсли; 
		
		Если НайденнаяСтрокаНоменклатура >= 1 И ИщемДлинуММ >= 1 И НайденнаяСтрока5Номенклатура >= 1 Тогда 
			НомерКолонкиНовый = НомерКолонкиНовый + 1; 
			ТЧспрНоменклатура.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоКоду(796); 
			ТЧспрНоменклатура.Количество = сокрЛП(Лист.Cells(2, НомерКолонкиНовый).text); 
			ТЧспрНоменклатура.КоличествоУпаковок = ТЧспрНоменклатура.Количество; 
			
			НомерКолонкиНовый = 11; 
		КонецЕсли; 
		
		
		
		Если КолонкаДляОтбораНоменклатуры = "" Тогда 
			Сообщить("Проверьте правила заполнения шаблона Эксель, номенклатура не найдена в строке поиска"); 
			Прервать; 
			
		КонецЕсли; 
		
		
		//Прервать; 
	КонецЦикла; 
	НовыйЭлементНоменклатуры2.Записать(); 
	
	Ексель.Quit(); 
	Ексель = 0; 
	ДокДляЗаписи.Записать(РежимЗаписиДокумента.Запись); 
	
	
КонецПроцедуры 


&НаСервере 
Процедура ЗаполнитьСписокЛистов()
	
	//C:\Users\бух\Desktop\клапана.xlsx 
	
	Ексель = Новый COMОбъект("Excel.Application"); 
	//НомерЛиста = 2; 
	файл = Ексель.WorkBooks.Open(ПолеВвода); 
	//Лист = файл .WorkSheets(НомерЛиста); 
	
	СписокЛистов = Элементы.ВыберитеНомерЛиста.СписокВыбора; 
	СписокЛистов.Очистить(); 
	Для Каждого ТекущийЛист Из файл .WorkSheets Цикл 
		СписокЛистов.Добавить(ТекущийЛист.Name); 
	КонецЦикла; 
	
	Ексель.Quit(); 
	Ексель = 0; 
	
КонецПроцедуры

&НаКлиенте 
Процедура ОткрытьНаКлиенте(Команда, Наименование) 
	
	ОткрытьНаСервере(Наименование); 
	
КонецПроцедуры 

&НаКлиенте 
Процедура ПолеВводаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) 
	СтандартнаяОбработка = Ложь; 
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); 
	Диалог.Заголовок = "Выбор файла"; 
	Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx"; 
	Диалог.ИндексФильтра = 0; 
	Диалог.ПредварительныйПросмотр = Ложь; 
	Диалог.ПроверятьСуществованиеФайла = Истина; 
	Диалог.МножественныйВыбор = Ложь; 
	Диалог.ПолноеИмяФайла = ПолеВвода; 
	
	Если Диалог.Выбрать() Тогда 
		ПолеВвода = Диалог.ПолноеИмяФайла; 
		ЗаполнитьСписокЛистов();
	КонецЕсли; 
КонецПроцедуры
Показать
15. parker_j 23.01.19 00:36 Сейчас в теме
16. Bene_Valete 189 23.01.19 02:53 Сейчас в теме
Для передачи ТЗ на клиент обычно используется ее трансофрмация в массив структур, вот стандратная процедура, может она Вам пригодится:

// Преобразует таблицу значений в массив структур.
// Может использоваться для передачи на клиент данных в том случае, если таблица
// значений содержит только такие значения, которые могут
// быть переданы с сервера на клиент.
//
// Полученный массив содержит структуры, каждая из которых повторяет
// структуру колонок таблицы значений.
//
// Не рекомендуется использовать для преобразования таблиц значений
// с большим количеством строк.
//
// Параметры:
//  ТаблицаЗначений - ТаблицаЗначений - исходная таблица значений.
//
// Возвращаемое значение:
//  Массив - коллекция строк таблицы в виде структур.
//
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
	
	Массив = Новый Массив();
	СтруктураСтрокой = "";
	НужнаЗапятая = Ложь;
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		Если НужнаЗапятая Тогда
			СтруктураСтрокой = СтруктураСтрокой + ",";
		КонецЕсли;
		СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
		НужнаЗапятая = Истина;
	КонецЦикла;
	Для Каждого Строка Из ТаблицаЗначений Цикл
		НоваяСтрока = Новый Структура(СтруктураСтрокой);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		Массив.Добавить(НоваяСтрока);
	КонецЦикла;
	Возврат Массив;

КонецФункции
Показать
17. bad_wag 51 25.01.19 13:18 Сейчас в теме
Можно добавить на форму реквизит с типом таблица значений и вуаля, на клиенте у вас ТЗ без танцев с бубном
Оставьте свое сообщение

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