Заполнение документа установки цен на основании регистрации цен поставщика. УТ 11.5
Клиенту нужно было сделать возможность ввода документа «Установка цен номенклатуры» на основании документа «Регистрация цен поставщика».
Чтобы добавить ввод на основании, нашел хороший совет на Инфостарте, но несколько улучшил его, в модуле менеджера документа-основания («Регистрация цен поставщика») прописал простой код:
&После("ДобавитьКомандыСозданияНаОсновании") Процедура дор_ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) //https://forum.infostart.ru/forum9/topic184637/ Документы.УстановкаЦенНоменклатуры.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании); КонецПроцедуры
Далее по аналогии с заполнением по поступлению добавил свою процедуру заполнения в модуле документа «Установка цен номенклатуры»:
&После("ОбработкаЗаполнения") Процедура дор_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РегистрацияЦенНоменклатурыПоставщика") Тогда ЗаполнитьПоРегистрацииЦенНоменклатурыПоставщика( ДанныеЗаполнения, ДанныеЗаполнения); КонецЕсли; КонецПроцедуры Процедура ЗаполнитьПоРегистрацииЦенНоменклатурыПоставщика( //Скопировано из процедуры заполнения по поступлению Знач ДокументОснование, ДанныеЗаполнения) // Заполним данные шапки документа. Запрос = Новый Запрос( "ВЫБРАТЬ | ТаблицаТовары.Номенклатура КАК Номенклатура, | ТаблицаТовары.Характеристика КАК Характеристика, | Неопределено КАК Серия, //ТаблицаТовары.Серия, //Серии нет в этом документе | ТаблицаТовары.Упаковка КАК Упаковка, | ВидыЦен.Ссылка КАК ВидЦены, | 0 КАК Цена |ИЗ | Документ.РегистрацияЦенНоменклатурыПоставщика.Товары КАК ТаблицаТовары | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЦен КАК ВидыЦен | ПО (ВидыЦен.УстанавливатьЦенуПриВводеНаОсновании) | И (НЕ ВидыЦен.ПометкаУдаления) | И (ВидыЦен.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияВидовЦен.Действует)) |ГДЕ | ТаблицаТовары.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", ДокументОснование); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"), ДокументОснование); ВызватьИсключение Текст; Иначе ЭтотОбъект.ДокументОснование = ДокументОснование; ЗагрузитьТовары(РезультатЗапроса.Выгрузить()); КонецЕсли; КонецПроцедуры
Но заполнение не отрабатывало — выдавалась ошибка, что нет поля цены в форме. Отладка по сравнению с заполнением по поступлением, показала, что в таблице формы ВыбранныеЦены поле Выбрана у строки цены не установлена в Истина.
Причина оказалась в процедуре ЗаполнитьДокумент в форме документа установки цен, не заполнен документ-основание:

Тип документа основание в документе установки цен составной:
ДокументСсылка.ПриобретениеТоваровУслуг, ДокументСсылка.ЗаказПоставщику, ДокументСсылка.ВводОстатков, ДокументСсылка.ПоступлениеТоваровНаСклад, ДокументСсылка.СборкаТоваров, ДокументСсылка.ПриемкаТоваровНаХранение, ДокументСсылка.ПрочееОприходованиеТоваров, ДокументСсылка.ИзменениеАссортимента, ДокументСсылка.ПорчаТоваров
Но в расширении показывается как любая ссылка, я добавил свой тип документа-основания:

Немного было страшно обновлять, но все обновилось, ссылки не удалились.
После этого заполнение перестало выдавать ошибку, но цена закупки и розницы не заполнялись:

Добавил в табло выражение и увидел, что цены заполняются в процедуре ЗаполнитьДокумент при вызове кода:

Как и ожидалось, 1С тупо прописала в запросе СКД конкретный вид документа:

