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