19 subscribers

3.3 Объект «Документы». Создание, разработка алгоритмов

← К оглавлению

Действия

1. Создать документ со следующими характеристиками:

  • Имя: ЗаказПоставщику
  • Подсистемы: Закупки
  • Данные Реквизиты: Поставщик (Тип: СправочникСсылка.Контрагенты; Проверка заполнения: Выдавать ошибку)
  • Данные Реквизиты: Склад (Тип: СправочникСсылка.Склады; Проверка заполнения: Выдавать ошибку)
  • Данные Реквизиты: СуммаДокумента (Тип: Число; Длина: 15; Точность: 2; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
  • Данные Табличные части: Товары
  • Данные Табличные частиРеквизиты: Номенклатура (Тип: СправочникСсылка.Номенклатура; Проверка заполнения: Выдавать ошибку)
  • Данные Табличные частиРеквизиты: Количество (Тип: Число; Длина: 15; Точность: 3; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
  • Данные Табличные частиРеквизиты: ЦенаПоступления (Тип: Число; Длина: 15; Точность: 2; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)
  • Данные Табличные частиРеквизиты: Сумма (Тип: Число; Длина: 15; Точность: 2; Неотрицательное: Истина; Проверка заполнения: Выдавать ошибку)

2. Создать форму документа «ЗаказПоставщику» и привести расположение ее элементов к следующему виду:

Рисунок 1: Состояние конструктора формы документа «ЗаказПоставщику»
Рисунок 1: Состояние конструктора формы документа «ЗаказПоставщику»

3. При изменении номенклатуры обеспечить подтягивание в документ ее цены.

Обратите внимание, что у выбираемой номенклатуры должна быть установлена эта самая цена в справочнике «Номенклатура», в противном случае получим 0, визуально выглядящий, как пустое поле.
  • Установить действие элемента Товары.ТоварыНоменклатура на событие <ПриИзменении>
Рисунок 2: Установка события <ПриИзменении> для поля «Номенклатура» табличной части формы документа «ЗаказПоставщику»
Рисунок 2: Установка события <ПриИзменении> для поля «Номенклатура» табличной части формы документа «ЗаказПоставщику»
  • Выбрать вариант: Создать на клиенте
  • Ввести следующий код:
Листинг 1: Процедура формы на событие <ПриИзменении> элемента «Номенклатура» табличной части «Товары»
Листинг 1: Процедура формы на событие <ПриИзменении> элемента «Номенклатура» табличной части «Товары»

СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные — в переменную «СтрокаТабличнойЧасти» записываем данные текущей строки, обращаясь к коллекции элементов формы «Элементы», затем к содержащейся в этих элементах табличной части «Товары» (выделено красным на скриншоне ниже), а потом к методу табличной части «ТекущиеДанные». Теперь в переменной «СтрокаТабличнойЧасти» содержаться все данные текущей строки: НомерСтроки, Номенклатура, Количество, ЦенаПоступления и Сумма.

Рисунок 3: Элементы формы
Рисунок 3: Элементы формы

Такая запись позволяет системе быстрее, а программисту проще обращаться к данным строки. Например, вместо записи Элементы.Товары.ТекущиеДанные.ЦенаПоступления или Элементы.Товары.ТекущиеДанные.Номенклатура, можно писать СтрокаТабличнойЧасти.ЦенаПоступления и СтрокаТабличнойЧасти.Номенклатура, соответственно. То же самое касается и остальных полей табличной части формы.

  • Т.к. обращение к самим данным (в данном случае — получение закупочной цены из справочника «Номенклатура») возможно только на стороне сервера, нужно написать соответствующую серверную функцию:
Листинг 2: Функция получения закупочной цены указанной номенклатуры
Листинг 2: Функция получения закупочной цены указанной номенклатуры

Функция ЦенаИзНоменклатурыНаСервере(Номенклатура) — объявление функции «ЦенаИзНоменклатурыНаСервере» и определение ее аргумента «Номенклатура», т.е. значения, которое должно быть передано в функцию для успешного ее выполнения. В данном случае в качестве аргумента функции ожидаем ссылку на элемент справочника «Номенклатура».

Возврат Номенклатура.ЦенаЗакупки — получение цены закупки, указанной номенклатуры и возврат ее в качестве результата выполнения функции. Здесь мы обращаемся к аргументу «Номенклатура», переданному в функцию и представляющему собой ссылку на определенный элемент справочника «Номенклатура», а затем к реквизиту «ЦенаЗакупки» данного элемента.

Рисунок 4: Аргумент функции и его использование
Рисунок 4: Аргумент функции и его использование

Ключевое слово «Возврат» обязательно для любой функции, т.к. именно здесь происходит возврат результата выполнения функции в точку ее вызова.

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

Рисунок 5: Всплывающая подсказка для самописной функции
Рисунок 5: Всплывающая подсказка для самописной функции
  • Теперь из процедуры «ТоварыНоменклатураПриИзменении» можно вызвать эту функцию и записать цену в соответствующее поле табличной части:
Листинг 3: Получение и запись цены поступления товара в процедуре «ТоварыНоменклатураПриИзменении»
Листинг 3: Получение и запись цены поступления товара в процедуре «ТоварыНоменклатураПриИзменении»

СтрокаТабличнойЧасти.ЦенаПоступления = ЦенаИзНоменклатурыНаСервере(СтрокаТабличнойЧасти.Номенклатура) — обращение к функции «ЦенаИзНоменклатурыНаСервере» с передачей ей в качестве аргумента ссылки на номенклатуру, находящейся в текущей строке (СтрокаТабличнойЧасти.Номенклатура) и запись полученного из функции значения в поле «ЦенаПоступления» текущей строки (СтрокаТабличнойЧасти.ЦенаПоступления).

4. При изменении количества обеспечить расчет суммы по строке:

  • Установить действие элемента Товары.ТоварыКоличество на событие <ПриИзменении>
Рисунок 6: Установка события <ПриИзменении> для поля «Количество» табличной части формы документа «ЗаказПоставщику»
Рисунок 6: Установка события <ПриИзменении> для поля «Количество» табличной части формы документа «ЗаказПоставщику»

Выбрать вариант: Создать на клиенте

  • Ввести следующий код:
Листинг 4: Процедура формы на событие <ПриИзменении> элемента «Количество» табличной части «Товары»
Листинг 4: Процедура формы на событие <ПриИзменении> элемента «Количество» табличной части «Товары»

СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные — в переменную «СтрокаТабличнойЧасти» записываем данные текущей строки.

СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаПоступления — вычисляем сумму строки путем произведения количества (СтрокаТабличнойЧасти.Количество) на цену поступления (СтрокаТабличнойЧасти.ЦенаПоступления) и записываем получившийся результат в поле «Сумма» (СтрокаТабличнойЧасти.Сумма).

5. При изменении цены обеспечить расчет суммы по строке:

  • Установить действие элемента Товары.ТоварыЦенаПоступления на событие <ПриИзменении>
Рисунок 7: Установка события <ПриИзменении> для поля «ЦенаПоступления» табличной части формы документа «ЗаказПоставщику»
Рисунок 7: Установка события <ПриИзменении> для поля «ЦенаПоступления» табличной части формы документа «ЗаказПоставщику»

Выбрать вариант: Создать на клиенте

  • Ввести следующий код:
Листинг 5: Процедура формы на событие <ПриИзменении> элемента «ЦенаПоступления» табличной части «Товары»
Листинг 5: Процедура формы на событие <ПриИзменении> элемента «ЦенаПоступления» табличной части «Товары»

СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные — в переменную «СтрокаТабличнойЧасти» записываем данные текущей строки.

СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаПоступления — вычисляем сумму строки путем произведения количества (СтрокаТабличнойЧасти.Количество) на цену поступления (СтрокаТабличнойЧасти.ЦенаПоступления) и записываем получившийся результат в поле «Сумма» (СтрокаТабличнойЧасти.Сумма).

6. Так же добавить вычисление суммы строки при выборе номенклатуры, внеся дополнение в уже имеющуюся процедуру «ТоварыНоменклатураПриИзменении»:

Листинг 6: Дополнение процедуры «ТоварыНоменклатураПриИзменении» расчетом суммы строки табличной части
Листинг 6: Дополнение процедуры «ТоварыНоменклатураПриИзменении» расчетом суммы строки табличной части

СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаПоступления — вычисляем сумму строки путем произведения количества (СтрокаТабличнойЧасти.Количество) на цену поступления (СтрокаТабличнойЧасти.ЦенаПоступления) и записываем получившийся результат в поле «Сумма» (СтрокаТабличнойЧасти.Сумма).

7. Обеспечить расчет суммы всего документа при его записи в базу:

  • В модуле документа создать обработчик события <ПередЗаписью>
Именно в модуле документа обычно располагается код, который выполняется при записи или проведении документа.
Рисунок 9: Создание модуля объекта документа «ЗаказПоставщику»
Рисунок 9: Создание модуля объекта документа «ЗаказПоставщику»
  • Ввести следующий код:
Листинг 7: Процедура модуля объекта на событие <ПередЗаписью> документа «ЗаказПоставщику»
Листинг 7: Процедура модуля объекта на событие <ПередЗаписью> документа «ЗаказПоставщику»

СуммаДокумента = Товары.Итог("Сумма") — здесь вызываем метод Итог() табличной части «Товары» и указываем в качестве его аргумента имя столбца ("Сумма"), по которому нужно получить итог. Затем записываем полученное значение в реквизит документа «СуммаДокумента». Как видно из кода, в модуле документа происходит обращение непосредственно к его реквизитам и табличной части, поэтому отсутствуют такие конструкции, как Элементы.Товары… или Объект.Товары…, которые использовались при написании процедур формы.

8. Проверить результат в пользовательском режиме:

  • Указать поставщика и склад
  • Выбрать товар: при этом должна подтянуться его цена (если цена не подтягивается, нужно проверить, указана ли она для выбранного товара в справочнике «Номенклатура»)
  • Указать количество: при этом должна рассчитаться сумма строки
  • Попробовать изменить количество или цену: при этом сумма строки должна соответствующим образом пересчитываться
  • Записать документ: при этом рассчитается сумма всего документа и установится в поле «Сумма документа»
Рисунок 9: Результат работы формы «Заказ поставщику» в пользовательском режиме
Рисунок 9: Результат работы формы «Заказ поставщику» в пользовательском режиме

← К оглавлению