Методические материалы обучения партнеров

апрель 2004 г.

28

1С:Предприятие 7.7. Компонента Оперативный учет

Заметим, что параллельно с созданием самого документа, в конструкторе до­кументов существует возможность создать новый журнал документов, в который можно поместить вновь создаваемый документ.

При работе с Приходной накладной необходимо обеспечить следующие воз­можности:

1. При вводе нового документа должны заполняться реквизиты (если доку­мент не был введен копированием другого документа):

Процедура ВводНового(Копирование)

// Копирование=1 - документ введен копированием, иначе О // введем значения "по умолчанию" реквизитов шапки Если Копирование=0 Тогда ДатаКурса=ДатаДок;

Курс=Константа. КурсУЕ. Получить(ДатаКурса) ;
КонецЕсли; -.

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

2. При редактировании табличной части:

• При выборе товара, реквизит «Единица» автоматически устанавлива­
ется равным «Единице измерения» для выбранного товара. А реквизит
«Цена» - равным «Цене закупки»;

•__ При изменении реквизитов «Цена» и «Количество» реквизиты
_______ «СуммаВал» и «СуммаРуб» пересчитывается автоматически;__

Процедура ПриВыбореТовара()

// организуем автоматическое заполнение реквизитов табличной

// части при выборе товара

Единица^Товар. ЕдиыицаИзмерения; ;

Цена=Товар. ЦенаЗакупки;

Количество^!; КонецПроцедуры

Глава 2. Простейшая конфигурация - торговля в реальном времени 29 2.4.1. Процедуры глобального модуля

Так как мы собираемся работу документа «Расходная накладная» сделать очень
похожей на работу нашего документа, то давайте внесем в Глобальный модуль сле-
дующис процедуры:_______________________________________________________

НЕ нашли? Не то? Что вы ищете?

// ВычислитьСумму(Конт) - вычисляет сумму строки табличной

// части

Процедура ВычислитьСумму(Конт) Экспорт

// переменная Конт является формальным параметром,

// которому при вызове процедуры будет присвоен

// локальный контекст

Конт. СуммаУЕ=Конт. Цена*Конт. Количество;

Конт. СуммаРуб^Конт. СуммаУЕ*Конт. Курс; КонецПроцедуры

// ПересчетеКонт) - пересчитывает все строки табличной части // при измениии курса доллара Процедура Пересчет(Конт} Экспорт

Конт. Курс=Константа, КурсУЕ. Получить(Конт. ДатаКурса}; // открываем выборку строк спецификации документа

Конт. ВыбратьСтроки(); // цикл выбора строк спецификации документа

Пока Конт. ПолучитьСтроку(}=1 Цикл // строка спозиционирована...

Конт. СуммаРуб=Конт. СуммаУЕ*Конт. Курс;

КонецЦикла;
КонецПроцедуры __

В результате теперь мы сможем вызывать эти процедуры из формы документов
следующим образом:_______________________________________________________

ВычислитьСумму(Контекст);


• Реквизиты «СуммаВал» и «СуммаРуб» вручную изменяться не могут;

3. При редактировании реквизитов шапки:

• При изменении реквизита «ДатаКурса» изменяется значение реквизита
«Курс» в соответствии с введенной датой. Кроме этого, в соответствии
с курсом автоматически пересчитываются все рублевые суммы.

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

Методические материалы обучения партнеров

Пересчет(Контекст);

Где ключевое слово Контекст позволяет передать в Глобальный модуль кон­текст формы документа.

2.4.2. Диалог формы документа «ПриходнаяНакладная»

Диалог формы документа может выглядеть, так как это изображено на рисунке 2.6.

При двойном щелчке мышью на заголовке столбца многострочной части появ­ляется окно «Свойства Поля Ввода». На закладке этого окна «Дополнительно» в строке «Формула:» необходимо ввести последовательность операторов на встроен-

апрель 2004 г.

30


1C:Предприятие 7.7. Компонента Оперативный учет


ном языке системы 1С:Предприятие или список тех процедур и функций, которые


Рис.2.6. Форма документа «ПриходнаяНакладная»

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

Приведем список процедур и функций, обращение к которым необходимо вве­сти поле «Формула» свойств полей ввода:

Поле Ввода Формула

т^тнттт

ДатаКурса

Товар

ПриВыбореТовара () ; Вычислить Сумму, ...

Количество

Вычислить Сумму (Контекст)

Цена

Текст!

Итог ("СуммаУЕ")

Текст2

FT

Итог ( "СуммаРуб" )

