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