Файл: Проектирование реализации операций бизнес-процесса).pdf
Добавлен: 24.05.2023
Просмотров: 189
Скачиваний: 4
СОДЕРЖАНИЕ
Выбор комплекса задач автоматизации
1.2 Характеристика существующих бизнес –процессов
1.3 Характеристика документооборота, возникающего при решении задачи
1.4 Обоснование проектных решений по информационному обеспечению
1.5 Обоснование проектных решений по программному обеспечению
2.1 Информационная модель и её описание
2.2 Характеристика нормативно-справочной, входной и оперативной информации
2.3 Характеристика результатной информации
2.4 Общие положения (дерево функций и сценарий диалога)
2.5 Характеристика базы данных
2.6 Структурная схема пакета (дерево вызова программных модулей)
2.7 Описание программных модулей
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.ЗакупочнаяЦена;
КонецФункции
Функция АктуальнаяРозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.РозничнаяЦена;
КонецФункции
Функция ПоставщикНоменклатуры(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Поставщик;
КонецФункции
Функция СтрокаВЧисло(Знач Строка, Знач Пусто = 0, Знач Ошибка = 0) Экспорт
Перем Результат, НомерСимвола, МаксНомерСимвола, ТекущийСимвол, Алфавит
, Отрицательное, ЕстьДробнаяЧасть;
Если Не ПустаяСтрока(Строка) Тогда
Строка = СокрЛП(Строка);
МаксНомерСимвола = СтрДлина(Строка);
// Определяем знак числа и удаляем его из исходной строки.
ТекущийСимвол = Лев(Строка, 1);
Алфавит = "+-";
Если Найти(Алфавит, ТекущийСимвол) > 0 Тогда
Строка = Сред(Строка, 2);
МаксНомерСимвола = МаксНомерСимвола - 1;
Отрицательное = (ТекущийСимвол = "-");
Иначе
Отрицательное = Ложь;
КонецЕсли;
// С начала исходной строки определяем последовательность максимальной длины,
// конторая может быть распознана как число.
НомерСимвола = 1;
Алфавит = "0123456789 .," + Символы.НПП;
Пока НомерСимвола <= МаксНомерСимвола Цикл
ТекущийСимвол = Сред(Строка, НомерСимвола, 1);
Если Найти(Алфавит, ТекущийСимвол) = 0 Тогда
Прервать;
КонецЕсли;
НомерСимвола = НомерСимвола + 1;
КонецЦикла;
// Удаляем правую часть строки, которая не участвует в распознавании.
Если НомерСимвола <= МаксНомерСимвола Тогда
Строка = Лев(Строка, НомерСимвола - 1);
МаксНомерСимвола = НомерСимвола - 1;
КонецЕсли;
Если МаксНомерСимвола > 0 Тогда
// Очищаем строку слева и справа от пробельных символов.
Алфавит = " " + Символы.НПП;
Пока Найти(Алфавит, Лев(Строка, 1)) > 0 Цикл
Строка = Сред(Строка, 2);
МаксНомерСимвола = МаксНомерСимвола - 1;
КонецЦикла;
Пока Найти(Алфавит, Прав(Строка, 1)) > 0 Цикл
Строка = Лев(Строка, МаксНомерСимвола - 1);
МаксНомерСимвола = МаксНомерСимвола - 1;
КонецЦикла;
// Определяем максимальное количество цифр справа, которые могут быть
// распознаны как дробная часть
НомерСимвола = МаксНомерСимвола;
Алфавит = "012345679";
Пока НомерСимвола >= 1 Цикл
ТекущийСимвол = Сред(Строка, НомерСимвола, 1);
Если Найти(Алфавит, ТекущийСимвол) = 0 Тогда
Прервать;
КонецЕсли;
НомерСимвола = НомерСимвола - 1;
КонецЦикла;
Если НомерСимвола > 0 Тогда
// Для строки "123,456": "456" - дробная часть
// Для строки "1,123,456": "456" - последняя триада целой части
Если Найти(".,", ТекущийСимвол) > 0
И Не (МаксНомерСимвола - НомерСимвола = 3
И МаксНомерСимвола >= 9
И Сред(Строка, НомерСимвола - 4, 1) = ТекущийСимвол) Тогда
Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Лев(Строка, НомерСимвола - 1), ".", ""), ",", ""), " ", ""), Символы.НПП, "") + "." + Сред(Строка, НомерСимвола + 1);
Иначе
Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка, ".", ""), ",", ""), " ", ""), Символы.НПП, "");
КонецЕсли;
КонецЕсли;
Строка = ?(Отрицательное, "-", "") + Строка;
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(Строка) Тогда
Результат = Пусто;
Иначе
Попытка
Результат = Число(Строка);
Исключение
Результат = Ошибка;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции // СтрокаВЧисло()
Листинг 3 – Модуль “РаботаСДокументами”
Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Процедура РассчитатьИтоговуюСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.ИтоговаяСумма = СтрокаТабличнойЧасти.Сумма * ((СтрокаВЧисло(СтрокаТабличнойЧасти.СтавкаНДС)/100)+1);
КонецПроцедуры
Листинг 1 – Модуль объекта
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос=Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,
| СУММА(РасходнаяНакладнаяПереченьНоменклатуры.Количество) КАК Количество,
| РасходнаяНакладнаяПереченьНоменклатуры.Цена,
| РасходнаяНакладнаяПереченьНоменклатуры.Сумма,
| РасходнаяНакладнаяПереченьНоменклатуры.ИтоговаяСумма
|ПОМЕСТИТЬ Док
|ИЗ
| Документ.РасходнаяНакладная.ПереченьНоменклатуры КАК РасходнаяНакладнаяПереченьНоменклатуры
|ГДЕ
| РасходнаяНакладнаяПереченьНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,
| РасходнаяНакладнаяПереченьНоменклатуры.Цена,
| РасходнаяНакладнаяПереченьНоменклатуры.Сумма,
| РасходнаяНакладнаяПереченьНоменклатуры.ИтоговаяСумма
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Док.Номенклатура КАК Номенклатура,
| ТоварыНаСкладеОстатки.Партия КАК Партия,
| Док.Количество КАК Количество,
| Док.Цена КАК Цена,
| Док.Сумма КАК Сумма,
| Док.ИтоговаяСумма КАК ИтоговаяСумм,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
| ТоварыНаСкладеОстатки.Склад КАК Склад,
| ТоварыНаСкладеОстатки.СтавкаНДС КАК СтавкаНДС
|ИЗ
| Док КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| Док.Номенклатура
| ИЗ
| Док КАК Док)) КАК ТоварыНаСкладеОстатки
| ПО Док.Номенклатура = ТоварыНаСкладеОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| ТоварыНаСкладеОстатки.Партия УБЫВ
|ИТОГИ
| МАКСИМУМ(Количество),
| СУММА(КоличествоОстаток)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса=Запрос.Выполнить();
ВыборкаИтогов=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Движения.ТоварыНаСкладе.Записывать = Истина;
Пока ВыборкаИтогов.Следующий() Цикл
Если ВыборкаИтогов.Количество>ВыборкаИтогов.КоличествоОстаток Тогда
Сообщить("Товара "+ВыборкаИтогов.Номенклатура+" в наличии только "+
ВыборкаИтогов.КоличествоОстаток+" шт. Документ """+Ссылка+""" не проведен!");
Отказ=Истина;
Продолжить;
Иначе
НадоСписать=ВыборкаИтогов.Количество;
Выборка=ВыборкаИтогов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() И НадоСписать<>0 Цикл
СписатьСПартии=МИН(НадоСписать, Выборка.КоличествоОстаток);
Если Выборка.КоличествоОстаток > 0 Тогда
СуммаСписания=СписатьСПартии*Выборка.СуммаОстаток/Выборка.КоличествоОстаток;
Иначе
CуммаСписания=Выборка.СуммаОстаток;
КонецЕсли;
НадоСписать=НадоСписать-СписатьСПартии;
Движение=Движения.ТоварыНаСкладе.ДобавитьРасход();
Движение.Период=Дата;
Движение.Номенклатура=Выборка.Номенклатура;
Движение.Партия=Выборка.Партия;
Движение.Количество=СписатьСПартии;
Движение.Стоимость=СуммаСписания;
Движение.Сумма=СписатьСПартии*Выборка.Цена;
РаботаСоСправочниками.СтрокаВЧисло(Выборка.СтавкаНДС);
Движение.ИтоговаяСумма= (РаботаСоСправочниками.СтрокаВЧисло(Выборка.СтавкаНДС)/100+1)*СписатьСПартии*Выборка.Цена;
Движение.Цена=Выборка.Цена;
Движение.СтавкаНДС = Выборка.СтавкаНДС;
Движение.Склад=Выборка.Склад;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
7. Приложение Б – Функции и процедуры конфигурации.
Листинг 2 – Модуль “РаботаСоСправочниками”
Функция АктуальнаяЗакупочнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.ЗакупочнаяЦена;
КонецФункции
Функция АктуальнаяРозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.РозничнаяЦена;
КонецФункции
Функция ПоставщикНоменклатуры(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Поставщик;
КонецФункции
Функция СтрокаВЧисло(Знач Строка, Знач Пусто = 0, Знач Ошибка = 0) Экспорт
Перем Результат, НомерСимвола, МаксНомерСимвола, ТекущийСимвол, Алфавит
, Отрицательное, ЕстьДробнаяЧасть;
Если Не ПустаяСтрока(Строка) Тогда
Строка = СокрЛП(Строка);
МаксНомерСимвола = СтрДлина(Строка);
// Определяем знак числа и удаляем его из исходной строки.
ТекущийСимвол = Лев(Строка, 1);
Алфавит = "+-";
Если Найти(Алфавит, ТекущийСимвол) > 0 Тогда
Строка = Сред(Строка, 2);
МаксНомерСимвола = МаксНомерСимвола - 1;
Отрицательное = (ТекущийСимвол = "-");
Иначе
Отрицательное = Ложь;
КонецЕсли;
// С начала исходной строки определяем последовательность максимальной длины,
// конторая может быть распознана как число.
НомерСимвола = 1;
Алфавит = "0123456789 .," + Символы.НПП;
Пока НомерСимвола <= МаксНомерСимвола Цикл
ТекущийСимвол = Сред(Строка, НомерСимвола, 1);
Если Найти(Алфавит, ТекущийСимвол) = 0 Тогда
Прервать;
КонецЕсли;
НомерСимвола = НомерСимвола + 1;
КонецЦикла;
// Удаляем правую часть строки, которая не участвует в распознавании.
Если НомерСимвола <= МаксНомерСимвола Тогда
Строка = Лев(Строка, НомерСимвола - 1);
МаксНомерСимвола = НомерСимвола - 1;
КонецЕсли;
Если МаксНомерСимвола > 0 Тогда
// Очищаем строку слева и справа от пробельных символов.
Алфавит = " " + Символы.НПП;
Пока Найти(Алфавит, Лев(Строка, 1)) > 0 Цикл
Строка = Сред(Строка, 2);
МаксНомерСимвола = МаксНомерСимвола - 1;
КонецЦикла;
Пока Найти(Алфавит, Прав(Строка, 1)) > 0 Цикл
Строка = Лев(Строка, МаксНомерСимвола - 1);
МаксНомерСимвола = МаксНомерСимвола - 1;
КонецЦикла;
// Определяем максимальное количество цифр справа, которые могут быть
// распознаны как дробная часть
НомерСимвола = МаксНомерСимвола;
Алфавит = "012345679";
Пока НомерСимвола >= 1 Цикл
ТекущийСимвол = Сред(Строка, НомерСимвола, 1);
Если Найти(Алфавит, ТекущийСимвол) = 0 Тогда
Прервать;
КонецЕсли;
НомерСимвола = НомерСимвола - 1;
КонецЦикла;
Если НомерСимвола > 0 Тогда
// Для строки "123,456": "456" - дробная часть
// Для строки "1,123,456": "456" - последняя триада целой части
Если Найти(".,", ТекущийСимвол) > 0
И Не (МаксНомерСимвола - НомерСимвола = 3
И МаксНомерСимвола >= 9
И Сред(Строка, НомерСимвола - 4, 1) = ТекущийСимвол) Тогда
Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Лев(Строка, НомерСимвола - 1), ".", ""), ",", ""), " ", ""), Символы.НПП, "") + "." + Сред(Строка, НомерСимвола + 1);
Иначе
Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка, ".", ""), ",", ""), " ", ""), Символы.НПП, "");
КонецЕсли;
КонецЕсли;
Строка = ?(Отрицательное, "-", "") + Строка;
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(Строка) Тогда
Результат = Пусто;
Иначе
Попытка
Результат = Число(Строка);
Исключение
Результат = Ошибка;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции // СтрокаВЧисло()
Листинг 3 – Модуль “РаботаСДокументами”
Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Процедура РассчитатьИтоговуюСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.ИтоговаяСумма = СтрокаТабличнойЧасти.Сумма * ((СтрокаВЧисло(СтрокаТабличнойЧасти.СтавкаНДС)/100)+1);
КонецПроцедуры
Листинг 1 – Модуль объекта
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос=Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,