__ „_„,________ «wv~v/«,imw провести, т. е. занести ин­
формацию в регистры.

Регистр

Предполагаем, что приход товара по накладной сопровождается немедленной оплатой (как в наличной форме, так и в безналичной). Таким образом, проведение документа «ПриходнаяНакладная» совершает следующие движения:

1вижение

ОстаткиТоваров | Приход товара на склад, с увеличением стоимости запас

2.4.3. Модуль документа "ПриходнаяНакладная"

Модуль документа, как известно, предназначен для записи движений докумен­та в те объекты системы, которые накапливают итоги. Для компоненты Оператив­ный учет это сводится к записи движения в регистр. Поэтому перед написанием

Методические материалы обучения партнеров

Глава 2. Простейшая конфигурация - торговля в реальном времени 31

текста процедуры ОбработкаПроведения {) необходимо убедиться в том, что установлен флаг «Оперативный учет» окна редактирования документа.

Записать движение в регистр напомним, можно только в модуле документа.
Для этой цели используются специальный синтаксис:___________________

Регистр, Идентификатор. Измерение1=ЗначениеИзмерения1; Регистр. Идентификатор. Измерение2=ЗначениеИзмерения2;

Регистр. Идентификатор. Ресурс1=ЗначениеРесурса1; Регистр. Идентификатор. Ресурс2=ЗначениеРесурса2;

Регистр. Идентификатор. Реквизит1=3начениеРеквизита1; Регистр. Идентификатор. Реквизит2=ЗначениеРеквизит2; Регистр. Идентификатор. ДвижениеПриходВыполнить();

или

[регистр. Идентификатор. ДвижениеРасходВыполнить(); |

Метод ДвижениеПриходВыполнить () ; записывает движение со знаком
«Приход», а метод Движение РасходВыполнить (} ; записывает движение со
знаком «Расход» в регистр. При использовании этих методов необходимо предвари­
тельно для регистра определить конкретные значения измерений, ресурсов и, если
это необходимо, реквизитов. Обычно такую методику применяют в тех случаях,
когда атрибуты объекта Регистр заполняются в результате некоторых вычисле­
ний. При этом последовательность заполнения измерений, ресурсов и реквизитов не
имеет значения. Главное, чтобы, когда все необходимые значения уже определены,
выполнить метод ДвижениеПриходВыполнить () или

ДвижениеРасходВыполнить{).

Таким же образом, поступает и конструктор «Движения регистров...». Выпол­ните следующее упражнение:

Упражнение №2.6

Откройте модуль документа «ПриходнаяНакладная». Вызовите конструк­тор «Движения регистров,..» и сформируйте текст модуля, который приведен ниже.

Процедура ОбработкаПроведения(}

// открываем выборку строк спецификации документа ВыбратьСтроки();

// цикл выбора строк спецификации документа Пока ПолучитьСтроку{)=1 Цикл

// строка спозиционирована...

// запишем номер строки документа в движении регистра

Регистр. ОстаткиТоваров. ПривязыватьСтроку(НомерСтроки};

// установим значения для измерений и ресурсов регистра

апрель 2004 г.

32

1С:Предприятие 7.7. Компонента Оперативный учет

Регистр. ОстаткиТоваров. Товар=Товар; Регистр. ОстаткиТоваров. Количество=Количество; Регистр. ОстаткиТоваров. СтоимостьУЕ=СуммаУЕ; Регистр. ОстаткиТоваров. СтоимостьРуб=СуммаРуб; // выполним запись прихода в регистр Регистр. ОстаткиТоваров. ДвижениеПриходВыполнить(); КонецЦикла; КонецПроцедуры

2.5. Создание документа "Расходная накладная"

Для отражения факта продажи товаров организацией служит документ «Рас­ходная накладная». В нашем случае реквизиты этого документа аналогичны рекви­зитам документа «Приходная накладная».

Упражнение №2.7

1. Создайте документ «Расходная накладная» со следующими характеристи-

ками:

Идентификатор

РасходнаяНакладная

Журнал

РасходныеНакладные

Остальные свойства документа не отличаются от соответствующих свойств доку­мента «ПриходнаяНакладная».


Рис.2.7. Форма документа «РасходнаяНакладная»


2. Используя таблицы свойств реквизитов документа «Приходная накладная», добавьте такие же реквизиты в шапку и табличную часть Расходной накладной.

Глава 2. Простейшая конфигурация - торговля в реальном времени 3$ 2.5.1. Диалог формы документа «РасходнаяНакладная»

Диалог формы документа может выглядеть, так как это изображено на рисунке 2.7.

Во время работы с «Расходной накладной» обеспечим те же самые возможно­сти, что и у «Приходной накладной». При этом надо иметь в виду, что реквизит Цена «Расходной накладной» является ценой проданного товара. Поэтому, в проце-

дуре ПриВыбореТовара () изменится строка :

|Цена=Товар. ЦенаПродажи;~|

Приведем список процедур и функций, обращение к которым необходимо вве­сти поле «Формула» свойств каждого из столбцов многострочной части:

Поле Ввода Формула

ДатаКурса

Пересчет (Контекст)

Товар

ПриВыбореТовара { ) ; ВычислитьСумму (Контекст)

Количество

ВычислитьСумму (Контекст)

Цена

ВычислитьСумму (Контекст)

Остаток

Регистр. ОстаткиТоваров . Остаток (Товар,

"Количество")

Текст!

Итог("СуммаУЕ")

Текст2

Итог ( "Сумма Руб" )

При заполнении количества продаваемого товара удобно видеть текущий оста­ток по данному товару. Реализуем эту возможность, выполнив следующее упраж­нение:

У пражнён иё №2.8

В диалоге формы документа «РасходнаяИакладная»:

L Создайте диалог формы документа, используя рисунок 2.7, и на основании таблицы заполните для приведенных в ней элементов диалога поле «Формула». Добавьте текст необходимых процедур на закладке «Модуль».

2.  Выберите пункт меню «ТЗставить|Текст>> и перетащите созданный системой
злемет диалога" удерживая нажатой левую кнопку мыши, во внутрь "Многостроч­
ной час in документа,"после чего кнопку мыши можно "отпустить. В этом случае
система додавит новый столбец.

3.  Активизируйте мышью только что созданный столбец многострочной части и
откройте его свойства.

4. Заполните свойства этого элемента следующими значениями:

Свойство

Значение

Заголовок

Остаток

Формула

Регистр. ОстаткиТоварсв. Остаток (Товар, "Количество" )

Положение

Прижать вправо

Отрицательное красным

V ......... __.

Остальные значения свойств можно не заполнять.


Методические материалы обучения партнеров

апрель 2004 г.

34

1С:Предприятие 7.7. Компонента Оперативный учет

Напомним, что ранее мы говорили о том, что если у регистра «спросить» его остаток, то он выдаст его на Точку^Актуальности^ Поэтому _запись вида^

[регистр. Идентификатор. Остаток (ЗнИзмх,..., ЗнИзмп, "ИмяРесурса;1") ; | означает, что для регистра «Идентификатор» вы просите получить остаток его некоторого ресурса «ИмяРесурса^) конкретной комбинации его измерений: ЗнИзм!,..., ЗнИзмп.

Важные замечания:

1.  Применение описанного выше приема, т. е. размещение в табличной части
столбца текста, который обращается к итогам, нежелательно с точки з]эения
общей производительности системы, т. к. чем большее число строк табличной
части будет заполнено, тем большее число раз, будет сделано обращение - к ито­
гам, и как следствие производительность системы несколько снизится...

2.  Следует помнить, что в нашем случае (а мы об этом договорились выше: про­
ведение документов задним числом запрещено) «правильные» значения в
столбце будут отображены до проведения документа. Если мы откроем форму
документа после его проведения (скажем, нам нужно исправить уже проведен­
ный документ), то в этом случае столбец будет отображать остатки, которые
образовались уже с учетом тех движений, которые уже записаны при его про­
ведении.

2.5.2. Проведение документа «РасходнаяНакладная»

Предполагаем, что отгрузка товара по накладной сопровождается немедленной оплатой (как в наличной форме, так и в безналичной). Проведение документа «РасходнаяНакладная» совершает следующие движения:

Глава 2. Простейшая конфигурация - торговля в реальном времени 35

присутствует на складе. Поэтому, необходимо проверить наличие списываемого товара и в случае его недостатка, запретить проведение документа-

