[^Переменная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 |




