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

Как подставить в табл.часть значение реквизита выбранного элемента справочника?

Автор Дммитррий, 23 мая 2023, 06:59

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

Дммитррий

Добрый день, пишу простенькую конфигурацию и обработку к ней (в целях обучения), столкнулся с рядом проблем, которые никак не выходит решить.
Суть в чем:
Есть справочник "Товары", у него есть реквизиты - КоличествоТовараВУпаковке, ОбъемУпаковки, ВесУпаковки, ЦенаУпаковки
Есть документ "ПродажаТовара", у него есть табличная часть с реквизитами - Товар, КоличествоТовараВУпаковке, ОбъемУпаковки, ВесУпаковки, ЦенаУпаковки (Поле реквизита Товар выбирается из спр. Товары.)

Задача 1:
При выборе Товара в поле табличной части документа ПродажаТовара, надо чтобы заполнялись поля: КоличествоТовараВУпаковке, ОбъемУпаковки, ВесУпаковки, ЦенаУпаковки (также данными из справочника).

Задача 2:
Обработка должна суммировать вес и объем всех товаров в документе, после чего сообщать эту информацию пользователю.

Заранее безумно благодарю...

Максим75

Дммитррий, вот по задаче 1 только было уже здесь, детально все описали как и чего.
по задаче 2: в обработчике товара при изменении написать что-то такое:

СтрокаТабличнойЧасти = Элементы.ТМЦ.ТекущиеДанные;
СтрокаТаблЧасти.Сумма = СтрокаТаблЧасти.Цена*СтрокаТаблЧасти.Колво;;

заменить на свои реквизиты (здесь сумма считается)

Дммитррий


fruitella

Дммитррий, чтобы решить первую задачу, тебе надо всегда продумать логику решения и разбить задачу на подзадачи.
1. Надо получить данные из справочника. Как это сделать? Через глобальный контекст ссылка или через sql запрос, написав который можно воспользоваться конструктором.
2. Пройтись циклом по объекту, где ты получил данные и записать их в документ.
3. Просить решение не правильный подход, вот пример можно. Посмотри тут прям пошаговая инструкция: https://dzen.ru/a/Ypsbz_FMjyl7u7E3

Программное заполнение таблицы значений на форме.

Всем привет! В этот раз разберу небольшой и, думаю, полезный пример по заполнению таблиц, расположенных на форме.Я подготовил заранее созданную базу, Вам останется только лишь повторить то, что я тут буду писать.
Обращаю внимание: для загрузки этой базы потребуется версия платформы не ниже 8.3.20.1590!

В моей конфигурации присутствуют:

  1. Справочник "Товары" с реквизитом "Назначение товара";
  2. Перечисление - "Назначение товара" для реквизита справочника "Товары" из пункта (1);
  3. Документ "Поступление товаров" с реквизитом "Вид Цены" и классической табличной частью (товар, количество ,цена, сумма);
  4. Перечисление -"Виды цен" для реквизита документа "Поступление товаров" из пункта (3), а так-же, для регистра сведений "Цены товаров" из пункта (5);
  5. Выше упомянутый регистр сведений "Цены товаров". Измерения - "Вид цены" и "Товар". Ресурс - "Цена";
Вопрос на засыпку: чем отличается "Ресурс" регистра накопления от "Ресурс" регистра сведений?

6. И, соответственно, регистр накопления "Поступившие товары". Измерения - "Товар". Ресурс - "Количество".

Специально назвал объекты так, чтобы не было похожих на классические названия, для зарядки мозгов при повторе создания 😉

Итак, приступим!

Первое, что мы сделаем, - это создадим новую внешнюю обработку.

"Файл - новый - внешняя обработка".

Получим вот такой вид (рис.1):

Рис.1Рис.1

Рис.1

Имя и синоним задавайте, как вам угодно.

Видим "Реквизиты", "Табличные части", "Формы" и "Макеты".
Тут есть два варианта действий: либо создавать табличную часть как реквизит объекта, либо же создать таблицу значений как реквизит формы (после создания формы, разумеется).

Я пойду через таблицу значений. Если кто-то захочет, то пишите; я опишу суть действия через табличную часть.

Реквизит объекта - хранит информацию в базе данных.
Реквизит формы - содержит информацию лишь до тех пор, пока открыта форма, после закрытия формы. (Можно сказать, его не существует)
Рис.2Рис.2

Рис.2

Кликаем по "Формы" ПКМ и нажимаем добавить, далее в окне жмем "Готово".(рис.2).

Рис.3Рис.3

Рис.3

Наша форма создалась! Ура!

Что же теперь нам делать?

Нам нужно получить данные о количестве пришедшего товара, его стоимости, вида его цены.

