1. user1004898 4 14.03.19 21:40 Сейчас в теме

Обход ИдентификаторКоманды и выполнение команды на клиенте

На данном портате нашел внешнюю обработку по загрузке данных в ТЧ документов (https://infostart.ru/public/722665/)
Немного модифицирую под себя. Убрал проверку на Начало таблицы, внес коррективы по поводу игнора пустых и необнаруженных строк с Артикулом.
Взялся за изменение формы.
Дорисовал свои поля. (фото1) В частности и Кнопку Выполнить (в оригинале там было просто открыть файл excel и заполнить ТЧ ).
Но на этапе нажатия кнопки Выполнить, вызывается исключение, что
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" не поддерживается данной обработкой!'"),
			ИдентификаторКоманды);


Сам модифицированный код обработки такой
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	
	Если ИдентификаторКоманды = "ЗагрузкаИзExcel" Тогда
		
		ПутьКФайлуНачалоВыбора(,,);
		          
		
		
		ЗагрузитьВДокумент(ОбъектыНазначения[0]);
		п = Новый Структура("Ключ", ОбъектыНазначения[0]);
		Если ТипЗнч(ОбъектыНазначения[0]) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
			Форма = ПолучитьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта", п);
			Форма.Прочитать();
		ИначеЕсли ТипЗнч(ОбъектыНазначения[0]) = Тип("ДокументСсылка.СписаниеНедостачТоваров") Тогда	
			Форма = ПолучитьФорму("Документ.СписаниеНедостачТоваров.ФормаОбъекта", п);
			Форма.Прочитать();
		Иначе
			Сообщить("Некорректный тип документа "+ТипЗнч(ОбъектыНазначения[0]));
		КонецЕсли; 	
		
		ПоказатьОповещениеПользователя("Загрузка завершена !");
	Иначе
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" не поддерживается данной обработкой!'"),
			ИдентификаторКоманды);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
		//Режим = РежимДиалогаВыбораФайла.Открытие;
		Режим = РежимДиалогаВыбораФайла.Открытие;
		ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
		ДиалогОткрытия.ПолноеИмяФайла = "";
		Фильтр = "Документы Excel (*.xls, *.xlsx)|*.xl*";
		ДиалогОткрытия.Фильтр = Фильтр;
		ДиалогОткрытия.МножественныйВыбор = Ложь;
		ДиалогОткрытия.Заголовок = "Выберите файл с данными";
		Если ДиалогОткрытия.Выбрать() Тогда
			Объект.ПутьКФайлу = ДиалогОткрытия.ПолноеИмяФайла;
		Иначе
			Сообщить("Файл не выбран !");
			Возврат;
		КонецЕсли;	
		
		
		ДД = Новый ДвоичныеДанные(Объект.ПутьКФайлу);
		СДД	 = ПоместитьВоВременноеХранилище(ДД);
		
		ПрочитатьДанныеНаСервере(СДД);
КонецПроцедуры

&НаСервере
Процедура ПрочитатьДанныеНаСервере(СсылкаДД)

	XLDATA 	 = ПолучитьИзВременногоХранилища(СсылкаДД);
	ИмяФ = ПолучитьИмяВременногоФайла("xlsx");
	XLDATA.Записать(ИмяФ);
	Попытка
        ДанныеXL.Прочитать(ИмяФ, СпособЧтенияЗначенийТабличногоДокумента.Текст);    // СпособЧтенияЗначенийТабличногоДокумента - новый параметр платформы 8.3.6. Второе значение "Текст".
	Исключение
		Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат;
	КонецПопытки;

