Дипломная (вкр): Модернизация автоматизированной информационной системы учета товара

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

19.    [Электронный ресурс] Дано описание системы «ABACUS Professional» Официальный сайт компании «Омега».

.        [Электронный ресурс] Дано описание системы «БЭСТ-5» Официальный сайт компании «БЭСТ».

Приложение А

Листинг программной реализации отчета «Планирование закупок»

// ОПИСАНИЕ МОДУЛЬНЫХ ПЕРЕМЕННЫХ

Перем ТекСтрокаВТаблице; // текущая строка в таблице значений МФ

// используются для стандартного механизма кнопок "Обновить" и

"Настройка"

Перем Таб;

Перем Обновить;

Перем Расшифровка;

соотв. с установкой)

// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ

//

//************************************************************

// ВыбратьПоФильтру()

// Параметры:

// Нет

// Описание:

// Открывает обработку отбора элементов по произвольному фильтру

//

Процедура ВыбратьПоФильтру()

Перем ВидЗначенияПодбора;

ВидЗначенияПодбора=СокрЛП(ТаблицаМФ.Вид);

Если ПустоеЗначение(ВидЗначенияПодбора)=1 Тогда

Возврат;

КонецЕсли;

СписокПараметров=СоздатьОбъект("СписокЗначений");

СписокПараметров.ДобавитьЗначение("", "ИмяВызвавшейФормы");

СписокПараметров.ДобавитьЗначение(ТаблицаМФ.Тип, "Тип");

СписокПараметров.ДобавитьЗначение(ВидЗначенияПодбора,"Вид");

СписокПараметров.ДобавитьЗначение(СписокЭлементовМФ,

"Объекты");

ТаблицаМФ.ФлВкл=2;

ОткрытьФорму("Обработка.ПодборОбъектов#",СписокПараметров);

КонецПроцедуры// ВыбратьПоФильтру

//************************************************************

// ПерерисовкаНазванийЗакладок

//

// Параметры:

// Нет

// Описание:

// Добавляет "(!)" в заголовок закладки с множественным фильтром,

когда этот фильтр задан

//

Функция ПерерисовкаНазванийЗакладок()

Форма.Закладки.УстановитьЗначение(2,?(глМножественныйФильтрЗадан(ТаблицаМФ)=1,"(!) ","")+"Множественный фильтр");

КонецФункции // ПерерисовкаНазванийЗакладок

//************************************************************

// УправлениеДиалогом()

//

// Параметры:

//Нет

// Возвращаемое значение:

//Нет

// Описание:

//Управление доступностью элементов диалога.

Процедура УправлениеДиалогом()

Если Форма.Закладки.ТекущаяСтрока() = 1 Тогда

Форма.ИспользоватьСлой("Шапка,Подвал,Основной1,Основной2");

Иначе

Форма.ИспользоватьСлой("Шапка,МФ,Подвал");

КонецЕсли;

КонецПроцедуры //УправлениеДиалогом()

//************************************************************

// РасшифровкаОбновить(Обновить)

//

// Параметры:

// Обновить = 1 - нажата кнопка "Обновить"

//2 - нажата кнопка "Настройка"

//

// Возвращаемое значение: Расшифровка (список значений)

//

// Вызывается из формул элементов диалога:

// из таблицы, кнопки "Обновить" и "Настройка"

//

// Описание: функция для стандартного механизма кнопок ""Обновить"

и "Настройка""

// помещает значение параметра в список Расшифровка и возвращает

этот список

//

Функция РасшифровкаОбновить(Обновить)

Расшифровка.Установить("Обновить", Обновить);

Возврат Расшифровка;

КонецФункции //РасшифровкаОбновить()

//************************************************************

// ЯвляетсяРабочимДнем(Д)

//

// Параметры:

// Д - дата

/// Возвращаемое значение:

// 1, если Д является рабочим днем

// 0, иначе

// Вызывается из формул элементов диалога:

// Описание:

// Проверяет, является ли дата рабочим днем в соответсвии с

настройкой рабочей недели

Функция ЯвляетсяРабочимДнем(Д)

Если НомерДняНедели(Д)>ЧислоРабочихДнейВНеделе Тогда

Возврат 0;

Иначе

Возврат 1;

КонецЕсли;

КонецФункции// ЯвляетсяРабочимДнем()

//************************************************************

// ЧислоРабочихДнейМежду(Д1,Д2)

//

// Параметры:

// Д1 и Д2 - даты

// Возвращаемое значение:

// Число рабочих дней между Д1 и Д2 включительно

// Вызывается из формул элементов диалога:

// Описание:

// Расчет количества рабочих дней между датами в соответствии с

установленной

// длиной рабочей недели.

Функция ЧислоРабочихДнейМежду(Д1,Д2)

Перем ОбщееЧислоДней, ЧислоПолныхНедель,

ЧислоДнейВНеполнойНеделе;

Перем ЧислоРабочихДней;

// если дата конца меньше даты начала, то число дней = 0

Если Д1>Д2 Тогда

Возврат 0;

КонецЕсли;

ОбщееЧислоДней = (Д2-Д1)+1;

ЧислоДнейВНеполнойНеделе = ОбщееЧислоДней % 7;

ЧислоПолныхНедель = Окр((ОбщееЧислоДней -

ЧислоДнейВНеполнойНеделе)/7);

ЧислоРабочихДней =

ЧислоРабочихДнейВНеделе*ЧислоПолныхНедель;

Для Индекс = 0 По (ЧислоДнейВНеполнойНеделе-1) Цикл

ЧислоРабочихДней = ЧислоРабочихДней + ЯвляетсяРабочимДнем(Д2-

Индекс);

КонецЦикла;

Возврат ЧислоРабочихДней;

КонецФункции// ЧислоРабочихДнейМежду()

//************************************************************

// ПроверитьКорректностьДат()

//

// Параметры:

// Нет

// Возвращаемое значение:

// Нет

// Вызывается из формул элементов диалога:

// поля с датами отчета

// Описание:

// проверяет даты на корректность (превышение ТА, дата конца закупок

Должна // быть не меньше даты конца анализа продаж)

Процедура ПроверитьКорректностьДат()

Если ДатаКонца>ПолучитьДатуТА() Тогда

Предупреждение("Нельзя устанавливать дату анализа продаж больше

Точки Актуальности!", 60);

ДатаКонца = ПолучитьДатуТА();

ДатаНачала = Мин(ДатаНачала,ДатаКонца);

КонецЕсли;

Если ДатаНачала>ДатаКонца Тогда

Предупреждение("Нельзя устанавливать дату начала анализа продаж

больше даты конца!", 60);

ДатаНачала = ДатаКонца;

КонецЕсли;

//Если (ДатаНачалаЗак - ДатаКонца) > 0 тогда // планируем будущий

период

//Форма.ОстатокНаНачало.Доступность(1);

//Иначе

//Форма.ОстатокНаНачало.Доступность(0);

//ОстатокНаНачало.ТекущаяСтрока(1);

//КонецЕсли;

КонецПроцедуры // ПроверитьКорректностьДат()

//************************************************************

// Сформировать(ЗакрытьДиалог=0)

// Параметры:

// ЗакрытьДиалог - флаг того, что после формирования отчета надо

закрыть диалог

// Возвращаемое значение: НЕТ

// Вызывается из формул элементов диалога:

// кнопки "Сформировать" и "ОК"

// Описание: запускает отчет

Процедура Сформировать(ЗакрытьДиалог=0)

Перем Запрос, ТекстЗапроса;

Если глПроверкаДаты(ДатаНачала,ДатаКонца)=0 Тогда

Возврат;

КонецЕсли;

// Здесь формируется отчет, который использует регистры, критичные к

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

// поэтому сравним установленные даты периода формируемого отчета

с ГП

ПроверитьКорректностьДат();

Если (ТипЗначенияСтр(Таб) <> "Таблица") ИЛИ (Обновить = 0) Тогда

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

Иначе

Таб.Очистить();

КонецЕсли;

Таб.ИсходнаяТаблица( "ПланированиеЗакупок" );

Расшифровка = СоздатьОбъект("СписокЗначений");

Расшифровка.Установить("Отчет", "ПланированиеЗакупок");

// все настройки помещаем в список

Расшифровка.Установить("ДатаНачала",  ДатаНачала);

Расшифровка.Установить("ДатаКонца",  ДатаКонца);

Расшифровка.Установить("ВыбТМЦ", ВыбТМЦ);

глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); //

записываем изменения если они были

БылЗаданМФ = глМножественныйФильтрЗадан(ТаблицаМФ);

// запомним МФ только если он задан

Если БылЗаданМФ = 1 Тогда

Расшифровка.Установить("ТаблицаМФ", ТаблицаМФ);

КонецЕсли;

ЧислоРабочихДнейВНеделе = 7;

//Создание объекта типа Запрос

Запрос = СоздатьОбъект("Запрос");

Загол = "";

ЗаголУсловия = Шаблон("За период с [ДатаНачала] по [ДатаКонца] " +

"([ЧислоРабочихДнейМежду(ДатаНачала,ДатаКонца)] раб. дн.). ");

ТекстЗапроса =

"//{{ЗАПРОС(Сформировать)

Период с ДатаНачала по ДатаКонца;

Номенклатура = Регистр.Продажи.Номенклатура,

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

КолПродажи = Регистр.Продажи.Количество;

КолОстатки = Регистр.Остатки.Количество;

Функция Продано = Сумма(КолПродажи );

Функция НачОст = НачОст(КолОстатки);

Функция КонОст = КонОст(КолОстатки);

Функция Приход = Приход(КолОстатки);

//Функция Расход = Расход(КолОстатки);

Группировка Номенклатура без групп;

Группировка Документ;

"//}}ЗАПРОС

;

НетОш = 1; // нет ошибок при наложении фильтров

НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ,

"Номенклатура",ВыбТМЦ, "ВыбТМЦ",

ТекстЗапроса,Загол,"СвойстваНоменклатуры");

//НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ,

"Поставщик",ВыбПоставщик, "ВыбПоставщик", ТекстЗапроса,"","");

Если НетОш = 0 Тогда

Возврат;

КонецЕсли;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

Возврат;

КонецЕсли;

Запрос2 = СоздатьОбъект("Запрос");

Загол = "";

ЗаголУсловия = Шаблон("За период с [ДатаНачала] по [ДатаКонца] " +

"([ЧислоРабочихДнейМежду(ДатаНачала,ДатаКонца)] раб. дн.). ");

ТекстЗапроса2 =

"//{{ЗАПРОС(Сформировать)

Период с ДатаНачала по ДатаКонца;

Номенклатура = Регистр.Продажи.Номенклатура,

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

Поставщик = Регистр.Продажи.Поставщик,

Регистр.Остатки.ПрихДок.Агент;

КолПродажи = Регистр.Продажи.Количество;

КолОстатки = Регистр.Остатки.Количество;

Функция Продано = Сумма(КолПродажи );

Функция НачОст = НачОст(КолОстатки);

Функция КонОст = КонОст(КолОстатки);

Функция Приход = Приход(КолОстатки);

Группировка Номенклатура без групп;

//Группировка Документ;

|"//}}ЗАПРОС

;

НетОш = 1; // нет ошибок при наложении фильтров

НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ,

"Номенклатура",ВыбТМЦ, "ВыбТМЦ",

ТекстЗапроса2,Загол,"СвойстваНоменклатуры");

НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ,

"Поставщик",ВыбПоставщик, "ВыбПоставщик", ТекстЗапроса2,"","");

Если НетОш = 0 Тогда

Возврат;

КонецЕсли;

// Если ошибка в запросе, то выход из процедуры

Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда

Возврат;

КонецЕсли;

//тз=создатьобъект("ТаблицаЗначений");//Создание объекта типа

Запросъ

//запрос.выгрузить(тз);

//тз.выбратьстроку();

ПечЗаголовок = "Планирование закупок ТМЦ";

ПечЗаголовокСтолбца = "ТМЦ";

глЧислоСтрок = 0;

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

Таб.ВывестиСекцию("Шапка");

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

// выводим шапку на каждой странице

НачПовт = Таб.ВысотаСекции("Кнопки") +

Таб.ВысотаСекции("Шапка");

КонПовт = НачПовт + Таб.ВысотаСекции("ШапкаТаблицы");

Таб.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);

глОживить(1);

//Если нужен порядок по списку элементов МФ Тогда

//Организовать цикл по элементам списка МФ и позиционировать

//запрос на элементе

Пока Запрос.Группировка("Номенклатура") = 1 Цикл

Номенклатура = Запрос.Номенклатура;

Если ПустоеЗначение(Номенклатура) = 1 Тогда

Продолжить;

КонецЕсли;

// подсчет количества дней продажи товара (рабочие дни когда он

лежал на складе

// или день (даже нерабочий) когда была сделана продажа)

ПроданоВсего = Запрос.Продано;

КолДнейПродажи = 0;

ТекДата = ДатаНачала;

ТекДатаУчтена = 0;

ОстатокНачалаПериода = Запрос.НачОст;

ПоступлениеПериода = Запрос.Приход;

ОстатокОкончанияПериода = Запрос.КонОст;

ОстатокНачалаПериодаП=0;

ОстатокОкончанияПериодаП=0;

ПроданоВсегоП=0;

Если Запрос2.Получить(Номенклатура) = 1 Тогда

ОстатокНачалаПериодаП = Запрос2.НачОст;

ОстатокОкончанияПериодаП = Запрос2.КонОст;

ПроданоВсегоП = Запрос2.Продано;

конецесли;

Пока Запрос.Группировка("Документ") = 1 Цикл

Если ТекДата <> Запрос.Документ.ДатаДок Тогда

ТекДатаУчтена = 0;

ТекДата = Запрос.Документ.ДатаДок;

КонецЕсли;

Если ТекДатаУчтена = 0 Тогда

Если (Запрос.Продано > 0) тогда// возвраты не считаем.

КолДнейПродажи = КолДнейПродажи + 1;

ТекДатаУчтена = 1;

КонецЕсли;

КонецЕсли;

КонецЦикла; // по документам

СредняяСкорость = ?(КолДнейПродажи = 0, 0,ПроданоВсего /

КолДнейПродажи);

ОбщаяСкорость = ?(КолДнейПродажи = 0, 0,ПроданоВсего /

ЧислоРабочихДнейМежду(ДатаНачала, ДатаКонца));

Ед = Номенклатура.БазоваяЕдиница;

ПечТекстСтроки = Номенклатура;

ТекРасшифровка = Номенклатура;

ПечКодТекстСтроки = Номенклатура.код;

ПечПроданоВсего = глФРМКоличество(ПроданоВсего, Ед);

ПечПроданоВсегоП = глФРМКоличество(ПроданоВсегоП, Ед);

ПечПриходВсего =глФРМКоличество(ПоступлениеПериода, Ед);

ПечКолДнейПродажи = Формат(КолДнейПродажи,"Ч10");

ПечСредняяСкорость = глФРМКоличество(СредняяСкорость,Ед);

ПечОбщаяСкорость=глФРМКоличество(ОбщаяСкорость, Ед);

ПечОстатокНачалаПериода =

глФРМКоличество(ОстатокНачалаПериода, Ед);

ПечОстатокОкончанияПериода =

глФРМКоличество(ОстатокОкончанияПериода, Ед);

ПечОстатокНачалаПериодаП =

глФРМКоличество(ОстатокНачалаПериодаП, Ед);

ПечОстатокОкончанияПериодаП =

глФРМКоличество(ОстатокОкончанияПериодаП, Ед);

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

глОживить(1);

КонецЦикла;

ОстатокНачалаПериодаП = Запрос2.НачОст;

ОстатокОкончанияПериодаП = Запрос2.КонОст;

ПроданоВсегоП = Запрос2.Продано;

ПечПроданоВсего = глФРМКоличество(ПроданоВсегоП, Ед);

ПечОстатокНачалаПериода =

глФРМКоличество(ОстатокНачалаПериодаП, );

ПечОстатокОкончанияПериода =


ОстатокНачалаПериода = Запрос.НачОст;

ОстатокОкончанияПериода = Запрос.КонОст;

ПроданоВсего = Запрос.Продано;

ПечПроданоВсего = глФРМКоличество(ПроданоВсего, Ед);

ПечОстатокНачалаПериода =

глФРМКоличество(ОстатокНачалаПериода, );

ПечОстатокОкончанияПериода =

глФРМКоличество(ОстатокОкончанияПериода, );

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

глОживить(1);

Таб.Опции(0, 0, 8, 0, "ПланированиеЗакупок",

"ПланированиеЗакупок");

Таб.ОбластьПечати(3);

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

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

Таб.Показать("Планирование закупок", "");

Если (Обновить = 2)ИЛИ(ЗакрытьДиалог=1) Тогда

СтрокаДействийФормы = "#Закрыть";

КонецЕсли;

КонецПроцедуры // Сформировать()

// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ

//************************************************************

// Предопределенная процедура

Процедура ПриОткрытии(ФлагВосстановленияНастройки)

Если ФлагВосстановленияНастройки = 0 Тогда

ДатаНачала = Константа.ДатаНачалаПериода;

Если ПустоеЗначение(ДатаНачала) = 1 Тогда

ДатаНачала = НачМесяца(ДатаКонца);

КонецЕсли;

// инициализация границ периодов

ДатаНачалаЗак = ДатаКонца+1;

ДатаКонцаЗак = КонМесяца(ДатаНачалаЗак);

ВидРазделителя = 1;

КонецЕсли;

Если глФлагРасшифровки = 1 Тогда

Обновить = глОбновить;

Источник: https://www.bibliofond.ru/detail.aspx?id=785762