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

Предлагаемая задача на курс обучения
Для облегчения изучения компоненты «Оперативный Учет» системы программ «ЮПредприятие 7.7» мы рассмотрим сквозной пример. Предположим, что необходимо выполнить автоматизацию деятельности некоторой организации. В результате встречи с нашим условным заказчиком удалось сформулировать следующее Техническое задание:
Фирма «ЮФранчайзи» осуществляет деятельность по следующим направлениям:
» покупка и продажа товаров (программных продуктов);
оказание разовых и долговременных услуг по поддержке и настройке программно

го обеспечения в рамках «!С:Предприятия». Оплата долговременных услуг может

проходить поэтапно.
В системе учета должны храниться следующие данные о товарах:
  1. информация о виде товара (товар, услуга);
  2. закупочная цена в У.Е.;
  3. продажная цена в У.Е.;
  4. единица измерения;
  5. дополнительная характеристика товара.
Все документы выписываются в рублях, но учет ведется в У.Е., курс У.Е. заносится по мере необходимости.
Поступление и продажа товара могут происходить на разные склады. При продаже товара необходима проверка на наличие этого товара на складе.
На фирме принят следующий оборот документов: покупка товара оформляется документами «Приходная накладная» и «Оплата покупки», в случае заказа товара клиентом оформляется документ «Счет», который формирует резерв товара. В случае отказа от оплаты формируется документ «Снятие резерва» по указываемым счетам. При отгрузке товара клиенту или при завершении работ на основании «Счета» выписывается документ «Расходная накладная», в которой указывается, какой товар отпускается. Поступление денежных средств от клиента фиксируется документом «Приход денег».
На фирме действует система скидок для клиентов, предусматривающая определенный процент скидки на продажную цену товара при условии, что общая сумма покупок клиента за предыдущий месяц превысила некоторую величину, которая должна задаваться пользователем.
Для оценки текущей ситуации на фирме введена следующая форма отчетности:
  1. Остатки товаров (с учетом партий);
  2. Взаиморасчеты;
  3. Резервы товаров;
  4. Скидки клиентам;
  5. Состояние заказа.
Учет товарных запасов и списание себестоимости ведется в разрезе партий товаров по методу FIFO или LIFO.
Глава 1. Основные понятия системы «1C: Предприятие» Перед тем как перейти непосредственно к началу создания программного продукта по автоматизации хозяйственной деятельности предприятия, необходимо осуществить так называемую Постановку задачи. Она заключается в четком определении того, что является для нас исходной информацией, какая информация должна быть получена в результате обработки системой введенной а нее информации и, наконец, какие существуют для этого механизмы обработки информации. После этого, опираясь на существующие инструменты той среды создания приложения, в которой будет вестись разработка, в нашем случае - это система «1С:Предприятие», для каждого из выше описанных этапов требуется выбрать соответствующие компоненты и модифицировать их с учетом требований конкретной задачи. Далее, с помощью средств конфигурирования, а также возможностей встроенного языка программирования необходимо связать отдельные элементы системы между собой в единое целое. 1.1. Конфигурация
В результате описанных выше действий в рамках системы «1С:Предприятие» будет создана так называемая Конфигурация, которая вместе с самой системой представляет законченный программный продукт. Именно Конфигурация содержит необходимый набор объектов системы «1С:Предприятие», структур информационных массивов и алгоритмов их обработки. С другой стороны, Конфигурация в системе «1С:Предприятие» определяется документацией как совокупность трех взаимосвязанных составных частей:



1.1. Окно «Конфигурация»
  1. Структуры метаданных (или просто метаданные);
  2. Набора пользовательских интерфейсов;
  3. Набора прав.
Методические материалы обучения партнеров


JJ 1С:Предприятие 7.7. Компонента Оперативный учет
1.2. Метаданные, объекты метаданных, их свойства
Основу концепции системы «1С:Предприятие» составляет понятие метаданные. Метаданными называется совокупность объектов метаданных, настроенных на хранение и обработку информации о хозяйственной деятельности конкретного предприятия или предметной области.
Наряду с понятием метаданные широко используется термин «структура метаданных». Данный термин более точно отражает суть метаданных, как сложной структуры взаимодействующих объектов метаданных.
Объект метаданных - формальное описание группы понятий предметной области со сходными характеристиками и одинаковым предназначением. Объекты метаданных подразделяются на виды. Каждый вид объектов метаданных обладает уникальным набором свойств, который описан на этапе разработки системы и не может быть изменен.
Примерами объектов метаданных являются:
  1. Константа "Руководитель Предприятия";
  2. Справочник "Номенклатура";
« Реквизит "Цен а Продажи" справочника "Номенклатура".
Главное свойство любого объекта метаданных - идентификатор - краткое наименование объекта метаданных. Уникальность идентификаторов объектов метаданных отслеживается системой. Идентификатор может быть удален только вместе с объектом метаданных.



Некоторые свойства объекта метаданных доступны для редактирования и могут быть так или иначе изменены в процессе конфигурирования. Характер изменений и их пределы также задаются на уровне системы. Целенаправленным изменением свойств объекта метаданных можно добиться требуемого поведения объекта при работе системы. Однако такие изменения не затрагивают сущности объекта и не позволяют добиться от него действий, не свойственных объектам данного типа.
Например: у справочника
1.2. Свойства объекта метаданных
"Номенклатура" есть реквизит "Наименование". У данного реквизита есть не редактируемое свойство «Тип» - всегда "Строка" и редактируемое свойство "Длина", которое может принимать значения от 1 до 100 (пределы изменения).
1.2.1. Агрегатные объекты метаданных
Объекты метаданных в системе могут быть как независимыми, так и подчиняться друг другу. Например, независимым объектом метаданных является кон-
Глава 1. Основные понятия системы «1С:Предприятие» 9 станта. Константа самодостаточна: она может содержать какое-либо значение, и этим полностью исчерпывается ее назначение. Прямо противоположным примером является объект метаданных «Реквизит справочника», который содержит какую-либо дополнительную информацию об элементе справочника. Он может существовать только в составе объекта метаданных «Справочник». Сам по себе, отдельно от справочника, реквизит справочника никогда не используется. Объект метаданных «Справочник» может вообще не содержать объектов типа «Реквизит справочника», но если такие объекты существуют, то они «живут» только внутри справочника. Таким образам, объект «Реквизит справочника» является подчиненным объекту «Справочник».
Объекты метаданных, которые могут иметь в своем составе подчиненные объекты, называются агрегатными объектами метаданных.
1.2.2. Типизированные и типообразующие объекты метаданных
Одно из основных свойств объектов метаданных - тип значения, который может быть назначен объекту. Тип значения определяет, какого рода информацию может содержать объект метаданных и назначается при редактировании свойств объекта. Свойство «Тип значения» существует не у всех объектов. Агрегатные типы данных, как правило, не обладают этим свойством, так как содержат «комплексную» информацию, то есть хранят одновременно данные разных типов.
Объекты метаданных, для которых может быть указан тип информации, хранящейся в объекте, называются типизированными объектами метаданных.
Типы значений, которые может принимать объект метаданных, можно разделить на 2 группы.
Первую группу составляют базовые типы значений: «Число», «Строка» я «Дата». Соответственно, информация, хранящаяся в этих объектах метаданных, может быть числом, произвольной строкой символов или датой.
Кроме этого, некоторые объекты метаданных также могут образовывать типы значений. Например, константе «Руководитель» может быть назначен тип «Справочник.Сотрудники». В этом случае значение константы будет представлять собой ссылку на один из элементов указанного справочника.
Объекты метаданных, которые могут образовывать типы значений других объектов метаданных, называются типообразующими объектами метаданных. Такими объектами в системе «1С:Предприятие» являются:
  1. справочники;
  2. документы;
  3. перечисления.
Необходимо обратить внимание, что типообразующие объекты метаданных образуют тип значения сразу после создания в Конфигураторе объекта любого из таких типов. Например, когда в Конфигураторе создается новый справочник, то в списке типов значений появляется наименование созданного справочника. Такой


