Действия
1. Создать документ со следующими характеристиками:
- Имя: ЗаказПоставщику
- Подсистемы: Закупки
- Данные → Реквизиты: Поставщик (Тип: СправочникСсылка.Контрагенты; Проверка заполнения: Выдавать ошибку)
- Данные → Реквизиты: Склад (Тип: СправочникСсылка.Склады; Проверка заполнения: Выдавать ошибку)
- Данные → Реквизиты: СуммаДокумента (Тип: Число; Длина: 15; Точность: 2; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
- Данные → Табличные части: Товары
- Данные → Табличные части → Реквизиты: Номенклатура (Тип: СправочникСсылка.Номенклатура; Проверка заполнения: Выдавать ошибку)
- Данные → Табличные части → Реквизиты: Количество (Тип: Число; Длина: 15; Точность: 3; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
- Данные → Табличные части → Реквизиты: ЦенаПоступления (Тип: Число; Длина: 15; Точность: 2; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
- Данные → Табличные части → Реквизиты: Сумма (Тип: Число; Длина: 15; Точность: 2; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
2. Создать форму документа «ЗаказПоставщику» и привести расположение ее элементов к следующему виду:
3. При изменении номенклатуры обеспечить подтягивание в документ ее цены.
Обратите внимание, что у выбираемой номенклатуры должна быть установлена эта самая цена в справочнике «Номенклатура», в противном случае получим 0, визуально выглядящий, как пустое поле.
- Установить действие элемента Товары.ТоварыНоменклатура на событие <ПриИзменении>
- Выбрать вариант: Создать на клиенте
- Ввести следующий код:
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные — в переменную «СтрокаТабличнойЧасти» записываем данные текущей строки, обращаясь к коллекции элементов формы «Элементы», затем к содержащейся в этих элементах табличной части «Товары» (выделено красным на скриншоне ниже), а потом к методу табличной части «ТекущиеДанные». Теперь в переменной «СтрокаТабличнойЧасти» содержаться все данные текущей строки: НомерСтроки, Номенклатура, Количество, ЦенаПоступления и Сумма.
Такая запись позволяет системе быстрее, а программисту проще обращаться к данным строки. Например, вместо записи Элементы.Товары.ТекущиеДанные.ЦенаПоступления или Элементы.Товары.ТекущиеДанные.Номенклатура, можно писать СтрокаТабличнойЧасти.ЦенаПоступления и СтрокаТабличнойЧасти.Номенклатура, соответственно. То же самое касается и остальных полей табличной части формы.
- Т.к. обращение к самим данным (в данном случае — получение закупочной цены из справочника «Номенклатура») возможно только на стороне сервера, нужно написать соответствующую серверную функцию:
Функция ЦенаИзНоменклатурыНаСервере(Номенклатура) — объявление функции «ЦенаИзНоменклатурыНаСервере» и определение ее аргумента «Номенклатура», т.е. значения, которое должно быть передано в функцию для успешного ее выполнения. В данном случае в качестве аргумента функции ожидаем ссылку на элемент справочника «Номенклатура».
Возврат Номенклатура.ЦенаЗакупки — получение цены закупки, указанной номенклатуры и возврат ее в качестве результата выполнения функции. Здесь мы обращаемся к аргументу «Номенклатура», переданному в функцию и представляющему собой ссылку на определенный элемент справочника «Номенклатура», а затем к реквизиту «ЦенаЗакупки» данного элемента.
Ключевое слово «Возврат» обязательно для любой функции, т.к. именно здесь происходит возврат результата выполнения функции в точку ее вызова.
Обратите внимание на комментарии перед функцией. Такие комментарии являются хорошим тоном в программировании, т.к. позволяют системе при написании обращения к функции выводить подсказки о том, что она делает, какие аргументы ожидает и что в итоге вернет:
- Теперь из процедуры «ТоварыНоменклатураПриИзменении» можно вызвать эту функцию и записать цену в соответствующее поле табличной части:
СтрокаТабличнойЧасти.ЦенаПоступления = ЦенаИзНоменклатурыНаСервере(СтрокаТабличнойЧасти.Номенклатура) — обращение к функции «ЦенаИзНоменклатурыНаСервере» с передачей ей в качестве аргумента ссылки на номенклатуру, находящейся в текущей строке (СтрокаТабличнойЧасти.Номенклатура) и запись полученного из функции значения в поле «ЦенаПоступления» текущей строки (СтрокаТабличнойЧасти.ЦенаПоступления).
4. При изменении количества обеспечить расчет суммы по строке:
- Установить действие элемента Товары.ТоварыКоличество на событие <ПриИзменении>
Выбрать вариант: Создать на клиенте
- Ввести следующий код:
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные — в переменную «СтрокаТабличнойЧасти» записываем данные текущей строки.
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаПоступления — вычисляем сумму строки путем произведения количества (СтрокаТабличнойЧасти.Количество) на цену поступления (СтрокаТабличнойЧасти.ЦенаПоступления) и записываем получившийся результат в поле «Сумма» (СтрокаТабличнойЧасти.Сумма).
5. При изменении цены обеспечить расчет суммы по строке:
- Установить действие элемента Товары.ТоварыЦенаПоступления на событие <ПриИзменении>
Выбрать вариант: Создать на клиенте
- Ввести следующий код:
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные — в переменную «СтрокаТабличнойЧасти» записываем данные текущей строки.
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаПоступления — вычисляем сумму строки путем произведения количества (СтрокаТабличнойЧасти.Количество) на цену поступления (СтрокаТабличнойЧасти.ЦенаПоступления) и записываем получившийся результат в поле «Сумма» (СтрокаТабличнойЧасти.Сумма).
6. Так же добавить вычисление суммы строки при выборе номенклатуры, внеся дополнение в уже имеющуюся процедуру «ТоварыНоменклатураПриИзменении»:
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаПоступления — вычисляем сумму строки путем произведения количества (СтрокаТабличнойЧасти.Количество) на цену поступления (СтрокаТабличнойЧасти.ЦенаПоступления) и записываем получившийся результат в поле «Сумма» (СтрокаТабличнойЧасти.Сумма).
7. Обеспечить расчет суммы всего документа при его записи в базу:
- В модуле документа создать обработчик события <ПередЗаписью>
Именно в модуле документа обычно располагается код, который выполняется при записи или проведении документа.
- Ввести следующий код:
СуммаДокумента = Товары.Итог("Сумма") — здесь вызываем метод Итог() табличной части «Товары» и указываем в качестве его аргумента имя столбца ("Сумма"), по которому нужно получить итог. Затем записываем полученное значение в реквизит документа «СуммаДокумента». Как видно из кода, в модуле документа происходит обращение непосредственно к его реквизитам и табличной части, поэтому отсутствуют такие конструкции, как Элементы.Товары… или Объект.Товары…, которые использовались при написании процедур формы.
8. Проверить результат в пользовательском режиме:
- Указать поставщика и склад
- Выбрать товар: при этом должна подтянуться его цена (если цена не подтягивается, нужно проверить, указана ли она для выбранного товара в справочнике «Номенклатура»)
- Указать количество: при этом должна рассчитаться сумма строки
- Попробовать изменить количество или цену: при этом сумма строки должна соответствующим образом пересчитываться
- Записать документ: при этом рассчитается сумма всего документа и установится в поле «Сумма документа»