Имя: Пароль:
1C
 
Параметр номер 2
0 Lepexa207
 
06.05.24
12:49
1С: УТ11

Здравствуйте, пытаюсь сделать так, чтобы при повторном изменении проведённого документа "Приобретение товаров и услуг" подставлялись актуальные с ПТУ данные в "Установку цен номенклатуры".

В самой базе уже существует такой функционал как: "Скопировать строки" и "Вставить строки". Я написал к ним обращение программно.

Проблема в том, что строки надо все выделить, чтоб команда отработала и подставила в "Установку цен". Но если я выделяю программно и база выполняет свой привычный алгоритм, то база жалуется на параметр 2 из-за события: ТоварыПриАктивизацииЯчейки.

[1] Вот мой код:
Он стопорится в коде на "СкопироватьСтрокиНаСервере"

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


[2] Сама ошибка:

Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств)
{ОбщийМодуль.ОбщегоНазначенияУТКлиентСервер.Модуль(969)}:    ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
{ОбщийМодуль.НаборыВызовСервера.Модуль(500)}:        Если ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(СтрокаТЧ, "НоменклатураНабора")
{ОбщийМодуль.КопированиеСтрокСервер.Модуль(22)}:        НаборыВызовСервера.ДополнитьДоПолногоНабора(ТабЧасть, ВыделенныеСтрокиТЧ);
{Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(5614)}:    КопированиеСтрокСервер.ПоместитьВыделенныеСтрокиВБуферОбмена(Элементы[ИмяТЧ].ВыделенныеСтроки, Объект[ИмяТЧ]);
{АвтоЗакупЦена Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(30)}:        СкопироватьСтрокиНаСервере("Товары");
{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1974)}:    Результат = Форма.Записать(ПараметрыЗаписи);
{Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(8650)}:    ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме(ЭтотОбъект, ПараметрыДляЗаписи);
по причине:
Недопустимое значение параметра (параметр номер '2')


[3] Ошибка возникает здесь (я его не менял):

Общий модуль ОбщегоНазначенияУТКлиентСервер

// Проверяет наличие у произвольного объекта реквизита с указанным именем.
//
Функция ЕстьРеквизитОбъекта(Объект, ИмяРеквизита) Экспорт
	
	КлючУникальности   = Новый УникальныйИдентификатор;
	СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);

	ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
	
	Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
	
КонецФункции

#КонецОбласти


Форма документа ПриобретениеТоваровУслуг

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

______________________________________________________________

Что мне нужно сделать, чтобы он не жаловался на всеми любимый параметр? :с
1 asady
 
06.05.24
12:13
(0) сама постановка задачи спорная.
Установка цен номенклатуры и проведение ПТУ в общем случае не должны быть завязаны жестко.
Вполне могут быть поставки одного и того же товара в один день от одного поставщика в разные магазины по разным ценам
2 Lepexa207
 
06.05.24
12:36
(1) У нас интернет-магазин и один розничный магазин, так что конкретной проблемы нет, мб в будущем будет, но она настанет минимум через года 2-3. Да и расширение в будущем можно будет просто отключить, чтобы не было осложнений, так что я ищу простое решение на актуальный промежуток времени)
3 Волшебник
 
06.05.24
12:42
Вот Вы пишете "Ошибка возникает в данном фрагменте", а выше "Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств)"

И где в [3] ЗаполнитьЗначенияСвойств?
4 Prog_man
 
06.05.24
12:43
(2) как вариант, сразу из поступления записывать цены в регистр
5 Волшебник
 
06.05.24
12:43
Ошибка здесь:
ОбщийМодуль.ОбщегоНазначенияУТКлиентСервер.Модуль(969)
6 Lepexa207
 
06.05.24
12:51
(3) я пофиксил пост, спасибо
7 Lepexa207
 
06.05.24
12:56
(5) ну он отсылает на ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);

Это я в курсе, но при пробежке через точку остановы и смотря на выражения, которые находятся в Объекте, я не заметил ничего примечательного. В Объекте просто вечно висит документ из которого я обращаюсь
8 Optan
 
06.05.24
13:17
При остановке на строке 969 ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект) какой тип у переменной Объект?
9 Мультук
 
06.05.24
13:19
(0)

== Вы засовываете в выделенные строки "НомерСтроки"


Для каждого Стр из Объект.Товары Цикл
      Элементы.Товары.ВыделенныеСтроки.Добавить(Стр.НомерСтроки);
КонецЦикла;
        
СкопироватьСтрокиНаСервере("Товары");

== 1С далее пытается с этим как-то жить, считая, что вы засунули туда таки ИдентификаторСтроки


P.S.

Смотрим в код функции РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(..);

Рожаем что-то вроде этого.

Процедура СкопироватьВсеСтрокиНаСервере()

    ТаблицаЗначений = Объект.Товары.Выгрузить();
    
    УдаляемыеКолонки = Новый Массив;
    УдаляемыеКолонки.Добавить("ИсходныйНомерСтроки");
    УдаляемыеКолонки.Добавить("КодСтроки");
    УдаляемыеКолонки.Добавить("ИдентификаторСтроки");
    УдаляемыеКолонки.Добавить("КлючСвязи");
    
    Для Каждого ИмяКолонки Из УдаляемыеКолонки Цикл
        Колонка = ТаблицаЗначений.Колонки.Найти(ИмяКолонки);
        Если Колонка <> Неопределено Тогда
            ТаблицаЗначений.Колонки.Удалить(Колонка);
        КонецЕсли;
    КонецЦикла;

        ОбщегоНазначения.СкопироватьВБуферОбмена(ТаблицаЗначений, "КопированиеВставкаСтрок");

КонецПроцедуры
10 Lepexa207
 
06.05.24
13:23
(8) Тип - ВыборкаИзРезультатаЗапроса
11 Lepexa207
 
06.05.24
14:46
(9) Я попробовал, не вышло(

Значение не является значением объектного типа (НайтиПоИдентификатору)
{ОбщийМодуль.КопированиеСтрокСервер.Модуль(18)}:            СтрокаТаблицы = ТабЧасть.НайтиПоИдентификатору(ТекСтрока);
{АвтоЗакупЦена Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(57)}:    КопированиеСтрокСервер.ПоместитьВыделенныеСтрокиВБуферОбмена(ТаблицаЗначений, "КопированиеВставкаСтрок");
{АвтоЗакупЦена Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(30)}:        СкопироватьВсеСтрокиНаСервере("Товары");
{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1974)}:    Результат = Форма.Записать(ПараметрыЗаписи);
{Документ.ПриобретениеТоваровУслуг.Форма.ФормаДокумента.Форма(8650)}:    ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме(ЭтотОбъект, ПараметрыДляЗаписи);


// Помещает данные в буфер обмена
//
// Параметры:
//   ВыделенныеСтроки - Массив - Массив идентификаторов выделенных строк
//   ТабЧасть -ТабличнаяЧасть - Табличная часть объекта с копируемыми строками.
//   ИменаКолонок -Структура - содержит описание сопоставления имен колонок, если требуется.
//
Процедура ПоместитьВыделенныеСтрокиВБуферОбмена(ВыделенныеСтроки, ТабЧасть, ИменаКолонок = Неопределено) Экспорт
	ТаблицаБуфераОбмена = ИнициализироватьТаблицуБуфераОбмена();
	
	ВыделенныеСтрокиТЧ = Новый Массив;
	Если ВыделенныеСтроки <> Неопределено Тогда
		
		Для Каждого ТекСтрока Из ВыделенныеСтроки Цикл
			СтрокаТаблицы = ТабЧасть.НайтиПоИдентификатору(ТекСтрока);
			ВыделенныеСтрокиТЧ.Добавить(СтрокаТаблицы);
		КонецЦикла;
		
		НаборыВызовСервера.ДополнитьДоПолногоНабора(ТабЧасть, ВыделенныеСтрокиТЧ);
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ВыделенныеСтрокиТЧ) Тогда
		
		КопируемаяКоллекция = ВыделенныеСтрокиТЧ;
		
	Иначе
		
		КопируемаяКоллекция = ТабЧасть;
		
	КонецЕсли;
	
	Для каждого СтрокаТаблицы Из КопируемаяКоллекция Цикл
		
		НоваяСтрока = ТаблицаБуфераОбмена.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);
		
		Если ИменаКолонок <> Неопределено Тогда
			
			Для Каждого КлючИЗначение Из ИменаКолонок Цикл
				НоваяСтрока[КлючИЗначение.Значение] = СтрокаТаблицы[КлючИЗначение.Ключ]
			КонецЦикла
			
		КонецЕсли;
		
	КонецЦикла;
	
	СкопироватьТаблицуВБуферОбмена(ТаблицаБуфераОбмена, "Строки");
	
КонецПроцедуры
12 Lepexa207
 
07.05.24
06:50
(4) им нужно наглядно видеть + это их механизм работы такой, сначала делать поступление, по нему установку цен, чтобы потом видеть разницу изменения цен, чтобы выставить к примеру розничную цену
13 Lepexa207
 
07.05.24
10:58
(0) Решил задачу тем, чтоб просто минусовать выбранные строки на 1:

Для каждого Стр из Объект.Товары Цикл      
 Элементы.Товары.ВыделенныеСтроки.Добавить(Стр.НомерСтроки-1);
КонецЦикла;
14 Волшебник
 
07.05.24
11:16
(13) Вы перешли от номера строки (с 1) к индексу (с 0).
15 Lepexa207
 
07.05.24
12:50
(14) Ну да, в процессе кода в массиве ищется 3 элемента (0, 1 и 2), когда в табличной части всего 2 номенклатуры. С -1 в массиве становится столько же элементов (0, 1), сколько и в документе. Проверка происходит успешно и скопированные данные подставляются "Установку цен"
16 Волшебник
 
07.05.24
12:56
(15) жуть