[^Переменная4 = Регистр. ОстаткиТоваров. Количество;_______ ^J

Переменная, которая включает в выборку все покупные цены товаров, которые

присутствуют на складе за период запроса.___________________________

11ПеременнаяЬ = Регистр. ОстаткиТоваров. Товар. ЦенаПокупки; |

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

Переменная! включила в выборку всех клиентов, встречающихся во всех до­кументах вида ПриходнаяНакладная за период запроса. Среди операторов, кото­рые используются для организации отбора записей по условию, выделяется

оператор «в». Этот оператор записывается следующим образом:__________

11Условие (Переменная! в ВыбПоставщик) ;_____________________

Где переменная ВыбПоставщик может быть:

1. Ссылкой на конкретный элемент справочника. В этом случае в выборку
попадут только те документы ПриходнаяНакладная, в которых рекви­
зит Поставщик равен значению ВыбПоставщик. В данном случае эта за-

_______ пись эквивалентна:______________________________________

11Условие (Переменная! = ВыбПоставщик) ;_________________________ |

2. Ссылкой на группу справочника. Тогда в выборку попадут те докумен­
ты, в которых реквизит Поставщик принадлежит группе

___ ВыбПоставщик. В этом случае наша запись будет эквивалентна:_

I Условие ((Переменная!.ПринадлежитГруппе(ВыбПоставщик))=1);

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

Пустым значением. Тогда в выборку попадут все документы вне зави­симости от того, какое значение Поставщик в них указано. Эта ситуация соответствует тому как если бы мы вообще не указали условие в тексте запроса.

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

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

зом:___________________________________________________

(ВыбПоставщик. Принадлежит (Переменная!) =1) ;______ |

ПеременнаяЗ включила в выборку все покупные цены товаров, которые при-(ргствуют на складе за период запроса.

Мы хотим поставить условие - включать в выборку только те результаты, ко-
i>pi>ie имеют ненулевое значение:_______________________________________

Г/словие(Переменная5<>0) ;

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

^результаты:________ _____________________________________________

Г^ункция Функция! = Сумма (Переменная4) ; [

После определения необходимых в запросе функций, необходимо задать спо-06 и порядок группировки данных. Задавая несколько группировок, следует учи-чцвать, что при их циклической обработке сначала должно следовать обращение к ^уппировкам вышестоящих уровней. Например: необходимо создать отчет, пока-Э1в#ощий остатки всех товаров на всех складах за определенный период, путем ^работки регистра ОстаткиТоваров. Для этого следует создать выборку за период (Дата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

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

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