Имя: Пароль:
1C
 
УТ 11.4 РегистрацияИПодборСерий
0 dubov
 
19.11.24
09:22
Добрый день!

Нужна помощь, Попросили изменить стандартную обработку добавить функционал загрузки серийных номеров через Excel и обязательно через сервер(Не спрашивайте почему, не знаю чем предложенный вариант на клиенте не понравился).

Серийные номера стали загружаться код рабочий для загрузки. Но при нажатии на кнопку "Завершить" выдает ошибку:
Ошибка при вызове метода контекста (ПоместитьВоВременноеХранилище)
{Расширение1 Обработка.ПодборСерийВДокументы.Форма.РегистрацияИПодборСерийПоОднойСтрокеТоваров.Форма(336)}:ПоместитьВоВременноеХранилище(ТаблицаВозврата,АдресВоВременномХранилище);
{Обработка.ПодборСерийВДокументы.Форма.РегистрацияИПодборСерийПоОднойСтрокеТоваров.Форма(1037)}:Если Не СохранитьВводСерийСервер() Тогда

по причине:
Недействительный адрес или не найден родительский сеанс задания


Вот код моей обработки:

&НаКлиенте
Процедура ЗагрузитьФайл2(Команда)
	ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбора.Заголовок = "Выберите файл";
	
	Если ДиалогВыбора.Выбрать() Тогда
		ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
		
		ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);   // Получаем двоичные данные нашего файла
		АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла);   // помещаем двоичные данные на сервер
		// Хранилище и получаем его адрес
		ЗагрузитьНаСервере(АдресВоВременномХранилище);
		
		Элементы.Серии.ДобавитьСтроку();
		ТекущиеДанные = Элементы.Серии.ТекущиеДанные;
		 Элементы.Серии.ЗакончитьРедактированиеСтроки(Ложь);
		СерииПриИзменении(Неопределено);

	КонецЕсли;	
	   
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере(АдресВХ) 
	ТабДок = Новый ТабличныйДокумент;
	ДанныеВХ = ПолучитьИзВременногоХранилища(АдресВХ); // Получаем данные по указанному адресу из ВХ 
	ПутьКФайлуНаСервере = ПолучитьИмяВременногоФайла("xlsx"); // Получаем путь к файлу на сервере
	ДанныеВХ.Записать(ПутьКФайлуНаСервере); 
	
	Попытка
		ТабДок.Прочитать(ПутьКФайлуНаСервере, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось прочитать указанный файл по причине: " + ОписаниеОшибки();
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки;
	
	КоличествоСтрок = ТабДок.ВысотаТаблицы;
	
	ДанныеФайла = Новый ТаблицаЗначений;
	ДанныеФайла.Колонки.Добавить("Номер");
	ДанныеФайла.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,3,ДопустимыйЗнак.Неотрицательный)));
	ДанныеФайла.Колонки.Добавить("КоличествоУпаковок",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,3,ДопустимыйЗнак.Неотрицательный)));   
	
	Для НомерСтроки = 1 По КоличествоСтрок Цикл
		СтрокаДанных = ДанныеФайла.Добавить();   
		
		СтрокаДанных.Номер = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 1).ТекущаяОбласть.Текст;   
		СтрокаДанных.Количество = 1;
		СтрокаДанных.КоличествоУпаковок = 1;
		Сообщить(СтрокаДанных.Номер + " Количество " + СтрокаДанных.Количество + "  КоличествоУпаковок " + СтрокаДанных.КоличествоУпаковок);
		
	КонецЦикла;
	Для Каждого Строка Из ДанныеФайла Цикл
		НоваяСтрока = Объект.Серии.Добавить(); 
		Номер = Строка.Номер;
		НоваяСтрока.Номер = Формат(Номер, "ЧЦ=8; ЧВН=; ЧГ=");
		НоваяСтрока.Количество = Строка.Количество; 
		НоваяСтрока.КоличествоУпаковок = Строка.КоличествоУпаковок;
		
	КонецЦикла;
	
КонецПроцедуры // ЗагрузитьНаСервере()