Поэтому мы пойдем своим путем и подставим цены сами. А вычисляемые цены рассчитаются уже далее типовым кодом. Расширяем процедуру УстановкаЦенСервер.ВычислитьЦеныПоДаннымИБ:
&После("ВычислитьЦеныПоДаннымИБ") Процедура дор_ВычислитьЦеныПоДаннымИБ(Форма, ТаблицаНоменклатуры, МассивСтрокВидовЦен, ТолькоНезаполненные, КэшДанных) ДокументОснование = Форма.Объект.ДокументОснование; Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.РегистрацияЦенНоменклатурыПоставщика") Тогда Для Каждого КЗ ИЗ КэшДанных.СоответствиеВидовЦенИменамКолонокТаблицыТоваров Цикл Если Найти(Врег(Строка(КЗ.Ключ)), "ЗАКУП") <> 0 Тогда //Работаем с этой ценой ВидЦены = КЗ.Ключ; ИмяКолонкиЦены = КЗ.Значение; КолонкаПроцента = "ПроцентИзменения" + ИмяКолонкиЦены; КолонкаСтаройЦены = "СтараяЦена" + ИмяКолонкиЦены; Прервать; КонецЕсли; КонецЦикла; Если ЗначениеЗаполнено(ВидЦены) Тогда //ЭлементыДерева = Форма.ДеревоЦен.ПолучитьЭлементы(); ДЗ = Форма.РеквизитФормыВЗначение("ДеревоЦен"); СтрокиДерева = ДЗ.Строки; //Заполняем по виду цены Для Каждого Строка ИЗ ДокументОснование.Товары Цикл ИскСтроки = СтрокиДерева.НайтиСтроки(Новый Структура("Номенклатура", Строка.Номенклатура)); Для Каждого ИскСтрока ИЗ ИскСтроки Цикл ИскСтрока[ИмяКолонкиЦены] = Строка.Цена; НоваяЦена = Строка.Цена; СтараяЦена = ИскСтрока[КолонкаСтаройЦены]; //Надо еще и процент считать ИскСтрока[КолонкаПроцента] = ?(СтараяЦена = 0, 0, Окр(НоваяЦена / СтараяЦена * 100 - 100, 2)); КонецЦикла; КонецЦикла; Форма.ЗначениеВРеквизитФормы(ДЗ, "ДеревоЦен"); КонецЕсли; КонецЕсли; КонецПроцедуры
И цены стали заполняться корректно:

Но приходится еще вычислять и процент изменения. Потому что 1С тоже делает это в компоновке. На скриншоте как раз процент не вычислял, пришлось поправить.
Взяв эту задачу в работу, я оценил ее в 1 час, хотя хотел в полчаса. Но вышло на самом деле даже больше, слишком много нюансов. Так что бойтесь деревьев в 1С!
Среда: УТ 11.5.22.83 Объем: 2 час.




Доброго времени суток А можно всё тоже, но только внешней обработкой на основании документа Реализации? Как тебе такое Гений?
Можно, но зачем? Если пользователям привычнее штатный механизм ввода на основании.
Кажется кто-то только что сломал работу других форм
это только кажется.
Нет, не только лишь
аргументы?
Ну прочти какие типы принимает параметр Форма в методе ВычислитьЦеныПоДаннымИБ. 1С это вполне документирует. А потом подумай почему не будет работать твой код и когда
думать не буду, на практике работает и клиенту уже задача сдана. Он доволен.
Если есть что сказать, говори, или вопрос останется нераскрытым.
Но можно сделать проверку на тип и имя формы, если она вызывается еще откуда-то. Нет проблем.
На сколько я знаю в ут 11 штатного механизма ввода Установки цен номенклатуры на основании Реализации нет. Или я что то пропустил? Просто клиент хочет, чтобы цены по каждой накладной закреплялись за Контрагентом.
не знаю, надо смотреть.
Проще прописать в расширении установки цен контрагента или по регистру «цены контрагентов»