КонецПроцедуры
&НаСервере
Функция ВЧисло(СтрокаЧисло)
	Если СокрЛП(СтрокаЧисло) = "" Тогда
	   Возврат 0;
	КонецЕсли;                   	
	Если СтрокаЧисло = "- 0 р." Тогда
	   Возврат 0;	
    КонецЕсли; 
   
	СтрокаЧисло = СтрЗаменить(СтрокаЧисло,"р .","");  	
	СтрокаЧисло = СтрЗаменить(СтрокаЧисло,"р.","");  	
	СтрокаЧисло = СтрЗаменить(СтрокаЧисло,",",".");  	
	СтрокаЧисло = СтрЗаменить(СтрокаЧисло,"-","");  	
	СтрокаЧисло = СокрЛП(СтрокаЧисло);
	Попытка
		Возврат Число(СтрокаЧисло);
	Исключение
		Сообщить("Не удалось преобразовать в число: "+СтрокаЧисло);
	    Возврат 0;
	КонецПопытки; 
	
КонецФункции 

&НаСервере
Процедура ЗагрузитьВДокумент(ТекущийДокумент)
				
	ТабДок = ДанныеXL;
	
	КолвоСтрокФайла = ТабДок.ВысотаТаблицы;
    КонечнаяКолонка = ТабДок.ПолучитьОбласть().ШиринаТаблицы;
	//НашлиНачало = Ложь;
	
	ДокументОбъект = ТекущийДокумент.ПолучитьОбъект();
	Если ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.ПересчетТоваров") Тогда
	    Для каждого стр Из ДокументОбъект.Товары Цикл
		   стр.КоличествоФакт = 0;
		   стр.КоличествоУпаковокФакт = 0;	
		КонецЦикла; 
	Иначе	
		ДокументОбъект.Товары.Очистить();
	КонецЕсли; 
	
	Для k = 1 По КолвоСтрокФайла Цикл
		ТС = Формат(k,"ЧГ=");
	    Артикул = СокрЛП(ТабДок.Область("R"+ТС+"C1").Текст);
		
		//Если Не НашлиНачало Тогда
		//	Если Артикул = "Артикул" Тогда
		//		НашлиНачало = Истина;
		//		Продолжить;
		//	Иначе
		//		Продолжить;		
		//	КонецЕсли; 		
		//КонецЕсли; 
		
		Если Артикул = "" Тогда
		    Прервать; 
		КонецЕсли;
		
		Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
	
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	Номенклатура.Ссылка
			|ИЗ
			|	Справочник.Номенклатура КАК Номенклатура
			|ГДЕ
			|	Номенклатура.ПометкаУдаления = ЛОЖЬ
			|	И Номенклатура.Артикул = &Артикул";
		Запрос.Параметры.Вставить("Артикул", Артикул);
		Результат = Запрос.Выполнить().Выбрать();
		Если Результат.Количество() > 1 Тогда
			сообщить("Найдено несколько позиций номенклатуры по артикулу: " + Артикул, СтатусСообщения.Важное);		
		ИначеЕсли Результат.Следующий() Тогда
			Номенклатура = Результат.Ссылка;			
		Иначе
			сообщить("Номенклатура по артикулу: " + Артикул + ", не найдена.", СтатусСообщения.Важное);	
		КонецЕсли;
		//Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",Артикул);
		//Если Не ЗначениеЗаполнено(Номенклатура) Тогда
		//     Сообщить("Не найдена номенклатура с артикулом "+Артикул);
		//	 Продолжить;		
		//КонецЕсли;
		
			
		Если ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.УстановкаЦенНоменклатуры") Тогда
			ИмяПрайса = ТабДок.Область("R"+ТС+"C3").Текст;
			Прайс =  Справочники.ВидыЦен.НайтиПоНаименованию(ИмяПрайса);
			Если Не ЗначениеЗаполнено(Прайс) Тогда
			     Сообщить("Не найден вид цены с наименованием "+ИмяПрайса);
				 Продолжить;		
			КонецЕсли; 
			
			Цена = ВЧисло(ТабДок.Область("R"+ТС+"C4").Текст);
			
			НС = ДокументОбъект.Товары.Добавить();
			НС.Номенклатура 		= Номенклатура;
			НС.Цена 				= Цена; 
			НС.ВидЦены			 	= Прайс;  
			НС.ЦенаИзмененаВручную  = Истина;
			
		ИначеЕсли ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.ПересчетТоваров") Тогда
			ИмяСклада = ТабДок.Область("R"+ТС+"C3").Текст;
			Склад =  Справочники.Склады.НайтиПоНаименованию(ИмяСклада);
			Если Не ЗначениеЗаполнено(Склад) Тогда
			     Сообщить("Не найден склад с наименованием "+ИмяСклада);
				 Продолжить;		
			КонецЕсли; 
			
			Если Склад <> ДокументОбъект.Склад  Тогда
			    Продолжить;			
			КонецЕсли; 
			
			Количество = ВЧисло(ТабДок.Область("R"+ТС+"C2").Текст);
			Если Количество = 0 Тогда
				Сообщить("По товару "+Артикул+" "+Номенклатура+" количество = 0.");		
			КонецЕсли; 
			
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("Номенклатура", Номенклатура);
			НайденныеСтроки = ДокументОбъект.Товары.НайтиСтроки(ПараметрыОтбора);		
			
			Если НайденныеСтроки.Количество() = 0 Тогда
				Сообщить("По товару "+Артикул+" "+Номенклатура+" не найдено строк в пересчете товаров. Позиция добавлена в конец таблицы в количестве "+Количество+".",СтатусСообщения.Важное);
				НС = ДокументОбъект.Товары.Добавить();
				НС.Номенклатура = Номенклатура;
				НС.КоличествоФакт = Количество;
				НС.КоличествоУпаковокФакт = Количество;
				Продолжить;			
			КонецЕсли;     	
			
			Если НайденныеСтроки.Количество() = 1 Тогда
				Для каждого строчка Из НайденныеСтроки Цикл
				    строчка.КоличествоФакт = Количество;
					строчка.КоличествоУпаковокФакт = Количество;			
				КонецЦикла; 
			Иначе	
				
				КолвоСвободно = 0;
				КолвоРезерв = 0;
				
				Для каждого строчка Из НайденныеСтроки Цикл
					Если ЗначениеЗаполнено(строчка.Назначение) Тогда
						КолвоРезерв = КолвоРезерв+строчка.Количество;
					Иначе
						КолвоСвободно = КолвоСвободно+строчка.Количество;
					КонецЕсли; 
				КонецЦикла;
				
				Если (КолвоРезерв+КолвоСвободно) = Количество Тогда
				    Для каждого строчка Из НайденныеСтроки Цикл
					    строчка.КоличествоФакт = строчка.Количество;
						строчка.КоличествоУпаковокФакт = строчка.КоличествоУпаковок;			
					КонецЦикла;
				ИначеЕсли (КолвоРезерв+КолвоСвободно)<Количество Тогда
					
					Для каждого строчка Из НайденныеСтроки Цикл
						Если Не ЗначениеЗаполнено(строчка.Назначение) Тогда
							строчка.КоличествоФакт = Количество-КолвоРезерв;
							строчка.КоличествоУпаковокФакт = Количество-КолвоРезерв;
							Прервать;
						КонецЕсли; 
					КонецЦикла;
					
					Для каждого строчка Из НайденныеСтроки Цикл
						Если ЗначениеЗаполнено(строчка.Назначение) Тогда
							строчка.КоличествоФакт = строчка.Количество;
							строчка.КоличествоУпаковокФакт = строчка.КоличествоУпаковок;
						КонецЕсли; 
					КонецЦикла;
					
				Иначе
					Если КолвоРезерв>=Количество Тогда
						
						Доля = Количество/КолвоРезерв;
						КолОсталось = Количество;
						ПослСтрочка = Неопределено;
						Для каждого строчка Из НайденныеСтроки Цикл
							Если КолОсталось = 0 Тогда
							    Прервать;							
							КонецЕсли; 
							Если ЗначениеЗаполнено(строчка.Назначение) Тогда
								ПослСтрочка = строчка;
								Кол = Окр(Доля*строчка.Количество+0.5);
								Если Кол>КолОсталось Тогда
								   Кол = КолОсталось;						
								КонецЕсли; 
								
								КолОсталось = КолОсталось-Кол;
								
								строчка.КоличествоФакт = Кол;
								строчка.КоличествоУпаковокФакт = Кол;
							КонецЕсли; 
						КонецЦикла;
						
						
						Если КолОсталось<>0 и ПослСтрочка<>Неопределено Тогда
						    ПослСтрочка.КоличествоФакт = ПослСтрочка.КоличествоФакт+КолОсталось;
							ПослСтрочка.КоличествоУпаковокФакт = ПослСтрочка.КоличествоУпаковокФакт+КолОсталось;
							КолОсталось = 0;						
						КонецЕсли; 
						
						Если КолОсталось<>0 Тогда
						    Сообщить("!!! По товару "+Артикул+" "+Номенклатура+" осталось нераспределенное количество остатка среди резерва = "+КолОсталось+".",СтатусСообщения.ОченьВажное);						
						КонецЕсли; 
                    Иначе
						
						Для каждого строчка Из НайденныеСтроки Цикл
							Если ЗначениеЗаполнено(строчка.Назначение) Тогда
								строчка.КоличествоФакт = строчка.Количество;
								строчка.КоличествоУпаковокФакт = строчка.КоличествоУпаковок;
							КонецЕсли; 
						КонецЦикла;
						Для каждого строчка Из НайденныеСтроки Цикл
							Если Не ЗначениеЗаполнено(строчка.Назначение) Тогда
								строчка.КоличествоФакт 			= Количество-КолвоРезерв;
								строчка.КоличествоУпаковокФакт 	= Количество-КолвоРезерв;
								Прервать;
							КонецЕсли; 
						КонецЦикла;
					КонецЕсли; 
				
				КонецЕсли; 
			
			КонецЕсли;
			
		Иначе	
			Количество = ВЧисло(ТабДок.Область("R"+ТС+"C2").Текст);
			
							
			Если ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
				НС = ДокументОбъект.Товары.Добавить();
				НС.Номенклатура = Номенклатура;
				НС.Количество 	= Количество; 
				НС.КоличествоУпаковок = Количество;
			ИначеЕсли ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.СписаниеНедостачТоваров") Тогда
				НС = ДокументОбъект.Товары.Добавить();
				НС.Номенклатура = Номенклатура;
				НС.Количество 	= Количество; 
			КонецЕсли; 		
		КонецЕсли; 
		
	КонецЦикла;
	
	//Если Не НашлиНачало Тогда
	//    Сообщить("Неправильный формат файла.");
	//	Возврат;
	//КонецЕсли; 
	
	ДокументОбъект.Записать();

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

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