А вот стандартный который ругается на временное хранилище:  
Функция СохранитьВводСерийСервер(СтрокаДляЗаписи)

	Если Объект.Серии.Количество() > 0 Тогда
		ПоследняяСтрока = Объект.Серии[Объект.Серии.Количество()-1];
		Если Не ЗначениеЗаполнено(ПоследняяСтрока.Серия)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.Номер)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.НомерКИЗГИСМ)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.ГоденДо)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.ДатаПроизводства)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.ПроизводительЕГАИС)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.Справка2ЕГАИС)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.ПроизводительВЕТИС)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.ЗаписьСкладскогоЖурналаВЕТИС)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.ИдентификаторПартииВЕТИС)
			И Не ЗначениеЗаполнено(ПоследняяСтрока.МаксимальнаяРозничнаяЦенаМОТП)
			И (ПоследняяСтрока.КоличествоУпаковок = 1
			Или ПоследняяСтрока.КоличествоУпаковок = 0) Тогда

			Объект.Серии.Удалить(ПоследняяСтрока);
		КонецЕсли;
	КонецЕсли;

	ПараметрыПроверки = Новый Структура("Номенклатура,Упаковка,ЭтоМаркировкаТоваровГИСМ,ЭтоМаркировкаПерсонифицированнымиКиЗ,
	|ЭтоМаркировкаОстатковГИСМ,ЭтоПоступлениеИзТаможенногоСоюза,ПроверятьЗаполнениеНомера,
	|ТолькоРедактированиеКоличества");

	ЗаполнитьЗначенияСвойств(ПараметрыПроверки, ЭтаФорма);
	ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыПроверки, НастройкиИспользованияСерий);

	Объект.ПараметрыПроверки = Новый ФиксированнаяСтруктура(ПараметрыПроверки);

	Если НЕ (ПроверитьЗаполнение()
		И УправлениеСвойствамиУТ.ПроверитьЗаполнениеДополнительныхРеквизитов(ЭтаФорма, "Объект.Серии")) Тогда
		Возврат Ложь;
	КонецЕсли;	

	НайтиЗарегистрированныеСерии();

	ТаблицаВозврата = Новый ТаблицаЗначений;
	ТаблицаВозврата.Колонки.Добавить("Серия",Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
	ТаблицаВозврата.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,3,ДопустимыйЗнак.Неотрицательный)));
	ТаблицаВозврата.Колонки.Добавить("КоличествоУпаковок",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,3,ДопустимыйЗнак.Неотрицательный)));

	КоэффициентИсходнойУпаковки = Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(ИсходнаяУпаковка, Номенклатура);

	Для Каждого СтрТабл Из Объект.Серии Цикл

		Если СтрТабл.Количество > 0
			Или ТолькоРедактированиеКоличества Тогда // В режиме ТолькоРедактированиеКоличества нужно также вернуть строки с нулевым количеством

			СохранитьСериюПоСтроке(СтрТабл);

			НоваяСтрока = ТаблицаВозврата.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрТабл);
			НоваяСтрока.КоличествоУпаковок = НоваяСтрока.Количество / КоэффициентИсходнойУпаковки;

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

	Если ПараметрыУказанияСерий.ИмяТЧТовары = ПараметрыУказанияСерий.ИмяТЧСерии
		И ТаблицаВозврата.Количество() = 0 Тогда

		НоваяСтрока = ТаблицаВозврата.Добавить();
		НоваяСтрока.КоличествоУпаковок = Количество;

		СтруктураРеквизитов = Новый Структура("Упаковка,Номенклатура", Упаковка, Номенклатура);
		СтруктураДействий = Новый Структура("ПересчитатьКоличествоЕдиниц", СтруктураРеквизитов);

		ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, Неопределено);

	КонецЕсли;

	ПоместитьВоВременноеХранилище(ТаблицаВозврата,АдресВоВременномХранилище);
	Модифицированность = Ложь;

	Возврат Истина;

КонецФункции

Помогите понять что не так сделал.
1 dubov
 
19.11.24
08:39
На это прошу не обращать внимание
закомментировано: Элементы.Серии.ДобавитьСтроку();
        ТекущиеДанные = Элементы.Серии.ТекущиеДанные;
         Элементы.Серии.ЗакончитьРедактированиеСтроки(Ложь);
        СерииПриИзменении(Неопределено);
2 Admin_Net_1C
 
19.11.24
13:09
Функция СохранитьВводСерийСервер(СтрокаДляЗаписи) --- здесь есть параметр

в тексте ошибки:
{Обработка.ПодборСерийВДокументы.Форма.РегистрацияИПодборСерийПоОднойСтрокеТоваров.Форма(1037)}:Если Не СохранитьВводСерийСервер() Тогда

вызов функции без параметра.
Возможно в этом дело?
3 dubov
 
19.11.24
13:49
(2) Сомневаюсь, т.к. это стандартный код 1С

&НаКлиенте
Процедура ЗавершитьВводСерий(Команда)
	ОчиститьСообщения();
	Если Не СохранитьВводСерийСервер() Тогда
		Возврат;
	КонецЕсли;
	Если Не Модифицированность Тогда
		Закрыть(АдресВоВременномХранилище);
	КонецЕсли;
КонецПроцедуры


дальше идет Функция СохранитьВводСерийСервер(СтрокаДляЗаписи)
Т.е. При нажатии кнопки Завершить выполняется Команда ЗавершитьВводСерий(Команда), а из нее уже выходит СохранитьВводСерийСервер() и вот в серверной выдает такую ошибку. Попробовал уже и Массивом через сервер но, ошибка не меняется. А все началось с серверной процедуры и временногоХранилища. Т.к. при добавлении клиентского кода таких проблем нет.
4 Волшебник
 
19.11.24
13:48
(3) не надо делать культа из типового кода
5 dubov
 
19.11.24
13:50
(2) Может нужно закрыть хранилище или из него данные удалить, пробовал УдалитьИзВременногоХранилища(АдресВХ);, не помогло.
Буду рад любым предложения.
И это Обработка РегистрацияИПодборСирийПоОднойСтрокеТоваров УТ11.4
6 dubov
 
19.11.24
13:50
(4) Можно отредактировать типовой код, знать бы в какую сторону.
7 Волшебник
 
20.11.24
12:58
(6) Типовой код пишут такие же люди, а иногда и не люди.
Программист всегда исправляет последнюю ошибку.