Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 дек 2023, 01:50

Получить значение реквизита справочника

Автор 7Stinger7, 03 июл 2022, 09:02

0 Пользователей и 1 гость просматривают эту тему.

7Stinger7

Всем привет, есть документ спецификация, в нем табличная часть в которой есть реквизит артикул, необходимо при выборе комплектующего что бы артикул автоматически брался с справочника фурнитура (там тоже реквизит артикул) и вставлялся в артикул в документе.Screenshot_1.pngScreenshot_2.png 

alexandr_ll

7Stinger7, https://capitally.ru/1c-development/dopolnitelnaya-vychislyaemaya-kolonka-v-tablichnoj-chasti/

Дополнительная вычисляемая колонка в табличной части

Иногда возникает необходимость вывода в табличное поле документа (или любого другого объекта, имеющего табличную часть) дополнительных колонок с данными, которые не содержатся непосредственно в табличной части. Реализовать это на платформе 1С: Предприятие 8.1 или 8.2 в режиме обычного приложения (без использования управляемых форм) было достаточно просто, чего не скажешь об управляемых формах в 1С 8.2.

Реализация на платформе 1С: Предприятие 8.1 (или в обычном приложении)

В начале коротко о том, как добавить дополнительную колонку в табличное поле на платформе 1С 8.1.

Предположим, что у нас есть некий документ с табличной частью "Товары" (с колонками "Номенклатура" и "Количество") и нам нужно вывести дополнительную колонку "Цена", которая бы содержала данные реквизита "Цена" элементов справочника "Номенклатура", выбранных в строках табличной части.

Для этого нам достаточно добавить в форме документа новую колонку "Цена" в табличное поле, содержащее данные табличной части документа и написать следующий код в обработчике события "ПриПолученииДанных" этого табличного поля:

// обработчик события «ПриПолученииДанных» табличного поля «Товары»
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Номенклатура = ОформлениеСтроки.ДанныеСтроки.Номенклатура;
Если ЗначениеЗаполнено(Номенклатура) Тогда
ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.Цена.Текст = Формат(Номенклатура.Цена,«ЧЦ=15; ЧДЦ=2»);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Хочу обратить внимание на то, что строки табличного поля обрабатываются порциями, по мере прокрутки списка.

Реализация на платформе 1С: Предприятие 8.2 (8.3 управляемое приложение)

На платформе 8.2 с использованием управляемых форм решение данной задачи потребует бóльших усилий. Это связано с тем, что за счет своей клиент-серверной ориентированности в платформе 8.2 в управляемом режиме отсутствуют некоторые привычные возможности - например, у табличного поля отсутствуют обработчики событий "ПриПолученииДанных" и "ПриВыводеСтроки", которые мы могли бы использовать для этих целей в 1С 8.1 или 8.2 в обычных формах.

Пусть в нашей конфигурации есть документ "ВводОстатковДолга" с табличной частью "Контрагенты" (с колонками "Контрагент" и "Сумма"). В свою очередь у справочника "Контрагенты" есть реквизит "ИНН", значение которого необходимо выводить в строках табличного поля.

[qu_spoiler title=»Примечание от 'Капитально:» open=»yes» icon=»chevron-circle»]в статье взят неудачный пример т.к. реквизиты вынести можно получить гораздо проще, но тем не менее статья полезна для рассмотрения в учебных целях[/qu_spoiler]

Откроем управляемую форму документа, добавим новую колонку "ИНН" реквизита "Контрагенты" и перенесём её на закладку "Элементы" (для отображения в форме).

kontargentinn-dobalvenie-v-polya-tablitsy

Откроем палитру свойств поля "КонтрагентыКонтрагент" и добавим обработчик события "ПриИзменении"

// служебная функция получения значения реквизита объекта (выполняется на сервере)
&НаСервере
Функция ЗначениеРеквизита(Объект,ИмяРеквизита);
Возврат Объект[ИмяРеквизита];
КонецФункции

// обработчик события «ПриИзменении» поля «Контрагент» в табличном поле «Контрагенты»
&НаКлиенте
Процедура КонтрагентыКонтрагентПриИзменении(Элемент)
ТекДанные = Элементы.Контрагенты.ТекущиеДанные;
ТекДанные.ИНН = ЗначениеРеквизита(ТекДанные.Контрагент,«ИНН»);
КонецПроцедуры

Это обеспечит нам изменение значения поля "ИНН" при выборе контрагента в строке табличного поля.
Теперь необходимо предусмотреть заполнение колонки "ИНН" при открытии формы документа, а так же после записи и при чтении на сервере.

Обновление данных после записи и при чтении на сервере необходимо в связи с тем, что иначе значения колонки "ИНН" будут очищаться каждый раз при возникновении этих событий. Для заполнения колонки "ИНН" опишем в модуле формы служебную серверную процедуру:

// служебная процедура для заполнения колонки «ИНН» табличного поля «Контрагенты»
&НаСервере
Процедура ОбновитьДанныеКолонкиИНН()
Запрос = Новый Запрос(
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Ссылка В(&СписокКонтрагентов)»
);
Запрос.УстановитьПараметр(«СписокКонтрагентов»,Объект.Контрагенты.Выгрузить().ВыгрузитьКолонку(«Контрагент»));
Выборка = Запрос.Выполнить().Выбрать();
Для Каждого Стр Из Объект.Контрагенты Цикл
Если Выборка.НайтиСледующий(Стр.Контрагент,«Контрагент») Тогда
Стр.ИНН = Выборка.ИНН;
Иначе
Стр.ИНН = «»;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Затем добавим в модуль формы документа обработчики событий "ПриОткрытии", "ПриЧтенииНаСервере" и "ПослеЗаписиНаСервере", в каждой из которых будем вызвать описанную ранее служебную процедуру "ОбновитьДанныеКолонкиИНН"

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

Всё готово. Можно посмотреть на результат.

primer-dopolnitelnoj-kolonki-v-spiske

Статья найдена на просторах интернета

Как добавить реквизит объекта в таблицу формы

dobavit-rekvizit-obekta-v-spisok-tablitsy-formy

Любые издержки на рекламную кампанию:
- больше, чем может позволить себе клиент;
- меньше, чем ожидали люди из творческого отдела;
- примерно такие, которых с ужасом опасались бухгалтеры.


7Stinger7

alexandr_ll, а можешь конкретно по моему примеру написать как должно быть. Просто не особо понимаю сути

alexandr_ll

7Stinger7, сделайте выгрузку базы и дайте ссылку

7Stinger7


alexandr_ll

7Stinger7, Что у вас там за пользователь? Выгрузите только файл конфигурации (cf)

7Stinger7


7Stinger7

alexandr_ll, получится решить мою проблему?

Похожие темы (5)

Рейтинг@Mail.ru

Поиск