10
^[С:Предприятие 7.7. Компонента Оперативный учет
тип значения может быть присвоен любому из типизированных объектов метаданных.
1.2.3. Форма объекта метаданных
Большинство объектов метаданных в системе «ЮПредприятие» могут иметь визуальное представление. В самом общем случае визуальное представление состоит из следующих частей:
  1. экранный диалог, используемый для ввода и редактирования информации,

    хранящейся в объекте метаданных;
  2. табличная форма объекта метаданных (печатных форм может быть не

    сколько);
  3. модуль формы - может содержать программу на встроенном языке систе

    мы «1С:Предприятие».
Модуль формы может содержать такие алгоритмы как: построение печатной формы, обработка вводимой в диалог информации для целей входного контроля, выполнение расчетов и т.д.
Совокупность диалога, модуля и таблицы называется формой. Для разработки форм в конфигураторе применяется комплексный редактор форм, позволяющий редактировать все компоненты формы во взаимосвязи.
1.2.4. Понятие модулей
Как мы уже заметили при обзоре существующих типов данных, для большинства из них в момент заполнения, сохранения, редактирования, проведения, расчета и т. д. необходимо выполнение неких процедур и функций, которые будут осуществлять определенные изменения в них самих или в других элементах системы. Для написания этих процедур и функций в программе предусмотрено наличие различных видов модулей, которые запускаются в строго определенные моменты работы с системой.
Фактически модуль - это программа на встроенном языке системы «1С: Предприятие».
Все виды программных модулей перечислены в книге «1С:Предприятие 7.7. Версия 7.7. Описание встроенного языка. Часть 1».
Нужно помнить, что вид программного модуля определятся его размещением в конфигурации, а это в свою очередь определяет момент его запуска и тот контекст, который вам будет доступен при написании алгоритма на встроенном языке системы программ «1С:Предприятия».
Компонента «Оперативный учет» не имеет каких-либо специальных видов программных модулей, которые принадлежали бы только ей. Для изменения состояния регистров используется только модуль документа. Именно об этом нужно помнить при конфигурировании документов и регистров для организации оперативного учета.
Методические материалы обучения партнеров
Глава 1. Основные понятия системы «1C:Предприятие» 11[ 1.2.5. Пользовательские интерфейсы, права пользователей, панели инструментов. Создание пользовательских интерфейсов, определение прав пользователей и редактирование панелей инструментов - достаточно важный этап создания конфигурации системы. Существует много примеров, когда пользователи были неудовлетворенны простейшей конфигурацией системы только потому, что программист не создал удобный для работы интерфейс или недостаточно четко разграничил права пользователей. И, наоборот, при наличии сложнейшей задачи программист четко разграничил наборы прав, ввел удобные интерфейсы для каждого пользователя на конкретном рабочем месте, чем облегчил восприятие сотрудниками логики работы программы, порядка ввода документов и т. д.
1.3. Виды объектов метаданных, используемые в компоненте «Оперативный учет»
«Базовые объекты» Компонента «Бухгалтерский учет» Компонента «Оперативный учет» и Компонента «Расчет»





Перед тем, как приступить к обсуждению и составлению плана создания конфигурации следует ознакомиться с основными видами объектов метаданных, присутствующими в системе, их структурой и функциональными возможностями.
JiI*E«? 'Ју-
Рмс.1.3. Принадлежность видов объектов метаданных компонентам «ЮИредприятии»
1.3.1. Базовые объекты метаданных
Следует помнить, что Константы, Перечисления, Справочники, Документы, Журналы документов, Отчеты и обработки - относятся к так называемым базовым объектам метаданных и подробно рассматриваются в дневном курсе обучения «1C: Предприняв 7.7. Базовые объекты».
апрель 2004 г.


12
1С:Предприятие 7.7. Компонента Оперативный учет
Константы - предназначены для хранения информации, относящейся ко всему предприятию, необходимой для многократного использования в печатных формах, расчетах и т. д. Информация может быть постоянной или периодически меняющейся. Использование констант облегчает изменение величин, которые используются в разных модулях и шаблонов таблиц конфигурации.
Перечисления - предназначены для перечисления возможных значений для выбора в случае, когда их число условно постоянно. Перечисления удобны в тех случаях, когда возникает необходимость в ограничении количества вариантов заполнения реквизита справочника, документа и т. д., а также при необходимости исключить возможность дополнения или изменения этих вариантов.
Использование перечислений также делает удобным дальнейший анализ заполнения реквизитов.
Справочники - предназначены для хранения различных списков, перечней и т. д. Достоинство справочников - наличие неограниченного количества реквизитов, наличие нескольких уровней. Информация в справочнике может изменяться, а также быть зависимой от времени.
Кроме того, существует возможность подчинения одного справочника другому, т. е. возможность сопоставить каждому элементу справочника-владельца все множество элементов подчиненного справочника.
Документы - предназначены для ввода информации о текущей деятельности предприятия, ее просмотра и корректировки. В конфигураторе системы мы создаем электронный аналог документа, который пользователь использует для ввода информации о хозяйственной деятельности предприятия. У документа существуют основные характеристики - дата и время, которые определяют его позицию на «оси времени» и устанавливают строго определенную последовательность документов.
Документ может иметь несколько «состояний». В момент ввода нового документа для программы этого документа еще не существует (точнее; он находится в оперативной памяти компьютера и не имеет еще своей «позиции»), для того чтобы документ стал частью базы данных его необходимо «Сохранить». Сохраненный документ, в свою очередь, может быть «проведенным» или «не проведенным». При проведении документа выполняются действия, описанные в модуле документа.
Журналы документов - предназначены для хранения документов, созданных в системе. Журналы документов могут иметь свои реквизиты, значение которых заполняется из соответствующих реквизитов хранящихся в журналах документов. Это значительно облегчает возможность поиска нужного документа в журнале. Визуальное представление журнала задается в «Форме» журнала.
Отчеты и обработки - предназначены для написания алгоритмов формирования форм визуального просмотра информации, а также для выполнения действий по изменению или введению какой - либо информации в систему.
Мы будем активно использовать эти виды метаданных в нашей учебной конфигурации, предполагая, что Вы уже знакомы с методикой их конфигурирования, а
Глава 1. Основные понятия системы «Ю^Предприятие» 13^ также с использованием соответствующих им объектов, атрибутов и методов встроенного языка системы «1С:Предприятие». Из всего дерева структуры метаданных компоненте «Оперативный учет» принадлежит только один вид объектов - «Регистры». Этот вид объектов метаданных будет присутствовать в дереве только тогда, когда компонента загружена. И отсутствовать, если ее нет.
1.3.2. Регистры
1.3.2.1.Общая информация о регистрах
Регистры используются для накопления информации о наличии и движении средств (товарных, денежных и т.д.). Вся информация о хозяйственных операциях, которая вводится с использованием документов или формируется при помощи расчетов, должна быть накоплена в регистрах. Именно регистры являются основным источником информации для анализа и формирования отчетов. Как правило, факт проведения документа означает изменение содержимого регистре» (одного или нескольких) на основе данных документа.
Регистры являются внутренним компонентом конфигураций, т.е. они недоступны для непосредственного заполнения, нет стандартных средств их просмотра, как для других агрегатных объектов метаданных (документов, справочников, констант и т. д.). Однако средствами встроенного языка можно записывать в регистры информацию и в последующем извлекать ее.
Физический аналог регистра подобрать сложно. Можно сказать, что это N-мерная система координат, в узлах которой хранятся итоговые данные на определенный момент времени, причем доступ к данным осуществляется практически мгновенно. Основными элементами регистра являются измерения (оси координат, на пересечении конкретных значений которых лежит информация) и ресурсы (собственно информация в виде итоговых, данных). Измерения можно определить как набор признаков, в разрезе которых информация должна храниться, извлекаться, анализироваться. Ресурсы - категории учета, которые должны быть представлены в числовом виде.
(Ьмерення: Реорсы:
Товар |
Количество
1 Склад
БазоваяСтоимость
1
ВалютнаяСтоимость |
1.4. Структура регистра
«ОстатхиТоваров»
В системе «ЮПредприятие» существует 2 типа регистров: регистры остатков и регистры оборотов. Разница между ними понятна из их названия и заключается в характере хранимой информации: в регистрах остатков всегда хранится информация о конечном состоянии средств, а в регистрах оборотов, образно выражаясь, - как это состояние было достигнуто.





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


14 1С:Предприятие 7.7. Компонента Оперативныйу^ет
Под термином «остаток» ресурса для регистров остатков следует понимать числовое значение, которое имеет ресурс на какой-то момент времени.
Кроме хранения остатка или оборота ресурсов, регистры хранят все «приращения» (приход со знаком «+» или расход со знаком «-»), произведенные документами (собственно «движения регистра»). Причем эти «приращения» регистров храь[ятся со ссылками на те документы, которые их вызвали. Поэтому, во встроенном языке системы «1 (^Предприятие» есть методы, позволяющие получить из регистра все его движения (с привязкой к документам), указав интервал времени, за который они нужны. Таким образом, регистр остатков физически состоит из двух таблиц: таблицы остатков и таблицы движений.
Проиллюстрируем вышесказанное на примере регистра «ОстаткиТоваров», имеющего тип «регистр остатков».
Представим себе следующую ситуацию:
У предприятия 2 склада: база и магазин, 2 товара: нитки и иголки, товар учитывается по количеству, стоимости в рублях и валюте.
В первый момент времени на всех складах отсутствуют все виды товара. Во второй момент времени на склад «База» приходит 10 штук иголок, стоимость каждой 25 рублей, курс валюты 25 рублей за 1 доллар.





Тогда структура нашего регистра должна быть такой, какой она изображена на 1.4.
Поэтому в Момент! наш регистр будет содержать информацию изображенную на рис 1.5.
Иголки
Нитки
1.5. Содержимое регистра «ОстаткиТоваров» в Момент2
Товар Склад Количество БазоваяСтоимотсь i ВалютнаяСтои.мос1ь
(пусто)
Затем в некоторый Момент?- произошел приход товара «Иголки» на склад «База». Этот приход товара согласно концепции «1С:Предприятия» записывается в регистр только в момент проведения соответствующего документа. А раз так, то
Следует знать, что физически регистр остатков хранит только те записи, в которых есть хотя бы одно ненулевое значение ресурса. Поэтому сейчас в нашем регистре не будет записей. И, следовательно, таблица остатков регистра будет пустой:
Глава 1. Основные понятия системы «1С:Предприятие» __15 графически, сейчас наш регистр можно изобразить, таким образом, как это изображено на рис, 1.6.



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

напоминает таблицу остатков

с той лишь разницей, что она

дополнительно содержит
Их-о'лкн
Ниткн
дополнительно еще:
Рнс.1.6. Содержимое регистра «ОстаткиТоваров» в Момент2
  1. Ссылку на документ,

    которому принадлежит

    документ
  2. Флаг «при-
ход/расход» Поэтому сейчас таблица движений будет выглядеть следующим образом:
Документ Флаг Товар Склад Количество Башвая Валюiпаи
10
250
10
База
СТОИМО I СЬ С I UIIMOC I I.
Иголки
Приходная
накладная
№1
После запаси движения таблица остатков примет следующий вид:
Товар Склад Количество ЬашваяС тоимотсь Ва.шишшСишмосн
250J
[База
1.3.2.2.Дополнительная информация о регистрах
Изменение информации в регистрах происходит при выполнении системных

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





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


^16 1C предприятие 7.7. Компонента Оперативный учет
Помимо измерений и ресурсов, для регистра может быть создан набор реквизитов. Реквизиты позволяют включать в движения регистров различную дополнительную информацию. Реквизиты не влияют на значения ресурсов регистра, и могут использоваться для анализа движений регистра при их выборке.
Например: все операции с товарами можно разделить условно на внутренние и внешние операции. Внутренним могут быть следующие операции: «перемещение», «списание», а внешними - «покупка», «продажа». Для облегчения анализа движения товаров введем в регистр «ОстаткиТоваров» реквизит «ТипОперации», которому при проведении документа будет присваиваться значение «1» для внутренней операции и значение «2» для внешней операции.
Подводя итог всему вышесказанному, можно сделать следующий вывод: наиболее важным преимуществом использования регистров является то, что они служат для хранения информации, к которой необходимо получать оперативный доступ. «Уровень оперативности» и, соответственно, целесообразность использования регистров должен определять специалист, выполняющий конфигурирование системы «1С:Предприятие», в соответствии с требованиями пользователей системы.
Кроме того, необходимо отметить, что регистры позволяют получать наиболее достоверную информацию о состоянии оперативного учета. Так как система позволяет сохранить документ без его проведения, пользователю предоставляется возможность остановиться и еще раз проверить правильность введенной в документ информации. Поэтому, именно запись изменений в регистры служит подтверждением того, что хозяйственная операция совершена.
К возможным неудобствам использования регистров при конфигурировании системы «1С:Предприятие» невозможность внесения, по понятным причинам, информации напрямую непосредственно в регистры.
1.3.3. Модуль документа
Модуль документа представляет собой программу на встроенном языке системы «1С:Предприятие», которая вызывается для исполнения при проведении документа, отмене его проведения, при установке на документ пометки на удаление. При этом выполняется одна из предопределенных процедур ОбработкаПроведения () или ОбработкаУдаленияПроведения().
Только из модуля документа можно изменять регистры, а также периодические реквизиты справочников (для которых включено свойство «Изменяется документами»). Документ «помнит» о тех изменениях, которые он выполнил в регистрах. При удалении документа или отмене его проведения (команда «Сделать документ не проведенным» в меню «Действия» главного меню системы «1 (^Предприятие») выполненные документом изменения в регистрах будут корректно удалены.
Следует помнить, что возможность обращения к Регистрам из Модуля документа существует только в том случае, когда в окне редактирования «Документ» включена опция «Оперативный учет».
Методические материалы обучения партнеров
Глава 1. Основные понятия системы «1С:Предприятие» 17^ Отметим, что в Модуле документов не следует использовать элементы интерактивного управления (например, системные процедуры Предупреждение (), Вопрос (), ВвестиЧисло () и т.п.). Это связано с выполнением транзакций. Во время проведения документа система выполняет неявную транзакцию, что гарантирует, что в любой момент времени проводиться может только один документ. По-/ этому применение диалоговых процедур будет существенно тормозить или даже останавливать работу других пользователей в разделенном режиме работы сетевой версии системы «1С:Предприятия». 13.4. Транзакции
Транзакция представляет собой последовательность шагов обработки, приводящих к выполнению конкретных функций или действий. При этом весь набор действий воспринимается как одна единица работы, которая либо принимается вся в случае успешного завершения, либо вся отвергается в случае возникновения ошибки. В системе «1С:Предприятие» транзакции активно используются самой системой при записи различной информации, Транзакция гарантирует неизменность информации в информационной базе для других пользователей до ее завершения и целостное сохранение информации.
Замечание: В классических СУБД, транзакции, как правило, используются для обеспечения целостности данных, когда требуется одновременно обновить записи в двух или нескольких таблицах и необходимо обеспечить, чтобы изменения были занесены во все таблицы (завершить транзакцию) или не были занесены ни в одну (отказаться от выполнения транзакции).
Например, при переводе денег с одного счета на другой следует снять необходимую сумму с одного счета и добавить ту же сумму на другой счет. Если любая из операций обновления не будет выполнена, то баланс счетов будет нарушен. В подобном случае следует применить метод Начать Транзакцию {) перед обновлением первой записи, а затем, если любое из последующих обновлений будет неудачным, применить метод ОтменитьТранзакцию {} для отмены всех обновлений. После успешного завершения последнего обновления следует применить метод ЗавершитьТранзакцию (5 для сохранения изменений. Если приложение завершается во время транзакции, то происходит откат всех операций.
В системе «1С:Предприятие» механизм транзакций должен применяться только в тех программных модулях, которые выполняют запись изменений в информационной базе (в справочниках, константах, документах). Их не следует использовать в алгоритмах формирования движений документов (так как в предопределенных процедурах модуля документа система сама, по умолчанию, выполняет все действия через транзакцию). Транзакции также не стоит использовать при одиночных записях. Типичный пример, когда следует использовать транзакции -это процедура, которая во всех элементах справочника будет менять некоторый параметр.
апрель 2004 г.


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





К транзакциям применимы следующие правила:
  1. Транзакция начинается с процедуры НачатьТранзакцию и заканчивает

    ся процедурой ЗафиксироватьТранзакцию.
  2. Конструкция ЗафиксироватьТранзакцию без предшествующей

    конструкции НачатьТранзакцию выдает сообщение об ошибке.
  3. Конструкция Отменить Транзакцию без предшествующей конструкции

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

    ЗафиксироватьТранзакцию (или до отката транзакции), даже если

    управление переходит в другие программы или функции, или до заверше

    ния приложения, что вызывает откат транзакции.
Действия, заключенные в транзакцию, выполняются быстрее. Особенно существенно ускоряется обработка в разделенном режиме. При этом наибольший выигрыш в скорости обработки может быть получен для операций, связанных с изменением содержимого базы данных, хотя и скорость чтения информации может быть повышена в несколько раз.
Так как транзакция, выполняемая одним пользователем, может помешать выполнению транзакций другими пользователями, то важно соизмерять получающееся ускорение от применения транзакции с возможными конфликтами между пользователями, связанными со слишком долгим ожиданием окончания транзакции.
При обработке транзакции (в том числе и в Модуле документа) не следует использовать элементы интерактивного управления (например, системные процедуры Предупреждение (}, Вопрос (), ВвестиЧисло () и т.п.). В противном случае при открытой транзакции система ожидает отклика пользователя, а это может препятствовать нормальной работе других пользователей (в результате документы у всех остальных пользователей могут не проводиться). В этом случае лучше использовать системные процедуры Сообщить (...) или Состояние (...).
Глава 2. Простейшая конфигурация -торговля в реальном времени На первом этапе, в рамках предлагаемой задачи на курс обучения, построим простейшую конфигурацию, отражающую торговую деятельность организации, осуществляющей закупку и перепродажу товаров. При этом будут преследоваться две следующие цели: « Напомнить слушателям, как работать с базовыми объектами. * Дать слушателям начальные навыки работы с регистрами. Для простоты будем считать, что все документы проводятся в реальном масштабе времени. Проведение документов задним числом запрещено.
Упражнение №2.1
Зарегистрируйте новую информационную базу. Дайте ей название «Простей-шая конфигурация» и разместите в любом удобном для вас каталоге.
Совет: для создания каталога можно использовать кнопку «Создание новой папки» диалога «Выоор каталога».
2.1. Создание констант и перечислений
На данном этапе, в соответствии с условиями задачи, создадим в системе две константы и одно перечисление:
Константа КурсУЕ - необходима для хранения величины курса условной единицы. Т.к. с течением времени курс может изменяться, то делаем константу периодической. В этом случае в списке констант будут храниться все ранее существовавшие значения константы с датами их ввода. Это позволяет получить для данной константы ее значение на любую дату ввода;
Константа НазваниеОрганизации - хранит название нашей организации для автоматического внесения его в расходную накладную;
Перечисление ЕдиницыИзмерения - может принимать значения: штука, коробка, контейнер и т.д.
Упражнение №2.2
Создайте следующие Константы в новой конфигурации
И дентифи каюр
КурсУЕ
НаздакиеОрганизации
Комментарий
Значение курса -у .е.
Полное название организации
Вид Длина ~~
!б "
'90 "





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


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


Идентификатор
КурсУЕ
НазваниеОрганизации
Точность
4
Не отрицательный
Л/
Разделять 1 риады
Ч"
Периодический
~v
2.2. Создание справочников
При заполнении документов часто возникает необходимость указать какую-либо информацию, выбрав ее из заранее заданного списка, который периодически дополняется. Такой список и представляет собой справочник. Справочники используются в тех случаях, когда необходимо исключить неоднозначный ввод информации. Система «1C предприятие» позволяет вести практически неограниченное число справочников, каждый из которых представляет собой список однородных объектов. Более подробную информацию об основных свойствах справочника слушатели могут получить, прослушав курс «1C предприятие 7.7. Базовые объекты».
Очевидно, что для хранения информации по товарам, с которыми имеет дело организация, нам необходим справочник, который назовем "Номенклатура".
2.2.1. Справочник "Номенклатура"
Выполните следующее упражнение:


Упражнение №2.3
ГГЦоздайтё справочник
«Номенклатура» со следующими характеристиками;
Идентификатор
Номенклатура
Синоним
Комментарий
Владелец
Количество уровней
"3"
Длима кода
"5"
Длина наименования
""23"
Серии кодов Тип кода
"В пределах подчинения"

"Числовой"
Основное представление
"В виде наименования"
Контроль уникальности
4
Авто нумерация
V
Группы впереди
Л/
- ч«- Г§ОСО\ pЈ^SIvT»*pCSftL~*rJ5
*'Ti TT»rtns%™»" СУ ,c4*feCWVvsK *
Одна форма для элемента и группы'
Основная форма
Справочник. Номенкяатура,ФормаСписка.ФормаСписка
Основная форма для выбора
Справочник. Номенклапура.ФормаСписка.ФормаСписка
Методические материалы обучения партнеров
Глава 2. Простейшая конфигурация^- торговля в^реальном времени_21 2. Для этого справочника необходимо создать следующие реквизиты:
Идентификатор
Единица Намерения
Цена Закупки
Цена Продажи
Описание
Синоним
Единица Измерения
Цена закупки
Цена продажи
Комментарий
Измеряется
Измеряется
в у, с.
в у. е.
Тип
Перечисление
Число
Число
Строка
Вид
ЕДИНИЦЫ
Измерения
Длина
10
10
VHeorp.
Точность
~1
т
Не отрицательный
"V
V
Разделять Триады
V
V
Периодический
Сортировка
Отбор
Ручное Изменение
V
V
V
V
Изменяется
" Доку ментами
...
-
Использование
Для элемента
Для "Элемента
Для элемента
Для обоих



2.1. Форма списка справочника «Номенклатура»
При вызове

справочника из

строки меню или

панели инстру

ментов открыва

ется Форма

списка справоч

ника. Как видно

из рисунка 2.1,

окно редактора

формы имеет три

закладки. На

закладке «Диа

лог» представлен

внешний вид
окна формы списка справочника. Если для реквизита «Редактировать» окна редактирования справочника выбрано значение «В списке», то редактирование строки, на которой установлен курсор, возможно непосредственно в ячейках табличной части справочника. Как правило, для редактирования справочника выбирается режим редактирования «В диалоге». апрель 2004 г.


22
1C: Пред приятие 7.7. Компонента Оперативный учет
Упражнение №2.4
Откройте окно формы списка справочника «Номенклатура».
1. Выберите закладку «Диалог». Разместите элементы в форме диалога, так как это изображено на рисунке 2.J.
2. Выберите закладку «Модуль». Вызовите конструктор печати. Сформируйте
процедуру Печать (}, а также шаблон печатной формы, используя, конструктор. Измените, шаблон печатной формы, так как это изображено на рисунке 2.2.



Глава 2. Простейшая конфигурация - торговля в реальном времени 23 В «Модуль формы» поместим только одну процедуру ВводНового (), вводя-

щую по умолчанию Единицу измерения товара. Процедура ВводНового()
// "по умолчанию" единицей измерения товара являются штуки
ЕдиницаИзмерения=Перечисление.ЕдиницыИзмерения.Штука;

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



Для редактирования заголовка группы в таблице справочника необходимо вызвать Форму группы в окне редактирования справочника.
Упражнение №2.5
2.4. Форма группы справочника
«Номенклатура»
Для справочника Номенклатура

необходимо создать Форму группы,

включить справочник в панель инст

рументов «Конфигурация» и основ

ное меню интерфейса

«Пользовательский» (см. 2.5).










2.2. Шаблон печатной формы списка справочника
«Номенклатура»
Если для реквизита «Редактировать» окна редактирования справочника выбрано значение «В диалоге», то редактирование текущей строки справочника в режиме «ЮПредприятие» происходит в специальном окне, вызываемом через Форму элемента справочника.



2.3. Форма элемента справочника
«Номенклатура»
--.. ,. I ' г mini 1 а II г i.ir.innininn» ^
2.5. Создание пользовательского интерфейса





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


24 1С:Предприятие 7.7. Компонента Оперативный учет
2.3. Создание регистров
При создании регистра важно помнить, что регистр остатков хранит значения своих ресурсов на некоторый момент времени. Этот момент называется Точкой Актуальности (далее ТА) итогов. Каждый из документов, принадлежащих компоненте Оперативный учет, при своем проведении записывает в соответствующий регистр необходимые движения и затем уже передвигает ТА вперед по времени.
Регистр остатков внутри самой системы «ЮПредприятие» спроектирован таким образом, что когда вы просите регистр выдать состояние его ресурса, т.е. остаток, регистр возвращает остаток на Точку Актуальности практически мгновенно.
При проектировании регистра важно вначале для себя дать ответ на два основных вопроса:
  1. Какую информацию должен накапливать регистр? В каких разрезах

    мы собираемся ее извлекать?
  2. Какие документы должны записывать движения в наш регистр? Когда

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


Идентификатор
ОстаткиТоваров
Синоним
Остатки товаров
Комментарий
Тип регистра
Остатки
Периодичность
Быстрая обработка движений
Регистр будет иметь следующую структуру: Измерения:
Идентификатор
Товар
Синоним
Комментарий
Тип значения
Справочник
Вид
Номенклатура
Длина
Точность
Разделять Триады
Отбор движений
Отбор итогов
Глава 2. Простейшая конфигурация - торговля в реальном времени 25 Ресурсы:
Идентификатор
Количество
СтоимостьРуб
СтоимостьУЕ
Синоним
Ст . руб
Комментарий
Измеряется в единицах измерения товара
Измеряется в рублях
Измеряется в У.Е.
Тип значения
Число
Число
Число
Вид
Длина
10
12
12
Точность
0
2
2
Разделять Триады
V
V
На втором этапе мы должны определить:
Какие виды документов будут записывать движения в наш регистр.
» С каким знаком эти движения должны быть записаны.
Последнее особенно важно. Поясним в чем дело.
Напомним, что регистр накапливает итоги и не хранит записей о тех конкретных значениях измерений, по которым нет ресурсов. Такой подход обеспечивает очень компактную структуру хранения информации, позволяющую быстро найти нужную информацию. Другими словами, чтобы хорошо работать, регистр «помнит» только то, что необходимо.
Поэтому таблица остатков регистра при правильном проектировании конфигурации практически не растет, и, как следствие, - документы проводятся быстро, да и отчеты также формируются быстрее. Скорость работы конфигурации остается практически одинаковой, что при практически пустой информационной базе в начале эксплуатации конфигурации, что и через год или более от начала эксплуатации.
Напротив, при неправильном проектировании регистров и документов таблица остатков растет очень быстро, документы проводятся все медленнее и медленнее, с течением времени отчеты формируются все дольше и дольше. И, в конце концов, пользователь задает резонный вопрос: «А где здесь оперативный учет?».
Чтобы не происходило, то, что описано в предыдущем абзаце, нужно при проектировании регистра, да и всей конфигурации в целом, соблюдать следующее правило:
Если для некоторого регистра остатков «X» есть вид документа, который записывает движение «Приход», то обязательно должен быть вид документа, который в этот же регистр «X» записывает и движение со знаком «Расход».
Если это правило не выполняется хотя бы для одного из регистров конфигурации, то об оперативном учете через некоторое время пользователь может забыть. Это произойдет из-за того, что таблица остатков регистра вырастет, т.к. регистр





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


.26 1C: Пред приятие 7.7. Компонента Оперативный учет
будет постоянно накапливать итоги по всем возможным комбинациям измерений. Как следствие, вырастет время, за которое регистр будет выдавать остаток.
С другой стороны, если для документов выполняющих «Приход» в регистр, через некоторое время выполняются и документы записывающие «Расход», тогда из таблицы остатков будут исключаться те записи, по которым все ресурсы равны нулю. И, как следствие, - таблица остатков практически не растет, т.е. система работает быстро.
Давайте возможные виды документов и их движения представим в виде таблицы - нам так легче будет потом проектировать конфигурацию:


Регистр «ОстаткиТоваров»
Флаг движения
Вид документа
«+» - приход
Приходная накладная
«-» - расход
Расходная накладная


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

Добавим в документ следующие реквизиты шапки:
Идентификатор
Курс
ДатаКурса
Синоним
Курс
Дата курса
Комментарий
Служит для хранения величины курса у. е. в документе
Хранит дату, на которую в документе используется курс
Тип значения
Число
Дата
Вид
Длина
10
Точность
4
Не отрицательный
V
Разделять Триады
Л/
В табличную часть документа необходимо внести следующие реквизиты:


Идентификатор
Товар
Количество
Единица
Синоним
Товар
Количество
бд. измерения
Комментарий
Измеряется в единицах измерения товара
Единица измерения закупленного товара
Тип значения
Справочник
Число
Перечисление
Вид
Номенклатура
ЕдиницыИзмерения
Длина
10
Точность
0
Не отрицательный
Л/
Разделить Триады
Л/
Итог по колонке
V





Идентификатор
ПризсоднаяНакл а дная
Синоним
Прих. Накл.
Комментарий
Приходная накладная
Журнал
ПриходныеНакладные
Номер: Нумератор
Не назначен
Номер: Периодичность
В пределах года
Номер: Автоматическая нумерация
"V '
Номер: Контроль уникальности
V
Номер: Тип:
Числовой
Номер: Длина
5
Разрешить проведение документа
V
Автоматическое удаление движений
V
Автоматическая нумерация строк
V
Оперативный учет
V




Идентификатор
Цена
СуммаУЕ
СуммаРуб
Синоним
Цена
Сумма в у.е.
Сумма в руб.
Комментарий
Цена закупленного товара
Сумма в у.е., '.на которую закуплен товар
Сумма в рублях, на которую закуплен товар
Тип значения
Число
Число
Число
Вид
Длина
10
12
12
Точность
2
2
2
Не *т»ицательный
V
V
V
Разделять ггмады
V
V
V
Итог по колонке
V
V
Для реквизитов Количе^во СуммаУЕ и СуммаРуб в диалоге формы будем вычислять сумму значений по все^ строкам табличной части. Поэтому на закладке «Дополнительные» каждого реквизит необходимо включить опцию «Итог по колонке».





Методические материалы обучения партнеров
апрель 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, и на основании таблицы заполните для приведенных в ней элементов диалога поле «Формула». Добавьте текст необходимых процедур на закладке «Модуль».
  1. Выберите пункт меню «ТЗставить|Текст и перетащите созданный системой

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

    ной час in документа,"после чего кнопку мыши можно "отпустить. В этом случае

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

    откройте его свойства.
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. Информация о тех организациях и частных лицах, с которыми фирма

    осуществляет акты купли-продажи.
Таким образом, в нашем случае, в Конфигурации должны присутствовать, как минимум, три справочника. Присвоим им следующие наименования:
  1. справочник «Номенклатура»;
  2. справочник «Места Хранения»;
  3. справочник «Контрагенты».
Не останавливаясь более подробно на детальной структуре этих справочников, а также на необходимых в Конфигурации константах и перечислениях, перейдем к рассмотрению выходной информации. Очевидно, что она напрямую связана с теми отчетами, которые нужно создать по условиям задачи. Поскольку, отчет включает в себя только блок обработки хранящейся в таблицах информации, которая выводится, а вся итоговая информация в компоненте «Оперативный учет» хранится в специфических объектах метаданных, называемыми Регистрами, то перед построением отчетов необходимо создать регистры. При этом, самым простым случаем будет тот, когда на каждый отчет создается свой регистр. При этом надо иметь в виду, что каждый регистр, представляет собой две таблицы и, следовательно, неоправданное увеличение количества регистров ведет к увеличению общего размера информационной базы, в которой будет храниться пересекающаяся информация. Кроме этого, на количество создаваемых регистров может повлиять распределение всей выходной информации по отдельным отчетам.
Для нашей задачи мы создадим следующие регистры:
регистр «ОстаткиТоваров»;
апрель 2004 г.








40 1C предприятие 7.7. Компонента Оперативный учет
  1. регистр «Взаиморасчеты»;
  2. регистр «РезервыТоваров»;
  3. регистр «СостояниеЗаказа»;
  4. регистр «Обороты».
Все изменения, связанные с информацией, хранящейся в регистрах, могут происходить только с помощью таких объектов метаданных, как Документы. Другими словами, документы являются «посредниками» между входящей и выходящей информацией. Поскольку в условии задачи документооборот фирмы описан, а движения регистров по каждому документу будут описаны ниже, приведем только список документов, которые должны присутствовать в конфигурации:
  1. документ «ПриходнаяНакладная»;
  2. документ«ОплатаПокупки»;
  3. документ «Счет»;
  4. документ «СнятиеРезерва»;
  5. документ «РасходнаяНакладная»;
  6. документ «ПриходДенег».
На основе выше изложенного, можно составить блок-схему информационных потоков, внешний вид которой представлен на следующей странице.
Еще раз обратим внимание, что в приведенной блок-схеме для каждого из регистров, кроме регистра «Обороты», существуют документы, осуществляющие движение этого регистра, как со знаком «плюс», так и со знаком «минус».
Таким образом, основные, необходимые объекты Конфигурации нами определены, и связи между ними намечены.
Перейдем к дальнейшей разработке учебной конфигурации, модифицируя по мере необходимости ранее созданные объекты.
3.2. Покупка товаров
Как было отмечено в Постановке задачи, для ведения оперативного учета в разрезе мест, где хранится товар, а также взаиморасчетов с клиентами, с которыми будут осуществляться операции купли-продажи, в Конфигурацию необходимо добавить два справочника: «МестаХранения» и «Контрагенты». Кроме того, так как в ходе нашей хозяйственной деятельности мы, кроме продажи товаров, будем оказывать еще и некоторые услуги, предусмотрим в справочнике «Номенклатура» возможность разделения по этому признаку.
Упражнение №3.1
1. Создайте справочники «МестаХранения» и «Контрагенты» без дополнительных реквизитов со следующими характеристиками:
Идентификатор
МестаХранения
Контрагенты
Синоним
Места хранения
Методические материалы обучения партнеров
Глава 3. Особенности проведения документов БЛОК-СХЕМА ИНФОРМАЦИОННЫХ ПОТОКОВ I
апрель 2004 г.
ВВОД ИСХОДНЫХ ДАННЫХ
41





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


Идентификатор
МесггаХранения
Контрагенты
Комментарий
Склады
Владелец
Количество уровней
» 1 и
"2"
Длина кода
"5"
"5"
Длина наименования
"25"
"50"
Серии кодов
"В пределах подчинения"
"В пределах подчинения"
Тип кода
"Числовой"
"Числовой"
Основное представление
"В виде наименования"
"В виде наименования"
Контроль уникальности
V
V
Авто нумерация
V
V
_Способ редактирования
"В списке"
"В списке"
Одна форма для элемента и группы
Основная форма
Справочник . МестаХранения . ФормаСписка . ФормаСписка
Справочник. Контрагенты. ФормаСписка . ФормаСписка
Основная форма для выбора
Справочник. МестаХранения. ФормаСписка . ФормаСписка
Справочник. Контрагенты. ФормаСписка . ФормаСписка


Глава 3. Особенности проведения документов

2. Создайте перечисление ВидНоменклатуры,

значения: товар, услуга.
3, Для справочника «Номенклатура» необходимо добавить реквизит, имеющий

следующие свойства:
Идентификатор
ВидНоменклатуры
Синоним
Вид номенклатуры
Комментарий
Определяет, является ли элемент справочника товаром
Тип
Перечисление
Вид
ВидНоменклатуры : :
Ручное Изменение
v -- "' "" .
Использование
Для группы
Остальные свойства реквизита можно не заполнять.
После внесения необходимых изменений в группу «Справочники» системы «1С:Предприятие» можно перейти к этапу проектирования регистров, необходимых для операций купли-продажи. Отметим, что на данном этапе, особенности учета по партиям товаров, а также вопросы резервирования товаров, нами затрагиваться не будут. Тогда, исходя из предлагаемой блок-схемы информационных потоков, кроме уже существующего в начальной Конфигурации регистра «ОстаткиТоваров» для хранения информации по взаиморасчетам с контрагентами предприятия создадим новый регистр «Взаиморасчеты», обладающий следующим набором свойств:
Идентификатор
Взаиморасчеты
Синоним
Комментарий
Тип регистра
Остатки
Периодичность
Быстрая обработка движений
Для того чтобы проверить, правильно ли мы спроектировали регистр, заполним таблицу, в которой опишем какие виды документов какой флаг движет™ (//приход» или «расход») будут использовать:
| Регистр «Вэамюора отчеты» 1
Флаг движения
Вид документа
«-» - расход
Приходная накладная
«+» - приход
Оплата покупки
«+» - приход
Расходная накладная
«-» - расход
Приход денег
Из таблицы видно, что в нашей Конфигурации предусмотрены документы, записывающие движения в регистр, как со знаком «+», тик и со знаком «-». Поэтому можно сделать вывод о том, регистр спроектирован правильно.





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


45
44 1С:Предприятие 7.7. Компонента Оперативный^чет
Упражнение JV»3.2
!. Для осуществления возможности учета остатков товаров по отдельным складам добавьте в регистр «ОстаткиТоваров» следующее измерение:
Идентификатор
Склад
Синоним
Комментарий
Тип значения
Справочник
Вид
МестаХранения
Остальные свойства измерения можно оставить пустыми.
По условию задачи операция покупки товаров нашей организацией сопровождается появлением двух видов документов: «Приходной накладной», отражающий сам факт оприходования на склад закупленных товаров, и «Оплатапокупки», который подтверждает перевод денег поставщику. Документ «Приходная накладная» нами был создан ранее, поэтому внесем в его структуру необходимые изменения, связанные с ведением оперативного учета по товарам в разрезе складов и поставщиков. Для этого в шапку документа добавим одноименные реквизиты:


Идентификатор
Поставщик
Склад
Синоним
Поставщик-
Склад
Комментарий
Пар! нер, продающий товар
Место хранения товара
-Тип значения
С гфаючник
Справочник
Вид
Контрагенты
МестаХранения
Поскольку на основании значений реквизитов документа Склад, Поставщик, Товар будут введены значения измерений созданных в Конфигурации регистров, запись документа целесообразно осуществлять только в том случае, если все значения этих реквизитов заполнены. Для проверки значений реквизитов добавим в модуль формы документа следующую предопределенную процедуру: Процедура ' ПриЗаписи // проверим, введено ли значение реквизита шапки Поставщик
Если Поставщик. Выбран () =0 Тогда
// если не введено, вызовем окно предупреждения и запретим запись Предупреждение ( "Не выбран поставщик!"); СтатусВозврата (0 ); КонецЕсли;
// проверим, правильно ли введены значения реквизитов Склад и Товар
Если ПроверкаСкладаТовара (Контекст )=0 Тогда СтатусВозврата (0) ;
КонецЕсли; КонецПроцедуры
В связи с тем, что подобная проверка будет необходима и для реквизитов документа «Расходная накладная», в рассматриваемой процедуре проверка правиль-
Методические материалы обучения партнеров
Глава 3. Особенности проведения документов ности заполнения реквизитов Склад и Товар выполняется с помощью функции глобального модуля ПроверкаСкладаТовара () , которая доступна всем программным модулям:
Функция ПроверкаСкладаТовара(Конт) Экспорт // проверим, введено ли значение реквизита шапки Склад Флаг1=1;
Если Конт.Склад.Выбран()=0 Тогда // если не введено, вызовем окно предупреждения и запретим запись
Предупреждение("Не выбран склад!"); Флаг1=0; КонецЕсли;
// открываем выборку строк спецификации документа Флаг2=Конт.ВыбратьСтроки(); Если Флаг2-0 Тогда // если нет ни одной строки, вызовем окно предупреждения и запретим запись
Предупреждение("Нет ни одной строки в табличной части!");
КонецЕсли;
// цикл выбора строк спецификации документа Пока Конт.ПолучитьСтроку{)=1 Цикл
Если Конт.Товар.Выбран()=0 Тогда
// если не введено значение товара, вызовем окно сообщений и запретим запись
Сообщить("В строке № "+Конт.НомерСтроки+
" не выбран товар!"); Флаг2=0; КонецЕсли;
КонецЦикла; ;

Возврат Флаг1*Флаг2;

КонецФункции
Упражнение №3.3
  1. Добавьте реквизиты Склад и Поставщик в Диалог формы документа «При

    ходная накладная».
  2. В Модуль формы документа «Приходная накладная» добавьте процедуру
ПриЗаписи().
3. Добавьте функцию ПроверкаСкладаТовара () в глобальный модуль.
Рассмотрим изменения, которые необходимо внести в Модуль документа «Приходная накладная». Очевидно, что при записи движений по регистру
апрель 2004 г.





46
1C .'Предприятие 7.7. Компонента Оперативный учет
«ОстаткиТоваров» необходимо добавить строку, присваивающую значение изме-

npHMip регистра Склад:
Регистр.ОстаткиТоваров.Склад=Склад;
Кроме этого, необходимо выполнить запись в регистр «Взаиморас
. ~г ~"-~Г
Регистр.Взаиморасчеты.ДвижениеРасход(Поставщик,
Итог("СуммаУЕ"),Итог("СуммаРуб") } ;
-- , -^ ~ / , ж.ж^д. v v^ivuviar yvj ; / f
Больше никаких изменений в документ «Приходная накладная» вносить не нужно и можно перейти к созданию документа «Оплата покупки».
3.2.1. Документ «Оплата покупки»
Для отражения факта оплаты организацией закупленных товаров служит документ «Оплата покупки».
Упражнение №3.4
1. Воспользовавшись Конструктором отчетов, создайте документ «Оплата покупки» СП rnf»nvirnTTT.r»*i* г.омт.*».™-»'""


Идентификатор
Синоним
Комментарий
Журнал
Номер: Нумератор
Номер: Периодичность
Номер: Автоматическая нумерация
"V
Номер: Контроль уникальности
V .
Номер: Тип:
Номер: Длина
5
Разрешить проведение документа
V
Автоматическое удаление движений
V
Автоматическая нумерация строк
V
Оперативный учет
V
2. Добавьте в документ реквизиты шапки:
Идентификатор
Курс
ДатаКурса
Синоним
Курс
Комментарий
Служит для хранения величины курса v.e. в документе
Хранит дату, на которую в
Тип значения
Число
Вид
Точность
4
Не отрицательный
л/
Разделять Триады




Глава 3. Особенности проведения документов 47
И д енти фи к а т о р
Поставщик
СуммаУЕ
СуммаРуб
Синоним
Поставщик
Сумма в у.е.
Сумма в руб.
Комментарий
Партнер, кому мы платим
Сумма по документу в у.е., которую мы платим
Сумма по документу в рублях, которую мы платим
Тип значения
Справочник
Число
Число
Вид
Контрагенты
Длина
14
14
Точность
2
2
Не отрицательный
V
V
Разделять Триады
V
V
Перейдем к созданию формы документа. Вид диалога показан на рисунке 3.1



3.1, Диалог документа «ОплатаПокупки»
При работе с документом обеспечим аналогичные возможности, как и у документа «Приходная накладная». В результате, список процедур и функций, обращение к которым необходимо ввести поле «Формула» свойств полей ввода, примет вид:
Текст используемых процедур поместим в Модуль формы:
Процедура ПриОткрытии
// установим режим обязательного перепроведения
// при записи уже проведенного документа
ПриЗаписиПерепроводить(1); КонецПроцедуры
Процедура ВводНового(Копирование)
// Копирование^! - документ введен копированием, иначе О
Если Копирование^ Тогда // введем значения "по умолчанию" реквизитов шапки
ДатаКурса^ДатаДок;
Курс=Константа.КурсУЕ.Получить(ДатаКурса) ;





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


Глава 3. Особенности проведения документов 49




48
1C: Предприятие 7.7. Компонента Оперативный учет
КонецЕсли; КонецПроцедуры
Процедура ПриЗаписи() //проверка по поставщику
Если Поставщик.Выбран()=0 Тогда
// если не введено, вызовем окно предупреждения и запретим запись
Предупреждение("Не выбран поставщик!");

СтатусВозврата(0); ;
КонецЕсли; КонецПроцедуры
// Процедура пересчета суммы в у.е. при изменении даты, //на которую получен курс Процедура Пересчет{)
Курс=Константа.КурсУЕ.Получить(ДатаКурса);
Если Курс=0 Тогда СуммаУЕ=0;
Иначе
СуммаУЕ=СуммаРуб/Курс;
КонецЕсли; КонецПроцедуры
Как следует из Блок-схемы информационных потоков, документ «Оплата п о куп ки» двигает только регистр «Взаиморасчеты»:



Взаиморасчеты | Увеличение долга клиента (получил оплату)
Поэтому, в Модуль документа можно добавить только одну строку:
[Регистр.Взаиморасчеты.ДвижениеПриход(Поставщик,СуммаУЕ,СуммаРуб);
3.3. Внесение изменений в документ «Расходная накладная»
Чтобы иметь возможность ведения оперативного учета хозяйственной деятельности нашего предприятия отдельно по каждому покупателю и каждому складу, добавим одноименные реквизиты в шапку документа «Расходная накладная» и Диалог его формы:
Идентификатор
Покупатель
Склад
Синоним
Покупатель
Склад
Комментарий
Партнер, покупающий товар
Место хранения товара
Тип значения
Справочник
Справочник
Вид
Контрагенты
МестаХранения
В Модуль формы документа добавим процедуру ПриЗаписи {), в которой будем проверять правильность заполнения этих реквизитов, а также реквизита многострочной части Товар. Текст данной процедуры будет полностью аналогичен тексту одноименной процедуры документа «Приходная накладная»:
Процедура ПриЗаписи()
// проверим, введено ли значение реквизита шапки Покупатель
Если Покупатель.Выбран()=0 Тогда
// если не введено, вызовем окно предупреждения и запретим запись
Предупреждение("Не выбран покупатель!"); СтатусВозврата{0); КонецЕсли;
// проверим, правильно ли введены значения реквизитов Склад и Товар
Если ПроверкаСкладаТовара(Контекст)=0 Тогда СтатусВозврата(0);
КонецЕсли; КонецПроцедуры
В связи с тем, что у регистра «Остатки товаров» появилось новое измерение -Склад, заменим поле «Формула» столбца «Остаток» многострочной части документа на следующую строку:
[Регистр.ОстаткиТоваров.Остаток(Товар,Склад/"Количество") |
Без учета операции резервирования товаров документ «Расходная накладная» совершает следующие движения регистров:
Регистр Движение
ОстаткиТоваров Расход товара на складе, с уменьшением стоимости запасов
Взаиморасчеты
Увеличение долга клиента (получил товар)
При этом, как было отмечено ранее, определение стоимости списываемых товаров основано на информации, извлекаемой из регистра «Остатки товаров». В предыдущей главе рассматривалось проведение документов в реальном времени, то есть данные из регистра были получены на Точку Актуальности итогов (ТА). В реальной работе часто возникает ситуация, когда необходимо получить информацию об итогах не на ТА, а на конец дня, начало дня, момент конкретного документа и т. п. Для этого нужно произвести так называемый «Временный расчет» одного или нескольких регистров, в которых хранится необходимая информация.
Для проведения временного расчета регистров в системе «1С:Предприятие» используется метод с таким же названием. Метод ВременныйРасчет () устанавливает флаг участия регистра во временном расчете. После такой установки можно выполнять системные процедуры работы с регистрами РассчитатьРегистрыНа ()
апрель 2004 г.


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


j50 1С:Предприятие 7.7. Компонента Оперативный учет
и Рассчитать РегистрыПо {). Тогда у данного регистра методы обращения к остаткам будут выдавать рассчитанные значения остатков на заданный момент времени. В один момент времени во временном расчете могут участвовать только по одному объекту регистров каждого вида. Другими словами, для каждого регистра, участвующего во временном расчете, после выполнения любой из упомянутых системных процедур формируется что-то вроде «фотографического снимка» состояния регистра, причем на этот «снимок» не будут влиять все последующие изменения, произведенные в регистре. Именно поэтому, в типовой Конфигурации версии 7.5 было запрещено проведение документа, имеющего по какому-либо товару больше одной строки в табличной части. В этом случае, правильное определение остатков для строки с повторившимся товаром возможно только тогда, когда временный расчет будет проводиться по каждой строке табличной части документа. В результате, ни о какой оперативности учета не может быть и речи.
Рассмотрим системные процедуры работы с регистрами. Данные процедуры доступны в любом программном модуле и воздействуют на все регистры, объявленные в конфигураторе, у которых установлен флаг участия во временном расчете. При применении процедуры в тексте программного модуля предварительная ссылка на объект не нужна.
Процедура РассчитатьРегистрыНа () рассчитывает все регистры, у которых установлен флаг участия во временном расчете на момент начала события, переданного в качестве параметра процедуры. Если при вызове метода передана дата, то расчет временных регистров производится на начало указанной даты. Если при вызове метода в параметре передана ссылка на документ, то расчет временных итогов производится на момент до проведения документа, т.е. движения, которые возможно записал документ в регистр, учтены во временном расчете не будут.
Процедура Рассчитать РегистрыПо () рассчитывает все регистры, у которых установлен флаг участия во временном расчете на момент окончания события, переданного в качестве параметра процедуры. Если при вызове метода передана дата, то расчет временных регистров производится на конец даты, т.е. во временный расчет будут включены движения всех документов вплоть до указанной даты включительно. Если при вызове метода в параметре передана ссылка на документ, то расчет временных итогов производится на момент после проведения документа, т.е. с учетом его движений.
Учитывая все вышеизложенное, Модуль документа необходимо было бы начать со следующих строк кода:
''использование временного расчета
// запрещено дублирование товара в табличной части Рег=СоздатьОбъект("Регистр.ОстаткиТоваров"); Если ИтогиАктуальны()=0 Тогда //проводим «задним числом» Per.ВременныйРасчет(1);
РассчитатьРегистрыНа(ТекущийДокумент{)) ; КонецЕсли;
Методические материалы обучения партнеров

51
Глава 3. Особенности проведения документов Заметим, что непосредственное использование методов Рассчитать РегистрыНа (), так и Рассчитать РегистрыПо (} позволяет в системе иметь только один временный расчет.
Однако, в версии 7.7 системы «1C: Пред приятие» имеется возможность преодолеть ограничение на выполнение временного расчета только на один момент времени только по одному регистру каждого вида. Это может быть достигнуто использованием вспомогательных объектов типа «Регистры». В этом случае система позволяет выполнять параллельно временные расчеты одних и тех же регистров, но для разных объектов «Регистры». Дело в том, что регистры одного объекта воспринимаются системой независимо от регистров другого объекта.
Во всех программных модулях доступ к атрибутам и методам объекта типа «Регистры» может выполняться при помощи переменной со ссылкой на объект, который создается функцией Создать Объект (). Чтобы вызвать атрибут или метод объекта, имя этого атрибута или метода (с указанием необходимых параметров) пишется через точку после имени объекта. При создании объекта типа "Регистры" используется ключевое слово Регистры.
СпецРег=СоздатьОбъект{"Регистры");
Объект «Регистры» через свои атрибуты предоставляет доступ к любому виду регистра конфигурации. Методы данного объекта Рассчитать РегистрыНа () и Рассчитать РегистрыПо {} имеют тот же механизм воздействия на регистры, что и одноименные системные процедуры, и позволяют выполнять временный расчет именно для регистров данного объекта, независимо от регистров другого (аналогичного) объекта.
Важным методом объекта «Регистры» является также метод Актуальность (), позволяющий поддерживать итоги регистров временного расчета все время (при проведении документа) в актуальном состоянии, то есть движения регистров будут изменять итоги временного расчета. Наличие данного метода позволяет снять ограничение на дублирование строк табличной части документа по товару.
Приведем окончательный вид фрагмента Модуля нашего документа, отражающий последовательность формирования движений по регистрам ^ОстаткиТоваров» и «Взаиморасчеты»:
ОбщРег=СоздатьОбъект{"Регистры"}; //будем поддерживать итоги в актуальном состоянии
ОбщРег. Актуальность (1) ; -., ..
Рег=ОбщРег. ОстаткиТоваров; .--..-,
// если проводим "задним числом"
Если ИтогиАктуальны()=0 Тогда
Per.ВременныйРасчет(1) ;
ОбщРег.РассчитатьРегистрыПо{ТекущийДокумент());
апрель 2004 г.


52
1C предприятие 7.7. Компонента Оперативный учет
КонецЕсли; ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл
// если-услуга, то регистр "Остатки товаров" двигать не надо Если Товар.Родитель.ВидНоменклатуры^
Перечисление.ВидНоменклатуры.Товар Тогда ОстКол=Рег.Остаток(Товар,Склад,"Количество"); Если ОстКол0 Тогда
Если ОстКолКоличество Тогда
Сообщить("В строке №"+НомерСтроки+ " не хватило товара "+Товар+ ". Реально есть "+ОстКол+" !"); СтатусВозврата(0); Продолжить; КонецЕсли;
ОстСумУЕ=Рег. Остаток (-Товар, Склад, "СтоимостьУЕ") ; ОстСумРуб=Рег.Остаток{Товар,Склад,"СтоимостьРуб"); //определим суммы списания с учетом "проблемы копеек" СуммаСписУЕ=?(ОстКол=Количество,ОстСумУЕ,
Окр{ОстСумУЕ*Количество/ОстКол,2)); СуммаСписРуб==? (ОстКол=Количество,ОстСумРуб,
Окр(ОстСумРуб*Количество/ОстКол,2));

53
Глава 3. Особенности проведения документов 3.3.1. Особые случаи, связанные с проведением документов Еще раз напомним, что важной особенностью компоненты «Оперативный учет» является понятие Точки Актуальности итогов (ТА). Согласно документации -это момент времени1, на который все необоротные регистры содержат текущие значения своих ресурсов. Другими словами, если просто запросить у регистра остатков значение какого-либо ресурса, то он выдаст его именно на момент ТА. В общем случае, в качестве ТА берется дата и время самого «старшего» проведенного документа.
Режим «Управление оперативными итогами...» позволяет «вручную» сдвигать ТА во времени как вперед, так и назад, при этом производится пересчет итогов. Проведенные документы, оказавшиеся после ТА, при пересчете итогов не учитываются.
При установке ТА в режиме «Управление оперативными итогами...» итоги пересчитываются на 00 часов 00 минут 00 секунд даты, выбранной в качестве даты актуальности итогов. Например, если вы хотите, чтобы при подсчете итогов были учтены все проведенные документы по 20 февраля 2000 года включительно, то в качестве ТА следует выбрать 21 февраля 2000 года.
В документации рассматривается несколько ситуаций, связанных с ТА, которые могут возникнуть при проведении документов. 1. Если не проведенный документ имеет более поздние дату и время, чем ТА, то
при проведении документа может возникнуть два случая:
если между документом и ТА нет других проведенных документов (см. рис 3.2), то при проведении документа ТА автоматически сдвигается вперед и








Регистр. Регистр. Регистр. Регистр. Регистр. Регистр. Иначе
Сообщить
КонецЕсли; КонецЕсли; КонецЦикла;
ОстаткиТоваров ОстаткиТоваров ОстаткиТоваров ОстаткиТоваров ОстаткиТоваров ОстаткиТоваров
.Товар=Товар;
. Склад=Склад;
. Количество=Количество;
. СтоимостьУЕ=СуммаСписУЕ;
. СтоимостьРуб=СуммаСписРуб
.ДвижениеРасходВыполнить() ,
"На "+ДатаДок+", в строке №'ЧНомерСтроки+ совсем нет товара "+Товар+" !");
//движение регистра Взаиморасчеты
Регистр.Взаиморасчеты.ДвижениеПриход(Покупатель,
Итог("СуммаУЕ"),Итог("СуммаРуб"));
становится равной дате и времени проведенного документа; если между документом и ТА существуют проведенные документы (см. 3.3), то такой документ не проводится, при этом выдается сообщение о существовании более ранних проведенных документов.





После того, как нами сформированы Модули всех трех документов, рассмотрим более подробно некоторые вопросы, связанные с особенностями проведения этих документов.
Методические материалы обучения партнеров
Дата + время.
апрель 2004 г.











2.
Дата, Время Ненроюднгся
3.3. Между ТА и документом есть проведенные документы
Если проводится не проведенный документ с датой и временем меньшим, чем ТА, то выдается запрос о проведении документа «задним числом». Необходимость этого связана с тем, что алгоритм формирования движения регистров может использовать итоговые данные регистров для вычисления каких-либо величин. В описанной ситуации итоги на дату и время проводимого документа будут не актуальны. Если при разработке модуля движения регистров подобная ситуация не учитывалась, то это может привести к ошибкам в вычислениях. Например, товар оприходован по двум приходным накладным с различными приходными ценами. Тогда при проведении расходной накладной с датой и временем, находящимся между датой и временем этих накладных, цена списания «по среднему» в приведенном модуле документа будет определена неправильно. Однако в режиме «Управление оперативными итогами...» можно пересчитать документы (выполнить групповое перепроведение) и исключить ошибки подобного рода.
«j Дата, Время

3.4. Дата и время нового документа меньше чем ТА
Если дата не проведенного документа равна дате ТА, но между ТА существуют проведенные документы (см. 3.4), то nf мента будет выдан диалог изображенный на 3.5:
Если в этом диалоге выбрать опцию «Провести документ задним то документ будет проведен со своим временем. В этом случае, как уже упоминалось выше, возможно возникновение ошибок, если алгоритм, формирующий движение регистров, не учитывает возможной неактуальности итогов на момент расчета.
Методические материалы

Глава 3. Особенности проведения документов 55


3.5. Диалог «Проведение документа»
Чтобы избежать этого, следует выбрать опцию «Изменить время документа» (см. 3.5). Тогда время документа будет изменено на время большее времени самого последнего документа, и уже с этим временем документ будет проведен. Очевидно, что в такой ситуации состояние итоговой информации регистров будет актуальным на момент проведения документа (см. 3.6).
3.6. Режим «Изменить время документа» позволяет записать документ после ТА
Ситуации, когда между временем записи документа и ТА существуют проведенные документы, наиболее часто могут возникать в процессе интенсивного ввода документов с многих рабочих мест при работе системы «1С:Предприятие» в сети. После записи документа при ожидании от пользователя ответа на запрос «Провести документ?» другие пользователи могут успеть провести свои документы: система «1С:Предприятие» проводит документы в порядке «живой очереди». Поэтому приведенный выше запрос может появляться на экране достаточно часто. Выдачу этого запроса можно отключить в настройке параметров (пункт «Параметры» меню «Сервис» главного меню программы), тогда новый документ всегда будет проводиться после последнего проведенного документа с соответствующим изменением времени документа. Когда ТА «вручную» сдвигается назад во времени, то проведенные документы с более поздними датой и временем, чем установленное дата и время ТА, исключаются при подсчете итогов и, фактически, могут считаться не проведенными. Если такой документ (т.е. проведенный документ, который лежит после ТА на оси времени) проводится повторно, то возможны следующие ситуации:
если между документом и ТА нет других проведенных документов, то

ч^---~- ТА автоматически сдвигается и становится равной дате и времени до

кумента;
если между документом и ТА находятся другие проведенные докумен

ты, то такой документ не проводится, при этом выдается сообщение о

том, что существуют более ранние проведенные документы.
апрель 2004 г.


56
1C предприятие 7.7. Компонента Оперативный учет
5. Если дата и время проведенного документа меньше, чем ТА, такой документ можно провести повторно. Однако надо иметь в виду возможные ошибки, если алгоритм формирования движения регистров использует итоговые данные из регистров для вычисления каких-либо величин.
Упражнение №3.5
Рассмотрите вышеперечисленные особые случаи проведения документов, создав для этого в режиме работы «1C:Предприятия» необходимое количество документов различного вида.
Подведем некоторые итоги. Итак, все документы в системе «1С:Предприятие» образуют единую хронологическую последовательность. Для этого каждый документ имеет дату и время. Даже если два документа имеют одинаковую дату и одинаковое время, они все равно располагаются в определенной последовательности, определяемой порядком их ввода в систему. Поскольку, дата и время документа могут быть изменены, то независимо от порядка ввода документов, они могут быть расположены в последовательности, реально отражающей происходившие в хозяйственной жизни предприятия события.
Алгоритм проведения документа, как правило, отражает в учете данные, записанные в самом документе (в его реквизитах). Однако в некоторых случаях алгоритм проведения документа анализирует также и текущие итоги, используя их при проведении. Например, если документ списывает товары или материалы по средней себестоимости, то для определения суммы списания алгоритм проведения будет анализировать остатки товаров (материалов) на момент документа. Очевидно, что документы, основывающиеся при проведении на данных итогов, должны проводиться строго последовательно. Однако на практике, из-за ошибок при вводе информации и несвоевременного поступления документов, часто приходится вводить или исправлять документы «задним числом». Разумеется, в этом случае, движения регистров, сформированные всеми последующими документами (расположенными после того, который был исправлен), становятся некорректными. Например, если выяснилось, что в одной из приходных накладных, введенных в начале месяца, было неверно указано количество товара, то во всех последующих расходных накладных, списывающих имеющиеся в наличии товары, .необходимо заново проанализировать остатки с учетом внесенных изменений и заново записать движения регистров. То есть, все документы, анализирующие остатки и расположенные после измененного документа, должны быть перепроведены.
Для обеспечения проведения определенных документов в непрерывной хронологической последовательности в версии 7.7 системы «1С:Предприятие» для компонент «Оперативный учет» и «Бухгалтерский учет» был разработан вспомогательный вид объекта метаданных «Последовательности документов».
\

57
Глава 3. Особенности проведения документов 3.3.2. Последовательность документов Каждая введенная в структуру метаданных «Последовательность документов» обеспечивает контроль порядка проведения документов указанных видов. Таким образом, в системе может существовать несколько независимых последовательностей.
При создании последовательности определяется, какие виды документов входят в данную последовательность, а также виды движений, влияющие на последовательность. В качестве таких движений необходимо указывать те регистры, значения итогов которых используются документами данной последовательности при своем проведении.
Например, для организации правильного списания товаров следует в качестве движения, влияющего на последовательность, указать регистр оперативного учета, на котором ведется стоимостной учет товаров. В качестве документов, на проведение которых будет влиять данная последовательность, следует указать те виды документов, которые будут анализировать при проведении указанный регистр. Например, такими документами могут быть расходные накладные.
При работе в режиме «1С:Предприятие» для каждой введенной в метаданных последовательности документов система будет автоматически поддерживать границу последовательности. В качестве границы последовательности будет выступать позиция документа.
При последовательном проведении документов, входящих в данную последовательность, граница последовательности будет устанавливаться на каждый вновь проведенный документ.
Если между проводимым документом, относящимся к данной последовательности и находящимся после текущей границы последовательности, уже существует проведенный документ, относящийся к той же последовательности, то граница последовательности сдвигаться не будет, так как может быть нарушена последовательность проведения документов. Эта ситуация может быть проанализирована алгоритмом проведения документа.
При проведении документов «задним числом», а также отмене проведения или удалении документов, если удаляются или записываются движения регистров, указанных как влияющие на данную последовательность, граница последовательности отодвигается на момент измененного документа.
В режиме пересчета документов существует специальная возможность восстановления последовательности проведения документов. При ее использовании система автоматически выполняет перепроведение всех документов, относящихся к даниой-лоследовательности от текущей позиции границы последовательности, до указанного момента.
Восстановление последовательности может выполняться только в монопольном режиме, так как система должна гарантировать неизменность итогов на момент перепроведения документов.








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


5g 1С:Предприятие 7.7. Компонента Оперативный учет
После выполнения восстановления последовательности, проводимые после границы последовательности документы (приходные и расходные накладные) снова бу^дут двигать границу вперед.
В рассматриваемой нами задаче правильная последовательность проведения документов особенно важна для расходных накладных, так как именно их механизм проведения использует информацию, накопленную в регистре «Остатки товаров».
Создадим последовательность документов «ДляРасходныхНакладных» со еле-


m/ющими свойствами:
И
дентификатор
ДляРасходныэсНакладных
г!иноним
Для расходных накладных
комментарий
"Движения, влияющие на последовательность:
Регистр . ОстаткиТоваров
Последовательность влияет на проведение документов:
РасходнаяНакладная
lCwMU 1 МЛ Г1* iv. Т. I V/ 1Ґ4^/ЛС*.1.1.Ж1~»1»А W JL w^»x,/.«»..«»a-«vm.mma« ** »-v ^ ^ -«-« г т-
документов отрабатывается системой автоматически, средства языка предос-та#ляют возможность непосредственного доступа к методам последовательностей. 0се объявленные в конфигураторе последовательности принадлежат глобальному кортексту конфигурации. Доступ к методам возможен в любом программном мо-ду/te. Во всех текстах программных модулей вызовы методов последовательностей мо?кно записывать просто через точку после имени последовательности.
Например, применив метод Проверить {) можно определить, является ли по-сл^довательность проведенных документов непрерывной и, в случае ее нарушения, запретить проведение документа. Текст подобной проверки в модуле документа «Расходная накладная» может выглядеть следующим образом:
Последовательность.ДляРасходныхНакладных.Проверить( ТекущийДокумент())=0 Тогда
// если последовательность нарушена, запретим проведение документа Сообщить("Нарушена последовательность проведения документов!"); СтатусВозврата (0); Возврат;
Упражнение №3.6
Если в информационной базе не существует ни одного документа «Расходная накладная» создайте и проведите такой документ в режиме работы «1 (^Предприятия».
2.
Сформируйте отчет «Остатки товаров на ТА». Обратите внимание на количество оставшегося товара и цену его списания.
3.
Оприходуйте дополнительно «задним числом» некоторое количество товара, уже имеющегося на складе, по цене, отличной от цены принимаемой «по умолчанию». Проследите, чтобы приходуемый документ был расположен на оси времени ранее хотя бы одного документа «Расходная накладная». Сформируйте отчет «Остатки товаров на та», проверив количество и цену списания ос-
тавшегося товара. __
Методические материалы обучения партнеров

59
Глава 3. Особенности проведения документов
  1. Создайте еще один новый документ «Расходная накладная». Убедитесь в не

    возможности проведения его с текущим датой и временем.
  2. Откройте окно «Проведение документов», выбрав последовательно пункты

    меню: «Операции», «Проведение документов...». В данном окне выберите за

    кладку «Последовательности». В списке последовательностей поставьте «V» в

    квадрате слева от последовательности «ДляРасходныхНакладных». Для запус

    ка режима перепроведения необходимых документов нажмите на кнопку «Вы

    полнить». Еще раз сформируйте отчет «Остатки товаров на ТА». Обратите

    внимание, что теперь цена списания товара определена правильно. Проведите

    не проведенный документ «Расходная накладная».
3.3.3. Предварительное проведение При работе в сети одновременно большого количества пользователей в системе часто возникает следующая ситуация. Кто-либо из их вводит в табличную часть расходной накладной товар, а это же самое время другой пользователь успевает продать этот же товар, т.е. провести документ, содержащий этот же товар, пока первый еще заполняет табличную часть документа. И на складе больше не окажется требуемого первому пользователю нужного количества данного товара. Эта ситуация возможна потому, что учет проданных товаров в системе «1С:Предприятие» наступает только после проведения документа вместе с записью в регистр «ОстаткиТоваров». Чтобы избежать подобной ситуации, в типовой конфигурации предусмотрен механизм предварительной продажи товаров. Идея реализации этого механизма заключается в том, что при предварительном проведении, документ осуществляет движения только по регистру «Остатки товаров».
Предварительное проведение накладной выполняется по времени гораздо быстрее полного проведения, кроме того, в процессе оформления документа можно несколько раз выполнять предварительное проведение, при этом накладная каждый раз перепроводится сдвигая, ТА вперед по времени, записывая за собой набранные в документ товары.
Движения в остальных регистрах будут произведены в момент окончательного проведения документа.
Для определения того, является ли документ полностью или частично проведенным, добавим в шапку документа «Расходная накладная» новый реквизит:
Идентификатор
РежимПроведения
Синоним
Режим проведения
Комментарий
НЕ проведен, Полностью=0; Частичной
Тип значения
Число
Вид
Длина
1
Точность
0
Не отрицательный
V
Разделять Триады


Глава 4. Резервирование товаров

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
  1. Внесите изменения, связанные с режимом предварительного проведения, в

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

    «РасходныеНакладные»,
  2. В режиме работы «1С:Предприятие» создайте новый документ «Расходная

    накладная». Сделайте для него предварительное проведение. Рассмотрите дви

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

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







Заголовок
Идентификатор
Формула
Выбор Пи к т о граммы ( )
Показывать пиктограммы
^


Методические материалы обучений партнеров
апрель 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. Добавьте в документ реквизиты шапки «Курс», «ДатаКурса», «СуммаУЕ», «Сумма Ру б», такие же, как и у документа «Оплата покупки». Добавьте два новых реквизита шапки:
Идентификатор
Покупатель
ПоСчету
Синоним
Покупатель
Счет
Комментарий
Партнер, покупающий товар
Счет, по которому пришли деньги
Тип значения
Справочник
Документ
Вид
Контрагенты
Счет
Длина
Точность
Не отрицательный
Разделять Триады


Глава 5. Учет партий товаров

3. Создайте Форму документа. Диалога формы, которого может выглядеть следующим образом:
Поле Ввода Формула
ДатаДок
ДатаКурса=ДатаДок; Пересчет { )
ДатаКурса
Пересчет ()
ПоСчету
Сумма Ру б
СуммаУЕ^? (Курс=0, 0, Сумма Ру б /Курс)
Кнопка Формула
Очистить Покупателя | Покупатель^
5. Поместите текст используемых процедур в Модуль формы:
Процедура ПриОткрытии
ПриЗаписиПерепроводить(1); КонецПроцедуры





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


72
1C предприятие 7.7. Компонента Оперативный учет
Процедура ^водНового ( Копирование ) Если КопиР°вание=0 Тогда
( )
КурС=1^онстанта.КурсУЕ. Получить (ДатаКурса) КонецЕсли; КонецПроцеЯуры
Процедура
// проверк^ правильности заполнения реквизитов Если покупатель Выбран ()=0 Тогда
предупреждение ( "Не выбран покупатель ! " } ;
КонецЕсл^1'

КонецПроцеЯуры - Г
// Процедур3 пересчета суммы в у.е.
// при изм^нении Даты' на которую получен курс
Процедура Пересчет ( )
Курс=Кон'станта КУРСУЕ Получить ( ДатаКурса ) ;
Если Кур^=0 Тогда Сумма/Е=0;
Иначе
КонецЕсл^'
ПосколькУ количество счетов, введенных в систему, может быть достаточно 5олыиим то д/™ облегчения работы с документом выбор счета будем производить только из спис^ка неоплаченных счетов. Чтобы подавить стандартный процесс выбора значения в Модуль формы добавим предопределенную процедуру
ПриНачалеВы^°Ра3начения )
Процедура Г^риНачалеВыбораЗначения(Знач1,Флаг) // при выбсЯР6 счета вызовем список неоплаченных счетов Если Зна«1="ПоСчетУ" Тогда
Флаг=0; //отменим стандартный процесс выбора значения
ПриВыб-°РеСчета ) КонецЕсл^1'
Текст сам*0"1 процедуры, которая выводит список неоплаченных счетов, может выглядеть сле^УюЩим образом:

73
Глава 4. Резервирование товаров //вывод списка неоплаченных счетов. После выбора счета //остальные реквизиты заполняются автоматически Процедура ПриВыбореСчета{) Перем ВыбСтр; Рег=СоздатьОбъект("Регистр.СостояниеЗаказа");

Ста=СравнитьТА(); *
Если Ста=-2 Тогда //документ еще не записан Если ДатаДокПолучитьДатуТА() Тогда Per.ВременныйРасчет(1); РассчитатьРегистрыПо(ДатаДок); КонецЕсли;
ИначеЕсли Ста=-1 Тогда
//дата и время существующего документа меньше даты и времени

// Точки актуальности итогов
Per.ВременныйРасчет{1);
РассчитатьРегистрыНа{ТекущийДокумент()); КонецЕсли;
ТЗ=СоздатьОбъект("ТаблицаЗначений"); // заполним таблицу значений данными из регистра Per.ВыгрузитьИтоги(ТЗ,,I); ТЗ.УдалитьКолонку("СуммаОтгрузки"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ТЗ.СуммаОплаты=0 Тогда
ТЗ.УдалитьСтроку(); КонецЕсли; КОнецЦикла;
ТЗ.УстановитьПараметрыКолонки("Заказ",,,,"Счет",20); ТЗ.УстановитьПараметрыКолонки("СуммаОплаты","Число",
12,2,"Сумма долга",20); // выведем список неоплаченных счетов
Если ТЗ.ВыбратьСтроку(ВыбСтр,"Неоплаченные счета")=1 Тогда Если ВыбСтроО Тогда
ПоСчету=ТЗ.ПолучитьЗначение(ВыбСтрг"Заказ"); Покупатель=ПоСчету.Покупатель;
СуммаУЕ=ТЗ.ПолучитьЗначение(ВыбСтр,"СуммаОплаты"); Ч^умма Руб=СуммаУЕ* Кур с; КонецЕсли; КонецЕсли; КонецПроцедуры





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


74 1С:Предприятие 7.7. Компонента Оперативный учет
Необходимо отметить, что ранее для определения, проводится ли документ в реальном времени или «задним числом», мы использовали метод ИтоГиАктуальны(). Однако он относится к контексту Модуля документа и не может применяться в Модуле формы. Точно так же, как и метод вспомогательного объекта «Регистры» - Актуальность (). Поэтому в приведенной выше процедуре для тех же целей используется метод документа Сравнить та ). Кроме этого, особое внимание необходимо обратить на использование в тексте системных процедур РассчитатьРегистрыНа() и РассчитатьРегистрыПо{) .
Как следует из Блок-схемы информационных потоков, документ «ПриходДенег» записывает движения в регистры:



В процедуру ОбработкаПроведения () Модуля документа необходимо добавить строки:
//По регистру Взаиморасчеты
регистр.Взаиморасчеты.ДвижениеРасход(Покупатель,
СуммаУЕ,СуммаРуб); //По регистру СостояниеЗаказа Если ПоСчету.Выбран()=1 Тогда
Регистр.СостояниеЗаказа.ДвижениеРасход(ПоСчету,,
СуммаУЕ); КонецЕсли; //Оборотный регистр Регистр.ОборотыКлиента.ДвижениеПриход(Покупатель,СуммаУЕ);
Упражнение №4.4
Внесите необходимые изменения в Модуль документа «ПриходДенег».
Документ «СнятиеРезерва» предназначен для отмены резервирования това ров, если покупатель отказался их оплатить.
Упражнение №4.5
1. Воспользовавшись Конструктором, создайте документ «Снятие резерва»:









Глава 4. Резервирование товаров 2. Добавьте в документ реквизит шапки «ПоСчету», аналогичный одноименному реквизиту документа «ПриходДенег». документа, диалог)
которой может выглядеть, так как это изображено на 4.3.
4.3. Форма документа
«Снятие Рез ерва»
4. При выборе счета предусмотрите

тпэттшзггписка" счетотггтго которым" осталсяг

не отгруженный и неоплаченный товар, -В |

этом случае текст Модуля формы может

быть следующим: --
Процедура ГТриОткрытим ()
ПриЗаписиПерепроводить(1); Конец11роцедурь1
//вывод списка счетов с неотгруженным и неоплаченным товаром Процедура ПриВыбореСчета()
Перем ВыбСтр;
Рег'СоздатьОбъект ( "Регистр. СостояниеЗаказа" ) ; Ста^СравнитьТА(};
"Если ста--2 Тогда //документ еще не записан Если ДатаДокПолучитьДатуТА() Тогда
--1- Per.
-РасечитатьРегистрыПо(ДатаДок);
"КонецЕсли;
//дачра и время существующего документа меньше //даты и времени Точки актуальности итогов ИначеЕсли Ста=-1 Тогда
Per.ВременныйРасчет(1) ;
(ТекущийДокумент () )7
"КонецЕсли;
~1Л1~создать Объект("СписокЗначений");
// выведем список счетов, имеющих резерв
Per.ВыОратьИтоги();
Пока Per. ПолучитьИтог 0=1" Цикл СТГТДо^а 1вйтЁГЭна че ни е ТТЗТ 3 а ка ^
.Заказ/Строка (ТЗ.Заказ)' + - ( отгрузка : 'Y 4-Формат (ТЗ."СуъШаОт'трузки,Ґ'410 . 2 ") оплата:"+Формат(ТЗ.СуммаОплаты,"410.2")+
~-уе '!_[ LJ
-ПНПёоп л а ч е иные с ч е та
{ВыбСтр,
Тог да
1ЦоСчету=ВыбСтр;





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





76
1С :Пред приятие 7.7. Компонента Оперативный учет
КонецЕсли; КонецПроцедуры
Процедура ПриНачалеВыбораЗначения{Знач1,Флаг) // при выборе счета вызовем список неоплаченных счетов Если Знач1="ПоСчету" Тогда
Флаг=0; //отменим стандартный процесс выбора значения ПриВыбореСчета() КонецЕсли;; КонецПроцедуры
потоков, документ
Снятие резерва с уменьшением сумм отгрузки и оплаты
5. Как следует из Блок-схемы информационных «СнятиеРезерва» записывает следующие движения:
Добавьте в процедуру Обра бот каПроведения (} Модуля документа следующий текст:
Процедура ОбработкаПроведения{) // по регистру РезервыТоваров Рег=СоздатьОбъект{"Регистр.РезервыТоваров");
-Рег1=СоздатьОбъект("Регистр.СостояниеЗаказа");
-Если ИтогиАктуальны{) =0 Тогда
Per.ВременныйРасчет{1};
Perl.ВременныйРасчет{1);
РассчитатьРегистрыНа(ТекущийДокумент()); КонецЕсли;
Рег.УстановитьФильтр(ПоСчету);
Пока Per.ПолучитьИтог(}=1 Цикл
Регистр.РезервыТоваров.ПоСчету=ПоСчету;
Регистр.РезервыТоваров.Товар^Рег.Товар;
Регистр.РезервыТоваров.РезервТовара=Рег.РезервТовара;
..__ Регистр.РезервыТоваров.ДвижениеРасходВыполнить(};
.-KG-; ю-^Ц-^кЛхх;- - -
// по регистру СостояниеЗаказа
СумОтгр=Рег1.Остаток(ПоСчету,"СуммаОтгрузки");
СумОпл=Рег1.Остаток(ПоСчету,"СуммаОплаты");
Если (СумОтгрХ)) или (СумОпл0) Тогда
Регистр.СостояниеЗаказа.ДвижениеРасход(Посчету,СумОтгр,
~ СумОпл) ; ,
Ко н е цЕ с л и ;
КонецПроцедуры
Методические материалы обучения партнеров

77
Глава 4. Резервирование товаров 4.3. Ввод документа «Расходная накладная» на основании документа «Счет» Одним из режимов ввода новых документов в процессе работы пользователя с системой «1С:Предприятие» является режим ввода «на основании». В режиме «1С:Предприятия» ввод «на основании» позволяет добавлять новые документы, заполняя их реквизиты путем копирования информации из выбранного документа-образца. В отличие от простого копирования документов, в результате которого создается документ того же вида, что и документ-образец, режим ввода «на основании» позволяет создавать и переносить информацию в документ другого вида.
Для организации ввода документа в режиме «ввод на основании» необходимо проделать следующие действия:
  1. В окне редактирования документа нажать на кнопку [Ввод на основа

    нии...] и в открывшемся окне диалога указать: документы каких видов

    будут являться основаниями для данного вида документов.
  2. В модуле формы документа должна быть написана предопределенная

    процедура ВводНаОсновании(ДокОснование), в которой необходимо

    реализовать заполнение реквизитов текущего документа значениями из

    реквизитов документа основания.
Текст этой процедуры должен быть разработан специалистом, осуществляющим конфигурирование системы. Для облегчения задачи разработки процедуры ВводиаОсновании () в системе «1С:Предприятие» существует «Конструктор ввода на основании».
По условию задачи нам необходимо обеспечить возможность ввода Расходной накладной на основании Счета.
Упражнение'-№4,6


Идентификатор
Основание
Синоним
Основание
Комментарий
Документ, на основании которого вводится накладная
Тип значения
Документ
Вид
Счет
  1. В окне редактирования свойств документа «Расходная накладная» нажмите

    кнопку «Ввод на основании» и в появившемся окне, в разделе «Вводить на основа

    нии:», поставьте «V» в квадрате слева от документа «Счет». Нажмите кнопку «ОК».
  2. С помощью «Конструктора ввода на основании» добавьте одноименную

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

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


73 1С:Предприятие 7.7. Компонента Оперативный учет
на основании одного документа «Счет» будет выписано несколько документов «Расходная накладная». Это тем более возможно, так как в счете не предусмотрен реквизит Склад^ а, следовательно, резервирование товара может происходить сразу на нескольких складах. Поэтому, после выбора для создаваемой накладной склада, первоначальное количество отгружаемого по накладной товара будет равно количеству товара, которое осталось отгрузить по данному счету. Если по счету осталось отгрузить товара больше, чем есть на складе, то в накладную будет внесен весь оставшийся на складе товар этого наименования.
Кроме того, запретим ввод «на основании» для накладной, если документ-основание не проведен или по нему полностью отгружен товар всех, присутствующих в счете, наименований.
Тогда процедура ВводНаОсновании () для документа «Расходная накладная» примет вид:
Процедура ВводНаОсновании(ДокОснование) Если ДокОснование.Проведен(}=0 Тогда
Предупреждение("Документ """+ДокОснование+
""" не проведен!. Ввод на основании запрещен."); СтатусВозврата(0); Возврат; КонецЕсли;
Рег^СоздатьОбъект("Регистр.РезервыТоваров"); Рег1=СоздатьОбъект("Регистр.ОстаткиТоваров"); Если Per.СводныйОстаток(ДокОснование,,"РезервТовара") =Ц
Тогда Предупреждение("По счету "+ДокОснование+
" все товары отгружены!"); СтатусВозврата(0); Возврат; КонецЕсли;
// заполним шапку документа Курс = ДокОснование.Курс; ДатаКурса = ДокОснование.ДатаКурса; Покупатель = ДокОснование.Покупатель; Основание = ДокОснование; ВвестиЗначение(Склад,"Выберите склад!"); РежимПровёдения=0; ДокОснование.ВыбратьСтроки(); Пока ДокОснование.ПолучитьСтроку()=1 Цикл
// найдем оставшееся количество зарезервированного товара Ост=Рег.Остаток(ДокОснование,
ДокОснование.Товар,"РезервТовара") Если Ост0 Тогда
Методические материалы обучения партнеров

79
Глава 4. Резервирование товаров // заполним табличную часть документа НоваяСтрока ( ) ; .
Товар=ДокОснование . Товар;
Единица = Товар. ЕдиницаИзмерения; :
Количество=0ст;
Цена=ДокОснование . Цена;
СуммаУЕ=Цена*Количество;
// проверим количество оставшегося товара на складе
Если Товар . Родитель . ВидНоменклатуры=
Перечисление . ВидНоменклатуры . Товар Тогда Ост=Рег1 .Остаток (Товар, Склад, "Количество") ; Если ОстКоличество Тогда Если Ост=0 Тогда
Сообщить ("Товар """+Товар-н
отсутствует!"
""" на складе """+Склад+ УдалитьСтроку ( ) ; Иначе
Количество=0ст; Сумма УЕ=Цена* Количество; КонецЕсли; КонецЕсли; КонецЕсли;
Сумма Руб=СуммаУЕ * Курс ; КонецЕсли; КонецЦикла;
Если КоличествоСтрок()=0 Тогда
СтатусВозврата(0) ; КонецЕсли; КонецПроцедуры
Упражнение №4.7
1. Предусмотрите аналогичное заполнение документа «Расходная накладная» в

случае изменения значения реквизита Основание. Для этого формула в свойствах

этого поля ввода введите имя процедуры ПриВыбореОснования (). Текст этой про-

цедуры может быть следующим:
// при вводе нового документа-основания // заполним реквизиты текущего документа Процедура ПриВыбореОснования()
УдалитьСтроки();
ВводНаОсновании(Основание); КонецПроцедуры
апрель 2004 г.


80 1C предприятие 7.7. Компонента Оперативный учет
2. В Модуле документа «Расходная накладная» добавьте необходимые строки

текста, связанные с движениями регистров «РезервыТоваров» и

«СостояниеЗаказа». После строки:
[Регистр. ОстаткиТоваров . ДвижениеРасходВыполнить () ; |
добавьте строки текста
//движение регистра РезервыТоваров Если Основание.Проведен()=1 Тогда
Регистр.РезервыТоваров.ДвижениеРасход(
Основание,Товар,Количество); КонецЕсли;
После строк:
Иначе
Сообщить ("На "+ДатаДок+", в строке №"+НомерСтроки4-
" совсем нет товара "+Товар+" !"); КонецЕсли;
строки текста, связанные с движением регистра «РезервыТоваров»
Иначе
//движение регистра РезервыТоваров Если Основание.Проведен()=1 Тогда
Регистр.РезервыТоваров.ДвижениеРасход(Основание,
Товар,Количество) КонецЕсли;
А после строки
Регистр.Взаиморасчеты.ДвижениеПриход{Покупатель,
Итог("СуммаУЕ"),Итог{"СуммаРуб"))
добавьте строки
//движение регистра СостояниеЗаказа Если Основание.Проведен{)=1 Тогда
Регистр.СостояниеЗаказа.ДвижениеРасход(Основание,
Итог("СуммаУЕ"),); КонецЕсли;
В заключение, необходимо упомянуть о следующем правиле, которое должно выполняться для документа-основания:
В Модуле документа, который может иметь подчиненные ему документы,

всегда должна присутствовать предопределенная процедура
ОбработкаУдаленияПроведения() после выполнения, которой все подчиненные данному документу документы станут не проведенными, либо в этой процедуре должна выполняться проверка на существование проведенных подчиненных документов и приниматься решение о возможности отмены проведения.

81
Глава 4. Резервирование товаров Для случая, когда при отмене проведения документа-основания должна выполняться отмена проведения всех подчиненных ему документов, процедура для документа «Счет» может выглядеть следующим образом: //отменим проведение всех документов, введенных на основании
//данного счета
Процедура ОбработкаУдаленияПроведения()
Докум^СоздатьОбъект("Документ");
Докум,ВыбратьПодчиненныеДокументы(
ДатаДок,,ТекущийДокумент());
Пока Докум.ПолучитьДокумент()=1 Цикл Докум.СделатьНеПроведенным{);
КонецЦикла; КонецПроцедуры
Заметим, что в этом случае, если пользователь случайно отменил проведение документа «Счет», который уже в последующих документах упомянут, то тогда будет отменена и вся «цепочка» документов. Это может приводить (при большом числе документов) к ненамеренным ошибкам в учете. Поэтому лучше все же в процедуре ОбработкаУдаленияПроведения () контролировать, что по данному документу уже была какая-то работа:
//отменим проведение всех документов, введенных на основании //данного счета
Процедура ОбработкаУдаленияПроведения() Докум=СоздатьОбъект("Документ"); Докум.ВыбратьПодчиненныеДокументы(ДатаДок,,
ТекущийДокумент{)); .
Пока Докум.ПолучитьДокумент()=1 Цикл Если Докум.Проведен()=1 Тогда
Сообщить("Для документа "+ТекущийДокумент()+ " нельзя отменить его проведение, т.к. он имеет "+ " подчиненные проведенные документы! "); .-СтатусВозврата(О) ; КонецЕсли; КонецЦикла; КонецПроцедуры
В этом случае пользователь вынужден будет осмысленными действиями вначале отменить проведение всех документов, которые подчинены данному документу, а уже затем отменить проведение и его самого.





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


82
Глава 5. Учет партий товаров 5.1. Принципы партионного учета В учебной задаче предполагается, что учет товаров ведется в разрезе товаров и складов, причем списание проданных товаров осуществляется по методу FJFO или LIFO. Для выбора одного из этих методов в Конфигурацию добавим еще одну константу МетодСписания, типом значения которой будет одноименное перечисление, имеющее следующие значения: lifo, fifo, Средняя.
Метод FIFO основан на предположении, что себестоимость товаров, приобретенных в первую очередь, должна быть отнесена к товарам, проданным в первую очередь. Его называют - «метод оценки запасов по ценам первых покупок (first-in, first-out method - FIFO). Эффект от использования метода FIFO заключается в том, что материальные запасы на конец периода оцениваются по ценам последних покупок, а в себестоимости реализованной продукции используются цены первых покупок товара. В период постоянного роста цен метод FIFO дает наиболее высокий из возможных уровень чистого дохода. Причина в том, что фирма стремится повысить цены реализации при росте текущих цен, не принимая во внимание тот факт, что материальные запасы могли быть приобретены до момента роста цен. Соответственно в период снижения цен наблюдается обратный процесс. Поэтому основным недостатком метода FIFO является то, что он увеличивает влияние цикла экономического развития на показатель дохода.
Метод LIFO базируется на той предпосылке, что себестоимость товаров, приобретенных последними, используется для определения стоимости товаров, проданных в первую очередь, а себестоимость запасов на конец периода рассчитывается на основе себестоимости, приобретенных первыми. Его называют -«метод оценки запасов по ценам последних покупок (last-in, first-out method - LIFO). Безусловно, подобное допущение не сочетается с действительным движением товаров на многих предприятиях. Тем на менее сторонники метода LIFO считают, что наиболее точное определение прибыли возможно лишь при условии соотнесения текущей себестоимости товаров с текущей продажной ценой, не взирая на то, какие именно товары были фактически проданы. При движении цен как вверх, так и вниз метод LIFO предполагает, что себестоимость реализованной продукции отразит издержки в соответствии с уровнем цен на момент продажи. В результате метод LIFO показывает меньшую чистую прибыль в период проявления инфляционных процессов и, соответственно, большую чистую прибыль в период проявления де инфляционных процессов, чем любой другой метод. В качестве критического замечания по отношению метода LIFO можно отметить тот факт, что в Балансе материальные запасы оценены и отражены по ценам первых покупок, и эта оценка часто не совпадает с реальной стоимостью материальных запасов.
Методические материалы обучения партнеров

83
Глава 5. Учет партий товаров Для обеспечения возможности партионного учета в регистр ОстаткиТоваров добавим новое измерение Партия со следующими свойствами:
Идентификатор
Партия
Синоним
Комментарий
Тип значения
Документ
Вид
ПриходнаяНакладная
Длина
Точность
Разделять Триады
Отбор движений
Отбор итогов
Необходимо отметить, что следствием введения данного измерения в регистр ОстаткиТовара будет появление в Модуле документа «Приходная накладная»
следующей строки:
I Регистр.ОстаткиТоваров.Партия = ТекущийДокумент () ; [
Эта строка расположена перед строкой:
I Регистр. ОстаткиТоваров. ДвижениеПриходВыполнить () ; ]
Для определения текущего метода списания введем новую константу ОсновнойМетодСписания, возможные значения которой будут определяться вновь созданным перечислением МетодыСписания.
Кроме этого, в выражениях на встроенном языке в нашей конфигурации, где использовался метод регистра Остаток (Измерение 1,Измерение2, Ресурс) , его необходимо заменить методом СводныйОстаток (Измерение!,Измерение2, ,Ресурс). Аналогичным образом, в методе регистра ОстаткиТовара СводныйОстаток (Измерение!, , Ресурс) необходимо добавить символ «,»: СводныйОстаток (Измерение!, ,, Ресурс). Теперь осталось организовать списание товара по партиям при проведении документа «Расходная накладная». Реализуем эту возможность с помощью существующего в системе «1С:Предприятие» механизма запросов.
5.2. Запросы в системе «1С:Предприятие»
Для организации различных выборок мы можем использовать методы справочников, документов и регистров, которые для этого специально предназначены. Однако у каждого из типов объектов эти методы называются по-разному, поэтому часто использование только методов для организации выборок недостаточно для построения различных отчетов, обработок.
В системе «1С:Предприятие» имеется служебный объект - «Запрос», который, в частности, предназначен для построения отчетов по любым данным конфигурации.
апрель 2004 г.


84
1С:Предлриятие 7.7. Компонента Оперативный учет
Основная отличительная черта запросов - возможность создания массива данных с произвольными группировками, которые могут не совпадать с группировками, доступными при обработке справочников, документов, регистров и т.д. Более важной причиной использования механизма запросов при программировании модулей системы «1C: Пред приятие» является их более быстрая работа при обработке хранящихся в системе данных, чем работа встроенных методов регистров3.
Во всех программных модулях доступ к атрибутам и методам запросов может выполняться только через переменную, созданную функцией СоздатьОбъект. Порядок создания запроса:
  1. Создание объекта типа «Запрос» при помощи функции

    СоздатьОбъект.
  2. Присвоение ссылки на этот объект какой-либо переменной. Дальней

    шее обращение к объекту производится через обращение к этой пере

    менной.
  3. Вызов метода Выполнить {), которому в качестве параметра передает

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

    Выполнить ) производит анализ текста запроса, выполняет выборку

    данных из объектов конфигурации, группирует их и накапливает, если

    это необходимо, итоговые значения по каждой из возможных комби

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

Вот общая схема использования объекта:
НашЗалрос=СоздатьОбъект("Запрос");
//Создание объекта и присвоение ссылки на него переменной
НашЗапрос
ТекстЗапроса=
"//Далее следует текст запроса, написанный на языке
запросов";
//Если ошибка в запросе, то выход из процедуры
Если НашЗапрос.Выполнить(ТекстЗапроса)=0 тогда
Возврат;
КонецЕсли;
// Далее следует циклическая обработка данных по группировкам запроса.
Рассмотрим подробнее порядок написания текста запроса. В начале текста за-

проса указывается период, за который будет формироваться запрос:
{Период с Дата! по Дата2
//Дата! - начало периода формирования запроса
3 Конечно, можно так «плохо» написать запрос, что методы выборки для соответст-
вующего объекта метаданных могут «обогнать» запрос по скорости работы.
Методические материалы обучения партнеров

85
Глава 5. Учет партий товаров |7/Дага2 - конец периода формирования запроса Если период запроса не указан, то запрос формируется на точку актуальности итогов. Указание периода запроса актуально в том случае, когда запрос организует выборку по документам или регистрам. При организации выборки по справочникам период запроса значения имеет только в том случае, если у справочника есть периодические реквизиты.
После указания периода запросов следует объявление внутренних переменных:
Переменная, которая включает в выборку всех клиентов, встречающихся во
всех документах вида ПриходнаяНакладная за период запроса.
|Переменная1= Документ.ПриходнаяНакладная.Поставщик;
Переменная, которая включает в выборку все элементы справочника контрагентов.
|Переменная2=Справочник.Контрагенты.ТекущийЭлемент;
Переменная, которая включает в выборку все товары, встречающиеся в регист-
ре ОстаткиТоваров за период запроса.
I | ПеременнаяЗ = Регистр„ОстаткиТоваров.Товар; ]
Переменная, которая включает в выборку все остатки товаров за период запро

са^
[^Переменная4 = Регистр. ОстаткиТоваров . Количество; ^J
Переменная, которая включает в выборку все покупные цены товаров, которые
присутствуют на складе за период запроса.
11ПеременнаяЬ = Регистр.ОстаткиТоваров.Товар.ЦенаПокупки; |
После объявления внутренних переменных запроса, существует возможность постановки условий по включению в выборку данных:
Переменная! включила в выборку всех клиентов, встречающихся во всех документах вида ПриходнаяНакладная за период запроса. Среди операторов, которые используются для организации отбора записей по условию, выделяется
оператор «в». Этот оператор записывается следующим образом:
11Условие (Переменная! в ВыбПоставщик) ;
Где переменная ВыбПоставщик может быть:
1. Ссылкой на конкретный элемент справочника. В этом случае в выборку

попадут только те документы ПриходнаяНакладная, в которых рекви

зит Поставщик равен значению ВыбПоставщик. В данном случае эта за-
пись эквивалентна:
11Условие (Переменная! = ВыбПоставщик) ; |
2. Ссылкой на группу справочника. Тогда в выборку попадут те докумен

ты, в которых реквизит Поставщик принадлежит группе
ВыбПоставщик. В этом случае наша запись будет эквивалентна:
I Условие ((Переменная!.ПринадлежитГруппе(ВыбПоставщик))=1);
апрель 2004 г.


1C.'Предприятие 7.7. Компонента Оперативный учет
Пустым значением. Тогда в выборку попадут все документы вне зависимости от того, какое значение Поставщик в них указано. Эта ситуация соответствует тому как если бы мы вообще не указали условие в тексте запроса.
Ссылкой на объект типа «СписокЗначений». В этом случае в выборку попадут все документы, у которых Поставщик входит в список значений ВыбПоставщик. Такое условие мы могли бы записать следующим обра-
зом:
(ВыбПоставщик.Принадлежит (Переменная!) =1) ; |
ПеременнаяЗ включила в выборку все покупные цены товаров, которые при-(ргствуют на складе за период запроса.
Мы хотим поставить условие - включать в выборку только те результаты, ко-

ipiie имеют ненулевое значение:
Г/словие(Переменная50) ;
После задания условий формирования выборки, необходимо определить функ-которые будут использованы в запросе. Переменна я 4 включила в запрос все товаров за период запроса. Зададим функцию, которая будет суммировать
^результаты: _____
Г^ункция Функция! = Сумма (Переменная4) ; [
После определения необходимых в запросе функций, необходимо задать спо-06 и порядок группировки данных. Задавая несколько группировок, следует учи-чцвать, что при их циклической обработке сначала должно следовать обращение к ^уппировкам вышестоящих уровней. Например: необходимо создать отчет, пока-Э1в#ощий остатки всех товаров на всех складах за определенный период, путем ^работки регистра ОстаткиТоваров. Для этого следует создать выборку за период (Дата1 по Дата2. Выборка должна включать в себя:
  1. Перечень товаров, встречающихся в регистре ОстаткиТоваров за пе

    риод запроса. С учетом того, как пользователь заполнит реквизит диа

    лога ВыбТовар.
  2. Перечень складов, на которых хранятся "товары.
Остатки по каждому наименованию товара на каждом склада
|ашЗапрос = СоздатьОбъект ( "Запрос") ;
1экстЗалроса="
[период с Дата! по Дата2;
Говар = Регистр. ОстаткиТоваров. Товар;
Склад = Регистр.ОстаткиТоваров.Склад;
(Сол = Регистр.ОстаткиТоваров.Количество;
Условие(Товар в ВыбТовар};
/порядок группировок
Группировка Товар;
Группировка Склад;

87
Глава 5. Учет партий товаров {Функция Результат = КоыОст(Кол);"; //выполняем запрос
О Тогда
Если НашЗапрос.Выполнить(ТекстЗапроса) Возврат;
КонецЕсли;
В результате выполнения подобного запроса мы получим выборку, которая будет иметь следующую структуру:


Товар
Склад
Результат
220
Товар!
79
Tojjapl
Склад!
69
Товар!
Склад2
10
Товар2
91
Товар2
Склад!
80
Товар2
Склад2
21
ТоварЗ
50
ТоварЗ
Склад!
50
В случае если порядок группировок в запросе поменять местами, изменится структура выборки:
//порядок группировок (Группировка Склад; (Группировка Товар;


Склад
Товар
Результат
220
Склад!
199
С '* -1
Товар!
69
С ;1
Товар2
80
С ,1
ТоварЗ
50
Склад2
10
Склад2
Товар 1
10
СкладЗ
21
СкладЗ
Товар2
21
После написания и выполнения запроса организуется циклическая обработка данных в порядке старшинства группировок:





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


1C предприятие 7.7. Компонента Оперативный учет
Глава 5. Учет партий товаров 89




НашЗапрос.Группировка(1}=1 Цикл //получение итоговых данных по текущему товару //по всем складам
Пока НашЗапрос.Группировка(2}=1 Цикл
//получение итоговых данных по товару
//по конкретному складу
КонецЦикла; КонецЦикла;
5.3. Текст Модуля документа «Расходная накладная»
Процедура СписатьПартии()
// присвоим переменной ссылку на текущий документ
ТД=ТекущийДокумент() ;
// присвоим переменной ссылку на объект типа "Запрос"
Запрос=СоздатьОбъект("Запрос"};
// формируем текст запроса
ТекстЗапроса="//{{ЗАПРОС(ПартииТоваров)";
// проверим, выполняется ли проведение документа в реальном
// времени
Если ИтогиАктуальны()=0 Тогда
// если нет, укажем период действия запроса
ТекстЗапроса=ТекстЗапроса+"
!Период с ТД по ТД;"; КонецЕсли;
ТекстЗапроса=ТекстЗапроса+"
// товары, встречающиеся в регистре за период запроса |Тов = Регистр.ОстаткиТоваров.Товар;
// склады, встречающиеся в регистре за период запроса |Скл = Регистр.ОстаткиТоваров.Склад;
// партии товаров, встречающиеся в регистре за период запроса {Партия = Регистр.ОстаткиТоваров.Партия; // остатки товаров
]Кол = Регистр.ОстаткиТоваров.Количество; // валютные остатки
|Вал = Регистр.ОстаткиТоваров. СтоимостьУЕ; // рублевые остатки
|Руб = Регистр.ОстаткиТоваров. СтоимостьРуб; // порядок группировок (Группировка Тов без групп; (Группировка Партия;
// добавим функции, позволяющие получить остатки на конец // периода
(Функция ОстКол = КонОст(Кол); (Функция ОстВал = КонОст(Вал); (Функция ОстРуб = КонОст(Руб);
которые хранятся на
// занесем в выборку только те товары, // складе, указанном в накладной |Условие(Скл=Склад) ; I"//}}ЗАПРОС
// проверим, выполнился ли запрос, если нет, то прекращаем
// выполнение процедуры
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
СтатусВозврата(0) ;
Возврат; КонецЕсли;
/у/ характеризует порядок списания: если LIFO Напр*-!, FIFO /|/Напр=1 Если Константа. ОсновнойМетодСписания =
Перечисление.МетодыСписания.ЫГО Тогда
Напр=-1; Иначе
Напр=1; КонецЕсли;
// открываем выборку строк табличной части документа ВыбратьСтроки();
// цикл выбора строк спецификации документа :
Пока ПолучитьСтроку{)=1 Цикл // строка спозиционирована... // пропустим услуги Если Товар.Родитель.ВидНоменклатурыО
Перечисление.ВидНоменклатуры.Товар Тогда
// делаем запись по регистру "РезервыТоваров"
Если Основание.Проведен()=1 Тогда
Регистр.РезервыТоваров.ДвижениеРасход(Основание,Товар,
Количество); КонецЕсли;
// перейдем к следующей итерации цикла Продолжить; КонецЕсли;
// для каждого товара из накладной перейдем в начало выборки, // для гарантированого позиционирования по // старшей группировке "Тов" Запрос.вНачалоВыборки();
// перейдем на запись в выборке, содержащую данные для // конкретного значения группировки - Товар из строки // документа Если Запрос.Получить(Товар,)=1 Тогда
// если в выборке такой товар существует, то получим //остатки
ОстКол_во=Запрос.ОстКол; ОстСумВал=Запрос.ОстВал;





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


90
1C предприятие 7.7. Компонента Оперативный учет
ОстСумРуб=Запрос.ОстРуб; Иначе
ОстКол_во=0;
ОстСумВал=0;
ОстСумРуб=0; КонецЕсли;
// осуществим проверку наличия товара на складе Если ОстКол_воКоличество Тогда
// если товара нет или не хватает, выводим информацию в
// окно сообщений и переходим на следующую строку в
// документе
Сообщить(ИВ документе "+ТекущийДокумент()+
" в строке »"+НомерСтроки+" не хватило товара "+Товар+ " на складе "+Склад+"; реально есть "+ОстКол_во+"!н);
// подготовим отмену проведения документа
СтатусВозврата (0);
Продолжить; КонецЕсли;
// движение по регистру "ОстаткиТоваров"
// присвоим начальное значение переменной, в которой будет // храниться количество товара, оставшееся списать после // учета очередной партии ОсталосьСписать=Количество; // организуем цикл по партиям Пока (Запрос.Группировка{"Партия",Напр}=1) и
(ОсталосьСписатьХ)) Цикл
// если в партии меньше товара, чем осталось списать,
// то переменной присваиваем все имеющееся в партии
//количество, иначе списываем столько, сколько осталось
СписКол_во=Мин(Запрос.ОстКол,ОсталосьСписать);
// определим валютную и рублевую суммы
СписСумВал=?(Запрос.ОстКол=СписКол_во,Запрос.ОстВал, Окр(СписКол_во*Запрос.ОстВал/Запрос.ОстКол,2));
СписСумРуб=?(Запрос.ОстКол=СписКол_во,Запрос.ОстРуб, Окр(СписКол_во*Запрос.ОстРуб/Запрос.ОстКол,2));
// установим значения для измерений и ресурсов регистра
// по текущей партии
Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
Регистр.ОстаткиТоваров.Товар=Товар;
Регистр.ОстаткиТоваров.Склад=Склад;
Регистр.ОстаткиТоваров.Партия=3апрос.Партия;
Регистр.ОстаткиТоваров.Количество=СписКол_во;
Регистр.ОстаткиТоваров.СтоимВал=СписСумВал;
Регистр,ОстаткиТоваров.СтоимРуб=СписСумРуб;
Регистр.ОстаткиТоваров.ДвижениеРасходВыполнитьО ;
ОсталосьСписать=ОсталосьСписать-СписКол_во; КонецЦикла; // по партиям // делаем запись по регистру "РезервыТоваров"
Методические материалы обучения партнеров
Глава 5. Учет партий товаров Если Основание.Проведен()=1 Тогда Регистр.РезервыТоваров.ДвижениеРасход(Основание,Товар,
Количество); КонецЕсли; КонецЦикла; КонецПроцедуры
Процедура ОбработкаПроведения(ПараметрПроведения) // ПараметрПроведения=1 при частичном проведении //(только по остаткам) Если Последовательность.ДляРасходныхНакладных.Проверить(
ТекущийДокумент())=0 Тогда
// если последовательность нарушена, запретим проведение
// документа
Сообщить(
'Нарушена последовательность проведения документов!");
СтатусВозврата(0);
Возврат; КонецЕсли; // вызываем процедуру списания товаров по партиям
СписатьПартии();
// делаем частичное проведение, поэтому здесь процесс проведения прекращаем Если ПараметрПроведения=1 Тогда
РежимПроведения=1 ;
Возврат; Иначе
РежимПроведения=0 ; КонецЕсли;
//движение регистра Взаиморасчеты , '
Регистр.Взаиморасчеты.ДвижениеПриход(Покупатель, Итог("СуммаУЕ"),Итог("СуммаРуб"));
//движение регистра СостояниеЗаказа Если Основание.Проведен()=1 Тогда
Регистр.СостояниеЗаказа.ДвижениеРасход(Основание,
Итог("СуммаУЕ") , КонецЕсли; КонецПроцедуры
апрель 2004 г.
91


92
Глава 6. Отчеты 93










Глава 6. Отчеты Поскольку увидеть содержимое регистров оперативного учета средствами самой системы «1С:Предприятие» невозможно, то для отображения накопленной в регистрах информации необходимо использовать отчеты. В системе «1С:Предприятие 7.7» имеется специальный конструктор отчетов, который позволяет быстро создать форму отчета. Обычно, в начале новый отчет разрабатывают как внешний. А затем, когда отчет полностью отлажен, его вставляют в конфигурацию, используя для этого пункт контекстно-зависимого меню «Вставить внешний отчет.,,». Подробнее об этой и других возможностях можно прочитать в книге «1С:Предприятис Версия 7.7. Конфигурирование и администрирование часть 1».
Для построения отчетов по итогам, хранящимся в регистрах, необходимо на втором шаге в Конструкторе отчета выбрать Конструктор запросов.
6.1. Отчет «Взаиморасчеты»
Этот отчет должен отображать текущее состояние взаиморасчетов клиентом (клиентами) за период. При этом мы должны иметь возможность получить не только начальное значение остатка по регистру «Взаиморасчеты», приход и расход за период, но и развернутое сальдо на конец периода.
Заметим, что регистр остатков не имеет методов для извлечения оборотов (приход/расход) за некоторый период времени и, что получить такую информацию можно только с помощью объекта «Запрос».
6.1.1. Диалог формы отчета



В окне диалога данного отчета (см. 6.1) можно вводить даты начала и конца периода, за который желательно получить отчет, а также конкретного клиента. Выбор клиента для обработки взаиморасчетов с ним осуществляется из справочника «Контрагенты».
Отчет формирует результаты взаиморасчетов с покупателями. Кроме этого, он включает всю подробную информацию по взаиморасчетам с покупателями с точностью до первичных документов. В сформированном отчете есть возможность просмотреть любой документ, сделав двойной клик мышкой на графе содержащей
документ. 6.1. Диалог формы отчета
«Взаиморасчеты»
6.1.2. Алгоритм построения отчета
Форма отчета была построена с помощью конструктора запросов. После чего шаблон печатной формы был замен на шаблон, приведенный на 6.2.
о-лон г** ,.ной формы от11, гы»
Кроме этого в процедуру сформировать () были внесены некоторые измене-
ния.
Прежде чем привести текст модуля отчета полностью рассмотрим некоторые

его особенности, на которые нужно обратить внимание.

Следующий фрагмент:
Запрос = СоздатьОбъект("Запрос");
Если ВыбНачПериодаПолучитьДатуТА() Тогда
ВыбНачПериода=ПолучитьДатуТА(} ; КонецЕсли; Если ВыбКонПериода=ПолучитьДатуТА() Тогда
ВыбКонПериода=ПолучитьПустоеЗначение(); КонецЕсли; ТекстЗапроса = "//{{ЗАПРОС(Сформировать) [Период с ВыбНачПериода по ВыбКонПериода;
позволяет правильно сформировать период, за который будет осуществляться выборка движений из регистра «Взаиморасчеты». Первый оператор «Если» проверяет, что дата начала периода не позже ТА. И если это так, то устанавливает дату начала периода равной дате ТА. Второй оператор «Если» проверяет и устанавливает, если это нужно, дату конца периода не позднее ТА.
Для того чтобы получить развернутое сальдо можно воспользоваться добавочным ключевым словом «Когда» при описании функций запроса:





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


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



(Функция ДолгКлиентаРуб = КонОст{СумРуб) когда(СумРуб=0) |Функция ДолгКлиентаВал = КонОст(СумВал) когда(СумВал=0) (Функция НашДолгРуб = КонОст{СумРуб) когда(СумРуб0); (Функция НашДолгВал = КонОст{СумРуб) когда{СумВал0};
Для того чтобы получить в отчете детализацию движений по документу нужно
воспользоваться предопределенной группировкой:
[ [Группировка Документ; _ |
Заметим, что функции НачОст{„.) и КонОст{...) не возвращают остатков на моменты до и после проведения документа соответственно при выборке по группировке «Документ».
При выводе секций отчета, когда группировка построена по справочнику,

обычно выделяют группы и элементы справочника разными секциями. В этом слу

чае целесообразно использовать метод ЭтоГруппа (...) объекта «Запрос», а не ана

логичный метод объекта «Справочник»:
Если Запрос.ЭтоГруппа(1)=1 Тогда Таб.ВывестиСекцию{"Группа");
Иначе
Таб.ВывестиСекцию("Клиент");
КонецЕсли;
Использование такой записи предпочтительнее по сравнению с Запрос. Клиент. ЭтоГруппа (), т.к. в этом случае в обработке будет участвовать 2 таблицы информационной базы вместо одной.
В результате выполнения запроса мы получим временную таблицу, которая будет иметь структуру, которую сокращенно можно представить следующим образом:
Клиент
Документ
Приход
Расход
9600
7200
Альтаир ТОО
5280
2880
Алътаир ТОО
Расходная накладная №1
2880
Альтаир ТОО
Приход денег №1
2000
Альтаир ТОО
Расходная накладная №3
2400
Альтаир ТОО
Приход денег №2
880
Маренго
4320
4320
Маренго
Расходная накладная №2
4320
Маренго
Приход денег №1
4000
Маренго
Приход денег №2
320


Глава 6. Отчеты

Окончательно, с учетом алгоритма заполнения выходной таблицы, модуль отчета можно представить в следующем виде:
дура генерации запроса Сформировать.
Процедура Сформировать()'
Перем Запрос, ТекстЗапроса, Таб; .
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
Если ВыбНачПериодаПолучитьДатуТА() Тогда
ВыбНачПериода=ПолучитьДатуТА(); КонецЕсли;
Если ВыбКонПериода=ПолучитьДатуТА() Тогда
ВыбКонПериода^ПолучитьПустоеЗначение(); КонецЕсли;
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
(Период с ВыбНачПериода^ ВыбКонПериода;
[Клиент = Регистр.Взаиморасчеты.Контрагент;
(СумРуб - Регистр.Взаиморасчеты.ДолгРуб;
(СумВал - Регистр.Взаиморасчеты.ДолгУЕ;
[Функция СумРубНачОст - НачОст(СумРуб};
(Функция СумВалНачОст = НачОст(СумВал);
(Функция СумРубПриход = Приход{СумРуб);
[Функция СумВалПриход - Приход(СумВал);
(Функция СумРубРасход = Расход(СумРуб);
(Функция СумВалРасход = Расход(СумВал);
(Функция ДолгКлиентаРуб = КонОст(СумРуб) когда(СумРуб=0)-
(Функция ДолгКлиентаВал = КонОст(СумВал) когда(СумВал-0);
(Функция НашДолгРуб = КонОст(СумРуб) когда(СумРуб0);
[Функция НашДолгВал = КонОст(СумРуб) когда(СумВал0);
(Группировка Клиент упорядочить по Клиент.Наименование;
(Группировка Документ;
[Условие(Клиент в ВыбКлиент);
("//}}ЗАПРОС
// Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат; КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); _Состояние("Заполнение выходной таблицы...")
1C предприятие 7.7. Компонента Оперативный учет
Таб.Опции(0, 0, Таб.ВысотаТаблицы{), 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей Клиент Если Запрос.ЭтоГруппа(1)=1 Тогда
Таб.ВывестиСекцию{"Группа"); Иначе
Таб.ВывестиСекцию("Клиент"); КонецЕсли;
Пока Запрос.Группировка{2) = 1 Цикл // Заполнение полей Документ Таб.ВывестиСекцию("Документ"); КонецЦикла; КонецЦикла;
// Заполнение полей "Итого"

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

// Вывод заполненной формы

Таб.ТолькоПросмотр(1};

Таб.Показать{"Сформировать", ""} ;

КонецПроцедуры
6.2. Отчет «Остатки товаров»



6.3. Диалог формы отчета «ОетаткиТоваров»
Этот отчет должен отображать текущее состояние склада, т.е. состояние регистра «ОстаткиТоваров» на момент ТА. Данный отчет также можно построить с помощью конструктора отчетов. В качестве дополнительной возможности мы в этом отчете реализуем расшифровку партий товара.

97
Глава 6. Отчеты 6.2.1. Диалог формы отчета После работы конструктора запросов в диалог отчета необходимо внести изменения (см. 6.3). Тогда пользователь сможет вводить конкретный товар или группу товаров, причем выбор товара для обработки осуществляется из справочника «Номенклатура». Кроме того, предусмотрена возможность выбора конкретного склада, по которому будут выводиться значения остатков товаров. Выбор склада осуществляется из справочника «Места хранения».
При выводе информации формируется полный или частичный отчет (в зависимости от состояния полей ввода «ВыбТовар» и «ВыбСклад»).
Форма отчета была построена с помощью конструктора запросов. После чего шаблон печатной формы был замен на шаблон, приведенный на 6.4.



Шабло печатной формы отчета «ОстаткиТоваров»
6.2.2. Алгоритм построения отчета
После работы конструктора в процедуру ОстаткиТоваров {) были внесены некоторые изменения.
Прежде чем привести текст модуля отчета полностью рассмотрим некоторые его особенности, на которые нужно обратить внимание.
При задании значений упорядочивания можно указывать на реквизиты справочника. Однако нужно помнить, что метод ЗначениеУпорядочивания(п,т) по-зволяет извлекать значения только базовых типов данных. Поясним это на примере:
(Группировка Товар упорядочить по Товар.Код, Товар.Наименование, Товар.ЕдиницаИзмерения, Товар.ЦенаЗакупки;
Поэтому вы не сможете в отчете отобразить значение 3-го параметра упорядо

чивай;^ .
[Запрос.ЗначениеУпорядочивания(1,3)
Правильный способ сосгоит в следующем:
I Группировка Товар упорядочить по Товар.Код, Товар.Наименование, Товар.ЦенаЗакупки;





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








Глава 6. Отчеты 99 98
1С:Предприятие7.7
Те мы в качестве параметров упорядочивания указываем только объекты базовых типов, а шаблоне печатной формы используем: Товар -^""*ц^э Двойствах
Далее, поскольку мы планируем сделать расшифроДО «™*™ то в CBO"°™* ячеек шаблона печатной формы мы задаем в поле «Расшифровка:» следующее вы-
ражение: _ __ __ , - - - - ~ I
_
Перед выводом соответствующих секций отчета п следующим образом:
|расшифровка#
мы
Пока Запрос.Группировка(1} = 1 Цикл
// Заполнение полей Товар ^
Расшифровка=СоздатьОбъект("СписокЗнахДении }; ^
Расшифровка.ДобавитьЗначение(Запрос.'Товар/ ю р },
Таб.ВывестиСекцию("Товар");
Пока Запрос.Группировка(2) = 1 Цикл
// Заполнение полей Склад wt
Расшифровка=СоздатьОбъект("СписокЗ^ачении );
Расшифровка.ДобавитьЗначение{Запрос-ТоваР'„^°Вар„ ' Расшифровка.ДобавитьЗначение(Запрос-Склад, Склад );
Таб.ВывестиСекцию{"Склад");

КонецЦикла;

КонеиДикла;
Таким образом, мы на каждой итерации цикла создаем список значений и по-мещаем в него товар, а при обработке группировки «Сю*Д» еще й текущий Склад. Расшифровку отчета мы реализуем следующим обраЗ°м:
Процедура ОбработкаЯчейкиТаблицы(Значение*Флаг)
Перем КонтФормы; „
Флар=0;// запретим стадартную обработку значения ячейки
// Примем значение расшифровки передами его как параметр
//в открываемую форму отчета КонтФормы=Значение; ОткрытьФорму ("Отчет. ПартииТоваров",
Коне цПроцедуры
В форме отчета «ПартииТоваров» мы сможем получить переданное значение, используя атрибут контекста формы: Форма. Параметр.
В результате выполнения запроса мы получим военную таблицу, которая будет иметь спруктуру, которую сокращенно можно приставить следующим обра-зом:
Окончательно, с учетом алгоритма заполнения выходной таблицы модуль от-

чета можно представить в следующем виде:
// Процедура генерации запроса ОстаткиТоваров.
// .. i
Процедура ОстаткиТоваров() . :
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ОстаткиТоваров)
(Товар = Регистр.ОстаткиТоваров.Товар;
I Склад = Регистр.ОстаткиТоваров.Склад;
IКолво = Регистр.ОстаткиТоваров.Количество;
(Функция Количество = КонОст{Колво);
(Группировка Товар упорядочить по Товар.Код, Товар.Наименование, Товар.ЦенаЗакупки;
[Группировка Склад упорядочить по Склад.Наименование;
(Условие(Товар в ВыбТовар);
(Условие(Склад в ВыбСклад);
I"//}}ЗАПРОС
// Если ошибка в запросе, то выход из процедуры 1 Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда ! ' ' Возврат;
КонецЕсли;





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


100
1C предприятие 7.7. Компонента Оперативный учет
// Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ОстаткиТоваров"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"}; Состояние{"Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка{1) = 1 Цикл // Заполнение полей Товар
Расшифровка=СоздатьОбъект("СписокЗначений") ; Расшифровка.ДобавитьЗначение(Запрос.Товар,"Товар") ; Таб.ВывестиСекцию{"Товар"}; Пока Запрос.Группировка{2} = 1 Цикл // Заполнение полей Склад
Расшифровка=СоздатьОбъект("СписокЗначений"); Расшифровка.ДобавитьЗначение(Запрос.Товар,"Товар"); Расшифровка.ДобавитьЗначение(Запрос.Склад,"Склад"); Таб.ВывестиСекцию("Склад"); КонецЦикла;
КонецЦикла; ^
// Заполнение полей "Итого" Таб.ВывестиСекцию{"Итого"); // Вывод заполненной формы Таб.Толь коПросмотр(1); Таб.Показать("ОстаткиТоваров", и я); КонецПроцедуры

101
Глава 6. Отчеты Этот отчет может быть получен путем расшифровки отчета «ОстаткиТоваров». Учитывая эту возможность, процесс его создания был разбит на два этапа. Вначале с помощью Конструктора отчета был создан сам отчет, а затем в модуль формы была включена предопределенная процедура Приоткрытии (), которая осуществляет прием параметров и построение отчета. 6.3.1. Диалог и шаблон печатной формы отчета



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

нения (см. 6.5). В окне диалога отчета можно вводить даты начала и конца

периода, за который желательно

получить отчет, или вызвать специ

альное окно для ввода этого периода.

Кроме этого имеется возможность

формировать отчет только по кон

кретному товару или группе товаров,

занесенных в справочник
«Номенклатура», с учетом возможности выбора конкретного склада из справочника «Места хранения».
При выводе информации фор

мируется полный или частичный (в

зависимости от состояния полей 6.6. Диалог формы отчета
ввода «ВыбТовар» и «ВыбСклад») «ПартииТоваров»
список товаров, вид шаблона печатной формы, которой представлен на рис 6.6.
Заметим, что в сформированном отчете выходные данные группируются по отдельным товарам, при этом объединение товаров по группам справочника








Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг)
Перем КонтФормы;
Флаг=0;// запретим стадартную обработку значения ячейки // Примем значение расшифровки, передав его как параметр // в открываемую форму отчета
КонтФормы=Значение;
ОткрытьФорму("Отчет.ПартииТоваров",КонтФормы);

КонецПроцедуры __^^
6.3. Отчет «Партии товаров»
Отчет «ПартииТоваров» детализирует состояние товарных запасов на предприятии по сравнению с отчетом «ОстаткиТоваров», дополнительно отображая еще движение товаров за указанный период в разрезе партий.
6.5. Шаблон печатной формы отчета «ПартииТоваров»





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





102 1С:Предприятие 7.7. Компонента Оперативный учет
«Номенклатура» не происходит. Далее идет группировка по отдельным складам и, наконец, по партиям. В качестве признака отдельной партии товаров принимается документ «Приходная накладная».
6.3.2. Алгоритм работы отчета
Прежде чем привести текст модуля отчета полностью, обратим ваше внимание

на то, что запись на языке запросов:
(Группировка Товар упорядочить по Товар.Код, Товар.Наименование без групп;
приводит к тому, что во временной таблице, сформированной объектом Запрос, не будут накапливаться итоги по группам справочника «Номнеклатура».
В результате выполнения запроса мы получим временную таблицу, которая будет иметь структуру, которую сокращенно можно представить следующим образом:

103
Глава 6. Отчеты Окончательно, с учетом алгоритма заполнения выходной таблицы процедуру генерации запроса можно представить в следующем виде: // Процедура генерации запроса ПартииТоваров.
Процедура ПартииТоваров()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ПартииТоваров)
[Период с ВыбНачПериода по ВыбКонПериода;
(Товар = Регистр.ОстаткиТоваров.Товар;
[Склад = Регистр.ОстаткиТоваров.Склад; -
[Партия = Регистр.ОстаткиТоваров.Партия;
IКолво = Регистр.ОстаткиТоваров.Количество;
[СтРуб - Регистр.ОстаткиТоваров.СтоимостьРуб;
IСтВал = Регистр.ОстаткиТоваров.СтоимостьУЕ;
[Функция НачОстКол = НачОст(Колво);
[Функция НачОстРуб = НачОст(СтРуб);'
(Функция НачОстВал = НачОст(СтВал);
[Функция ПриходКол = Приход(Колво};
[Функция ПриходРуб = Приход(СтРуб);
(Функция ПриходВал = Приход(СтВал);
[Функция РасходКол = Расход(Колво);
[Функция РасходРуб = Расход(СтРуб);
(Функция РасходВал = Расход(СтВал);
[Функция КонОстКол = КонОст(Колво);
[Функция КонОстРуб = КонОст(СтРуб);
[Функция КонОстВал = КонОст(СтВал);
[Группировка Товар упорядочить по Товар.Код, Товар.Наименование без групп;
(Группировка Склад упорядочить по Склад.Наименование
[Группировка Партия;
(Условие(Товар в ВыбТовар);
(Условие(Склад в ВыбСклад);
Г//ИЗАПРОС
// Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат; КонецЕсли;





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


104
1С:Предприятие 7.7. Компонента Оперативный учет
// Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект{"Таблица"); Таб.Исхо днаяТаблица("ПартииТоваров") ; // Заполнение полей "Заголовок" Таб.ВывестиСекцию{"Заголовок"); Состояние("Заполнение выходной таблицы...и); Таб.Опция(0, 0, . Таб.ВысотаТаблицыО , 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей Товар Таб.ВывестиСекцию("Товар"}; Пока Запрос.Группировка{2) = 1 Цикл
// Заполнение полей Склад , .
Таб-ВывестиСекцию("Склад"); °
Пока Запрос.Группировка(3) = 1 Цикл ,
// Заполнение полей Партия Таб.ВывестиСе кцию("Партия"); КонецЦикла; КонецЦикла;
КонецЦикла; J

// Заполнение полей "Итого"

Таб.ВывестиСекцию{"Итого");

// Вывод заполненной формы

Таб.ТолькоПросмотр{1};

Таб.Показать("ПартииТоваров", "");

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

105
Глава J. Отчеты // определимся с периодом отчета Если ПустоеЗначение(ВыбНачПериода)=1 Тогда
// "по умолчанию" в качестве начальной даты принимается //дата начала того месяца, в котором лежит дата ТА ЗыбНачПериода=НачМесяца(ПолучитьДатуТА(});
КонецЕсли;
Если (ПустоеЗначение(ВыбКонПериода)=1) или (ВыбКонПериода=ПолучитьДатуТА()) Тогда // Если конечная дата не введена или она больше даты // ТА, то конечной дате присваивается значение даты ТА ЗыбКонПериода=ПолучитьДатуТА();
КонецЕсли;
// Сформируем отчет не открывая диалог
ПартииТоваров();
Стс1тусВозврата (0) ; "'
КонецПроцедуры
i. ., _ . .1
Если Форма. Параметр будет иметь пустое значение, тогда процедура завершает свою работу и пользователь формирует отчет интерактивным образом.
В противном случае этот атрибут содержит ссылку на объект типа «СписокЗначнний». Поэтому мы можем извлечь предварительно сохранные отчетом «ОстаткиТоваров», значения:
ВыбТовар=Форма.Параметр.Получить("Товар"); ВыбСклад=Форма.Параметр.Получить("Склад");








6.3.3. Вызов отчета «Партии товаров» из отчета «Остатки товаров»
Рассмотрим связь между отчетами «Остатки товаров» и «Партии товаров». Для приема параметров из отчета «ОстаткиТоваров» мы воспользуемся атрибутом контекста формы: Форма. Параметр. Тогда предопределенная процедура ПриОткрытии {) будет выглядеть следующим образом:
Процедура ПриОткрытии()
// Если отчет вызван через пункт меню, то продолжим работу Если ПустоеЗначение(Форма.Параметр)=1 Тогда
Возврат; КонецЕсли;
// Отчет вызван из отчета "ОстаткиТоваров" ВыбТоварФорма.Параметр.Получить("Товар"); ВыбСклад=Форма.Параметр.Получить{"Склад");
Эти значения были сохранены отчетом «ОстаткиТоваров» в содержимое поля «Расшифровка» свойств соответствующей ячейки отчета (см. 6.7).
6.7. Свойства ячейки таблицы
Вызов процедуры выполняется по , , .j.,j.l^_^^_^___^^ ,i двойному щелчку левой кнопкой мыши или нажатию клавиши Enter на выбранной ячейке. В конце выражения, записанного в поле «Расшифровка» поставлен управляющий символ «#» без кавычек, означающий, что выражение расшифровки будет использовано как расшифровка для всех ячеек данной строки. Предопределенная процедура ОбработкаЯчейкиТаблицы{) модуля формы отчета «Остатки товаров» была рассмотрена в предыдущем разделе.





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


106
1C предприятие 7.7. Компонента Оперативный учет
6.4. Отчет «Резервы товаров»
Этот отчет позволяет посмотреть остатки и движение резерва товаров за период от некоторой даты по ТА. В отчете отображается только количество товара. Кроме того, можно увидеть движение: сколько товара было отложено и сколько снято с резерва.
Этот отчет также можно построить с помощью конструктора. После чего внести косметические изменения в диалог и шаблон печатной формы отчета.
6.4.1. Диалог и шаблон печатной формы отчета
Диалог отчета представлен на 6.8. Обратим внимание на то, что в диалоге выбирается только начало периода, а в качестве конца периода используется ТА.



Кроме этого, в окне диалога отчета предусмотрен выбор для обработки кон

кретного товара или группы товаров,

причем этот выбор осуществляется из

справочника «Номенклатура». Созда

ние списка зарезервированных товаров

может быть осуществлено по конкрет

ному покупателю или их группе, вы

бранных из справочника

«Контрагенты».
При выводе информация дополнительно расшифровывается по каждому приходному и расходному документам, которые были введены за указанный период.
6.8. Диалог формы отчета «РезервыТоваров»



Отчет о езервировании товаров
6.9. Шаблон печатной формы отчета «РеэервыТоваров»
Вид шаблона печатной формы, которой представлен на рис 6.9.

107
Глава 6. Отчеты 6.4.2. Алгоритм построения отчета в процедуру
После работы конструктора мы внесли изменения резерыТоваров (), которые мы рассмотрим ниже.
Для того чтобы построить отчет «по Точку Актуальности» мы из секции «Период» текста запроса удалим конец периода:
Период с ВыбНачПериода.
i
Для того чтобы приходные и расходные документы выводились бы разными секциями, мы напишем следующее:
Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей Документ Если Запрос.ПрихКолоО Тогда
Таб.ВывестиСекцию("Приход"); КонецЕсли; Если Запрос. РасхКолоО Тогда
Таб.ВывестиСекцию("Расход"); КонецЕсли; КонецЦикла;
В результате выполнения запроса мы получим временную таблицу, которая будет иметь структуру, которую сокращенно можно представить следующим обра-
зом:


1
' Товар/ Документ Начальный Отл'оже- Снято Конечный
резерв но резерв
1С:Предприятие 7.7.
2
' 5
6
1
ПРОФ на CD-ROM
Расходная накладная №1
2
Счет №2
3
Расходная накладная №2
3
Счет№3
2
Расходная накладная №3
1
1C .'Торговля и склад 7.5
1
4
3
2
ПРОФ
Счет №2
3
Расходная накладная №2
3
Счет №3
1
Окончательно, с учетом алгоритма заполнения выходной таблицы модуль отчета можно представить в следующем виде:





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


108
1С:Предприятие 7.7. Компонента Оперативный учет
у/*** *****
// Процедура генерации запроса РезервыТоваров.
II-
Процедура РезервыТоваров()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос"};
ТекстЗапроса =
"//{{ЗАПРОС{РезервыТоваров}
I Период с ВыбНачПериода;
(Товар = Регистр.РезервыТоваров.Товар;
[Клиент = Регистр.РезервыТоваров.ПоСчету.Покупатель;
|Кол = Регистр.РезервыТоваров,РезервТовара;
(Функция НачКол = НачОст(Кол);
|Функция ПрихКол = Приход(Кол);
(Функция РасхКол = Расход(Кол);
I Функция КонКол = КонОст(Кол);
(Группировка Товар упорядочить пр Товар.Наименование;
(Группировка Документ;
(Условие(Товар в ВыбТовар);
(Условие(Клиент в ВыбКлиент);
("//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат; КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб. ИсходнаяТаблица ( "РезервыТоваров11); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"}; Состояние("Заполнение выходной таблицы...и); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей Товар
Таб.ВывестиСекцию("Товар") ; ; : .
Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей Документ Если Запрос.ПрихКолоО Тогда
Таб.ВывестиСекцию("Приход") ; КонецЕсли;
Отчеты
Если Запрос. РасхКолОО Тогда
Таб.ВывестиСекцию("Расход"); КонецЕсли; КонецЦикла; КонецЦикла;




    Бухгалтерия: Автоматизация - Система 1С