Мне недавно нужно было сделать обработку для одной ювелирной компании. Никогда не слышал про Азиатскую схему поэтому решил описать и заодно как делал обработку.
Формула расчета цены за ювелирные изделия:
Цена изделия = (Стоимость золота + 20%( НДС и потери) + Цена Работы) * Вес изделия + Стоимость за карат в $ * каратный вес изделия * курс рубля + 0,5$ * кол-во вставок * курс рубля.
Стоимость золота = Стоимость 1 гр. золота 585 по Лондону в рублях.
Стоимость вставок:
Рассев |
Диаметр |
Характеристика |
||||
3/4 |
3/5 |
3/6 |
4/4 |
4/5 |
||
200-400 120-200 90-120 60-90 |
0,8-1,1 1,1-1,23 1,23-1,40 1,40-1,60 |
878 |
783 |
743 |
702 |
675 |
40-60 |
1,60-1,80 |
1013 |
963 |
770 |
925 |
891 |
30-40 |
1,80-2,00 |
945 |
905 |
878 |
925 |
891 |
25-30 |
2,00-2,20 |
972 |
925 |
878 |
925 |
891 |
20-25 |
2,20-2,35 |
1013 |
925 |
670 |
925 |
891 |
15-20 |
2,35-2,60 |
963 |
918 |
905 |
925 |
891 |
10-15 |
2,60-2,95 |
1148 |
1026 |
999 |
1013 |
972 |
7-10 |
2,95-3,30 |
1256 |
1067 |
1013 |
1013 |
972 |
Стоимость золота по Лондону 1287$ за унцию, курс 1$ =33руб
Цена за работу будет 350 рублей, Вес изделия 2, 37.
Характеристика: 4/5 Рассев: 11 Количество вставок: 1 Каратный вес: 0,093. |
Считаем стоимость золота за 1 гр. 585 = 1287/31,1*0,585*33= 798,9 руб.
Стоимость изделия = (798,9+20%+350) *2,37+972*33*0,093+0,5*33*1= 6101 руб.
В базе есть в определённой папке номенклатура эталонная, т.е. по которой можно сделать заказ. По этой номенклатуре пользователь будет ориентироваться по ней. Он в обработке вводит Артикул длинный и указывает размер изделия. А после этого он должен указать Чистоту камня (его характеристику) и после этого нажать на кнопку и посчитать Цену за изделие.
Сделаем внешнюю обработку, в которой мы будем писать артикул изделия. По этому артикулу мы узнаем какие размеры изделия есть в базе. После выбора размера изделия в поле табличной части подставится номенклатура. В табличной части состав выведутся камни изделия и картинка. Дальше нужно будет подставлять значения для камней.
Добавим реквизиты:
Стоимость золота: число, длина 15, точность 2
Цена за работу: число, длина 15, точность 2
Курс рубля: число, длина 15, точность 2
Артикул: Строка
Номенклатур: СправочникСсылка.Номенклатура
Количество: Число
Характеристика: Строка
Цена: число, длина 15, точность 2
Размер: Строка
НоменклатураСостав с реквизитами:
Камень: Строка
Рассев: Строка
Номенклатур: СправочникСсылка.Номенклатура
Размер: Строка
Чистота: Строка
Количество: Число
Масса: Число
Сделаем Размер полем выбора:
И будем при начале выбора из
списка искать по артикулу значения
Пропишем следующий код в этой процедуре
Процедура ОсновнаяФормаТаблицаРазмерНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка) ТекущаяСтрока = ЭтаФорма.ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НоменклатураРазмерныйРяд.Размеркакразмер |ИЗ | Справочник.Номенклатура.РазмерныйРядКАКНоменклатураРазмерныйРяд | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураКАК Номенклатура | ПО НоменклатураРазмерныйРяд.Ссылка=Номенклатура.Ссылка |ГДЕ | Номенклатура.АртикулДлинный=&АртикулДлинный"; Запрос.УстановитьПараметр("АртикулДлинный", ТекущаяСтрока.Артикул) Результат = Запрос.Выполнить(); ВыборкаДетальнойЗаписи = Результат.Выбрать(); СписокВыбора = Новый СписокЗначений; Пока ВыборкаДетальнойЗаписи.Следующий() Цикл СтрокаСписка = СписокВыбора.Добавить(); СтрокаСписка.Представление = ВыборкаДетальнойЗаписи.Размер; СтрокаСписка.Значение = ВыборкаДетальнойЗаписи.Размер; КонецЦикла; Элемент.СписокВыбора = СписокВыбора; КонецПроцедуры
Добавим еще одну процедуру ПриИзменении Размера
Процедура ОсновнаяФормаТаблицаРазмерПриИзменении(Элемент) Попытка ТекущаяСтрока = ЭтаФорма.ЭлементыФормы. ОсновнаяФормаТаблица.ТекущаяСтрока; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.НоменклатураКАКНоменклатура |ГДЕ | Номенклатура.АртикулДлинный=&АртикулДлинный | ИНоменклатура.РазмерныйРяд.Размер=&Размер"; Запрос.УстановитьПараметр("АртикулДлинный", ТекущаяСтрока.Артикул); Запрос.УстановитьПараметр("Размер", число(ТекущаяСтрока.Размер)); Результат = Запрос.Выполнить(); ВыборкаДетальнойЗаписи = Результат.Выбрать(); Если ВыборкаДетальнойЗаписи.Следующий() Тогда ТекущаяСтрока.Номенклатура = ВыборкаДетальнойЗаписи.Ссылка; ТекущаяСтрока.Количество = 1; КонецЕсли; // Заполним табличную часть состав ЗаполнитьТабличнуюЧастьСостав(); Если ЗначениеЗаполнено(ВыборкаДетальнойЗаписи.Ссылка.ОсновноеИзображение) Тогда Картинка = ВыборкаДетальнойЗаписи.Ссылка.ОсновноеИзображение.Хранилище.Получить(); Иначе Картинка = Новый Картинка; КонецЕсли; ЭлементыФормы.ОсновноеИзображение.Картинка= картинка; Исключение Сообщить("Артикул ненайден"); КонецПопытки; КонецПроцедуры
//Процедура Заполнения табличной части с Составом Номенклатуры Процедура ЗаполнитьТабличнуюЧастьСостав() Попытка ЭтотОбъект.НоменклатураСостав.Очистить(); ТекущаяСтрока= ЭтаФорма.ЭлементыФормы. ОсновнаяФормаТаблица.ТекущаяСтрока; ЕслиТекущаяСтрока.Артикул> "" Тогда Запрос= Новый Запрос;Запрос.Текст= "ВЫБРАТЬ | НоменклатураСостав.КаменьКАККамень, | НоменклатураСостав.МассаКАКМасса, | НоменклатураСостав.ЧистотаКАКЧистота, | НоменклатураСостав.КоличествоКАККоличество, | НоменклатураСостав.Рассев.НаименованиеКАКРассев, | Номенклатура.АртикулДлинный, | Номенклатура.СсылкаКАКНоменклатура |ИЗ | Справочник.Номенклатура.СоставКАКНоменклатураСостав | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураКАКНоменклатура | ПО НоменклатураСостав.Ссылка=Номенклатура.Ссылка |ГДЕ | Номенклатура.Родитель.Код=&Код | ИНоменклатура.АртикулДлинный=&АртикулДлинный | ИНоменклатура.РазмерныйРяд.Размер=&Размер"; Запрос.УстановитьПараметр("АртикулДлинный", ТекущаяСтрока.Артикул); Запрос.УстановитьПараметр("Размер", Число(ТекущаяСтрока.Размер)); Запрос.УстановитьПараметр("Код", "000000004"); // параметр родителя установлен такой специально для данного предприятия //для которого делал обработку, Папка для заказов где //находится специальная номенклатура, по которой делается заказ т.е. эталонРезультат= Запрос.Выполнить(); ВыборкаДетальнойЗаписи= Результат.Выбрать(); Пока ВыборкаДетальнойЗаписи.Следующий() Цикл НоваяСтрока= НоменклатураСостав.Добавить(); НоваяСтрока.Номенклатура= ВыборкаДетальнойЗаписи.Номенклатура; НоваяСтрока.Камень= ВыборкаДетальнойЗаписи.Камень; НоваяСтрока.Количество= ВыборкаДетальнойЗаписи.Количество; НоваяСтрока.Масса= ВыборкаДетальнойЗаписи.Масса; НоваяСтрока.Чистота= ВыборкаДетальнойЗаписи.Чистота; НоваяСтрока.Рассев= ВыборкаДетальнойЗаписи.Рассев; НоваяСтрока.Размер= ТекущаяСтрока.Размер;КонецЦикла; КонецЕсли; ИсключениеКонецПопытки; КонецПроцедуры
Посмотрим что получилось:
Теперь добавим две страницы на форму: Таблица и Настройка
На странице Настройка добавим две кнопки выбрать файл и загрузить, а также поле надписи (сюда запишем путь к файлу) и индикатор загрузки.
Теперь в нашей конфигурации добавим непериодический независимый регистр сведений. В него мы считаем и запишем из Excelтаблицу с ценой за карат по рассеву и характеристике.
// Сохраняем путь к файлу загрузки документа Excel Процедура ОткрытьНажатие(Элемент) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытия= Новый ДиалогВыбораФайла(Режим); ДиалогОткрытия.ПолноеИмяФайла= ""; ДиалогОткрытия.МножественныйВыбор= Ложь; ДиалогОткрытия.Заголовок= "Выберите файл"; Если ДиалогОткрытия.Выбрать() Тогда ПутьКФайлу= ДиалогОткрытия.ПолноеИмяФайла; КонецЕсли;
КонецПроцедуры
На странице настройка по кнопке выполнить нажатие вставим процедуру
По кнопке загрузить будем загружать данные в регистр
// Заполнение регистра сведений из файла ПроцедураЗагрузитьНажатие(Элемент) БезОшибок= Истина; Попытка Книга = ПолучитьCOMОбъект(ПутьКФайлу); Исключение Сообщить(ОписаниеОшибки()); БезОшибок= Ложь; КонецПопытки; Если БезОшибокТогда Лист=Книга.WorkSheets(1); ВсегоСтрок=Лист.Cells(1,1).SpecialCells(11).Row; ЭлементыФормы.Индикатор1.МаксимальноеЗначение = (ВсегоСтрок-2)*5; ШагЗагрузки= 1; для i = 3 по ВсегоСтрок Цикл Для j = 3по 7 Цикл МенеджерЗаписи= РегистрыСведений.АзиатскаяСхемаРасчетаЦеныЗаИзделие.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Рассев= Лист.Cells(i,1).Value; МенеджерЗаписи.Диаметр= Лист.Cells(i,2).Value; МенеджерЗаписи.Характеристика= Лист.Cells(2,j).Value; МенеджерЗаписи.СтоимостьЗаКарат= Лист.Cells(i,j).Value; МенеджерЗаписи.Записать(); Индикатор1 = Индикатор1+ШагЗагрузки; КонецЦикла; КонецЦикла;
КонецЕсли; КонецПроцедуры
Таблица не меняется поэтому зададим руками границы циклов.
Теперь на странице таблица будем выводит данные из регистра сведений. Действие формы при смене страницы добавим следующий код
Процедура ПриСменеСтраницы(Элемент, ТекущаяСтраница) ТабличноеПоле2.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | АзиатскаяСхемаРасчетаЦеныЗаИзделие.Рассев, | АзиатскаяСхемаРасчетаЦеныЗаИзделие.Диаметр, | АзиатскаяСхемаРасчетаЦеныЗаИзделие.Характеристика, | АзиатскаяСхемаРас
четаЦеныЗаИзделие.СтоимостьЗаКарат |ИЗ | РегистрСведений.АзиатскаяСхемаРасчетаЦеныЗаИзделие КАК АзиатскаяСхемаРасчетаЦеныЗаИзделие"; Результат = Запрос.Выполнить(); ВыборкаДетальнойЗаписи = Результат.Выбрать(); ТаблицаЗначений = Новый ТаблицаЗначений; ТаблицаЗначений.Колонки.Добавить("Рассев"); ТаблицаЗначений.Колонки.Добавить("Диаметр"); ТаблицаЗначений.Колонки.Добавить("Характеристика3_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика5_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика6_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика4_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика4_5"); Пока ВыборкаДетальнойЗаписи.Следующий() Цикл НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.Рассев = ВыборкаДетальнойЗаписи.Рассев; НоваяСтрока.Д
иаметр = ВыборкаДетальнойЗаписи.Диаметр; Если ВыборкаДетальнойЗаписи.Характеристика = "34" Тогда НоваяСтрока.Характеристика3_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика = "54" Тогда НоваяСтрока.Характеристика5_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика = "64" Тогда НоваяСтрока.Характеристика6_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕс
ли; Если ВыборкаДетальнойЗаписи.Характеристика = "44" Тогда НоваяСтрока.Характеристика4_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика = "45" Тогда НоваяСтрока.Характеристика4_5 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; КонецЦикла; ТаблицаЗначений.Свернуть("Рассев,Диаметр", "Характеристика3_4,Характеристика5_4,Характеристика6_4,Характеристика4_4,Характеристика4_5"); Для Каждого Элемента из ТаблицаЗначений Цикл НоваяСтрока = ТабличноеПоле2.Добавить(); НоваяСтрока.Рассев = Элемента.Рассев; НоваяСтрока.Диаметр = Элемента.Диаметр; НоваяСтрока.Характеристика3_4 = Элемента.Характеристика3_4; НоваяСтрока.Характеристика5_4 = Элемента.Характеристика5_4; НоваяСтрока.Характеристика6_4 = Элемента.Характеристика6_4; НоваяСтрока.Характеристика4_4 = Элемента.Характеристика4_4; НоваяСтрока.Характеристика4_5 = Элемента.Характеристика4_5; КонецЦикла; КонецПроцедуры
Так как у изделия может быть много камней сделаем форму, в которой будут выводится камни и там будем указывать его характеристику. Форму будем вызывать при изменении Характеристики.
При выборе характеристики:
Процедура ОсновнаяФормаТаблицаХарактеристикаНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбораХарактеристики = ЭтотОбъект.ПолучитьФорму("ФормаВыбораХарактеристики"); ФормаВыбораХарактеристики.Открыть(); ВыборХарактеристики.Очистить(); Для каждого элемента из НоменклатураСостав Цикл НоваяСтрока = ВыборХарактеристики.Добавить(); НоваяСтрока.Номенклатура = элемента.Номенклатура; НоваяСтрока.Камень = Элемента.Камень; НоваяСтрока.Рассев = Элемента.Рассев; НоваяСтрока.Размер = элемента.Размер; Для каждого значение из ТаблицаЗначенийДанных цикл Если элемента.Номенклатура = значение.номенклатура И элемента.Рассев = значение.Рассев и элемента.Размер = значение.Размер тогда НоваяСтрока.Характеристика = значение.Характеристика; КонецЕсли; КонецЦикла; конецЦикла; КонецПроцедуры
//Создание Таблицы Значений Данных ПроцедураСозданиеТаблицыЗначенийДанных(); ТаблицаЗначенийДанных.Колонки.Добавить("Номенклатура"); ТаблицаЗначенийДанных.Колонки.Добавить("Рассев"); ТаблицаЗначенийДанных.Колонки.Добавить("Характеристика"); ТаблицаЗначенийДанных.Колонки.Добавить("Размер"); КонецПроцедуры // Заполнение Таблицы Значений для номенклатуры чтобы знать рассев и характеристику Процедура ВыборХарактеристикиПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) Если ТаблицаЗначенийДанныхСоздана= Ложь Тогда СозданиеТаблицыЗначенийДанных(); ТаблицаЗначенийДанныхСоздана= Истина; КонецЕсли; ЭлементУжеЕсть= Ложь; ТекущаяСтрока= ЭтаФорма.ЭлементыФормы.ВыборХарактеристики.ТекущаяСтрока; Характеристика = ТекущаяСтрока.Характеристика; i = 0; Для каждого Значения из ТаблицаЗначенийДанных Цикл Если Значения.Номенклатура= ТекущаяСтрока.Номенклатура И Значения.Рассев= Строка(ТекущаяСтрока.Рассев) и Значения.Размер= ТекущаяСтрока.размер Тогда ЭлементУжеЕсть= Истина; КонецЕсли; КонецЦикла; Если ЭлементУжеЕсть= Ложь Тогда НоваяСтрока= ТаблицаЗначенийДанных.Добавить(); НоваяСтрока.номенклатура= ТекущаяСтрока.Номенклатура; НоваяСтрока.Рассев= ТекущаяСтрока.Рассев; НоваяСтрока.Характеристика= ТекущаяСтрока.Характеристика; НоваяСтрока.Размер= ТекущаяСтрока.Размер; Иначе Если Вопрос("Заменить значение?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда Иначе i = 0; Для каждого Значения из ТаблицаЗначенийДанных Цикл Если Значения.номенклатура= ТекущаяСтрока.НоменклатураиЗначения.Размер= ТекущаяСтрока.размер тогда ТаблицаЗначенийДанных.Удалить(i); КонецЕсли; i = i+1; КонецЦикла; НоваяСтрока= ТаблицаЗначенийДанных.Добавить(); НоваяСтрока.номенклатура= ТекущаяСтрока.Номенклатура; НоваяСтрока.Рассев= ТекущаяСтрока.Рассев; НоваяСтрока.Характеристика= ТекущаяСтрока.Характеристика; НоваяСтрока.Размер= ТекущаяСтрока.Размер; КонецЕсли; КонецЕсли; КонецПроцедуры // Заполним текстовое поле характеристики на основной форме ПроцедураПриЗакрытии() для каждого Элемента из ВыборХарактеристики цикл для каждого Значения из ОсновнаяФормаТаблица цикл Если Элемента.Номенклатура= Значения.НоменклатураиЭлемента.Размер= Значения.РазмертогдаЗначения.Характеристика= ""; КонецЕсли; КонецЦикла; КонецЦикла; для каждого Элемента из ВыборХарактеристики цикл для каждого Значения из ОсновнаяФормаТаблица цикл Если Элемента.Номенклатура= Значения.НоменклатураиЭлемента.Характеристика<> "" и Элемента.Размер= Значения.РазмертогдаЕсли Элемента.Камень= "Бриллиант" Тогда Значения.Характеристика= Значения.Характеристика+ Строка(Элемента.НомерСтроки)+". бр."+""+Строка(Элемента.Характеристика) + Символы.ПС; Иначе Сообщить("Подсчет цены ведется только для брилиантов"); КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры
Сделаем еще одну форму для массового выбора характеристики по номенклатуре:
Процедура ВыбратьНажатие(Элемент) ФормаОткрыть("ФормаОбщегоВыбора"); КонецПроцедуры //А в модуле объекта //Закрытие ФормыПроцедураФормаЗакрыть(Форма)Экспорт ФормаЗакрыть= ЭтотОбъект.ПолучитьФорму(Форма); ФормаЗакрыть.Закрыть(); КонецПроцедуры // Открытие формы ПроцедураФорма Открыть(Форма)Экспорт Форма= ЭтотОбъект.ПолучитьФорму(Форма); Форма.Открыть(); КонецПроцедуры
И на основной форме кнопку
На форме добавим текстовое поле туда будем писать характеристику, кнопку по которой будут заполняться характеристики и табличную часть. ТЧ с полями Флажок, №, Артикул, Номенклатура и характеристика. Данные брать на основании табличной части основной формы, кроме флажка и характеристики.
// МассовояустановкахарактеристикиПроцедураУстановитьХарактеристикуНажатие(Элемент) Если ТаблицаЗначенийДанныхСоздана= Ложь ТогдаСозданиеТаблицыЗначенийДанных(); ТаблицаЗначенийДанныхСоздана= Истина; КонецЕсли; i= 0; Характеристика = ""; Для каждого элемента из ОсновнаяФормаТаблица Цикл Если элемента.Флажек Тогда Для каждого Строка из ТаблицаЗначенийДанных Цикл Если элемента.Номенклатура= строка.Номенклатураи элемента.Размер= строка.размер тогда ТаблицаЗначенийДанных.Удалить(i); КонецЕсли; i = i + 1; КонецЦикла; КонецЕсли; КонецЦикла; Для каждого элемента из ОсновнаяФормаТаблица Цикл Если элемента.ФлажекТогда Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | НоменклатураСостав.КаменьКАККамень, | НоменклатураСостав.МассаКАКМасса, | НоменклатураСостав.ЧистотаКАКЧистота, | НоменклатураСостав.КоличествоКАККоличество, | НоменклатураСостав.Рассев.НаименованиеКАКРассев, | Номенклатура.АртикулДлинный, | Номенклатура.СсылкакакНоменклатура |ИЗ | Справочник.Номенклатура.СоставКАКНоменклатураСостав | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураКАК Номенклатура | ПО НоменклатураСостав.Ссылка=Номенклатура.Ссылка |ГДЕ | Номенклатура.АртикулДлинный=&АртикулДлинный"; Запрос.УстановитьПараметр("АртикулДлинный", элемента.Артикул); Результат = Запрос.Выполнить(); ВыборкаДетальнойЗаписи= Результат.Выбрать(); i = 1; Пока ВыборкаДетальнойЗаписи.Следующий() Цикл НоваяСтрока= ТаблицаЗначенийДанных.Добавить(); НоваяСтрока.номенклатура= элемента.Номенклатура; НоваяСтрока.Рассев = ВыборкаДетальнойЗаписи.Рассев; НоваяСтрока.Характеристика = ЭтаФорма.ПолеВводаХарактеристика; НоваяСтрока.Размер = элемента.Размер; Если строка(ВыборкаДетальнойЗаписи.Камень) = "Бриллиант" Тогда Характеристика = Характеристика + Строка(i)+".бр."+""+Строка(ЭтаФорма.ПолеВводаХарактеристика) + Символы.ПС; элемента.Характеристика= Характеристика; Иначе Сообщить("Подсчет цены ведется только длябрилиантов"); КонецЕсли; i= i + 1; КонецЦикла; КонецЕсли; КонецЦикла; КонецПроцедуры //Создание Таблицы Значений Данных Процедура СозданиеТаблицыЗначенийДанных(); ТаблицаЗначенийДанных.Колонки.Добавить("Номенклатура"); ТаблицаЗначенийДанных.Колонки.Добавить("Рассев"); ТаблицаЗначенийДанных.Колонки.Добавить("Характеристика"); ТаблицаЗначенийДанных.Колонки.Добавить("Размер"); КонецПроцедуры
Для того, чтобы в табличной части состав номенклатуры при изменении строки менялись данные напишем процедуру для табличного поля. При активации строки.
// Загружаем данные из табличной части Состав в Справочнике нопенклатурывТабЗначенийНоменклатураСостав Процедура ОсновнаяФормаТаблицаПриАктивизацииСтроки(Элемент) ЭтотОбъект.ВыборХарактеристики.Очистить(); ЗаполнитьТабличнуюЧастьСостав(); Для каждого Элемента из ЭтотОбъект.НоменклатураСостав цикл НоваяСтрока= ВыборХарактеристики.Добавить(); НоваяСтрока.Номенклатура= Элемента.Номенклатура; НоваяСтрока.Камень= Элемента.Камень; НоваяСтрока.Рассев= Элемента.Рассев; номенклатура= Элемента.Номенклатура; КонецЦикла; попытка ЕслиЗначениеЗаполнено(Номенклатура.ОсновноеИзображение) Тогда Картинка = Номенклатура.ОсновноеИзображение.Хранилище.Получить(); Иначе Картинка = Новый Картинка;КонецЕсли;ЭлементыФормы.ОсновноеИзображение.Картинка= картинка; исключение КонецПопытки; КонецПроцедуры
//Получение изделий из таблицы значений ФункцияПолучитьИзделие() Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | Номенклатура.МассаИзделия, | Номенклатура.СсылкаКАК Номенклатура, | Номенклатура.Состав.( | Ссылка, | НомерСтроки, | Камень, | Количество, | Масса, | Чистота, | Огранка, | Рассев, | ОтпускнаяЦена, | ЦветКамня, | КолГраней | ) КАК Состав, | Номенклатура.АртикулДлинныйКАК Артикул, | НоменклатураРазмерныйРяд.Размер |ИЗ | Справочник.Номенклатура.РазмерныйРядКАК НоменклатураРазмерныйРяд | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураКАК Номенклатура | ПО НоменклатураРазмерныйРяд.Ссылка= Номенклатура.Ссылка |ГДЕ | Номенклатура.АртикулДлинныйВ(&АртикулДлинный)"; Запрос.УстановитьПараметр("АртикулДлинный", ОсновнаяФормаТаблица.ВыгрузитьКолонку("Артикул")); ВыборкаДетальнойЗаписи= Запрос.Выполнить().Выгрузить(); Возврат ВыборкаДетальнойЗаписи; КонецФункции // Считаем цену изделия согласно азиатской схемы ПроцедураПодсчитатьЦенуНажатие(Элемент) ТаблицаИзделий= ПолучитьИзделие(); РассевНеНайден= Ложь; для каждого элемента из ОсновнаяФормаТаблица цикл ЦенаКамень= 0; ЦенаЗаРаботу= 350; для каждого СтрокаТИ из ТаблицаИзделий цикл Если СтрокаТИ.артикул = элемента.артикул Тогда Если СтрокаТИ.Размер= Число(элемента.Размер) Тогда СтрокаТаблицыЗначений= СтрокаТИ; КонецЕсли; КонецЕсли; КонецЦикла; Попытка ЦенаЗолото= ((СтоимостьЗолота+СтоимостьЗолота*0.20)+Число(ЦенаЗаРаботу))*Число(СтрокаТаблицыЗначений.МассаИзделия); Исключение Сообщить("Данные по артикулу не найдены"); КонецПопытки; для каждого строка из СтрокаТаблицыЗначений.Состав Цикл Для каждого Значения из ТаблицаЗначенийДанных Цикл Если Значения.Номенклатура= элемента.Номенклатура Тогда Если Значения.Рассев= Строка(строка.Рассев) Тогда Если Элемента.Размер= Значения.Размер Тогда Характеристика = Значения.Характеристика; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Если РассевНеНайден= Ложь Тогда СтоимостьЗаКарат= ПоискСтоимостиИзделия(строка.Рассев, Характеристика ); Если СтоимостьЗаКарат= Неопределено Тогда Сообщить("Рассев не найден "+элемента.Номенклатура+" у "+строка.камень); Элемента.Цена= 0; Элемента.Сумма= 0; РассевНеНайден= Истина; продолжить; Иначе КаратныйВесИзделия= Строка.Масса; КоличествоВставок= Строка.Количество; Попытка ЦенаКамень= ЦенаКамень+ СтоимостьЗаКарат*КаратныйВесИзделия*КурсРубля+0.5*КоличествоВставок*КурсРубля; Элемента.Цена= ЦенаЗолото+ЦенаКамень; Элемента.Сумма= Элемента.Цена* Элемента.Количество; Исключение Сообщить("Установите характеристику."); Элемента.Цена= 0; Элемента.Сумма= 0; КонецПопыткиКонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедурыФункцияПоискСтоимостиИзделия(Размер,Характеристика) Возврат Поиск(Размер,Характеристика); КонецФункции //Поиск Чистота - Характеристика показатель поиска ФункцияПоиск(Рассев,Характеристика) ТаблицаЗначений= ЗаполнитьЗначенияТаблицы(); Для каждого Элемента из ТаблицаЗначений Цикл Если Строка(Рассев) = Элемента.Рассев Тогда Если Характеристика = "34" ИЛИ Характеристика = "3/4" Тогда Возврат Элемента.Характеристика3_4; ИначеЕслиХарактеристика = "54" ИЛИ Характеристика = "5/4" Тогда Возврат Элемента.Характеристика5_4; ИначеЕсли Характеристика = "64" ИЛИ Характеристика = "6/4" Тогда Возврат Элемента.Характеристика6_4 ; ИначеЕслиХарактеристика = "44" ИЛИ Характеристика = "4/4" Тогда Возврат Элемента.Характеристика4_4 ; ИначеЕслиХарактеристика = "45" ИЛИ Характеристика = "4/5" Тогда Возврат Элемента.Характеристика4_5; Иначе КонецЕсли; КонецЕсли; КонецЦикла; КонецФункции // Заполнение Таблицы Азиатской схемы расчета цены Функция ЗаполнитьЗначенияТаблицы() ТабличноеПоле2.Очистить(); Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | АзиатскаяСхемаРасчетаЦеныЗаИзделие.Рассев, | АзиатскаяСхемаРасчетаЦеныЗаИзделие.Диаметр, | АзиатскаяСхемаРасчетаЦеныЗаИзделие.Характеристика, | АзиатскаяСхемаРасчетаЦеныЗаИзделие.СтоимостьЗаКарат |ИЗ | РегистрСведений.АзиатскаяСхемаРасчетаЦеныЗаИзделиеКАК АзиатскаяСхемаРасчетаЦеныЗаИзделие"; Результат = Запрос.Выполнить(); ВыборкаДетальнойЗаписи= Результат.Выбрать(); ТаблицаЗначений= Новый ТаблицаЗначений; ТаблицаЗначений.Колонки.Добавить("Рассев"); ТаблицаЗначений.Колонки.Добавить("Диаметр"); ТаблицаЗначений.Колонки.Добавить("Характеристика3_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика5_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика6_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика4_4"); ТаблицаЗначений.Колонки.Добавить("Характеристика4_5"); Пока ВыборкаДетальнойЗаписи.Следующий() Цикл НоваяСтрока= ТаблицаЗначений.Добавить(); НоваяСтрока.Рассев= ВыборкаДетальнойЗаписи.Рассев; НоваяСтрока.Диаметр= ВыборкаДетальнойЗаписи.Диаметр; Если ВыборкаДетальнойЗаписи.Характеристика= "34" Тогда НоваяСтрока.Характеристика3_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика= "54" Тогда НоваяСтрока.Характеристика5_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика= "64" Тогда НоваяСтрока.Характеристика6_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика= "44" Тогда НоваяСтрока.Характеристика4_4 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; Если ВыборкаДетальнойЗаписи.Характеристика= "45" Тогда НоваяСтрока.Характеристика4_5 = ВыборкаДетальнойЗаписи.СтоимостьЗаКарат; КонецЕсли; КонецЦикла; ТаблицаЗначений.Свернуть("Рассев,Диаметр", "Характеристика3_4,Характеристика5_4,Характеристика6_4,Характеристика4_4,Характеристика4_5"); Для Каждого Элемента из ТаблицаЗначений Цикл НоваяСтрока= ТабличноеПоле2.Добавить(); НоваяСтрока.Рассев= Элемента.Рассев; НоваяСтрока.Диаметр= Элемента.Диаметр; НоваяСтрока.Характеристика3_4 = Элемента.Характеристика3_4; НоваяСтрока.Характеристика5_4 = Элемента.Характеристика5_4; НоваяСтрока.Характеристика6_4 = Элемента.Характеристика6_4; НоваяСтрока.Характеристика4_4 = Элемента.Характеристика4_4; НоваяСтрока.Характеристика4_5 = Элемента.Характеристика4_5; КонецЦикла; Возврат ТаблицаЗначений; КонецФункции