Вот с обходом исключения уже получаются косяки при модификации кода. Как можно "культурно" обойти данную проблему, и сделать загрузку именно через кнопку "Выполнить"?
Прикрепленные файлы:
Ответы
Избранное Подписка Сортировка: Древо
2. spec8s 290 14.03.19 21:45 Сейчас в теме
&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФайла(Команда)
    Если не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
        предупреждение("Не указан файл для загрузки.");
        возврат;
    КонецЕсли;
    
    Файл = Новый Файл(Объект.ПутьКФайлу);
    Если не Файл.Существует() ТОгда
        Предупреждение("Указанный файл не существет. Выберите другой файл.");
        возврат;
    КонецЕсли;
    ВыполнитьКоманду(,);
    
КонецПроцедуры
Показать


ВыполнитьКоманду(,); изменить на


ВыполнитьКоманду("ЗагрузкаИзExcel", ОбъектыНазначения);

ОбъектыНазначения - это либо параметр формы либо что-то еще, посмотрите Параметры.ОбъектыНазначения
3. user1004898 4 14.03.19 22:04 Сейчас в теме
(2)
ВыполнитьКоманду("ЗагрузкаИзExcel", ОбъектыНазначения);


ОбъектыНазначения - Массив - Ссылки, для которых выполняется команда.

