Добавление колонки себестоимость в прайс-лист. УТ 11
Проклятием типовых конфигураций является сильная привязка логики к интерфейсу при попытке сделать красиво.
Клиенту нужно было добавить колонку себестоимость в обработку «Прайс-лист», чтобы он мог сверять цены с себестоимостью.
Решение казалось простым — я просто программно добавил колонку себестоимости в ДеревоЦен обработки ПрайсЛист:
Но вот тут и сказался недостаток подхода методистов 1С. Они удаляли все колонки и потом добавляли свои, естественно, не восстанавливая добавленную мною:
В итоге дерево значений не могло восстановиться в реквизит формы.
Пришлось делать удаление своей колонки с последующим ее добавлением:
&НаСервере &Вместо("ПрименитьНастройки") Процедура дор_ПрименитьНастройки(АдресВоВременномХранилище, ДанныеРедактированияПрайсЛиста) дор_УдалитьКолонки(); ПродолжитьВызов(АдресВоВременномХранилище, ДанныеРедактированияПрайсЛиста); дор_СоздатьКолонки(); дор_ПолучитьСебестоимость(); КонецПроцедуры &НаСервере Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) дор_СоздатьКолонки(); КонецПроцедуры
При создании формы также создаю колонки, чтобы их появление после формирования прайс-листа не было для пользователя сюрпризом.
Процедуры создания и удаления колонок простые:
&НаСервере Процедура дор_УдалитьКолонки() Экспорт Перем Колонки; Если Элементы.Найти("дор_Себестоимость") <> Неопределено Тогда Элементы.Удалить(Элементы.дор_Себестоимость); Колонки = Новый Массив; Колонки.Добавить("ДеревоЦен.дор_Себестоимость"); ИзменитьРеквизиты(, Колонки); КонецЕсли; КонецПроцедуры &НаСервере Процедура дор_СоздатьКолонки() Экспорт НовыеКолонки = Новый Массив; НовыеКолонки.Добавить(Новый РеквизитФормы("дор_Себестоимость", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), "ДеревоЦен", "С-сть")); ИзменитьРеквизиты(НовыеКолонки); // ключевая процедура, которая добавляет ревизиты Элемент = Элементы.Вставить("дор_Себестоимость", Тип("ПолеФормы"), Элементы.ДеревоЦен, Элементы.ДеревоЦенЦеноваяГруппа); Элемент.Вид = ВидПоляФормы.ПолеВвода; Элемент.ПутьКДанным = "ДеревоЦен.дор_Себестоимость"; Элемент.ТолькоПросмотр = истина; Элемент.Ширина = 4; Элемент.АвтоМаксимальнаяШирина = ложь; Элемент.РастягиватьПоГоризонтали = ложь; Элементы.дор_Себестоимость.Видимость = истина; //После вывода отчета Элементы.дор_Себестоимость.Видимость = истина; КонецПроцедуры
Код заполнения себестоимости тоже довольно простой, у клиента не использовались характеристики, поэтому достаточно перебрать строки первого уровня:
&НаСервере Процедура дор_ПолучитьСебестоимость() Экспорт ДЗ = РеквизитФормыВЗначение("ДеревоЦен"); М = ДЗ.Строки.ВыгрузитьКолонку("Номенклатура"); //Выгружаем номенклатуру З = Новый Запрос(); З.Текст = "ВЫБРАТЬ | Т.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура, | ЕСТЬNULL(Т.Стоимость, 0) КАК Себестоимость |ИЗ | РегистрСведений.СтоимостьТоваров.СрезПоследних(&Дата, ) КАК Т |ГДЕ | Т.АналитикаУчетаНоменклатуры.Номенклатура В(&М)"; З.УстановитьПараметр("Дата", ТекущаяДата()); З.УстановитьПараметр("М", М); ТЗ = З.Выполнить().Выгрузить(); ТЗ.Индексы.Добавить("Номенклатура"); Для Каждого Строка ИЗ ДЗ.Строки Цикл ТекНоменклатура = Строка.Номенклатура; ИскСтрока = ТЗ.Найти(ТекНоменклатура, "Номенклатура"); Если ИскСтрока = Неопределено Тогда Строка.дор_Себестоимость = 0; Иначе Строка.дор_Себестоимость = ИскСтрока.Себестоимость; КонецЕсли; КонецЦикла; ЗначениеВРеквизитФормы(ДЗ, "ДеревоЦен"); КонецПроцедуры
В итоге получается такой результат:
Клиент просил заменить закупочную цену на себестоимость, но для этого не нужно программировать — закупочная цена убирается галочкой в настройках:
UPD 2021-10-07: была выявлена ошибка, если из карточки номенклатуры вызывать прайс-лист, выдается ошибка, что реквизит дор_Себестоимость уже есть, поэтому поправил процедуру создания колонок так:
&НаСервере Процедура дор_СоздатьКолонки() Экспорт //Осипов 2021-10-07 Если Элементы.Найти("дор_Себестоимость") <> Неопределено Тогда Возврат; КонецЕсли; ....
Среда: УТ 11.4.13.46
Объем: 1 час.
Свежие комментарии