1C предприятие 7.7. Компонента Оперативный учет
А в Диалог формы - текстовое поле: |
|
Заголовок |
|
Идентификатор |
|
Формула |
? (РежимПроведения=1, "Проведен предварительно", "") |
Положение |
Прижать влево |
Шрифт |
MS Sans Serif, 6, красный, жирный, подчеркнутый |
и кнопку:
Заголовок |
Предв. пров. |
Идентификатор |
|
Формула |
ЧастичноПровестм ( ) |
Пропускать при вводе |
V |
Остальные свойства у всех новых элементов можно не заполнять.
В Модуль формы документа добавим процедуру ЧастичноПровести {). Вызов процедуры может быть осуществлен только для накладной, дата которой, не меньше даты ТА. Кроме того, данный режим доступен только для новых, не проведенных или предварительно проведенных накладных.
//делает движения только в регистре "Остатки товаров" Процедура ЧастичноПровести()
Если ДатаДокПолучитьДатуТА() Тогда
Предупреждение("Режим предварительного проведения запрещен!"
+РазделительСтрок+"Дата документа даты ТА."); Иначе
Если Проведен()=1 Тогда
Если РежимПроведения=0 Тогда
Предупреждение("Документ уже был полностью
(проведен. Частичное перепроведение запрещено.™)?
Возврат; :
КонецЕсли; КонецЕсли; Провести(3,1)
//параметры: 3 - проводить документ
реальным временем (со сдвигом ТА)
1 - признак частичного проведения,
передается в ОбработкуПроведения()
КонецЕсли; КонецПроцедуры
Глава 3. Особенности проведения документов
Если Последовательность.ДляРасходныхНакладных.Проверить( ТекущийДокумент())-0 Тогда
// если последовательность нарушена, запретим проведение // документа
Сообщить("Нарушена последовательность проведения документов!"); СтатусВозврата(0); Возврат; КонецЕсли;
//Использование временного расчета //Используем объект Регистр (новое в 7.7) //Разрешает дублирование строк ОбщРег=СоздатьОбъект("Регистры");
//будем поддерживать итоги в актуальном состоянии ОбщРег.Актуальность(1) ; Рег=ОбщРег.ОстаткиТоваров; Если ИтогиАктуальны()=0 Тогда // если проводим "задним числом" Per.ВременныйРасчет(1);
ОбщРег.РассчитатьРегистрыПо(ТекущийДокумент()); КонецЕсли; ВыбратьСтроки() ; Пока ПолучитьСтроку()=1 Цикл
// если-услуга, то в регистр "Остатки товаров" движения // записывать не надо Если Товар.Родитель.ВидНоменклатуры= Перечисление.ВидНоменклатуры.Товар Тогда ОстКол^Рег.Остаток(Товар,Склад,"Количество"); Если ОстКол0 Тогда Если ОстКолКоличество Тогда Сообщить("В строке №"+НомерСтроки+
11 не хватило товара "+Товар+". Реально есть "+ОстКол+и !"); СтатусВозврата(0); Продолжить; КонецЕсли;
ОстСумУЕ=Рег.Остаток(Товар,Склад,"СтоимостьУЕ"); ОстСумРуб=Рег.Остаток(Товар,Склад,"СтоимостьРуб"); //определим суммы списания с учетом "проблемы копеек" СуммаСписУЕ=?(ОстКол^Количество,ОстСумУЕ,
Окр(ОстСумУЕ*Количество/ОстКол,2)); СуммаСписРуб=?(ОстКол=Количество,ОстСумРуб, Окр(ОстСумРуб*Количество/ОстКол,2));
61
С учетом изменений, внесенных для случая предварительного проведения, процедура ОбработкаПроведения () должна быть следующей:
Процедура ОбработкаПроведения(ПараметрПроведения) // ПараметрПроведения=1 при частичном проведении //(только по остаткам)
Методические материалы обучения партнеров
Регйгетр. ОстаткиТоваров Регистр.ОстаткиТоваров Регистр.ОстаткиТоваров Регистр.ОстаткиТоваров Регистр.ОстаткиТоваров Регистр.ОстаткиТоваров
апрель 2004 г.
.Товар=Товар;
.Склад=Склад;
. Количество=Количество;
.СтоимостьУЕ=СуммаСписУЕ;
.Стоимость Руб=СуммаСписРуб;
.ДвижениеРасходВыполнить();
62
1С:Предприятие 7.7. Компонента Оперативный учет
Иначе Сообщить("На "+ДатаДок+", в строке №"+НомерСтроки+
" совсем нет товара "+Товар+" !");
КонецЕсли; г
КонецЕсли; КонецЦикла;
// делаем частичное проведение, поэтому здесь процесс проведения
// прекращаем ^
Если ПараметрПроведения=1 Тогда .
РежимПроведения=1; .
Возврат; Иначе
РежимПроведения=0; КонецЕсли;
//движение регистра Взаиморасчеты v : Регистр.Взаиморасчеты.ДвижениеПриход(Покупатель, Итог("СуммаУЕ"),Итог("СуммаРуб"));
КонецПроцедуры
Необходимо отметить, что в случае отмены проведения документа, значению
реквизита «РежимПроведения» необходимо присвоить 0. Для этого, добавим в
Модуль документа предопределенную процедуру
ОбработкаУдаленияПроведения (}, вызов которой производится системой как раз
в этом случае.
Процедура ОбработкаУдаленияПроведения() //снимем флаг частичного проведения
Если РежимПроведенияоО Тогда РежимПроведения=0;
КонецЕсли; КонецПроцедуры
63
Глава 3. Особенности проведения документов
Кроме того, в свойства многострочной части, на закладке «Картинка» необходимо загрузить пиктограмму из файла «Status.bmp»2.
Приведем текст функции Выбор Пикт о граммы(), возвращающей номер используемой картинки для частично проведенных документов, который
необходимо поместить в Модуль формы списка журнала.
Функция ВыборПиктограммы() НомерПиктограммы=1;
Если ТекущийДокумент.Вид(}="РасходнаяНакладная" Тогда Если ТекущийДокумент.РежимПроведения=1 Тогда
НомерПиктограммы=2; КонецЕсли; КонецЕсли;
Возврат НомерПиктограммы; КонецФункции
Упражнение №3.7
Наконец, для визуального отличия частично проведенных документов в журнале «РасходныеНакладные», добавим в Форму списка этого журнала дополнительную графу:
Заголовок |
|
Идентификатор |
|
Формула |
Выбор Пи к т о граммы ( ) |
Показывать пиктограммы |
^ |
Методические материалы обучений партнеров
апрель 2004 г.
64
Глава 4. Резервирование товаров
В хозяйственной практике предприятия часто возникает ситуация, когда, прежде чем купить товар, клиент просит зарезервировать его на некоторое время. Для учета резерва товаров в нашей конфигурации, как следует из Блок-схемы информационных потоков, необходимо создать два регистра. Один «РезервыТоваров», который будет хранить количество зарезервированного товара, другой -«СостояниеЗаказа», предназначенный для хранения информации о том, на какую сумму по данному заказу было отгружено товара и сколько денег пришло по нему в качестве оплаты за товар.
Для оформления предварительных договоренностей на продажу товаров клиентам предназначен документ «Счет». Поскольку, в общем случае, такая договоренность не является обязательной, т.к. контрагент может отказаться от покупки или решит купить другие товары, не указанные в счете, то при проведении счета заказанный товар просто резервируется (откладывается) на некоторый срок. По условию задачи срок резервирования не определен. Основное назначение счетов -возможность их использования в дальнейшем для выписки на их основании расходных накладных.
Упражнение №4.1
1. Воспользовавшись Конструктором, создайте документ «Счет» со следую
щими параметрами:
Идентификатор |
Счет |
Синоним |
Счет |
Комментарий |
Доку мен i для принятия заказа |
Журнал |
Заказы |
Остальные свойства документа не отличаются от соответствующих свойств
Расходной накладной^~~ ~
в документ реквизиты шапки:
1 1 д с htii фи ка то р |
Курс |
ДатаКурса |
Покупатель |
Синоним |
Курс |
Дата курса |
Покупатель |
Ко'ммшгарий |
Служи! для хранения величины курса |
Хранит дачу, на которую в докумен- |
Партнер, покупающий товар |
_у:е. в доку менте |
те uci'iujfb'^yeiuM xvpc |
||
Тип значения |
Число |
Дата |
Справочник |
Вид Длина |
10 |
Контрагенты |
|
Точность |
4 |
||
Не отрицательный |
V |
||
Разделять Триады |
3. Используя таблицу свойств реквизитов документа «Расходная накладная», добавьте те же самые реквизиты в табличную часть Счёт
65
Глава 4. Резервирование товаров
4. Добавьте в Конфигурацию два регистра:
Идентификатор |
РвэервыТоваров |
СостоянивЗаказ а |
Синоним |
Резервы товаров |
Состояние заказов |
Комментарий |
||
Тип регистра |
Остатки |
Остатки |
Периодичность |
||
Быстрая обработка движений |
Регистры будут иметь следующую структуру:
Измерения:
Регистр |
РезервыТоваров |
СостояниеЗаказа |
|
И дентмфи катор |
Заказ |
ПоСчету |
Товар |
Синоним |
По Счет}' |
Товар |
|
Комментарий |
|||
Тип значения |
Документ |
Документ |
Справочник |
Вид |
Счет |
Счет |
Номенклатура |
Длина |
|||
Точность |
|||
Разделять Триады Отбор движений |
|||
Отбор итогов |
|||
Ресурсы: |
|||
Регистр |
РезервыТоваров |
СостояниеЗаказа |
|
Идентификатор |
СуммаОтгру 3 ки |
СуммаОплаты |
РеэервТовара |
Синоним |
Сумма отгрузки |
Сумма оплаты |
Резерв товара |
Комментарий |
Сумма» на которую мы долж-- ны отгрузить товаров в у.е |
Сумма, подлежащая оплате в V"f. ' ' " |
Измеряется в единицах измерения товара |
1 ип значения |
Число |
Число |
Число |
Вид |
|||
Длина |
12 |
12 |
10 |
Точность- |
2 |
2 |
гсг~~ |
Разделять Триады |
V |
V |
v |
Чтобы проверить, правильно ли мы спроектировали регистры, заполним для них таблицу, показывающую флаги движений для разных видов документов:
Методические материалы обучения партнеров
апрель 2004 г.
67
1С:Предприятие 7.7. Компонента Оперативный учет
в нашей Конфигурации предусмотрены документы, записываюЩие движения в регистр кЈ^ со знаком «+», тик и «-», то можнО сделать вывод о том, что регистры спроектированы правильно.
4-1. Создание Формы и Модуля документа для документа «Счет»
диг1/юг Формы документа показан на рисунке 4.1:
4.1. Форма документа «Счет»
работе с документом обеспечим сходные с документом «Расходная накладная» возможности. В результате, список процедур и функций, обращение к которым необходимо ввести поле «Формула» свойств полей ввода, примет вид:
Глава 4. Резервирование товаров
Текст используемых процедур поместим в Модуль формы:
Т Ј* TT\7T1 J3 TTr^T/f ГЛгпт/ч^ч-итгпти-т^г
Процедура ПриОткрытии
// установим режим обязательного перепроведения
// при записи уже проведенного документа
ПриЗаписиПерепроводить(1); КонецПроцедуры
Процедура ВводНового(Копирование) ,
// Копирование^ - документ введен копированием, иначе О
Если .Копирование=0 Тогда
// введем значения "по умолчанию" реквизитов шапки ДатаКурса=ДатаДок;
Курс=Константа.КурсУЕ.Получить(ДатаКурса); КонецЕсли; КонецПроцедуры
Процедура ПриВыбореТовара()
// организуем автоматическое заполнение реквизитов табличной
// части при выборе товара
Единица=Товар.ЕдиницаИзмерения;
Цена=Товар.ЦенаПродажи;
Если Количество^ Тогда Количество=1;
КонецЕсли;
ВычислитьСумму(Контекет); КонецПроцедуры
Процедура ПриВыбореПокупателя(}
'/пересчитаем суммы .
ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл
ПриВыбореТовара{);
КонецЦикла;
:онецПроцедуры .
Процедура ПриЗаписи() . ,
// проверка по покупателю
Если ишсупатель.Выбран()-0 Тогда
I/ если не введено, вызовем окно предупреждения и запретим
/запись ;.,;..
Предупреждение ("Не выбран покупатель!"); : --,.. .
СтатусВозврата ( 0) ; :. . .., , ;.
КонецЕсли;
Методические материалы обучения партнеров
апрель 2004 г.
68
1С:Предприятие 7.7. Компонента Оперативный учет
Глава 4. Резервирование товаров
69
// проверим, правильно ли введены значения реквизита Товар Если ПроверкаСкладаТовара(Контекст)=0 Тогда
СтатусВозврата(0) ; КонецЕсли;
КонецПроцедуры
Так как у документа «Счет» отсутствует реквизит «Склад», то есть резервиро
вание товаров может осуществляться сразу на всех складах, то в процедуре Гло
бального модуля ПроверкаСкладаТовара () необходимо предусмотреть
следующую проверку:
Если Конт.Вид()"Счет" Тогда
Первоначальный текст модуля проверки выбора склада КонецЕсли;
По условию задачи, при выписке счета, нам необходимо получить информацию о той сумме покупок, которую заплатил клиент за предыдущий месяц, и, если эга сумма превышает некоторую заданную величину, то программа, при выводе цены продажи товара, должна автоматически учитывать предусмотренную нами величину скидки. Для хранения вышеназванных величин добавим в Конфигурацию две константы. Для учета величины полной суммы покупок клиентом введем в Конфигурацию оборотный регистр «ОборотыКлиента». Сумму покупок будем учитывать в у.е.
Упражнение №4.2 I. Создайте следующие константы в Конфигурации:
Идентификатор |
ПроцентСкидки |
ГраницаС кид ки |
Синоним |
Процент скидки |
Граница скидки |
Комментарий |
Величина скидки на цену продажи в % |
Оборот клиента за текущий период в у.е. |
Тип |
Число |
Число |
Вид |
||
Длина |
6 |
10 |
Точность |
2 |
0 |
Не отрицательный |
V |
V |
Разделять Триады |
||
Периодический |
2. Создайте оборотный регистр:
Идентификатор |
ОборотыКлиента |
Синоним |
Резервы товаров |
Комментарий |
Обороты |
Тип регистра |
Обороты |
Периодичность |
Месяц |
Быстрая обработка движений |
Регистр будет иметь следующую структуру
Измерения |
Ресурсы |
|
Идентификатор |
внт |
Оборот |
chhoi |
нт |
Оборот |
Ю---; шй |
Оборот клиента за период в у.е. |
|
[ИЯ |
-НОЧНИК |
Число |
} |
Контрагенты |
|
) i |
10 |
|
'". )СТЬ |
2 |
|
1 гать Триады , |
V " |
|
С ) движений |
||
О.х.Ор ИТОГОВ |
Тогда движения в этот регистр будут записывать следующие документы:
Регистр «ОборотыКлиента»
Теперь, после создания оборотного регистра, в форму документа можно доба
вить текстовый элемент, в строке «Формула» которого напишем имя функции
Оборот (). Текст функции:
// Вычислим сумму покупок клиента за предыдущий месяц Функция Оборот() // 1-е число предыдущего месяца
ДатаПредМес=НачМесяца(ДобавитьМесяц(ДатаДок,-1)); Если ДатаПредМесПолучитьДатуТА() Тогда
Регистр.ОборотыКлиента.ИспользоватьПериод(
ДатаГод(ДатаПредМес),ДатаМесяц(ДатаПредМес)); КонецЕсли;
Возврат Регистр.ОборотыКлиента.Итог(Покупатель,"Оборот"); КонецФункции
добавим в Модуль формы перед процедурой ПриВыбореТовара (), в которой после
строки
I Цена=Товар.ЦенаПродажи; необходимо добавить строки текста:
// определим цену продажи с учетом скидки Если Оборот()Жонстанта.ГраницаСкидки Тогда
Цена^Гсгвар.ЦенаПродажи* {100-Константа .ПроцентСкидки) /100; КонецЕсли;
Методические материалы обучения партнеров
апрель 2004 г.
70
1С:Предприятие7.7. Компонента Оперативный учет
Как следует из Блок-схемы информационных потоков, документ «Счет» записывает движения во вновь созданные регистры «РезервыТоваров» и «СостояниеЗаказа»:
Регистр
Движение
РезервыТоваров
Увеличение резерва товаров на складах
СостояниеЗаказа
Резервирование товаров с увеличением сумм отгрузки и оплаты
Поэтому в Модуль документа необходимо добавить предопределенную процедуру ОбработкаПроведения (), имеющую вид:
Процедура ОбработкаПроведения() ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл
// по регистру "РезервыТоваров"
Регистр.РезервыТоваров.ПривязыватьСтроку(НомерСтрокй);
Регистр.РезервыТоваров.ПоСчету=ТекущийДокумент{ );
Регистр.РезервыТоваров.Товар=Товар; ;
Регистр.РезервыТоваров.РезервТовара=Количество; '
Регистр.РезервыТоваров.ДвижениеПриходВыполнить() ; КонецЦикла;
//по регистру "СостояниеЗаказа" Регистр.СостояниеЗаказа.ДвижениеПриход(ТекущийДокумент(},
Итог("СуммаУЕ"),Итог("СуммаУЕ")); КонецПроцедуры
4.2. Создание документов «Приход денег» и «Снятие резерва»
Документ «ПриходДенег» предназначен для учета поступлений денежных средств от покупателей в качестве расчетов за отгруженные товары и предоставленные услуги.
Упражнение №43
1. Воспользовавшись Конструктором, создайте документ «ПриходДенег»:
Идентификатор |
ПриходДенег |
Синоним |
Приход денег |
Комментарий |
Клиент оплатил товар |
Журнал |
Оплата |
71
Глава 4. Резервирование товаров
2. Добавьте в документ реквизиты шапки «Курс», «ДатаКурса», «СуммаУЕ», «Сумма Ру б», такие же, как и у документа «Оплата покупки». Добавьте два новых реквизита шапки:
Идентификатор |
Покупатель |
ПоСчету |
Синоним |
Покупатель |
Счет |
Комментарий |
Партнер, покупающий товар |
Счет, по которому пришли деньги |
Тип значения |
Справочник |
Документ |
Вид |
Контрагенты |
Счет |
Длина |
||
Точность |
||
Не отрицательный |
||
Разделять Триады |