Урок №2.
Торговля и учет по складу.
Проверка на заполнение реквизитов в документе
Если вы обратили внимание, то некоторые поля в документе подчеркнуты красным цветом.
Это говорит нам о том, что эти поля необходимы к заполнению. Для чего это нужно? Это необходимо для того, чтобы мы знали на какой склад нам приходит продукция и что операторы при создании документа, не забудут заполнить это поле, иначе документ просто нельзя будет провести. Чтобы сделать поле необходимым для заполнения, в режиме конфигуратора установим свойство "Проверка заполнения" для этого поля - "Выдавать ошибку".
Предопределенные справочники. Автоматическое заполнение значений по умолчанию в документе
Чтобы каждый раз при заведении нового документа не заполнять реквизиты, которые как правило одни и те же, например - фирма, можно прописать нашу фирму как предопределенный справочник, и тогда при создании нового документа она будет заполняться автоматически. Заходим в свойства справочника и нажимаем ссылку "Предопределенные - открыть":
Теперь необходимо его прописать в наших документах:
Теперь разберемся, зачем все это нам нужно. Прежде всего, как было сказано выше, это позволит ускорить процесс введения документов, а во вторых, эти данные заносятся в конфигураторе из-за того чтобы по неосторожности нельзя было удалить этот элемент справочника. Кстати, в конфигураторе при создании нового элемента мы можем редактировать только Код и Наименование, а остальные реквизиты нам будут доступны и из самой программы. Чтобы выделить такие элементы от остальных, они в программе выводятся таким вот образом (с маленьким желтым кружочком):
Подстановка цены в табличную часть
Каждый раз при добавлении нового товара в табличную часть приходится цену вбивать вручную. Можно существенно облегчить жизнь, если брать цену из справочника товаров. Для этого необходимо создать процедуру, которая будет обрабатывать полученную номенклатуру и добавлять цену в табличную часть. Для этого прежде всего создадим форму нашего документа:
В появившемся окне выбираем элемент табличной части Товары:
и переходим к событиям этого элемента. Нам понадобится событие "ПриИзменении". Нажимаем кнопку с изображением лупы и проваливаемся в модуль документа. Программа автоматически создала процедуру ТЧТоварыТоварПриИзменении(Элемент):
Далее пишем следующий код:
&НаКлиенте
Процедура ТЧТоварыТоварПриИзменении(Элемент)
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти = Элементы["ТЧТовары"].ТекущиеДанные;
СтрокаТабличнойЧасти.Цена =ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
КонецПроцедуры
&НаСервере
Функция ПолучитьЦену(СсылкаНаСправочник)
//Находим объект справочник номенклатуры по переданной в
//функцию ссылку на этот справочник
СправочникПоСсылке = Справочники.Номенклатура;
СправочникПоСсылке = СсылкаНаСправочник.ПолучитьОбъект();
//Возвращаем цену
Возврат СправочникПоСсылке.РозничнаяЦена;
КонецФункции
Проверяем. Теперь при выборе товара автоматически заполняется поле Цена:
Расчет суммы по строке в документе
Рассчитывать каждый раз вручную сумму по строке документа крайне
неудобно, поэтому мы напишем одну процедуру, которая будет делать это за
нас. Вот исходный текст процедуры:
&НаКлиенте
Процедура РассчитатьСтрокуТабличнойЧастиДокумента()
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
СтрокаТабличнойЧасти.Сумма =СтрокаТабличнойЧасти.Количество*СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
но
этого недостаточно для расчета. Теперь нам необходимо эту процедуру
прописать в нужных обработчиках событий - ТЧТоварыТовар, ТЧТоварыЦена и
ТЧТоварыКоличество:
&НаКлиенте
Процедура ТЧТоварыТоварПриИзменении(Элемент)
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
СтрокаТабличнойЧасти.Цена =ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
Если СтрокаТабличнойЧасти.Количество = 0 Тогда
СтрокаТабличнойЧасти.Количество = 1;
КонецЕсли;
РассчитатьСтрокуТабличнойЧастиДокумента();
КонецПроцедуры
&НаКлиенте
ПроцедураТЧТоварыЦенаПриИзменении(Элемент)
// Вставить содержимое обработчика.
РассчитатьСтрокуТабличнойЧастиДокумента();
КонецПроцедуры
&НаКлиенте
Процедура ТЧТоварыКоличествоПриИзменении(Элемент)
// Вставить содержимое обработчика.
РассчитатьСтрокуТабличнойЧастиДокумента();
КонецПроцедуры
Теперь сумма по строке будет рассчитываться автоматически:
Объединение похожего кода в глобальных модулях
Весь этот код нам придется дублировать во всех документах т.е. мы написали код для Приходной накладной, и его нужно скопировать в Расходную накладную. А если у нас будут еще какие нибудь похожие документы, то придется этот код копировать и туда тоже. Это немного неудобно. Чтобы упростить нашу работу, можно вынести одинаковый код в отдельный модуль, который будет доступен в модулях документов. Для этого добавим два общих модуля в нашу конфигурацию и назовем их ОМРаботаСДокументамиСервер и ОМРаботаСДокументамиКлиент:
в свойствах модуля ОМРаботаСДокументамиСервер устанавливаем галку на значении "Сервер" и "Вызов сервера":
а в свойствах модуля ОМРаботаСДокументамиКлиент устанавливаем галку на значении "Сервер" и "Вызов сервера":
В модуль ОМРаботаСДокументамиСервер вставим код:
Функция ПолучитьЦену(СсылкаНаСправочник) Экспорт
СправочникПоСсылке = Справочники.Номенклатура;
СправочникПоСсылке =СсылкаНаСправочник.ПолучитьОбъект();
Возврат СправочникПоСсылке.РозничнаяЦена;
КонецФункции
а в модуль ОМРаботаСДокументамиКлиент вставим код:
Процедура РассчитатьСтрокуТабличнойЧастиДокумента(СтрокаТабличнойЧасти) Экспорт
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти.Сумма =СтрокаТабличнойЧасти.Количество*СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Соответственно наш код в модуле документа теперь будет выглядеть так:
&НаКлиенте
Процедура ТЧТоварыТоварПриИзменении(Элемент)
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
СтрокаТабличнойЧасти.Цена =ОМРаботаСДокументамиСервер.ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
Если СтрокаТабличнойЧасти.Количество = 0 Тогда
СтрокаТабличнойЧасти.Количество = 1;
КонецЕсли;
РассчитатьСтрокуТабличнойЧастиДокумента();
КонецПроцедуры
&НаКлиенте
Процедура ТЧТоварыЦенаПриИзменении(Элемент)
// Вставить содержимое обработчика.
РассчитатьСтрокуТабличнойЧастиДокумента();
КонецПроцедуры
&НаКлиенте
Процедура ТЧТоварыКоличествоПриИзменении(Элемент)
// Вставить содержимое обработчика.
РассчитатьСтрокуТабличнойЧастиДокумента();
КонецПроцедуры
&НаКлиенте
ПроцедураРассчитатьСтрокуТабличнойЧастиДокумента()
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
ОМРаботаСДокументамиКлиент.РассчитатьСтрокуТабличнойЧастиДокумента(СтрокаТабличнойЧасти);
КонецПроцедуры
Таким образом обращаться к процедурам:
ОМРаботаСДокументамиСервер.ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
ОМРаботаСДокументамиКлиент.РассчитатьСтрокуТабличнойЧастиДокумента(СтрокаТабличнойЧасти);
мы можем не только из модуля Приходной накладной, но и из других модулей документов, например - Расходная накладная.
Расчет итоговой суммы
Еще нам необходимо все таки узнать - какая же общая сумма нашего документа. Для этого добавляем новый элемент "Итог" на форму:
и в его свойствах "ПутьКДанным" добавляем следующие данные:
Вот что у нас получилось: