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 Тогда
Обновить = глОбновить;