| 
    
        
     
     | 
    
  | 
Параметр номер 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) жуть     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |