//Реализуем алгоритм в модуле документа РеализацияТоваров//
<
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЭтотОбъект.ЭтоНовый() Тогда
Контрагент = ДанныеЗаполнения;
Товары.Загрузить(ОбщиеНастройкиСервер.ПолучитьДанныеПоследнегоДокумента(Ссылка,Контрагент));
КонецЕсли;
КонецПроцедуры
<
//Реализуем универсальный алгоритм получения последнего документа (для поступления и реализации) в общем модуле в Функции
ПолучитьДанныеПоследнегоДокумента.
<
Функция ПолучитьДанныеПоследнегоДокумента(ДокСсылка,Контрагент) Экспорт
Если ТипЗнч(ДокСсылка) = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
Документ = "ПоступлениеТоваров";
ИначеЕсли ТипЗнч(ДокСсылка) = Тип("ДокументСсылка.РеализацияТоваров") Тогда
Документ = "РеализацияТоваров";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| "+Документ+".Ссылка
|ПОМЕСТИТЬ Документы
|ИЗ
| Документ."+Документ+" КАК "+Документ+"
|ГДЕ
| "+Документ+".Проведен
|
|УПОРЯДОЧИТЬ ПО
| "+Документ+".Дата УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| "+Документ+"Товары.НомерСтроки,
| "+Документ+"Товары.Номенклатура,
| "+Документ+"Товары.Цена,
| "+Документ+"Товары.Количество,
| "+Документ+"Товары.Сумма,
| "+Документ+"Товары.ЕдиницаИзмерения,
| "+Документ+"Товары.Качество,
| "+Документ+"Товары.Ссылка
|ИЗ
| Документ."+Документ+".Товары КАК "+Документ+"Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документы КАК Документы
| ПО Документы.Ссылка = "+Документ+"Товары.Ссылка
|ГДЕ
| "+Документ+"Товары.Ссылка.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| "+Документ+"Товары.Ссылка.Дата УБЫВ";
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Если ТипЗнч(Ссылка[0].Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Вставить содержимое обработчика.
Если ТипЗнч(ДанныеЗаполнения)=Тип("СправочникСсылка.Контрагенты") Тогда
Если НЕ ДанныеЗаполнения.ЭтоГруппа Тогда
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Проведен
| И ПоступлениеТоваров.Поставщик = &Поставщик
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.МоментВремени УБЫВ";
Запрос.УстановитьПараметр("Поставщик", ДанныеЗаполнения);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Поставщик = ДанныеЗаполнения;
Для Каждого ТекСтрокаТовары Из Выборка.Ссылка.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Брак = ТекСтрокаТовары.Брак;
НоваяСтрока.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецЕсли;
4. Добавлен документ “РеализацияТоваров” с реквизитами “Контрагент”, “КонтактноеЛицо” (связано с рекв. “Контрагент”), табл. часть аналогичная документу “ПоступлениеТоваров”. Модуль объекта и модуль формы практически аналогичны док. “ПоступлениеТоваров”.
С помощью конструктора сформирована печатная форма “ТОРГ-12”
Модуль команды:
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Все материалы этого сайта являются составной частью Базового / Продвинутого курсов по программированию - и являются объектами авторского и имущественного права.
Любое их распространение без письменного согласования с авторами запрещено.
Домашнее задание № 7 Блок 2.
Созаем структуру конфигурации:
Подсистемы: Блок2
Справочники: Контрагенты, КонтактныеЛица, СтепениБракаТоваров , ФизическиеЛица
Документы: ПоступлениеТоваров, РеализацияТоваров, КонтактСКлиентами
Перечисления: ВидыКонтактовСКонтрагентами
Для документов : ПоступлениеТоваров, РеализацияТоваров на владке Ввод на основании добавляем Справочник Контрагенты.
//Реализуем алгоритм в модуле документа ПоступлениеТоваров//
<
Если ЭтотОбъект.ЭтоНовый() Тогда
Контрагент = ДанныеЗаполнения;
Товары.Загрузить(ОбщиеНастройкиСервер.ПолучитьДанныеПоследнегоДокумента(Ссылка,Контрагент));
КонецЕсли;
КонецПроцедуры
<
//Реализуем алгоритм в модуле ФормыДокумента – ПоступлениеТоваров//
//И в модуле Формы Документа – РеализацияТоваров
<
Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Элементы.Товары.ТекущиеДанные.ЕдиницаИзмерения = ПолучитьБазовуюЕдиницуИзмерения(ВыбранноеЗначение);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьБазовуюЕдиницуИзмерения(ВыбранноеЗначение)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КлассификаторЕдиницИзмерения.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлассификаторЕдиницИзмерения КАК КлассификаторЕдиницИзмерения
| ПО Номенклатура.БазоваяЕдиницаИзмерения = КлассификаторЕдиницИзмерения.Ссылка
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",ВыбранноеЗначение);
Результат = Запрос.Выполнить();
Если НЕ Результат = Неопределено Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
КонецФункции // ПолучитьБазовуюЕдиницуИзмерения()
<
//Реализуем алгоритм в модуле документа РеализацияТоваров//
<
Если ЭтотОбъект.ЭтоНовый() Тогда
Контрагент = ДанныеЗаполнения;
Товары.Загрузить(ОбщиеНастройкиСервер.ПолучитьДанныеПоследнегоДокумента(Ссылка,Контрагент));
КонецЕсли;
КонецПроцедуры
<
//Реализуем универсальный алгоритм получения последнего документа (для поступления и реализации) в общем модуле в Функции
ПолучитьДанныеПоследнегоДокумента.
<
Если ТипЗнч(ДокСсылка) = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
Документ = "ПоступлениеТоваров";
ИначеЕсли ТипЗнч(ДокСсылка) = Тип("ДокументСсылка.РеализацияТоваров") Тогда
Документ = "РеализацияТоваров";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| "+Документ+".Ссылка
|ПОМЕСТИТЬ Документы
|ИЗ
| Документ."+Документ+" КАК "+Документ+"
|ГДЕ
| "+Документ+".Проведен
|
|УПОРЯДОЧИТЬ ПО
| "+Документ+".Дата УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| "+Документ+"Товары.НомерСтроки,
| "+Документ+"Товары.Номенклатура,
| "+Документ+"Товары.Цена,
| "+Документ+"Товары.Количество,
| "+Документ+"Товары.Сумма,
| "+Документ+"Товары.ЕдиницаИзмерения,
| "+Документ+"Товары.Качество,
| "+Документ+"Товары.Ссылка
|ИЗ
| Документ."+Документ+".Товары КАК "+Документ+"Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документы КАК Документы
| ПО Документы.Ссылка = "+Документ+"Товары.Ссылка
|ГДЕ
| "+Документ+"Товары.Ссылка.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| "+Документ+"Товары.Ссылка.Дата УБЫВ";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Результат = Запрос.Выполнить();
Если НЕ Результат = Неопределено Тогда
Возврат Результат.Выгрузить();
КонецЕсли;
КонецФункции // ПолучитьДанныеПоследнегоДокумента()
<
//Реализуем алгоритм печати документа Реализация в модуле менеджера.
<
Макет = Документы.РеализацияТоваров.ПолучитьМакет("Печать");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваров.Дата,
| РеализацияТоваров.КонтактноеЛицо,
| РеализацияТоваров.Контрагент,
| РеализацияТоваров.Номер,
| РеализацияТоваров.Ответственный,
| РеализацияТоваров.Товары.(
| НомерСтроки,
| Номенклатура,
| ЕдиницаИзмерения,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка В (&Ссылка)";
Запрос.Параметры.Вставить("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьТоварыШапка = Макет.ПолучитьОбласть("ТоварыШапка");
ОбластьТовары = Макет.ПолучитьОбласть("Товары");
Подвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Если ТипЗнч(Ссылка[0].Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
ОбластьЗаголовок.Параметры.ВидДокумента = "ТОГР-12";
ИначеЕсли ТипЗнч(Ссылка[0].Контрагент) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ОбластьЗаголовок.Параметры.ВидДокумента = "Товарный чек";
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьТоварыШапка);
ВыборкаТовары = Выборка.Товары.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень());
КонецЦикла;
Подвал.Параметры.Заполнить(Выборка);
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
Подвал.Параметры.СуммаПрописью = ЧислоПрописью(Запрос.Выполнить().Выгрузить()[0].Товары.Итог("Сумма"),
ФормСтрока,ПарПредмета);
ТабДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
КонецПроцедуры
<
Создадим в документе реализация Макет Печать и Команду Печать с помощью конструктора печати.
Реализуем алгоритм команды Печать
<
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
ТабДок = Новый ТабличныйДокумент;
Печать(ТабДок, ПараметрКоманды);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
//}}
КонецПроцедуры
&НаСервере
Процедура Печать(ТабДок, ПараметрКоманды)
Документы.РеализацияТоваров.Печать(ТабДок, ПараметрКоманды);
КонецПроцедуры
<
1. Спр. Контрагенты добавлен реквизит “ОрганизационнаяФорма” ссылающийся на перечисление “ОрганизационнаяФормаКонтрагентов” (варианты: ФизическоеЛицо, ЮридическоеЛицо)
2. Добавлен спр. “БракТовара”
3. Добавлен документ “ПоступлениеТоваров” с реквизитом “Поставщик” (составной: спр. Контрагенты, спр. Пользователи), табл. частью “Товары” содержащей поля “Номенклатура, ЕдиницаИзмерения, Количество(Число 15,2), Цена(Число 15,2), Сумма(Число 15,2)”. Поле “Сумма” расчетное, недоступно для изменения.
Форма документа:
Процедура ТоварыКоличествоПриИзменении(Элемент)
// Вставить содержимое обработчика.
ОбщегоНазначенияКлиент.РассчитатьСумму(Элементы.Товары.ТекущиеДанные);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
// Вставить содержимое обработчика.
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
ТекущаяСтрока.ЕдиницаИзмерения = ТоварыНоменклатураПриИзмененииНаСервере(ТекущаяСтрока.Номенклатура);
КонецПроцедуры
&НаСервере
Функция ТоварыНоменклатураПриИзмененииНаСервере(Номенклатура)
// Вставить содержимое обработчика.
Возврат Номенклатура.БазоваяЕдиница;
КонецФункции
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
// Вставить содержимое обработчика.
ОбщегоНазначенияКлиент.РассчитатьСумму(Элементы.Товары.ТекущиеДанные);
КонецПроцедуры
модуль документа:
// Вставить содержимое обработчика.
Если ТипЗнч(ДанныеЗаполнения)=Тип("СправочникСсылка.Контрагенты") Тогда
Если НЕ ДанныеЗаполнения.ЭтоГруппа Тогда
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Проведен
| И ПоступлениеТоваров.Поставщик = &Поставщик
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.МоментВремени УБЫВ";
Запрос.УстановитьПараметр("Поставщик", ДанныеЗаполнения);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Поставщик = ДанныеЗаполнения;
Для Каждого ТекСтрокаТовары Из Выборка.Ссылка.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Брак = ТекСтрокаТовары.Брак;
НоваяСтрока.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецЕсли;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецЕсли;
КонецЕсли;
КонецПроцедуры
4. Добавлен документ “РеализацияТоваров” с реквизитами “Контрагент”, “КонтактноеЛицо” (связано с рекв. “Контрагент”), табл. часть аналогичная документу “ПоступлениеТоваров”. Модуль объекта и модуль формы практически аналогичны док. “ПоступлениеТоваров”.
С помощью конструктора сформирована печатная форма “ТОРГ-12”
Модуль команды:
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
ТабДок = Новый ТабличныйДокумент;
Печать(ТабДок, ПараметрКоманды);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Истина;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
//}}
КонецПроцедуры
&НаСервере
Процедура Печать(ТабДок, ПараметрКоманды)
Документы.РеализацияТоваров.Печать(ТабДок, ПараметрКоманды);
КонецПроцедуры
Модуль менеджера док. “РеализацияТоваров”
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
Макет = Документы.РеализацияТоваров.ПолучитьМакет("Печать");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваров.Дата,
| РеализацияТоваров.КонтактноеЛицо,
| РеализацияТоваров.Контрагент,
| РеализацияТоваров.Номер,
| РеализацияТоваров.Товары.(
| НомерСтроки,
| Номенклатура,
| ЕдиницаИзмерения,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка В (&Ссылка)";
Запрос.Параметры.Вставить("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьТоварыШапка = Макет.ПолучитьОбласть("ТоварыШапка");
ОбластьТовары = Макет.ПолучитьОбласть("Товары");
Подвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьТоварыШапка);
ВыборкаТовары = Выборка.Товары.Выбрать();
СуммаИтого = 0;
Пока ВыборкаТовары.Следующий() Цикл
ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень());
СуммаИтого = СуммаИтого + ВыборкаТовары.Сумма;
КонецЦикла;
Подвал.Параметры.Заполнить(Выборка);
Подвал.Параметры.Пользователь = ПараметрыСеанса.ТекущийПользователь;
Подвал.Параметры.СуммаПрописью = ЧислоПрописью(СуммаИтого, "ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
ТабДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
//}}
КонецПроцедуры