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