ЗагрузитьВДокумент(ОбъектыНазначения[0]);
		п = Новый Структура("Ключ", ОбъектыНазначения[0]);
		Если ТипЗнч(ОбъектыНазначения[0]) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
			Форма = ПолучитьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта", п);
			Форма.Прочитать();
		ИначеЕсли ТипЗнч(ОбъектыНазначения[0]) = Тип("ДокументСсылка.СписаниеНедостачТоваров") Тогда	
			Форма = ПолучитьФорму("Документ.СписаниеНедостачТоваров.ФормаОбъекта", п);
			Форма.Прочитать();
		Иначе
			Сообщить("Некорректный тип документа "+ТипЗнч(ОбъектыНазначения[0]));
		КонецЕсли; 
Показать
4. spec8s 290 14.03.19 22:16 Сейчас в теме
(3)
ВыполнитьКоманду("ЗагрузкаИзExcel", ОбъектыНазначения);


ну так надо в процедуру ВыполнитьКоманду("ЗагрузкаИзExcel", ОбъектыНазначения);
и передать эти объекты, тогда все заработает
5. user1004898 4 15.03.19 00:12 Сейчас в теме
(4)каким образом? ну намекните хотя-бы конкрентно...
8. spec8s 290 15.03.19 11:03 Сейчас в теме
(5)Скиньте обработку, надо смотреть, я лишь хотел натолкнуть на мысль
9. user1004898 4 15.03.19 11:16 Сейчас в теме
10. spec8s 290 15.03.19 11:43 Сейчас в теме
11. user1004898 4 15.03.19 12:49 Сейчас в теме
(10)
да, лучше, спасибо.
еще вопрос, если можно.
как возможно реализовать, чтобы кнопка выводилась не в панели сверху "Заполнение", а допустим ниже в "заполнить" - "загрузка из Excel".?

параллельно в макет добавил Параметры_Авторегистрации, а модуль обработки дописал процедуру:

Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
	
	ТабличнаяЧасть = Объект[ИмяТабличнойЧасти];
		
КонецПроцедуры
.

Но перемещение "кнопки" нет.
Прикрепленные файлы:
12. spec8s 290 15.03.19 14:05 Сейчас в теме
(11)Параметры авторегистрации - это для старых конфигураций, типа БП 2.0, УТ 10.3. На новых не работает.

Команду перенести нельзя, таков типовой механизм. Можно перенести, только путем доработки конфигурации или доработке через расширение.
6. nikolega 161 15.03.19 09:38 Сейчас в теме
Вам форма нужна только для того, чтобы предоставить возможность указания очищать или нет табличную часть ?
Или цели другие есть ?

Обработка писалась так, чтобы минимизировать количество различных диалоговых окон при работе с загрузкой. Просто - выбрали файл - загрузили.

Если нужно дополнительное значение "булево" от пользователя (например очищать ли табличную часть перед загрузкой) или любое простое значение, то просто можно решить вопрос так:
если есть хоть одна строка в документе - можете вывести вопрос асинхронный на очистку табличной части.
7. user1004898 4 15.03.19 10:35 Сейчас в теме
(6)
мне нужна форма, чтобы я мог выполнить загрузку данных из excel.
за "очистку" пока не говорю, так как выполнить загрузку все еще не могу сделать.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Нижний Новгород
зарплата до 120 000 руб.
Полный день

Программист 1С
Волгоград
зарплата от 45 000 руб. до 90 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Консультант-аналитик 1С
Москва
зарплата от 70 000 руб. до 100 000 руб.
Полный день

Программист 1С
Москва
зарплата от 80 000 руб. до 120 000 руб.
Временный (на проект)