Чтобы получить данные, нужна какая-то кнопка, ну и, соответственно, нужно что-то, во что мы поместим все эти данные, чтобы на них любоваться.

Начнем с определения места где мы будем все это видеть. А видеть мы будем это в таблице значений.

Создаем таблицу значений с набором реквизитом имеющих нужные нам типы данных.

Рис.4Рис.4

Рис.4

На (рис.4) добавили реквизит, обозвали его "Табличка" (надеюсь, он не обиделся) и выбрали ему тип "Таблица значений".

Далее создаем колонку реквизита "Табличка".

Рис.5Рис.5

Рис.5

Указываем ему тип. И так для всех интересующих нас реквизитов, а это :

  • "Товар" тип "СправочникСсылка.Товары";
  • "Количество" тип "Число" точность 2, длина 15;
  • "Цена" тип "Число" точность 2, длина 15;
  • "ВидЦены" тип "Перечисления.ВидыЦен";
  • "ТипТовара" тип "Перечисления.ТипыТоваров".
Рис.6Рис.6

Рис.6

Колонки реквизита создаются вот так. (рис.6). ПКМ на реквизит и "Добавить колонку реквизита".

Рис.7Рис.7

Рис.7

Вот что мы получаем.

Теперь берем и перетаскиваем нашу табличку на форму. Просто ЛКМ тянете её в право. На вопрос "Добавить все колонки бла-бла-бла?" отвечаете "да".

Рис.7Рис.7

Рис.7

Ну вот и все, у нас на форме есть таблица со всеми интересующими нас реквизитами.

Снова ура!👍

Теперь осталось самое интересное и трудное - это заполнить нашу таблицу.🤔

Для заполнения нам потребуется команда...и...чуть не забыл...,добавим на форму реквизит "ВидЦены" с типом "Перечисления.ВидыЦены".

Для чего? А для того, чтобы мы выбирали определенный вид цены и получали товары из наличия только с этим видом.

Рис.8Рис.8

Рис.8

И так же ЛКМ перетаскиваем его на форму.

Рис.9Рис.9

Рис.9

Все, приступим к созданию команды и заполнению таблицы.✔

Создаем команду вот тут (рис.10).

Рис.10Рис.10

Рис.10

Нажимаем на плюсик и называем как хотим.(рис.11)

Рис.11Рис.11

Рис.11

Создали, отлично! Теперь в поле действие (рис.11) нажимаем на лупу и создаем обработчик команды на сервере и на клиенте.

Рис.12Рис.12

Рис.12

Почему на сервере и на клиенте? И что такое сервер и клиент? Сервер - это наша база данных, где записаны все данные о наших объектах.
Клиент - это пользовательская часть интерфейса в которой он может видеть данные, которые мы ему любезно предоставляем из базы данных. Также он может записывать новые данные в реквизиты объектов. Эти данные будут записываться в базу данных.
Соответственно, для того, чтобы заполнить таблицу, нам нужно нажать на кнопку в пользовательском интерфейсе, после чего сработает процедура, которая на сервере вытащит все нужные нам данные и покажет их пользователю.
Рис 13.Рис 13.

Рис 13.

При нажатии на кнопку на форме сработает процедура "ЗаполнитТаблицуНаСервере()", которая будет выполнена на сервере. Повторюсь.

Итак, заполним эту процедуру программным кодом.

Для того, что бы получить данные, что нам нужно? Правильно, очень вежливо попросить их у базы данных, с помощью хорошо и правильно построенного ЗАПРОСА.

Удаляем "// Вставить содержимое обработчика." .Кликаем ПКМ и вызываем конструктор запроса с обработкой результата.(рис.14)

Рис.14Рис.14

Рис.14

Зайдем в "Таблицы и поля" и выберем две таблицы рис.15.

Рис.15Рис.15

Рис.15

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

Рис.16Рис.16

Рис.16

Зайдем на вкладку "Связи" и свяжем эти таблицы между собой ЛЕВЫМ соединением.(рис.17)

Рис.17Рис.17

Рис.17

Левая таблица у нас будет "ПоступлениеТоваровОстатки". Левое соединение значит, что в результат войду все данные таблицы слева и данные таблицы справа, которые соответствуют условию связи. Нашу условие - это "Товар = Товар".

Во вкладке "Группировка" сделаем группировку по товару и суммируемое поле сделаем "КоличествоОстаток"

Рис.18Рис.18

Рис.18

К примеру, у нас будет 10 штук "Товар 1" с разным количеством. Зачем нам выводить 10 строк одинакового товара, когда можно вывести его одной строкой и посчитать его общее количество. Это я и реализовал на рис.18

Осталось совсем немного.

Мы же хотим получать товары с указанным видом цены. Для этого зайдем в во вкладку "Условия" и зададим условие.

Программное заполнение таблицы значений на форме.

И напишем условие, что выбирать будем только те записи, где "ВидЦены" = виду цены указанном на форме. (& alt + 3 + 8)

Жмем "Ок". Все, запрос сформирован.

Рис. 19Рис. 19

Рис. 19

Удаляем все лишнее и оставляем только текст запроса и установку параметра. (Рис. 19)

"ВидЦены" - это параметр с формы, который мы будем указывать в режиме предприятия.

У нас есть запрос к данным, у нас есть таблица и у нас есть команда - все в сборе, можно завершать работу.

Давайте загрузим результат в нашу таблицу на форме. (рис.20)

Рис. 20Рис. 20

Рис. 20

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

  • Выполняем запрос - получаем его данные. Метод "Выполнить()"
  • Выгружаем в таблицу значений. Метод "Выгрузить().

Выполнить().Выгрузить() - все.

У таблицы значений так же есть метод "Загрузить()", который загружает в неё данные из другой любой таблицы значений, при условии одинаковых названий колонок и одинаковых типов в них.

В ходе выполнения запроса мы получили таблицу значений с: товаром(тип справочник), количеством(число), видом цены (перечисление), ценой (число)
Мы имеем таблицу значений на форме с: товаром(тип справочник), количеством(число), видом цены (перечисление), ценой (число)

Следовательно, возьмем и загрузим таблицу значений полученную в результате запроса в нашу таблицу значений на форме.

Рис.21.Рис.21.

Рис.21.

Обратите внимание ещё раз!
Название полей и их типы в запросе, должны быть точно такие же как и в созданной таблице на форме!

Ещё один нюанс. Так как у нас ЛЕВОЕ соединение, где главная таблица "ПоступившиеТовары", то в таблице "ЦеныТоваров" возможны пустые значения(литерал NULL). Для избавления от них допишем немного наш запрос (рис.22).

Рис.22.Рис.22.

Рис.22.

Используем функцию языка запросов ЕСТЬNULL(). Она приводит значение с типом NULL к значению, которое укажет разработчик.

Все. Сохраняем нашу обработку. Обзываем как угодно. И заходим в режим пользователя.

Кстати, не забудьте перенести команду на форму. Также левой клавишей.

Программное заполнение таблицы значений на форме.
Программное заполнение таблицы значений на форме.

Открываем через файл открыть в режиме пользователя.

Программное заполнение таблицы значений на форме.

Выбираем вид цены и нажимаем "Заполнить таблицу".

Программное заполнение таблицы значений на форме.

Получаем товары в наличии с типом цены "Самая дорогая цена"

Вид товара я нарочно оставил пустым. Подумайте сами, как сделать, чтобы и он тоже заполнялся 😁А также подумайте, как получать нужные нам данные по заданному временному интервалу .Если не придумаете, а я уверен, что придумаете, то пишите мне, я буду очень рад подсказать.

Вот сама обработка, для ленивых.

Ну вот и все. Надеюсь, этот скромный пример поможет вам.


fruitella


Максим75

Дммитррий, в управляемых формах все по первому вопросу просто:

открываем конструктор формы документа.
разворачиваем в реквизитах объект, находим Товар или ТМЦ или как там у Вас задана номенклатура.
Разворачиваем ее и тащим мышом в Элементы нужные реквизиты.
таким образом при выборе номенклатуры, все что с ней связано заполнится автоматом и никакого кода писать не нужно.

Дммитррий

fruitella, я правильно понимаю, что кнопка "Добавить" (в таком случае) будет существовать без надобности?

Дммитррий

fruitella, где можно посмотреть пример подобного обхода? А то пока (по этому гайду) получается только залить весь справочник в табличную часть документа

fruitella

Дммитррий, Надо тогда сделать добавление по выбранному значению. Вроде есть возможность обмена данными через временное хранилище. Почитай о нем тоже.
Принцип вроде будет работать такой: Пользователь выбирает определенный товар, объектом будет являться ВыбранноеЗначение его передаешь как аргумент в функцию. Затем уже в самой функции или в процедуре (не важно) на сервере, ты получаешь адрес выбранного значения.
Теперь дело за малым, проходимся циклом по переменной, которой ты присвоил получение адреса из временного хранилища и вытягиваем данные и передаем в табличную часть ну или куда тебе нужно.

У меня выстраивается лишь такая логика.

Дммитррий

Максим75, А как к таким (скопированным) реквизитам обращаться в коде? Если мне хочется посчитать какой-то другой реквизит (Скопировал из справочника цену товара, руками внес количество товара, надо чтоб считалась сумма)

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

Рейтинг@Mail.ru

Поиск