Урок №2.

Торговля и учет по складу.

Проверка на заполнение реквизитов в документе

Если вы обратили внимание, то некоторые поля в документе подчеркнуты красным цветом.

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

Предопределенные справочники. Автоматическое заполнение значений по умолчанию в документе

Чтобы каждый раз при заведении нового документа не заполнять реквизиты, которые как правило одни и те же, например - фирма, можно прописать нашу фирму как предопределенный справочник, и тогда при создании нового документа она будет заполняться автоматически. Заходим в свойства справочника и нажимаем ссылку "Предопределенные - открыть":

 

Теперь необходимо его прописать в наших документах:

Теперь разберемся, зачем все это нам нужно. Прежде всего, как было сказано выше, это позволит ускорить процесс введения документов, а во вторых, эти данные заносятся в конфигураторе из-за того чтобы по неосторожности нельзя было удалить этот элемент справочника. Кстати, в конфигураторе при создании нового элемента мы можем редактировать только Код и Наименование, а остальные реквизиты нам будут доступны и из самой программы. Чтобы выделить такие элементы от остальных, они в программе выводятся таким вот образом (с маленьким желтым кружочком):

Подстановка цены в табличную часть

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

В появившемся окне выбираем элемент табличной части Товары:

и переходим к событиям этого элемента. Нам понадобится событие "ПриИзменении". Нажимаем кнопку с изображением лупы и проваливаемся в модуль документа. Программа автоматически создала процедуру ТЧТоварыТоварПриИзменении(Элемент):

Далее пишем следующий код:

&НаКлиенте

Процедура ТЧТоварыТоварПриИзменении(Элемент)
   
    // Вставить содержимое обработчика.

    СтрокаТабличнойЧасти = Элементы["ТЧТовары"].ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена =ПолучитьЦену(СтрокаТабличнойЧасти.Товар);

КонецПроцедуры


&НаСервере
Функция ПолучитьЦену(СсылкаНаСправочник)
   
    //Находим объект справочник номенклатуры по переданной в
    //функцию ссылку на этот справочник

    СправочникПоСсылке = Справочники.Номенклатура;
    СправочникПоСсылке = СсылкаНаСправочник.ПолучитьОбъект();
   
    //Возвращаем цену
    Возврат СправочникПоСсылке.РозничнаяЦена;
   
КонецФункции

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

 

Расчет суммы по строке в документе

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

&НаКлиенте
Процедура РассчитатьСтрокуТабличнойЧастиДокумента()
   
    // Вставить содержимое обработчика.
    СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма =СтрокаТабличнойЧасти.Количество*СтрокаТабличнойЧасти.Цена;

КонецПроцедуры


но этого недостаточно для расчета. Теперь нам необходимо эту процедуру прописать в нужных обработчиках событий - ТЧТоварыТовар, ТЧТоварыЦена и ТЧТоварыКоличество:

&НаКлиенте
Процедура ТЧТоварыТоварПриИзменении(Элемент)
   
   // Вставить содержимое обработчика.
    СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена =ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
   
    Если СтрокаТабличнойЧасти.Количество = 0 Тогда
        СтрокаТабличнойЧасти.Количество = 1;
    КонецЕсли;
   
    РассчитатьСтрокуТабличнойЧастиДокумента();
   
КонецПроцедуры 

&НаКлиенте
ПроцедураТЧТоварыЦенаПриИзменении(Элемент)
   
    // Вставить содержимое обработчика.
    РассчитатьСтрокуТабличнойЧастиДокумента();

КонецПроцедуры

&НаКлиенте
Процедура ТЧТоварыКоличествоПриИзменении(Элемент)
   
   // Вставить содержимое обработчика.
    РассчитатьСтрокуТабличнойЧастиДокумента();

КонецПроцедуры

Теперь сумма по строке будет рассчитываться автоматически:

 

Объединение похожего кода в глобальных модулях

Весь этот код нам придется дублировать во всех документах т.е. мы написали код для Приходной накладной, и его нужно скопировать в Расходную накладную. А если у нас будут еще какие нибудь похожие документы, то придется этот код копировать и туда тоже. Это немного неудобно. Чтобы упростить нашу работу, можно вынести одинаковый код в отдельный модуль, который будет доступен в модулях документов. Для этого добавим  два общих модуля в нашу конфигурацию и назовем их ОМРаботаСДокументамиСервер и ОМРаботаСДокументамиКлиент:

в свойствах модуля ОМРаботаСДокументамиСервер устанавливаем галку на значении "Сервер" и "Вызов сервера":

а в свойствах модуля ОМРаботаСДокументамиКлиент устанавливаем галку на значении "Сервер" и "Вызов сервера":

В модуль ОМРаботаСДокументамиСервер вставим код:

Функция ПолучитьЦену(СсылкаНаСправочник) Экспорт
   
    СправочникПоСсылке = Справочники.Номенклатура;
    СправочникПоСсылке =СсылкаНаСправочник.ПолучитьОбъект();
   
    Возврат СправочникПоСсылке.РозничнаяЦена;
   
КонецФункции

а в модуль ОМРаботаСДокументамиКлиент вставим код:

Процедура РассчитатьСтрокуТабличнойЧастиДокумента(СтрокаТабличнойЧасти) Экспорт
   
    // Вставить содержимое обработчика.
    СтрокаТабличнойЧасти.Сумма =СтрокаТабличнойЧасти.Количество*СтрокаТабличнойЧасти.Цена;

КонецПроцедуры

Соответственно наш код в модуле документа теперь будет выглядеть так:

&НаКлиенте
Процедура ТЧТоварыТоварПриИзменении(Элемент)

    // Вставить содержимое обработчика.
    СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена =ОМРаботаСДокументамиСервер.ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
       
    Если СтрокаТабличнойЧасти.Количество = 0 Тогда
        СтрокаТабличнойЧасти.Количество = 1;
    КонецЕсли;
   
    РассчитатьСтрокуТабличнойЧастиДокумента();
   
КонецПроцедуры 

&НаКлиенте
Процедура ТЧТоварыЦенаПриИзменении(Элемент)

    // Вставить содержимое обработчика.
    РассчитатьСтрокуТабличнойЧастиДокумента();

КонецПроцедуры

&НаКлиенте
Процедура ТЧТоварыКоличествоПриИзменении(Элемент)

    // Вставить содержимое обработчика.
    РассчитатьСтрокуТабличнойЧастиДокумента();

КонецПроцедуры


&НаКлиенте
ПроцедураРассчитатьСтрокуТабличнойЧастиДокумента()
   
    // Вставить содержимое обработчика.
    СтрокаТабличнойЧасти =Элементы["ТЧТовары"].ТекущиеДанные;
    ОМРаботаСДокументамиКлиент.РассчитатьСтрокуТабличнойЧастиДокумента(СтрокаТабличнойЧасти);

КонецПроцедуры


Таким образом обращаться к процедурам:

ОМРаботаСДокументамиСервер.ПолучитьЦену(СтрокаТабличнойЧасти.Товар);
ОМРаботаСДокументамиКлиент.РассчитатьСтрокуТабличнойЧастиДокумента(СтрокаТабличнойЧасти);

мы можем не только из модуля Приходной накладной, но и из других модулей документов, например - Расходная накладная.

 

Расчет итоговой суммы

Еще нам необходимо все таки узнать - какая же общая сумма нашего документа. Для этого добавляем новый элемент "Итог" на форму:

и в его свойствах "ПутьКДанным" добавляем следующие данные:

Вот что у нас получилось: