Файл: Проектирование реализации операций бизнес-процесса).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 24.05.2023

Просмотров: 163

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);

ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);

Возврат ЗначенияРесурсов.ЗакупочнаяЦена;

КонецФункции

Функция АктуальнаяРозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт

Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);

ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);

Возврат ЗначенияРесурсов.РозничнаяЦена;

КонецФункции

Функция ПоставщикНоменклатуры(АктуальнаяДата, ЭлементНоменклатуры) Экспорт

Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);

ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);

Возврат ЗначенияРесурсов.Поставщик;

КонецФункции

Функция СтрокаВЧисло(Знач Строка, Знач Пусто = 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 – Модуль объекта

Процедура ОбработкаПроведения(Отказ, Режим)

Запрос=Новый Запрос;

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

"ВЫБРАТЬ

| РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,