Если (ОстКол<Количество) или (ОстКол=0) Тогда
Сообщить ("В строке №"+НомерСтроки+"не хватило
товара"+Товар+".
Реально есть "+ОстКол+" !");
СтатусВозврата(0);
Продолжить;
КонецЕсли;_______________________________________

Напомним, что отменить действие предопределенной процедуры позволяет ис­пользование специальной системной функции СтатусВозврата (0).

Одной из часто встречающихся на практике проблем при ведении оперативно­го учета является так называемая «проблема копеек», когда при выполнении ариф­метических операций с большими числами может быть потеряна необходимая точность вычислений. Так, если мы хотим списать весь оставшийся на складе товар и, при этом использовать формулу для списания стоимости товара частично: «(вся стоимость оставшегося товара)/(все количество оставшегося товара)*(необходимое количество товара)», то возможна ситуация, когда «по количеству» товар будет отсутствовать, а «по стоимости» в регистре будет храниться некоторая величина. В этом случае, более правильным будет списание из регистра всего количества товара на всю, хранящуюся в нем сумму.

СуммаСписР=?(ОстКол=Количество, СтоимР,

Окр(Стоим? *Количество/ОстКол,2)); СуммаСписУЕ=?(ОстКол=Количество, СтоимУЕ,

Окр(СтоимУЕ*Количество/ОстКол,2));


Регистр

Движение

| ОстаткиТоваров [ Расход товара на складе, с уменьшением стоимости запасов |

На начальном этапе учет товара и списание себестоимости будем вести «по
среднему». В этом случае, цена списываемого товара может быть определена как
отношение суммарной стоимости всего оставшегося товара на складе к его общему
количеству, хранящемуся на этом складе. Причем все остатки будут получены на
момент ТА. В Модуле документа получение вышеописанных остатков может быть
представлено в виде следующих строк кода: __

ОстКол=Регистр. ОстаткиТоваров. Остаток(Товар,"Количество"); СтоимР=Регистр. ОстаткиТоваров. Остаток(Товар,

"СтоимостьРуб"); СтоимУЕ=Регистр. ОстаткиТоваров. Остаток(Товар,

"СтоимостьУЕ");

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

Методические материалы обучения партнеров

Окончательно, Модуль документа будет выглядеть следующим образом:

Процедура ОбработкаПроведения{)

// открываем выборку строк спецификации документа

ВыбратьСтроки();

// цикл выбора строк спецификации документа

Пока ПолучитьСтроку()=1 Цикл

// строка спозиционирована...

// для расчета стоимости списания товара "по среднему"

// определим на ТА количество оставшегося товара, его

//рублевую и валютную стоимости

ОстКол-Регистр. ОстаткиТоваров. Остаток(Товар,"Количество");

СтоимР^Регистр. ОстаткиТоваров. Остаток(Товар,

"СтоимостьРуб"); СтоимУЕ^Регистр. ОстаткиТоваров. Остаток(Товар,

"СтоимостьУЕ");_________________________________ —

апрель 2004 г.

36

1C:Предприятие 7.7. Компонента Оперативный учет

// проверим, хватает ли на складе товара? Если (ОстКол<Количество) или (ОстКол=0) Тогда

Сообщить ("В строке №"-ьНомерСтроки+

"не хватило товара"+Товар+". Реально есть "+ОстКол+ 11 !");

// если не хватает, то документ не проводится.

СтатусВозврата(0);

Продолжить; КонецЕсли;

// учтем погрешность вычислений при выполнении // арифметических операций СуммаСписР=?{ОстКол=Количество, СтоимР,

Окр(СтоимР*Количество/ОстКол,2)); СуммаСписУЕ=?(ОстКол^Количество, СтоимУЕ,

Окр(СтоимУЕ*Количество/ОстКол,2));

// запишем номер строки документа в движении регистра Регистр. ОстаткиТоваров. ПривязыватьСтроку(НомерСтроки); // установим значения для измерений и ресурсов регистра Регистр. ОстаткиТоваров. Товар=Товар; Регистр. ОстаткиТоваров. Количество=Количество; Регистр. ОстаткиТоваров. СтоимостьУЕ=СуммаСлисУЕ; Регистр. ОстаткиТоваров. Стоимость Руб=СуммаСписР; // выполним запись расхода в регистр Регистр. ОстаткиТоваров. ДвижениеРасходВыполнить() ; КонецЦикла; КонецПроцедуры

2.6. Создание отчета «Остатки товаров»

В заключение с помощью Конст­
руктора «Новый Отчет» создадим отчет
«ОстаткиТоваровНаТА», причем за­
полнение выходной формы будем вес­
ти, используя информацию из регистра
«ОстаткиТоваров» на Точку Актуаль­
ности с помощью общих методов реги­
стров ВыбратьИтоги() ,
ПолучитьИтог (). Отчет будем фор­
мировать в разрезе товаров по Коду
товара,
его Наименованию., Единицам

измерения, Цене списания и вставшему - , «*.._.<>. st^t»!* и; чета

ся Количеству. Если при определении «ОстаткиТоваровНаТА»

цены окажется, что по количеству това-

Методические материалы обучения партнеров

Глава 2. Простейшая конфигурация - торговля в реальном времени 37

ра нет, а по рублевой стоимости остатки присутствуют, занесем в ячейку таблицы Количество значение «Нет»:

цена=?(Per. Количество=0, "Нет", Per. СтоимостьР/Рег. Количество);

После внесения необходимых изменений Форма отчета примет вид изображен­ный на рисунке 2.8.

Модуль формы отчета в этом случае будет содержать следующий текст:

Процедура Сформировать() / создадим ссылку на объект Регистр «Остатки товаров»

рег = СоздатьОбъект ( "Регистр. ОстаткиТоваров11); / присвоим переменной Таб ссылку на специальный / агрегатный тип данных "Таблица"

Таб = СоздатьОбъект("Таблица");

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

Таб. ИсходнаяТаблица("Сформировать"); // заполним поля секции "Шапка"

Таб. ВывестиСекцию("Шапка"); // зададим опции таблицы

Таб. Опции(0,0,Таб. ВысотаТаблицы(),0}; // выберем все остатки регистра и организуем по ним цикл

Per. ВыбратьИтоги();

Пока Per. ПолучитьИтог(}=1 Цикл // спозиционируем на очередном остатке.. // заполним поля секции "Строка_1"

цена=?(рег. Количество=0,"Нет",Per. СтоимостьУЕ/Рег. Количество);

Таб. ВывестиСекцию("Строка_1") ;

КонецЦикла; // заполним поля секции "Подвал"

Таб. ВывестиСекцию{"Подвал"); // запретим возможность редактирования выведенной формы

Таб. ТолькоПросмотр(1); // Выведем заполненную форму на экран

Таб. Показать("Сформировать","");
КонецПроцедуры „____^___________________ -

Шаблон печатной формы «Сформировать» изображен на рисунке 2.9.

апрель 2004 г.

1С:Предприятие 7.7. Компонента Оперативный учет


<0сталси товаров на [ПолучитьДатуТА()]>;


fiiy^


.„__„

Рис.2.9. Шаблон печатной Ф ;ы отчета

«ОстаткиТоваровНаТА»

Упражнение №2.9

Внесите необходимые изменения в форму диалога и ш^§лщ даЧатной формы так, чтобы они соответствовали приведенным даян^

Методические материалы обучения партнеров

39

Глава 3. Особенности проведения докумен­тов в компоненте «Оперативный учет»

После того, как мы освежили в памяти работу с базовыми объектами системы «1С:Предприятие» и познакомились с новыми, присущими компоненте «Оператив­ный учет», объектами для хранения итоговой информации - регистрами, рассмот­рим более подробно механизмы учета данных по хозяйственным операциям, связанные с проведением документов. При этом будем исходить из требований, предъявляемых к окончательной постановке учебной задачи.

3.1. Полная постановка задачи

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

1.  Информация о находящихся в распоряжении фирмы товарах и услу­
гах, которые продаются и покупаются;

2.  Информация о местах их хранения;

3.  Информация о тех организациях и частных лицах, с которыми фирма
осуществляет акты купли-продажи.

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

•  справочник «Номенклатура»;

•  справочник «Места Хранения»; >

•  справочник «Контрагенты».

Не останавливаясь более подробно на детальной структуре этих справочников, а также на необходимых в Конфигурации константах и перечислениях, перейдем к рассмотрению выходной информации. Очевидно, что она напрямую связана с теми отчетами, которые нужно создать по условиям задачи. Поскольку, отчет включает в себя только блок обработки хранящейся в таблицах информации, которая выводит­ся, а вся итоговая информация в компоненте «Оперативный учет» хранится в спе­цифических объектах метаданных, называемыми Регистрами, то перед построением отчетов необходимо создать регистры. При этом, самым простым случаем будет тот, когда на каждый отчет создается свой регистр. При этом надо иметь в виду, что каждый регистр, представляет собой две таблицы и, следовательно, неоправданное увеличение количества регистров ведет к увеличению общего размера информаци­онной базы, в которой будет храниться пересекающаяся информация. Кроме этого, на количество создаваемых регистров может повлиять распределение всей выход­ной информации по отдельным отчетам.

Для нашей задачи мы создадим следующие регистры:

• регистр «ОстаткиТоваров»;

апрель 2004 г.


40_______________ 1C предприятие 7.7. Компонента Оперативный учет

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12