Базовый курс. Занятие №7
Начинаем второй блок базового курса и представляем первое занятие по нему.
Необходимо изучить следующие главы.
Глава 1. Документы
Глава 2. Ввод на основании
Глава 3. Создание печатных форм
Глава 4. Настройка форм документов.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Задание сделал, ничего сложного. По-хорошему, надо бы сделать так, чтобы вообще все люди хранились в физлицах, а сотрудники, контактные лица и, если это надо, контрагенты (через ЮрФизЛицо) ссылались на этот справочник, но в задании такое явно не было указано, поэтому пока оставил как есть, посмотрю решение, потом переделаю.
Единицы для табличных частей документов поступления и реализации получаю через общую функцию запросом по владельцу, наименованию единицы и коэффициенту равному единице.
При вводе на основании делаю запрос к документам по контрагенту и проведено = истина, и выбираю первый 1 при сортировке по моменту времени по убыванию. Табличные части документов при вводе на основании заполняю через Выгрузить/Загрузить.
Задание выполнил.
Добавил справочники “Сотрудники” и “Степень брака”.
Поступление товаров реализовал через один вид документа, реквизит “Контрагент” сделал составным типом данных.
При выборе номенклатуры в документ, подставляется базовая единица измерения:
<code>
&НаКлиенте
Процедура ТоварыТоварПриИзменении(Элемент)
Элементы.Товары.ТекущиеДанные.Единица = ПолучитьЕдиницу(Элементы.Товары.ТекущиеДанные.Товар);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЕдиницу(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору = &БазоваяЕдиница”;
Запрос.УстановитьПараметр(“БазоваяЕдиница”, Ссылка.БазоваяЕдиница);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Возврат ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
КонецФункции
</code>
При вводе на основании, не смог сделать в одном запросе получение табличной части нужного документа, реализовал по-другому.
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваров.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Контрагент = &Контрагент
| И РеализацияТоваров.Проведен
|
|УПОРЯДОЧИТЬ ПО
| Ссылка УБЫВ
|АВТОУПОРЯДОЧИВАНИЕ”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Товары.Загрузить(ВыборкаДетальныеЗаписи.Ссылка.Товары.Выгрузить());
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</code>
В справочник контрагентов добавил вид контрагента (юр или физ лицо).
Печать документа реализации сделал с помощью конструктора печати.
<code>
ФормСтрока = “Л = ru_RU; ДП = Истина”;
ПарПредмета=”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″;
Подвал.Параметры.ИтогоСумма = ЧислоПрописью(Ссылка[0].Товары.Итог(“Сумма”),ФормСтрока,ПарПредмета);
</code>
Задание выполнил
http://imagepost.ru/images/d/z7/dz7_screen.png
Ушел смотреть решение
Правильная ссылка
http://www,imagepost.ru/images/d/z7/dz7_screen.png
Мы что-то пропустили? Где решение? :))
Точно, уже есть решение, а в ленте почему-то нету.
В какой ленте нет?
Вот здесь https://mg.spec8.ru/category/dbasecourse/basehomeworks/ отображается..
RSS лента https://mg.spec8.ru/category/dbasecourse/feed/
Записи с решениями ДЗ, сессиями мастер-групп не будут доступны в RSS ленте.
Очень жаль, очень удобная штука.
Задание выполнил.
1) Для отражения поступления товаров напрямую от поставщиков создал документ “ПоступлениеТоваровУслуг” с реквизитом “Контрагент”, от подотчетного лица – документ “АвансовыйОтчет”, с реквизитом “ФизЛицо” (тип = СправочникСсылка.ФизическиеЛица).
Реализовал заполнение единицы измерения по умолчанию при выборе номенклатуры в событии “ПриИзменении” реквизита ТЧ “Номенклатура”.
//Модуль формы документа “ПоступлениеТоваровУслуг”
<code>
&НаКлиенте
Процедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Количество = 1;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекДанные = Элементы.Товары.ТекущиеДанные;
СтруктураСтроки = ПреобразоватьСтрокуВСтруктуру(ТекДанные);
ЗаполнитьЗначенияСвойств(СтруктураСтроки, ТекДанные);
ПриИзмененииНоменклатуры(СтруктураСтроки);
ЗаполнитьЗначенияСвойств(ТекДанные, СтруктураСтроки);
КонецПроцедуры
&НаКлиенте
Функция ПреобразоватьСтрокуВСтруктуру(СтрокаТабЧасти)
СтруктураСтроки = Новый Структура();
Для Каждого ТекКолонка Из Элементы.Товары.ПодчиненныеЭлементы Цикл
СтруктураСтроки.Вставить(ТекКолонка.Имя);
КонецЦикла;
Возврат СтруктураСтроки;
КонецФункции
&НаСервере
Процедура ПриИзмененииНоменклатуры(СтрокаТабЧасти)
Если НЕ ЗначениеЗаполнено(СтрокаТабЧасти) Тогда
Возврат;
КонецЕсли;
СтрокаТабЧасти.ЕдиницаИзмерения = Справочники.ЕдиницыИзмеренияНоменклатуры.ПодобратьЕдиницуИзмеренияДляНоменклатурыПоКлассификатору(СтрокаТабЧасти.Номенклатура, СтрокаТабЧасти.Номенклатура.БазоваяЕдиницаИзмерения);
КонецПроцедуры
&НаКлиентеПроцедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) Отказ = Истина; НоваяСтрока = Объект.Товары.Добавить(); НоваяСтрока.Количество = 1; КонецПроцедуры
&НаКлиентеПроцедура ТоварыНоменклатураПриИзменении(Элемент) ТекДанные = Элементы.Товары.ТекущиеДанные; СтруктураСтроки = ПреобразоватьСтрокуВСтруктуру(ТекДанные); ЗаполнитьЗначенияСвойств(СтруктураСтроки, ТекДанные); ПриИзмененииНоменклатуры(СтруктураСтроки); ЗаполнитьЗначенияСвойств(ТекДанные, СтруктураСтроки); КонецПроцедуры
&НаКлиентеФункция ПреобразоватьСтрокуВСтруктуру(СтрокаТабЧасти) СтруктураСтроки = Новый Структура(); Для Каждого ТекКолонка Из Элементы.Товары.ПодчиненныеЭлементы Цикл СтруктураСтроки.Вставить(ТекКолонка.Имя); КонецЦикла; Возврат СтруктураСтроки; КонецФункции
&НаСервереПроцедура ПриИзмененииНоменклатуры(СтрокаТабЧасти) Если НЕ ЗначениеЗаполнено(СтрокаТабЧасти) Тогда Возврат; КонецЕсли; СтрокаТабЧасти.ЕдиницаИзмерения = Справочники.ЕдиницыИзмеренияНоменклатуры.ПодобратьЕдиницуИзмеренияДляНоменклатурыПоКлассификатору(СтрокаТабЧасти.Номенклатура, СтрокаТабЧасти.Номенклатура.БазоваяЕдиницаИзмерения); КонецПроцедуры
</code>
Чтобы передать текущую строку ТЧ на сервер не придумал ничего лучшего, как скопировать в структуру и обратно. Для чего создал отдельную процедуру.
Для подбора ЕдиницыИзмерения для номенклатуры по единице измерения по классификатору создал отдельную процедуру
“ПодобратьЕдиницуИзмеренияДляНоменклатурыПоКлассификатору”
в модуле менеджера справочника “ЕдиницыИзмеренияНоменклатуры”
Модуль формы документа “АвансовыйОтчет” аналогичен приведенному.
2) Для отражении качества поступающего товара добавил в ТЧ документов реквизит “Качество” (тип = СправочникСсылка.Качество)
3) Для отражения факта реализации товаров. Создал документ “РеализацияТоваровУслуг”.
Реквизит КонтактноеЛицо имеет составной тип СправочникСсылка.КонтактныеЛица, СправочникСсылка.КонтактныеЛицаКонтрагентов.
В справоник Контрагенты добавил предопределенный элемент “ФизЛицо”.
Также в документ “РеализацияТоваровУслуг” добавил флаг “ОбращениеФизЛица”.
//Модуль формы документа “РеализацияТоваровУслуг”
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.КонтактноеЛицо = Справочники.КонтрактныеЛицаКонтрагентов.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
ПриИзмененииКонтрагента();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииКонтрагента()
Объект.ОбращениеФизЛица = (Объект.Контрагент = Справочники.Контрагенты.ФизЛицо);
Если Объект.ОбращениеФизЛица
И ТипЗнч(Объект.КонтактноеЛицо) <> Тип(“СправочникСсылка.КонтактныеЛица”) Тогда
Объект.КонтактноеЛицо = Справочники.КонтактныеЛица.ПустаяСсылка();
ИначеЕсли НЕ Объект.ОбращениеФизЛица
И (ТипЗнч(Объект.КонтактноеЛицо) = Тип(“СправочникСсылка.КонтактныеЛица”)
ИЛИ Объект.КонтактноеЛицо.Владелец <> Объект.Контрагент) Тогда
Объект.КонтактноеЛицо = Справочники.КонтрактныеЛицаКонтрагентов.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КонтактноеЛицоПриИзменении(Элемент)
ПриИзмененииКонтактногоЛица();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииКонтактногоЛица()
Объект.Контрагент = ?(Объект.ОбращениеФизЛица ИЛИ Объект.КонтактноеЛицо.Владелец = Объект.Контрагент, Объект.Контрагент, Объект.КонтактноеЛицо.Владелец);
КонецПроцедуры
&НаКлиенте
Процедура КонтактноеЛицоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = ПолучитьФорму(“Справочник.” + ?(Объект.ОбращениеФизЛица, “КонтактныеЛица”, “КонтрактныеЛицаКонтрагентов”) + “.ФормаВыбора”,, Элемент);
Если НЕ Объект.ОбращениеФизЛица И ЗначениеЗаполнено(Объект.Контрагент) Тогда
ОтборПовладельцу = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
ОтборПовладельцу.ЛевоеЗначение = ФормаВыбора.Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти(“Владелец”).Поле;
ОтборПовладельцу.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПовладельцу.ПравоеЗначение = Объект.Контрагент;
КонецЕсли;
ФормаВыбора.Открыть();
КонецПроцедуры
</code>
4) Для регистрации контактов менеджеров с клиентами добавил документ “Событие”.
5) Обработка заполнения документа “РеализацияТоваровУслуг”
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Проведен
|
|УПОРЯДОЧИТЬ ПО
| РеализацияТоваровУслуг.Дата УБЫВ”;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Для Каждого СтрокаТовары Из Выборка.Ссылка.Товары Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовары);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
6) Печать реализации
//Модуль формы документа “РеализацияТоваровУслуг”
<code>
&НаКлиенте
Процедура Печать(Команда)
Если Объект.Ссылка.Пустая() Тогда
Сообщить(“Необходимо записать документ.”);
Возврат;
КонецЕсли;
ПолучитьПечатнуюФорму(Объект.Ссылка).Показать();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПечатнуюФорму(Ссылка)
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет(“Макет”);
ОбластьШапка = Макет.ПолучитьОбласть(“ОбластьШапка”);
ОбластьШапка.Параметры.НазваниеДокумента = ?(Ссылка.ОбращениеФизЛица, “Товарный чек”, “ТОРГ-12”);
ОбластьШапка.Параметры.Номер = Ссылка.Номер;
ОбластьШапка.Параметры.Дата = Ссылка.Дата;
ОбластьШапка.Параметры.Контрагент = ?(Ссылка.ОбращениеФизЛица, Ссылка.КонтактноеЛицо, Ссылка.Контрагент);
ТабДок.Вывести(ОбластьШапка);
Для Каждого ТекСтрока Из Ссылка.Товары Цикл
ОбластьСтрока = Макет.ПолучитьОбласть(“ОбластьСтрока”);
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ТекСтрока);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
ОбластьПодвал = Макет.ПолучитьОбласть(“ОбластьПодвал”);
ОбластьПодвал.Параметры.Поставщик = Ссылка.Организация;
ОбластьПодвал.Параметры.Покупатель = Ссылка.КонтактноеЛицо;
СуммаДокумента = Ссылка.Товары.Итог(“Сумма”);
ОбластьПодвал.Параметры.СуммаПрописью = ЧислоПрописью(СуммаДокумента, “Л = ru_RU; ДП = Истина”, “рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2”);
ТабДок.Вывести(ОбластьПодвал);
Возврат ТабДок;
КонецФункции
</code>
Чего-то мой комент не отразился. Напишу вкратце снова.
Были созданы необходимые справочники, 3 документа: приход, расход и контакты, модули выкладывать не буду.
Ввод на основании справончиков:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| Поступление.Ссылка КАК Ссылка
|ИЗ
| Документ.Поступление КАК Поступление
|
|УПОРЯДОЧИТЬ ПО
| Поступление.Ссылка.Дата УБЫВ”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ТЗ = ВыборкаДетальныеЗаписи.ссылка.номенклатура.Выгрузить();
Номенклатура.Загрузить(ТЗ);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
В результате все условия задания работают.
1) Добавил справочник «СотрудникиОрганизации», с учетом «ДЗ6.1CdevBase-HWSolution06-part10.avi» Наименование<=>ФИО.
2)Добавил документ ДокПоступления(реквизит Поставщик – или Контрагент или Поставщик), скопировал его в ДокРеализации(добавил КонтактноеЛицо, реквизит Покупатель – или Контрагент или ФизичЛицо)
3)Добавил ДокПоступления.МФ(заполнение ед.изм.)
<code>
&НаКлиенте
Процедура СтрокиНоменклатураПриИзменении(Элемент)
//авто заполнить цену
ТД = Элементы.Строки.ТекущиеДанные;
ТД.Цена = ПолучитьЦену(ТД.Номенклатура);
ТД.ЕдИзмНом = ПолучитьОснЕдИзмНом(ТД.Номенклатура);
ПересчитатьСумму();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦену(Ссылка)
Возврат Ссылка.Цена;
КонецФункции // ПолучитьЦену()
&НаСервереБезКонтекста
Функция ПолучитьОснЕдИзмНом(Ссылка)
СсылкаНаОснЕдИзм=Ссылка.БазоваяЕдиницаИзмерения.Ссылка;
СсылканаНоменклатуру=Ссылка.Ссылка;
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка,
| ЕдиницыИзмеренияНоменклатуры.ЕдИзм.Наименование
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.ЕдИзм.Ссылка = &Ссылка”;
Запрос.УстановитьПараметр(“Владелец”, СсылканаНоменклатуру);
Запрос.УстановитьПараметр(“Ссылка”, СсылкаНаОснЕдИзм);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
КолЗап=ВыборкаДетальныеЗаписи.Количество();
Если КолЗап=1 Тогда
ВыборкаДетальныеЗаписи.Следующий();
Возврат ВыборкаДетальныеЗаписи.Ссылка;
ИначеЕсли КолЗап=0 Тогда
Сообщить(“Для текущей номенклатуры нет записи в Справочнике ЕдИзмНоменклатуры!”);
Возврат Справочники.ЕдиницыИзмеренияНоменклатуры.ПустаяСсылка();
ИначеЕсли КолЗап>1 Тогда
Сообщить(“Для текущей номенклатуры более 1записи в Справочнике ЕдИзмНоменклатуры!”);
Возврат Справочники.ЕдиницыИзмеренияНоменклатуры.ПустаяСсылка();
КонецЕсли;
//Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// // Вставить обработку выборки ВыборкаДетальныеЗаписи
//КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецФункции
</code>
4)Добавил ДокРеализации.МО(у ФизЛица не требовать заполнение КонтактногоЛица)
5) Добавил документ ИсторияКонтактов.
6)Ввод на основании … запрос последнего проведенного с получением ТЧ не получился, но познакомился с консолью запросов. Как выбрать ТЧ понял – так и сделал, буду смотреть решение. ДокПоступления.МО <code> Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда // Заполнение шапки Основание = ДанныеЗаполнения; Поставщик = ДанныеЗаполнения.Ссылка; Дата = наСервере_ВремяНаСервере.ПолучитьВремяНаСервере(); //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ ПЕРВЫЕ 1 | ДокПоступления.Ссылка |ИЗ | Документ.ДокПоступления КАК ДокПоступления |ГДЕ | ДокПоступления.Поставщик = &Поставщик | И ДокПоступления.Проведен | |УПОРЯДОЧИТЬ ПО | ДокПоступления.ВерсияДанных УБЫВ”; Запрос.УстановитьПараметр(“Поставщик”, Поставщик); Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() Тогда ВыборкаДетальныеЗаписи = Результат.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); ТЧстроки = ВыборкаДетальныеЗаписи.Ссылка.Строки.Выгрузить(); Строки.Загрузить(ТЧстроки); //Документы.ДокПоступления.ПолучитьСсылку().Строки.ВыгрузитьКолонки() //ТЧ = ВыборкаДетальныеЗаписи.Ссылка.Строки.ВыгрузитьКолонки(); Иначе Сообщить(“По этому Контрагенту нет документов поставки”); КонецЕсли; КонецЕсли; КонецПроцедуры </code>
Для ДокРеализации все аналогично.
7) В коде Печати после конструктора добавил в запрос «ДокРеализации.Покупатель» и код
<code>
ПокупательОбъект = Выборка.Покупатель.ПолучитьОбъект();
Если ТипЗнч(Выборка.Покупатель)=Тип(“СправочникСсылка.Контрагенты”) Тогда
ОбластьЗаголовок.Параметры.НазваниеДокумента = “Торг-12”;
Шапка.Параметры.НКонтрагент = “Контрагент”;
Шапка.Параметры.Контрагент = ПокупательОбъект.Наименование;
Подвал.Параметры.Покупатель = ПокупательОбъект.Наименование;
Иначе
ОбластьЗаголовок.Параметры.НазваниеДокумента = “Товарный чек”;
Шапка.Параметры.НКонтрагент = “ФИО покупателя”;
Шапка.Параметры.Контрагент = ПокупательОбъект.Наименование;
Подвал.Параметры.Покупатель = ПокупательОбъект.Наименование;
КонецЕсли;
Подвал.Параметры.Пользователь = ИмяПользователя();
</code>
Созданы подсистемы:
Закупка;
Реализация;
РаботаСКонтрагентами.
Созданы перечисления:
КачествоТовара
ТипыКонтактовСКонтрагентами
Созданы справочники:
ФизЛица
Сотрудники
СтепениБрака
Созданы документы:
ПоступлениеТоваров
РеализацияТоваров
КонтактыСКонтрагентом
Настроен ввод на основании элемента справочника «Контрагенты» документов «ПоступлениеТоваров» и «РеализацияТоваров».
Для того чтобы обеспечить выполнения задания, процедуры «ОбработкаЗаполнения» обоих документов выглядят так:
<code>
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
ОбщийМодульСервера.ЗаполнитьТЧПоступленияРеализации(ТипЗнч(ЭтотОбъект), Контрагент, Товары);
КонецЕсли;
</code>
А вот так выглядит часть общего модуля ОбщийМодульСервера, обеспечивающая выполнение этого условия:
<code>
Процедура ЗаполнитьТЧПоступленияРеализации(ТипДок, Контрагент, ТабЧасть) Экспорт
ПоследнийДок = ПолучитьПоследнийДок(ТипДок, Контрагент);
Если ПоследнийДок <> Неопределено Тогда
Объ = ПоследнийДок.ПолучитьОбъект();
ТабЧасть.Загрузить(Объ.Товары.Выгрузить());
КонецЕсли;
КонецПроцедуры
Функция ПолучитьПоследнийДок(ТипДок, Контрагент)
Если ТипДок = Тип(“ДокументОбъект.ПоступлениеТоваров”) Тогда
ТипДокСтрока = “ПоступлениеТоваров”;
ИначеЕсли ТипДок = Тип(“ДокументОбъект.РеализацияТоваров”) Тогда
ТипДокСтрока = “РеализацияТоваров”;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ПоступлениеРеализация.Ссылка,
| ПоступлениеРеализация.Дата КАК Дата
|ИЗ
| Документ.” + ТипДокСтрока + ” КАК ПоступлениеРеализация
|ГДЕ
| ПоступлениеРеализация.Проведен
| И ПоступлениеРеализация.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
</code>
Обеспечена возможность печати документа «РеализацияТоваров».
Задание выполнил.
Созданы дополнительные перечисления: ВидПоступления (поставщик, подотчетное лицо), ЮрФизЛицо, ВидыКонтактов (встреча, звонок, письмо). Так-же созданы справочники: КачествоТовара, ФизическиеЛица.
Для справочника Контрагенты добавлен реквизит ЮрФизЛицо с типом перечисление.
Созданы документы: ПриходнаяНакладная, РасходнаяНакладная, Контакт.
В приходной накладной имеются реквизиты ВидПоступления (перечисление), Контрагент (составного типа контрагенты/физические лица).
Для табличной части Товары: Номенклатура, Единица, Количество, Цена, Сумма, Качество.
В расходной накладной указываются Контрагент, КонтактноеЛицо. Для табличной части Товары: Номенклатура, Единица, Количество, Цена, Сумма, Качество, Скидка.
В обработчиках заполнения документов используется запрос. С формированием печатной формы вопросов так-же не возникает.
ДЗ 7
1. Справочник «Контрагенты» добавлен реквизит – ЮрФизЛицо = ПеречислениеСсылка.ЮрФизЛицо
2. Создан справочник «Качесво» : содержит ревизит «Скидка» =Число
3. Создан Документ.ПоступлениеТовара: содержит реквизиты
ВидПоступления = ПеречислениеСсылка.ВидПоступления(от контрагента или от сотрудника)
Поставщик = составной тип: СправочникСсылка.Контрагенты, СправочникСсылка.Сотрудники
Табличная Часть Товары:
Номенклатура = СправочникСсылка.Номенклатура
ЕдиницаИзмерения = составной тип = СправочникСсылка.ЕдиницыИзмеренияНоменклатуры, СправочникСсылка.КлассификаторЕдиницИзмерения
Качество=СправочникСсылка.Качество
Количество,Цена,Сумма, Коэффициент
Процедура ВидПоступленияПриИзменении(Элемент)
ВидПоступленияПриИзмененииСервер();
КонецПроцедуры
&НаСервере
Процедура ВидПоступленияПриИзмененииСервер()
Если Объект.ВидПоступления = Перечисления.ВидПоступления.ОтКонтрагента Тогда
Если ТипЗнч(Объект.Поставщик)Тип("СправочникСсылка.Контрагенты") Тогда
Объект.Поставщик = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
иначе
Если ТипЗнч(Объект.Поставщик)Тип("СправочникСсылка.Сотрудники") Тогда
Объект.Поставщик = Справочники.Сотрудники.ПустаяСсылка();
КонецЕсли;
конецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоставщикНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
если ТипЗнч(Объект.Поставщик)=Тип("СправочникСсылка.Сотрудники") Тогда
спрВыбор="Сотрудники";
иначе
спрВыбор="Контрагенты";
конецЕсли;
ФормаВыбора=ПолучитьФорму("Справочник."+СпрВыбор+".ФормаВыбора",,Элемент);
ФормаВыбора.Открыть();
СтандартнаяОбработка=ложь;
КонецПроцедуры
Также разработаны процедуры обработки Табличной части….
// Вставить содержимое обработчика.
СтрокаТабличнойЧасти = Элементы.Товар.ТекущиеДанные;
СтруктураДанные = Новый Структура();
СтруктураДанные.Вставить("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
СтруктураДанные=ИзменитьТаблицу(СтруктураДанные);
СтрокаТабличнойЧасти.ЕдиницаИзмерения = СтруктураДанные.ЕдиницаИзмерения;
СтрокаТабличнойЧасти.Количество = 1;
СтрокаТабличнойЧасти.Коэффициент = 1;
КонецПроцедуры
&НаКлиенте
Процедура ТоварЕдиницаИзмеренияНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
СтрокаТабличнойЧасти = Элементы.товар.ТекущиеДанные;
Элемент.СписокВыбора.Очистить();
Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
Возврат;
КонецЕсли;
СтруктураДанные = ПолучитьДанныеЕдиницаИзмерения(СтрокаТабличнойЧасти.Номенклатура);
Для каждого ЭлСписка Из СтруктураДанные.СписокЕдиницаИзмерения Цикл
Элемент.СписокВыбора.Добавить(ЭлСписка.Значение, ЭлСписка.Представление);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеЕдиницаИзмерения(Номенклатура)
СписокЕдиницаИзмерения = Новый СписокЗначений;
СтруктураДанные = Новый Структура();
СтруктураДанные.Вставить("СписокЕдиницаИзмерения", СписокЕдиницаИзмерения);
СписокЕдиницаИзмерения.Добавить(Номенклатура.БазоваяЕдиница, Номенклатура.БазоваяЕдиница.Наименование + " (базовая единица)");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЕдиницыИзмерения.Ссылка КАК ЕдиницаИзмерения
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Владелец =&Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СписокЕдиницаИзмерения.Добавить(Выборка.ЕдиницаИзмерения);
КонецЦикла;
Возврат СтруктураДанные;
КонецФункции
4. Создан Документ.РеализацияТовара: содержит реквизиты
Контрагент= СправочникСсылка.Контрагенты
КонтактноеЛицо= СправочникСсылка.КонтрактныеЛицаКонтрагентов. Связь параметров выбора: Отбор.Владелец(Контрагент)
Печатная Форма:
ОбластьЗаголовок.Параметры.НазваниеДок="Торг-12";
иначе
ОбластьЗаголовок.Параметры.НазваниеДок="Товарный Чек";
конецЕсли;
5. Ввод на основание – никаких сложностей не возникло в решение – выбирает 1 результат из запроса, сортировка по убыванию МоментВремени.
6. Документ – КонтактыСКонтрагентами содержит реквизиты
Автор= СправочникСсылка.Пользователи
ВидКонтакта= ПеречислениеСсылка.ВидКонтакта
Контрагент= СправочникСсылка.Контрагенты
КонтактноеЛицо= СправочникСсылка.КонтрактныеЛицаКонтрагентов. Связь параметров выбора: Отбор.Владелец(Контрагент)
Загаловок,Тема
&НаКлиенте
Процедура ПриОткрытии(Отказ)
если Объект.Автор.Пустая() тогда
Объект.Автор=глТекущийПользователь;
конецЕсли
КонецПроцедуры
Задание выполнила. Для поступления создала перечисление “Вид поступления” со значениями “От поставщика” и “От подотчетного лица”. В зависимости от его значения в модуле формы документа ограничиваю тип значения реквизита “Контрагент” и подпись на форме.
Заполнение ед. измерения по умолчанию вынесла в общий модуль, так как и в реализации потом данный функционал необходим.
Для учета брака – завела справочник “КачествоНоменклатуры” и соответствующие реквизиты в табличных частях документов.
В справочник “Контрагенты” добавила реквизит “Вид контрагента”, тип перечисление.виды контрагентов, со значениями юр.лицо, физ.лицо.
С пересчетами цен пока не заморачивалась, так как думаю в дальнейшем все равно цены будем хранить в регистре сведений (подглядела в след. задании).
в процедурах ввода на основании справочника “Контрагенты” документов “Поступление товаров” и “Реализация товаров” вызываю процедуру общего модуля:
<code> Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
Контрагент = ДанныеЗаполнения.Ссылка;
ТЗ = ЗаполнениеДокументовСервер.ЗаполнитьТЧПоКонтрагенту(Контрагент);
Товары.Загрузить(ТЗ);
КонецЕсли;
КонецПроцедуры
</code>
Собственно общий модуль:
<code> Функция ЗаполнитьТЧПоКонтрагенту(Контрагент) Экспорт
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(“Номенклатура”);
ТЗ.Колонки.Добавить(“ЕдиницаИзмерения”);
ТЗ.Колонки.Добавить(“Количество”);
ТЗ.Колонки.Добавить(“Сумма”);
ТЗ.Колонки.Добавить(“Качество”);
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ПоступлениеТоваров.Номенклатура,
| ПоступлениеТоваров.ЕдиницаИзмерения,
| ПоступлениеТоваров.Качество,
| ПоступлениеТоваров.Количество,
| ПоступлениеТоваров.Сумма
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Ссылка В
| (ВЫБРАТЬ
| ВЫБОР
| КОГДА ПТ.Ссылка.Дата < РТ.Ссылка.Дата
| ТОГДА РТ.Ссылка
| ИНАЧЕ ПТ.Ссылка
| КОНЕЦ КАК Ссылка
| ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка КАК Ссылка
| ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
| ГДЕ
| ПоступлениеТоваров.Контрагент = &Контрагент
| УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.Дата УБЫВ
| ) КАК ПТ ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваров.Ссылка КАК Ссылка
| ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
| ГДЕ
| РеализацияТоваров.Контрагент = &Контрагент
| УПОРЯДОЧИТЬ ПО
| РеализацияТоваров.Дата УБЫВ
| ) КАК РТ
| ПО
| ПТ.Ссылка.Контрагент = РТ.Ссылка.Контрагент)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваров.Номенклатура,
| РеализацияТоваров.ЕдиницаИзмерения,
| РеализацияТоваров.Качество,
| РеализацияТоваров.Количество,
| РеализацияТоваров.Сумма
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка В
| (ВЫБРАТЬ
| ВЫБОР
| КОГДА ПТ.Ссылка.Дата < РТ.Ссылка.Дата
| ТОГДА РТ.Ссылка
| ИНАЧЕ ПТ.Ссылка
| КОНЕЦ КАК Ссылка
| ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка КАК Ссылка
| ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
| ГДЕ
| ПоступлениеТоваров.Контрагент = &Контрагент
| УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.Дата УБЫВ
| ) КАК ПТ ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваров.Ссылка КАК Ссылка
| ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
| ГДЕ
| РеализацияТоваров.Контрагент = &Контрагент
| УПОРЯДОЧИТЬ ПО
| РеализацияТоваров.Дата УБЫВ
| ) КАК РТ
| ПО
| ПТ.Ссылка.Контрагент = РТ.Ссылка.Контрагент)”;
Запрос.УстановитьПараметр(“Контрагент”,Контрагент);
РезЗапроса = Запрос.Выполнить();
ТЗ = РезЗапроса.Выгрузить();
Возврат ТЗ;
КонецФункции // ЗаполнитьТЧПоКонтрагенту()
</code>
В процедуре печати в зависимости от вида контрагента меняю заголовок печатной формы, возникли трудности с получением текущего пользователя, добавила его в массив параметров, которые передаются в обработке команды.
В ходе выполнения возник вопрос – как правильней делать:
1. в модуле формы из клиентской процедуры переходить на серверную и оттуда вызывать общий модуль, который работает на сервере.
или
2. достаточно установить галку “серверный вызов” для общего модуля и делать вызов непосредственно из клиентской процедуры.
Достаточно установить флаг “Вызов сервера”.
Доброго времени суток.
Задание выполнил. В прошлом задании забежал вперед, поэтому за основу для 7-го задания взял информационную базу из выгрузки.
1. Добавил справочники “Бракованность” (больше ничего на ум не пришло), “Сотрудники” (Подотчетные лица), перечисление “Виды контрагентов” (физ. и юр. лицо).
2. Добавил документы “Закупка”, “Реализация” и “Контакт”
3. Для подбора контактных лиц в документах “Реализация” и “Контакт” использовал следующий код:
<code>
&НаКлиенте
Процедура КонтактноеЛицоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДанныеВыбора = МассивКЛ(Объект.Контрагент);
Если ДанныеВыбора.Количество() > 0 Тогда
СтруктураОтбора = Новый Структура();
СтруктураОтбора.Вставить(“Отбор”, Новый Структура(“Ссылка”,ДанныеВыбора));
ОткрытьФорму(“Справочник.КонтактныеЛица.ФормаВыбора”,СтруктураОтбора,Элементы.КонтактноеЛицо);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция МассивКЛ(Контрагент)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| КонтрактныеЛицаКонтрагентов.КонтактноеЛицо КАК КЛ
|ИЗ
| Справочник.КонтрактныеЛицаКонтрагентов КАК КонтрактныеЛицаКонтрагентов
|ГДЕ
| КонтрактныеЛицаКонтрагентов.Владелец = &Владелец”;
Запрос.УстановитьПараметр(“Владелец”, Контрагент);
ТЗ = Запрос.Выполнить().Выгрузить();
Если ТЗ.Количество() = 0 Тогда
Возврат Новый Массив;
Иначе
Возврат ТЗ.ВыгрузитьКолонку(“КЛ”);
КонецЕсли;
КонецФункции // МассивКЛ()
&НаКлиентеПроцедура КонтактноеЛицоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ДанныеВыбора = МассивКЛ(Объект.Контрагент); Если ДанныеВыбора.Количество() > 0 Тогда СтруктураОтбора = Новый Структура(); СтруктураОтбора.Вставить(“Отбор”, Новый Структура(“Ссылка”,ДанныеВыбора)); ОткрытьФорму(“Справочник.КонтактныеЛица.ФормаВыбора”,СтруктураОтбора,Элементы.КонтактноеЛицо); КонецЕсли;КонецПроцедуры
&НаСервереБезКонтекстаФункция МассивКЛ(Контрагент) Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | КонтрактныеЛицаКонтрагентов.КонтактноеЛицо КАК КЛ |ИЗ | Справочник.КонтрактныеЛицаКонтрагентов КАК КонтрактныеЛицаКонтрагентов |ГДЕ | КонтрактныеЛицаКонтрагентов.Владелец = &Владелец”;
Запрос.УстановитьПараметр(“Владелец”, Контрагент);
ТЗ = Запрос.Выполнить().Выгрузить(); Если ТЗ.Количество() = 0 Тогда Возврат Новый Массив; Иначе Возврат ТЗ.ВыгрузитьКолонку(“КЛ”); КонецЕсли;КонецФункции // МассивКЛ()</code>
Для выбора единиц измерения следующий:
<code>
&НаКлиенте
Процедура ТоварыЕдиницаИзмеренияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТД = Элементы.Товары.ТекущиеДанные;
Данные = ЗаполнитьСписок(ТД.Номенклатура);
СтруктураПараметров = Новый Структура();
СтруктураПараметров.Вставить(“Отбор”,Новый Структура(“Ссылка”,Данные));
ОткрытьФорму(“Справочник.КлассификаторЕдиницИзмерения.ФормаВыбора”,СтруктураПараметров,Элементы.Товары);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьСписок(Номенк)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору КАК ЕдиницаИзмерения
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| Номенклатура.БазоваяЕдиница КАК ЕдиницаИзмерения
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Владелец”;
Запрос.УстановитьПараметр(“Владелец”, Номенк);
Результат = Запрос.Выполнить();
Массив = Результат.Выгрузить().ВыгрузитьКолонку(“ЕдиницаИзмерения”);
Возврат Массив;
КонецФункции // ЗаполнитьСписок(Номенк)
</code>
Печать реализовал через мастер. В сформированном коде данные выгружал в таблицу и обрабатывал ее: заполнял параметры и т.д.
Итоговую сумма:
<code>
ФормСтрока = “Л = ru_RU; ДП = Истина”;
ПарПредмета=”рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2″;
ПрописьСуммы = ЧислоПрописью(Товары.Итог(“Сумма”), ФормСтрока, ПарПредмета);
</code>
В принципе вопросов не возникло.
Создал объекты
Сотрудники
Степень брака
Документы
Закупка
Реализация
Контакт
Перечисления
Вид контрагенты (Юр.лицо, физюлицо)
Вид контакта (Письмо, встреча, звонок)
Заполнение ТЧ при вводе нового документа (Закупка и Реализация) сделал через процедуру общего модуля:
Процедура ЗаполнитьТЧДокумента(Документ) Экспорт
Если ТипЗнч(Документ) = Тип(“ДокументОбъект.Закупка”) Тогда
ВидДокумента = “Закупка”;
ИначеЕсли ТипЗнч(Документ) = Тип(“ДокументОбъект.Реализация”) Тогда
ВидДокумента = “Реализация”;
Иначе
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ
| Товары.Ссылка,
| Товары.НомерСтроки,
| Товары.Номенклатура,
| Товары.ЕдиницаИзмерения,
| Товары.Количество,
| Товары.Цена,
| Товары.Сумма,
| Товары.Брак
|ИЗ
| Документ.”+ВидДокумента+”.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Документ.Ссылка КАК Ссылка
| ИЗ
| Документ.”+ВидДокумента+” КАК Документ
| ГДЕ
| Документ.Проведен
| И Документ.Контрагент = &Контрагент
| УПОРЯДОЧИТЬ ПО
| Документ.Дата УБЫВ)”;
Запрос.УстановитьПараметр(“Контрагент”,Документ.Контрагент);
Документ.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
Печатную форму сделал конструктором, потом доработал. Убрал возможность передачи множественного параметра в процедуру печати
В документе Закупка не делал составной тип на Поставщика, а сделал доп.поле Сотрудник, для указания подотчетного лица с обязательным требованием указывать поставщика.
Задание выполнил.
Модуль объекта приходной накладной
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Контрагент=ДанныеЗаполнения;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ПриходнаяНакладная.Ссылка
|ИЗ
| Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
|ГДЕ
| ПриходнаяНакладная.Контрагент = &Контрагент
| И ПриходнаяНакладная.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| ПриходнаяНакладная.Дата УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Для Каждого й из ВыборкаДетальныеЗаписи.Ссылка.товар Цикл
НовСтрока=ЭтотОбъект.Товар.Добавить();
НовСтрока.Номенклатура =й.Номенклатура;
НовСтрока.Количество=й.Количество;
НовСтрока.Цена=й.Цена;
НовСтрока.Сумма=й.Сумма;
Новстрока.ЕдИзм=й.ЕдИзм;
НовСтрока.СтепеньБрака=й.СтепеньБрака;
КонецЦикла;
Прервать;
КонецЦикла;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Контрагент=ДанныеЗаполнения; Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ПриходнаяНакладная.Ссылка |ИЗ | Документ.ПриходнаяНакладная КАК ПриходнаяНакладная |ГДЕ | ПриходнаяНакладная.Контрагент = &Контрагент | И ПриходнаяНакладная.Проведен = ИСТИНА | |УПОРЯДОЧИТЬ ПО | ПриходнаяНакладная.Дата УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Для Каждого й из ВыборкаДетальныеЗаписи.Ссылка.товар Цикл НовСтрока=ЭтотОбъект.Товар.Добавить(); НовСтрока.Номенклатура =й.Номенклатура; НовСтрока.Количество=й.Количество; НовСтрока.Цена=й.Цена; НовСтрока.Сумма=й.Сумма; Новстрока.ЕдИзм=й.ЕдИзм; НовСтрока.СтепеньБрака=й.СтепеньБрака; КонецЦикла; Прервать;
КонецЦикла;КонецПроцедуры
</code>
Модуль формы приходной накладной
<code>
&НаКлиенте
Процедура ТоварНоменклатураПриИзменении(Элемент)
Базовая=ПолучитьБазовуюЕдИзмНаСервере(Элемент.ТекстРедактирования);
Если Базовая.Пустая() тогда
Сообщить(“Для элемента не выбрана базовая единица”);
Иначе Этаформа.ТекущийЭлемент.ТекущиеДанные.ЕдИзм=Базовая;
КонецЕсли;
Этаформа.ТекущийЭлемент.ТекущиеДанные.СтепеньБрака=0;
КонецПроцедуры
&НаСервере
Функция ПолучитьБазовуюЕдИзмНаСервере(Эл)
Ном=Справочники.Номенклатура.НайтиПоНаименованию(Эл);
БазЕдИзм=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(Ном.БазоваяЕдиницаИзмерения,Истина,,Ном);
Возврат БазЕдИзм;
КонецФункции // ПолучитьБазовуюЕдИзмНаСервере()
</code>
Расходная накладная модуль менеджера
<code>
Процедура Печать(ТабДок, Ссылка) Экспорт
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
Макет = Документы.РасходнаяНакладная.ПолучитьМакет(“Печать”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РасходнаяНакладная.Дата,
| РасходнаяНакладная.КонтактноеЛицо,
| РасходнаяНакладная.Контрагент,
| РасходнаяНакладная.Номер,
| РасходнаяНакладная.Товар.(
| НомерСтроки,
| Номенклатура,
| Цена,
| Количество,
| Сумма,
| ЕдИзм
| ),
| РасходнаяНакладная.ЮрЛицо
|ИЗ
| Документ.РасходнаяНакладная КАК РасходнаяНакладная
|ГДЕ
| РасходнаяНакладная.Ссылка В(&Ссылка)”;
Запрос.Параметры.Вставить(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть(“Заголовок”);
Шапка = Макет.ПолучитьОбласть(“Шапка”);
ОбластьТоварШапка = Макет.ПолучитьОбласть(“ТоварШапка”);
ОбластьТовар = Макет.ПолучитьОбласть(“Товар”);
Подвал = Макет.ПолучитьОбласть(“Подвал”);
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Заг=?(Выборка.ЮрЛицо=Истина,”Торг-12″,”Товарный чек”);
ОбластьЗаголовок.Параметры.Заг=Заг;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьТоварШапка);
Сум=0;
ВыборкаТовар = Выборка.Товар.Выбрать();
Пока ВыборкаТовар.Следующий() Цикл
ОбластьТовар.Параметры.Заполнить(ВыборкаТовар);
ТабДок.Вывести(ОбластьТовар, ВыборкаТовар.Уровень());
Сум=Сум+ВыборкаТовар.Сумма;
КонецЦикла;
Подвал.Параметры.Заполнить(Выборка);
Подвал.Параметры.СуммаПроп=ЧислоПрописью(Сум);
Подвал.Параметры.Поставщик=ИмяПользователя();
ТабДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
//}}
КонецПроцедуры
</code>
сложностей невозникло.
Задание сделал. Создал
Перечисления: ЮрФизЛицо(ЮрЛицо;ФизЛицо), КонтактыСКлиентами(ЛичнаяВстреча;ТелефонныйЗвонок;Письмо)
Справочник Качество
Документы: Приходная накладная,Расходная накладная, Событие (для хранения контактов), АвансовыйОтчет (для закупки через подотчетное лицо).
Добавил функционал в документах для удобной работы с ними.
Последний проведенный документ находил запросом с упорядочиванием по моменту времени, фильтром и конструкцией ВЫБРАТЬ ПЕРВЫЕ 1
Задание выполнил. Создал справочники:
Физ лица расположены в справочнике контрагенты в группе физическиелица
Сотрудники и ВидыБрака -реквизит ПроцентБрака число 10, 2.
Перечисления ВидКонтакта- ЛичныеВстречи, ТелефонныеЗвонки, Письма
ВидыПродаж – ФизЛицо, ЮрЛицо
ВидПокупки – ПодотчетноеЛицо, Поставщик
Документы:
Контакты – реквизиты: ТипОбщения тип ПеречислениеСсылка.ВидКонтакта,
Контрагент -СправочникСсылка.Контрагенты,
КонтактноеЛицо -СправочникСсылка.КонтрактныеЛицаКонтрагентов
связь параметра выбора Отбор.Владелец(Контрагент),
Заголовок- Строка 80,
Тема – Строка не ограниченная длинна Вид Поле тексьового документа
Документ Закупка :
Реквиз Поставщик тип СправочникСсылка.Контрагенты, СправочникСсылка.Сотрудники;
ВидПокупки тип ПеречислениеСсылка.ВидПокупки
Таблица Покупки реквизиты
Номенклатура тип СправочникСсылка.Номенклатура
ЕдиницаИзмерения тип СправочникСсылка.ЕдиницыИзмеренияНоменклатуры
ПризнакБрака тип СправочникСсылка.ВидыБрака
Количество, Цена, сумма
Ввод на основании Справочник.Контрагенты
Процедура модуля формы
&НаКлиенте
Процедура ПоставщикПриИзменении(Элемент)
// Вставить содержимое обработчика.
Если ТипЗНЧ(Объект.Поставщик)=Тип(“СправочникСсылка.Контрагенты”) Тогда
Тер= ПолучитьВидПокупки(Истина);
Иначе
Тер= ПолучитьВидПокупки(Ложь);
КонецЕсли;
Объект.ВидПокупки=Тер;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьВидПокупки(Ссылка)
Если Ссылка Тогда
Возврат Перечисления.ВидПокупки.Поставщик;
Иначе
Возврат Перечисления.ВидПокупки.ПодотчетноеЛицо;
КонецЕсли;
КонецФункции // ПолучитьВодПродажи()
&НаКлиенте
Процедура ПокупкиНоменклатураПриИзменении(Элемент)
// Вставить содержимое обработчика.
Тек=Элементы.Покупки.ТекущиеДанные;
тек.ЕдинцаИзмерения=ПолучитьЕдиницы(Тек.Номенклатура);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЕдиницы(Ссылка)
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.К = 1”;
Запрос.УстановитьПараметр(“Владелец”, Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если Результат.Пустой() Тогда
Возврат Справочники.ЕдиницыИзмеренияНоменклатуры.ПустаяСсылка();
КонецЕсли;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
Возврат ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
КонецФункции
&НаКлиенте
Процедура ПокупкиКоличествоПриИзменении(Элемент)
// Вставить содержимое обработчика.
ПересчетСуммы();
КонецПроцедуры
&НаКлиенте
Процедура ПересчетСуммы()
ТД = Элементы.Покупки.ТекущиеДанные;
ТД.Сумма = ТД.Цена * ТД.Количество;
КонецПроцедуры // ПересчетСуммы()
&НаКлиенте
Процедура ПокупкиЦенаПриИзменении(Элемент)
ПересчетСуммы();
КонецПроцедуры
Модуль обьекта
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
Поставщик = ДанныеЗаполнения.Ссылка;
ВидПокупки = перечисления.ВидПокупки.Поставщик;
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| ЗакупкаПокупки.Ссылка,
| ЗакупкаПокупки.Номенклатура,
| ЗакупкаПокупки.ЕдинцаИзмерения,
| ЗакупкаПокупки.ПризнакБрака,
| ЗакупкаПокупки.Количество,
| ЗакупкаПокупки.Цена,
| ЗакупкаПокупки.Сумма
|ИЗ
| Документ.Закупка.Покупки КАК ЗакупкаПокупки
|ГДЕ
| ЗакупкаПокупки.Ссылка.Поставщик= &Ссылка
| И ЗакупкаПокупки.Ссылка.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| ЗакупкаПокупки.Ссылка.МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“Ссылка”, Поставщик);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выгрузить();
Покупки.Добавить();
Покупки.Загрузить(ВыборкаДетальныеЗаписи);
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
Документ Реализация
Реквизиты КонтАгент тип СправочникСсылка.Контрагенты
ПризнакПродажи тип ПеречислениеСсылка.ВидыПродаж
КонтактноеЛицо тип СправочникСсылка.КонтрактныеЛицаКонтрагентов
связь парам выбора Отбор.Владелец(КонтрАгент)
Табличная часть Товары с реквизитами
Номенклатура тип СправочникСсылка.Номенклатура
ЕдиницИзмерен тип СправочникСсылка.ЕдиницыИзмеренияНоменклатуры
Отбор.Владелец(Товары.Номенклатура)
Количество, Цена, Сумма
Ввод на основании Справочник.Контрагенты
Модуль формы
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Тер= ПолучитьВидПродажи(Объект.КонтрАгент);
Объект.Признакпродажи=Тер;
КонецПроцедуры
Функция ПолучитьВидПродажи(Ссылка)
Если Ссылка.Родитель.Наименование=”Организации” Тогда
Возврат Перечисления.ВидыПродаж.ЮрЛицо;
Иначе
Возврат Перечисления.ВидыПродаж.ФизЛицо;
КонецЕсли;
КонецФункции // ПолучитьВодПродажи()
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
// Вставить содержимое обработчика.
ПересчетСуммы();
КонецПроцедуры
&НаКлиенте
Процедура ПокупкиНоменклатураПриИзменении(Элемент)
// Вставить содержимое обработчика.
Тек=Элементы.Покупки.ТекущиеДанные;
тек.ЕдинцаИзмерения=ПолучитьЕдиницы(Тек.Номенклатура);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЕдиницы(Ссылка)
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.К = 1”;
Запрос.УстановитьПараметр(“Владелец”, Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если Результат.Пустой() Тогда
Возврат Справочники.ЕдиницыИзмеренияНоменклатуры.ПустаяСсылка();
КонецЕсли;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
Возврат ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
КонецФункции
&НаКлиенте
Процедура ПокупкиКоличествоПриИзменении(Элемент)
// Вставить содержимое обработчика.
ПересчетСуммы();
КонецПроцедуры
&НаКлиенте
Процедура ПересчетСуммы()
ТД = Элементы.Товары.ТекущиеДанные;
ТД.Сумма = ТД.Цена * ТД.Количество;
КонецПроцедуры // ПересчетСуммы()
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
// Вставить содержимое обработчика.
ПересчетСуммы();
КонецПроцедуры
Модуль обьекта
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
КонтрАгент = ДанныеЗаполнения.Ссылка;
Если ДанныеЗаполнения.Ссылка.Родитель.Наименование=”Организации” Тогда
Признакпродажи = Перечисления.ВидыПродаж.ЮрЛицо;
Иначе
Признакпродажи = Перечисления.ВидыПродаж.ФизЛицо;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| Реализация.КонтактноеЛицо
|ИЗ
| Документ.Реализация КАК Реализация
|ГДЕ
| Реализация.Товары.Ссылка.КонтрАгент = &КонтрАгент
| И Реализация.Товары.Ссылка.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| Реализация.МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“КонтрАгент”, КонтрАгент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонтактноеЛицо=ВыборкаДетальныеЗаписи.КонтактноеЛицо;
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТовары.Ссылка,
| РеализацияТовары.Номенклатура,
| РеализацияТовары.ЕдиницаИзмерен,
| РеализацияТовары.Количество,
| РеализацияТовары.Цена,
| РеализацияТовары.Сумма
|ИЗ
| Документ.Реализация.Товары КАК РеализацияТовары
|ГДЕ
| РеализацияТовары.Ссылка.КонтрАгент = &КонтрАгент
| И РеализацияТовары.Ссылка.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| РеализацияТовары.Ссылка.МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“КонтрАгент”, КонтрАгент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выгрузить();
Товары.Добавить();
Товары.Загрузить(ВыборкаДетальныеЗаписи);
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры
Модуль команды
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
ТабДок = Новый ТабличныйДокумент;
Печать(ТабДок, ПараметрКоманды);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
//}}
КонецПроцедуры
&НаСервере
Процедура Печать(ТабДок, ПараметрКоманды)
Документы.Реализация.Печать(ТабДок, ПараметрКоманды);
КонецПроцедуры
Модуль менеджора
Процедура Печать(ТабДок, Ссылка) Экспорт
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
Макет = Документы.Реализация.ПолучитьМакет(“Печать”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Реализация.Дата,
| Реализация.КонтактноеЛицо,
| Реализация.КонтрАгент,
| Реализация.Номер,
| Реализация.Признакпродажи,
| Реализация.Товары.(
| НомерСтроки,
| Номенклатура,
| ЕдиницаИзмерен,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.Реализация КАК Реализация
|ГДЕ
| Реализация.Ссылка В (&Ссылка)”;
Запрос.Параметры.Вставить(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть(“Заголовок”);
Шапка = Макет.ПолучитьОбласть(“Шапка”);
ОбластьТоварыШапка = Макет.ПолучитьОбласть(“ТоварыШапка”);
ОбластьТовары = Макет.ПолучитьОбласть(“Товары”);
Подвал = Макет.ПолучитьОбласть(“Подвал”);
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Если Выборка.Признакпродажи=Перечисления.ВидыПродаж.ФизЛицо Тогда
ОбластьЗаголовок.Параметры.Реализация = “Товарный чек”;
Иначе
ОбластьЗаголовок.Параметры.Реализация =”Торг-12″;
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьТоварыШапка);
ВыборкаТовары = Выборка.Товары.Выбрать();
ИтогСумма=0;
Пока ВыборкаТовары.Следующий() Цикл
ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень());
ИтогСумма=ИтогСумма+ВыборкаТовары.Сумма;
КонецЦикла;
Подвал.Параметры.Пользователь=ИмяПользователя();
Подвал.Параметры.КонтактноеЛицо=Выборка.КонтактноеЛицо;
ФормСтрока = “Л = ru_RU; НП = Истина; ДП = Ложь”;
ПарамПредмета = “рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2”;
Подвал.Параметры.ЧислоБуквы = ЧислоПрописью(ИтогСумма, ФормСтрока, ПарамПредмета);
ТабДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
//}}
КонецПроцедуры
Задание получилось.
Сложность возникла с запросом возвращающим табличную часть последнего документа:
ВЫБРАТЬ
ПоступлениеТоваровТовары.Номенклатура,
ПоступлениеТоваровТовары.ЕдиницаИзмерения,
ПоступлениеТоваровТовары.Коэффициент,
ПоступлениеТоваровТовары.Количество,
ПоступлениеТоваровТовары.Качество
ИЗ
Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
ГДЕ
ПоступлениеТоваровТовары.Ссылка В
(ВЫБРАТЬ ПЕРВЫЕ 1
ПоступлениеТоваров.Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ГДЕ
ПоступлениеТоваров.Контрагент = &Контрагент
И ПоступлениеТоваров.Проведен
УПОРЯДОЧИТЬ ПО
ПоступлениеТоваров.МоментВремени УБЫВ)
УПОРЯДОЧИТЬ ПО
ПоступлениеТоваровТовары.НомерСтроки
он упорно возвращал первый доумент, запрос пришлось немного переделать
ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка
|ПОМЕСТИТЬ ПоследнееПоступление
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Контрагент = &Контрагент
| И ПоступлениеТоваров.Проведен
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.МоментВремени УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.ЕдиницаИзмерения,
| ПоступлениеТоваровТовары.Коэффициент,
| ПоступлениеТоваровТовары.Количество,
| ПоступлениеТоваровТовары.Качество
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка В
| (ВЫБРАТЬ
| ПоследнееПоступление.Ссылка
| ИЗ
| ПоследнееПоступление КАК ПоследнееПоступление)
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваровТовары.НомерСтроки
Видимо глюк релиза 8.2.13.205
>он упорно возвращал первый доумент, запрос пришлось немного переделать
Есть такая проблема. С ней же столкнемся и в решении задачи.
</code>Задание выполнил.
Создал документы ПоступлениеТоваров и РеализацияТоваров по структуре аналогичные выгрузке базы после занятий по 1му блоку.
Создал справочник Сотрудники. В документ ПоступлениеТоваров добавил реквизит ВидЗакупки типа ПеречислениеСсылка.ВидыЗакупки со значениями Поставщик или ПодотчетноеЛицо, а так же реквизит ПодотчетноеЛицо типа СправочникСсылка.Сотрудники для обеспечения выбора варианта закупки.
Для управления видимостью реквизитов в Модуль ФормыДокумента ПоступлениеТоваров поместил следующий код:
<code>
&НаКлиенте
Процедура ВидЗакупкиПриИзменении(Элемент)
УстановитьВидимостьКонтрагента(Объект.ВидЗакупки)
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимостьКонтрагента(ВидЗакупки)
Если ВидЗакупки = Перечисления.ВидыЗакупки.ПодотчетноеЛицо Тогда
Элементы.Контрагент.Видимость = Ложь;
Элементы.ПодотчетноеЛицо.Видимость =Истина ;
Иначе
Элементы.Контрагент.Видимость = Истина;
Элементы.ПодотчетноеЛицо.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьВидимостьКонтрагента(Объект.ВидЗакупки);
КонецПроцедуры
</code>
В табличную часть документа добавил реквизит ЕдИзм типа СправочникСсылка.ЕдиницыИзмеренияНоменклатуры а так же следующий код в Модуль ФормыДокумента ПоступлениеТоваров
<code>
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТД = Элементы.Товары.ТекущиеДанные;
ТД.ЕдИзм = ПолучитьЕдИзм(ТД.Номенклатура);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЕдИзм(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец.Ссылка = &Ссылка
| И ЕдиницыИзмеренияНоменклатуры.Владелец.БазоваяЕдиница.Наименование = ЕдиницыИзмеренияНоменклатуры.Наименование”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Возврат Выборка.Ссылка;
КонецЦикла;
КонецФункции
</code>
который позволил при выборе номенклатуры подставлять базовую единицу измерения.
Для учета возможности поступления бракованного товара создан справочник СтепеньБракаНоменклатуры, а в табличную часть добавлен реквизит СтепеньБрака типа СправочникСсылка.СтепеньБракаНоменклатуры
В документ РеализацияТоваров добавил Реквизит КонтактноеЛицоКонтрагента типа СправочникСсылка.КонтрактныеЛицаКонтрагентов
Создал документ КонтактСКлиентом в соответствии со спецификацией. Для хранения вида контакта добавлен реквизит ВидКонтакта типа ПеречислениеСсылка.ВидыКонтактов.
Для ввода документов на основании в модуле объекта документов добавлен следующий код
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваров.Ссылка
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваров.Ссылка
| ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
| ГДЕ
| РеализацияТоваров.Контрагент = &Контрагент
| И РеализацияТоваров.Проведен = ИСТИНА
| УПОРЯДОЧИТЬ ПО
| РеализацияТоваров.Дата УБЫВ)”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
СсылкаНаДокумент = Выборка.Ссылка;
КонецЦикла;
Для каждого Товар Из СсылкаНаДокумент.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.ЕдИзм = Товар.ЕдИзм;
НоваяСтрока.Количество = Товар.Количество;
НоваяСтрока.Номенклатура = Товар.Номенклатура;
НоваяСтрока.СтепеньБрака = Товар.СтепеньБрака;
НоваяСтрока.Сумма = Товар.Сумма;
НоваяСтрока.Цена = Товар.Цена;
КонецЦикла;
ВидПродажи = СсылкаНаДокумент.ВидПродажи;
КонтактноеЛицоКонтрагента = СсылкаНаДокумент.КонтактноеЛицоКонтрагента;
Иначе
Сообщить(“Нет проведенных документов по контрагенту” + Контрагент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Создал 2 макета согласно Рис. 1. торг12 и для товарного чека. В модуль формы документа РеализацияТоваров добавил следующий код
<code>
&НаСервереБезКонтекста
Функция СформироватьМакет(Ссылка, ТекущийПользователь)
Если Ссылка.ВидПродажи = Перечисления.ВидыПродажи.ФизическоеЛицо Тогда
Макет = ПолучитьОбщийМакет(“ТоварныйЧек”);
Иначе
Макет = ПолучитьОбщийМакет(“Торг12”);
КонецЕсли;
ТабДок = Новый ТабличныйДокумент;
ОбластьЗаголовок = Макет.ПолучитьОбласть(“Заголовок”);
ТабДок.Вывести(ОбластьЗаголовок);
ОбластьШапка = Макет.ПолучитьОбласть(“Шапка”);
ОбластьШапка.Параметры.Номер = Ссылка.Номер;
ОбластьШапка.Параметры.Дата = Ссылка.Дата;
ОбластьШапка.Параметры.Контрагент = Ссылка.Контрагент;
ТабДок.Вывести(ОбластьШапка);
ОбластьТоварыШапка = Макет.ПолучитьОбласть(“ТоварыШапка”);
ТабДок.Вывести(ОбластьТоварыШапка);
ИтогоСумма = 0;
Для каждого Строка Из Ссылка.Товары Цикл
ОбластьТовары = Макет.ПолучитьОбласть(“Товары”);
ОбластьТовары.Параметры.Заполнить(Строка);
ТабДок.Вывести(ОбластьТовары);
ИтогоСумма = ИтогоСумма + Строка.Сумма
КонецЦикла;
ОбластьПодвал = Макет.ПолучитьОбласть(“Подвал”);
ОбластьПодвал.Параметры.ТекущийПользователь = ТекущийПользователь;
ОбластьПодвал.Параметры.КонтактноеЛицоКонтрагента = Ссылка.КонтактноеЛицоКонтрагента;
ФормСтрока = “Л = ru_RU; ДП = Ложь”;
ПарПредметаИсчисления =”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″;
ОбластьПодвал.Параметры.ИтогоСумма = ЧислоПрописью(ИтогоСумма, ФормСтрока, ПарПредметаИсчисления);
ТабДок.Вывести(ОбластьПодвал);
Возврат ТабДок;
КонецФункции
</code>
Задание выполнено. А как вставить картинки?
http://radikal.ru/F/i073.radikal.ru/1105/de/af621d2efb9b.jpg.html
http://radikal.ru/F/s59.radikal.ru/i166/1105/40/6b1e5c8f55a7.jpg.html
http://radikal.ru/F/s50.radikal.ru/i130/1105/4e/491777c5ff8c.jpg.html
Картинки вставить в блог не получится.
http://www.imagepost.ru/images/m/od/moduleformdocpostuplenye.JPG
модуль формы док Поступления.
Почему то ссылка не работает
Код всех модулей приводить нет необходимости.
модульФормыДокументаПоступления
Задание выполнено.
Создала 2 справочника: СостояниеТовара(СтепеньБрака,Скидка),Сотрудники.
Создала 3 док-та:
1)ПоступлениеТовара
(Контрагент-Справочник.Контрагент или Справочник.Сотрудники,
КонтакноеЛицо-Справочник.КонтакныеЛицаКонтрагенов
и ТЧ Товар с реквизитами
Номенклатура-Спр.Номенклатура,
НаличиеБрака-Спр.СостояниеТовара,
ЕдиницаИзмерения-Спр.ЕдиницыИзмеренияНоменклатуры,
Количество,Цена, Сумма)
2)РеализацияТовара(Аналогично док Поступления только в ТЧ вместо реквизита<НаличиеБрака> реквизит <Скидка>)
3)КонтактыСКлиентами.
Создала 2 перечисления: ВидКонтрагента(Юр,Физ),ВидыКонтактовСКлиентами.
В справочник Контрагенты добавила реквизит ВидКонтрагента.
модульОбъектаПоступлениеТовара
модульФормыДокументаПоступления
модульОбъектаРеализацияТовара
Печать документа отгрузки реализовала через конструктор печати, добавила
1)вывод названия документа
Если Выборка.Контрагент.ВидКонтрагента = Перечисления.ВидКонтрагента.Юр Тогда
названиеДок = “ТОРГ-12”;
ИначеЕсли Выборка.Контрагент.ВидКонтрагента = Перечисления.ВидКонтрагента.Физ Тогда
названиеДок = “Товарный чек”;
КонецЕсли; ОбластьЗаголовок.Параметры.названиеДокумента = названиеДок;
2)подсчет суммы документа и вывод
Подвал.Параметры.СуммаДокумента =
ЧислоПрописью(СуммаДок,,”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″)
3) вывод пользователя в качестве Поставщика
Подвал.Параметры.пользователь = ОбщийМодульСервер.ПользователиИнфБазы(глПользовательИБАдминистратор).наименование
?
1. Все шло гладко, только вот в конце натолкнулся на сообщение об ошибке синтаксис контроля проверки Сервер в Модуле менеджера Процедура Печать(), при попытке <code>Подвал.Параметры.Ответственный = глТекущийПользователь;</code>
Переменная глТекущийПользователь определена в модуле УП как Экспортная (брал Вашу конфигурацию). Печать отработала без ошибки, ругался только контроль. Почему?
Сам то я, такие переменные привычно определяю в ветке ПараметрыСеанса, от туда и достал.
2. как то у меня отчеты получаются большие, может я перебарщиваю с подробностями?
1. Вполне возможно Вы запускаете толстый клиент (управляемое приложение). В этом случае модуль менеджера будет копилироваться на стороне клиента. То есть клиентский контекст будет доступен.
Попробуйте запустить тонкого клиента, должна возникнуть ошибка.
2. Да, отчеты можно писать более кратко: даже без программного кода.
так и есть, в тонком ошибка
Все разработал, отладил . Привожу основные моменты, так как отчет получился большой.
Создал документы:
АвансовыйОтчет-реквизитами Сотрудник, ПриходнаяНакладная – реквизит Контрагент. Табличная часть Товары у обоих док. идентична, реквизиты: Номенклатура, ЕдиницаИзмерения (тип ЕдиницаИзмеренияНоменклатуры), Коэффициент, Количество, Цена, Сумма, Качество (тип СправочникСсылка.Качество)
Создал новый справочник Качество (для брака) с реквизитом ПроцентСкидки (число 5.2), предопределенный элемент – Новый.
Создал ФормаДокумента для обеих док., создал обработчики событий реквизитов ТЧ «Товары»
<code>&НаСервереБезКонтекста
Функция ИзменениеНоменклатурыСервер(ДанныеДляЗаполнения)
&НаСервереБезКонтекста
Функция ИзменениеЕдиницыИзмеренияСервер(ДанныеДляЗаполнения)
&НаКлиенте
Процедура ИзменениеНоменклатурыКлиент(СтрокаТабличнойЧасти)
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
ИзменениеНоменклатурыКлиент(СтрокаТабличнойЧасти);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЕдиницаИзмеренияПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
РаботаСДиалогамиКлиент.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыСуммаПриИзменении(Элемент)</code>
Общие серверные процедуры вынес в модули Общие модули\РаботаСДиалогамиСервер
<code>Функция ИзменениеНоменклатуры(ДанныеДляЗаполнения) Экспорт
Функция ИзменениеЕдиницыИзмерения(ДанныеДляЗаполнения) Экспорт</code>
Общие клиентские в общий модуль РаботаСДиалогамиКлиент
<code>Процедура РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, СтруктураПараметров = Неопределено) Экспорт
Процедура ПриИзмененииСуммыТабЧасти(СтрокаТабличнойЧасти) Экспорт </code>
Создал док. РасходнаяНакладная, реквизиты: Контрагент, КонтактноеЛицоКонтрагента, табличная часть Товары – как у док. поступления + реквизит ПроцентСкидки (свойство Только просмотр). ФормаДокумента с обработкой событий реквизитов ТЧ
<code>&НаСервереБезКонтекста
Функция ИзменениеНоменклатурыСервер(ДанныеДляЗаполнения)
ЗначенияДляЗаполнения = РаботаСДиалогамиСервер.ИзменениеНоменклатуры(ДанныеДляЗаполнения);
Возврат ЗначенияДляЗаполнения;
КонецФункции
&НаСервереБезКонтекста
Функция ИзменениеЕдиницыИзмеренияСервер(ДанныеДляЗаполнения)
&НаКлиенте
Процедура ИзменениеНоменклатурыКлиент(СтрокаТабличнойЧасти)
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыЕдиницаИзмеренияПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыСуммаПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыПроцентСкидкиПриИзменении(Элемент)
&НаКлиенте
Процедура ТоварыКачествоПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
СтрокаТабличнойЧасти.ПроцентСкидки = ПолучитьПроцентСкидки(СтрокаТабличнойЧасти.Качество);
РаботаСДиалогамиКлиент.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, Новый Структура(“ЕстьПроцентСкидки”,));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПроцентСкидки(Ссылка)
Возврат Ссылка.ПроцентСкидки;
КонецФункции // ПолучитьПроцентСкидкиНаСервере()</code>
Создал док. Событие, реквизиты: ТипСобытия (ПеречислениеСсылка.ТипыСобытий), Контрагент, КонтактноеЛицоКонтрагента (везде этот реквизит со свойством Связь параметров выбор, на уровне объекта), Заголовок, Тема (Неограниченная длина).
Ввод док. на основании спр. Контрагенты создал конструктором и доработал Процедуру ОбработкуЗаполнения:
<code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ПриходнаяНакладнаяТовары.НомерСтроки,
| ПриходнаяНакладнаяТовары.Номенклатура,
| ПриходнаяНакладнаяТовары.ЕдиницаИзмерения,
| ПриходнаяНакладнаяТовары.Коэффициент,
| ПриходнаяНакладнаяТовары.Количество,
| ПриходнаяНакладнаяТовары.Цена,
| ПриходнаяНакладнаяТовары.Сумма,
| ПриходнаяНакладнаяТовары.Качество
|ИЗ
| Документ.ПриходнаяНакладная.Товары КАК ПриходнаяНакладнаяТовары
|ГДЕ
| ПриходнаяНакладнаяТовары.Ссылка В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ПриходнаяНакладная.Ссылка
| ИЗ
| Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
| ГДЕ
| ПриходнаяНакладная.Контрагент = &Контрагент
| И ПриходнаяНакладная.Проведен
| УПОРЯДОЧИТЬ ПО
| ПриходнаяНакладная.Дата УБЫВ)”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
//?есть ли способ сразу выгрузить результат запроса в Товары?
Пока Выборка.Следующий() Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;
КонецЕсли;
КонецПроцедуры</code>
Аналогично для док. РасходнаяНакладная
Печать док. РасходнаяНакладная, через Конструктор и доработал Шапку и Подвал в Модуль менеджера
….
<code> Если Выборка.Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
ОбластьЗаголовок.Параметры.ЗаголовокДок = “Торг-12”;
Иначе
ОбластьЗаголовок.Параметры.ЗаголовокДок = “Товарный чек”;
КонецЕсли;
…
Подвал.Параметры.Ответственный = ПараметрыСеанса.ТекущийПользователь;
//Подвал.Параметры.Ответственный = глТекущийПользователь; это грабли от ЕГ валит ошибку при контроле
Подвал.Параметры.КонтактноеЛицоКонтрагента = Выборка.КонтактноеЛицоКонтрагента;
Подвал.Параметры.СуммаПрописью = ЧислоПрописью(Сумма,”Л = ru_RU”, “рубль, рубля, рублей, м, копейка, копейки, копеек ж, 2”);
ТабДок.Вывести(Подвал);</code>
Создала Справочник Сотрудники, документы ПоступлениеТоваров, РеализацияТоваров, Контакты.
В документе поступление реквизит контрагент имеет составной тип данных (справочники контрагенты, сотрудники). В форме документа реализовано событие при изменении номенклатуры для проставления базовой единицы измерения по умолчанию. В табличной части можно указать степень брака номенклатуры.
Создала перечисление Виды Контактов.
Для ввода на основании справочника в модуле объекта документов создала запрос по соответствующим документам, упорядоченный по дате (убыв) с выборкой 1 документа, по которому и делается заполнение.
Создала две команды печать для юр.лиц и физ.лиц
Макеты на основе конструктора печати с доработкой результата. В подвале для параметра сумма использовала функцию форматирования ЧислоПрописью(), для Поставщика
ТекПользователь=Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя());
ТекПользователь=Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя());
Задание выполнил. Сложностей не возникло.
Создал:
– два справочника “ФизическиеЛица” и “КачетвоТоваров”,
– три документа “Закупка”, “Реализация” и “Событие”,
– три перечисления “ВидЗакупки”, “ТипКонтрагента”, “ТипСобытия”.
Перед записью документа “Закупка” определяется тип закупки, если реквизит выбран из справочника “Контрагенты”, то документу присваиваться тип операции “От поставщика”, если контрагент выбран из справочника “ФизическеиЛица”, то присваиваться операция “На подотчетное лицо”. Все операции с табличной частью реализовал через процедуру при изменении номенклатуры, через неё сделал несколько серверных функций для автоматического заполнения базовой единицы и установки качества товара по умолчанию. Учет бракованного товара реализовал через справочник “КачествоТоваров”, с двумя предопределенными значениями “Новый” и “Брак”. Документ “Реализация” сделал на основе документа “Закупка”.
Создал документ “Событие”, для фиксации всех контактов менеджеров с клиентами.
Ввод на основании сделал похожим для документа “Закупка” и “Реализация”, изменил только таблицы в запросе. Для документа “Закупка”:
<code>
Запрос = Новый Запрос;
Запрос.Текст =”ВЫБРАТЬ
| ЗакупкаТовары.Номенклатура,
| ЗакупкаТовары.ЕдиницаИзмерения,
| ЗакупкаТовары.Количество,
| ЗакупкаТовары.Качество,
| ЗакупкаТовары.Ссылка,
| ЗакупкаТовары.Цена,
| ЗакупкаТовары.Сумма
|ИЗ
| Документ.Закупка.Товары КАК ЗакупкаТовары
|ГДЕ
| ЗакупкаТовары.Ссылка В
| (ВЫБРАТЬ
| Закупка.Ссылка
| ИЗ
| Документ.Закупка КАК Закупка
| ГДЕ
| Закупка.Контрагент = &Контрагент)”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НоваяСтрока=Товары.Добавить();
НоваяСтрока.Номенклатура=ВыборкаДетальныеЗаписи.Номенклатура;
НоваяСтрока.ЕдиницаИзмерения=ВыборкаДетальныеЗаписи.ЕдиницаИзмерения;
НоваяСтрока.Количество=ВыборкаДетальныеЗаписи.Количество;
НоваяСтрока.Качество=ВыборкаДетальныеЗаписи.Качество;
НоваяСтрока.Цена=ВыборкаДетальныеЗаписи.Цена;
НоваяСтрока.Сумма=ВыборкаДетальныеЗаписи.Сумма;
КонецЦикла;
</code>
Печатную форму сделал через конструктор, потом немного поправил, добавил условие проверки контрагента на принадлежность к юр.лицу или физ.лицу. Добавил подписи в подвал и сумму прописью. Сумму прописью реализовал через стандартную функцию:
<code>
СуммаПрописью=ЧислоПрописью(Сумма, “Л=ru_RU”,”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″);
</code>
Что-то я напутал с запросом при вводе на основании. Посмотрел решение, переделал свой запрос, теперь всё работает:) Особенно понравился приём с заменой строки в запросе…я раньше всегда подставлял в сам запрос переменную и это было не удобно, так как нельзя было вызвать конструктор. Теперь буду пользоваться заменной строки:) Спасибо:)
Создал следующие объекты:
Справочники:ФизическиеЛица, Сотрудники (подчинён Физлицам), Брак (подчинён Номенклатуре). (какое-то смутное чувство по поводу того, что брак это по сути вид характеристик, но пока ПланыВидовХарактеристик не проходили — сделал справочником).
Перечисления: Контакты (это которые Письма, Звонки, Встречи в задании).
Документы: ПоступлениеТоваров (расширенное представление как Документы поступления), РеализацияТоваров (расширенное представление как Документы реализации), Контакты.
В ПоступленииТоваров и РеализацииТоваров реквизиты Контрагент и Покупатель соответственно составного типа данных СправочникСсылка.ФизическиеЛица и СправочникСсылка.Контрагенты. В РеализацииТоваров реквизиту КонтактноеЛицо установил свойство «Связи параметров выбора» как Отбор.Владелец(Покупатель).
Немного отошёл от задания и сделал проверку на обязательность заполнения реквизита КонтактноеЛицо в РеализацииТоваров только у ЮрЛиц. По сути — покупатель физлицо сам и будет контактным лицом. Думаю, что для упрощения оформления продаж, можно завести служебный элемент справочника ФизическиеЛица «ФизЛицо» без указания контактных данных.
С документом Контакты проблем не возникло. Для реквизита КонтактноеЛицо также заполнил свойство «Связи параметров выбора» как Отбор.Владелец(Клиент).
Дополнил документы поступления и реализации заполнением на основании справочника Контрагенты. Привожу листинг для ПоступленияТоваров, реализация сделана по аналогии — с учётом названий ТЧ и реквизитов. (краткое пояснение: в запросе нахожу последний проведённый документ данного контрагента и в результате запроса возвращаю таблицу значений, в которой содержатся строки ТЧ этого документа)
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Контрагенты") Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Результат = ЗапросТабличнойЧастиНаСервере(Контрагент);
Если Результат.Количество() > 0 Тогда
Поступление.Добавить();
Поступление.Загрузить(Результат[0][0]);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗапросТабличнойЧастиНаСервере(Контрагент) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Поступление.(
| Ссылка,
| НомерСтроки,
| Номенклатура,
| Количество,
| ЕденицыИзмерения,
| Цена,
| Сумма,
| Брак
| )
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Контрагент = &Контрагент
| И ПоступлениеТоваров.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.МоментВремени УБЫВ";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;
КонецФункции
В выборке берётся только первый элемент с учётом того, что МоментВремени является уникальным и, соответственно, повторы исключены.
Листинг Модуля формы документа РеализацияТоваров:
Процедура РеализацияНоменклатураПриИзменении(Элемент)
ТекДанные = Элементы.Реализация.ТекущиеДанные;
ТекДанные.ЕденицыИзмерения = ПолучитьЕдиницуИзмерения(ТекДанные.Номенклатура);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЕдиницуИзмерения(Ссылка) Экспорт
Возврат Ссылка.БазоваяЕденица;
КонецФункции // ИзменениеНоменклатурыНаСервере() Экспорт
&НаКлиенте
Процедура РеализацияКоличествоПриИзменении(Элемент)
РасчетСкидки();
РасчетСуммы();
КонецПроцедуры
&НаКлиенте
Процедура РеализацияЦенаПриИзменении(Элемент)
РасчетСкидки();
РасчетСуммы();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСкидку(Ссылка) Экспорт
Возврат Ссылка.Скидка;
КонецФункции // ПолучитьСкидку(Ссылка) Экспорт()
&НаКлиенте
Процедура РеализацияБракПриИзменении(Элемент)
ТекДанные = Элементы.Реализация.ТекущиеДанные;
Скидка = ПолучитьСкидку(ТекДанные.Брак);
ТекДанные.Скидка = Скидка;
РасчетСкидки();
РасчетСуммы();
КонецПроцедуры
&НаКлиенте
Процедура РасчетСкидки()
ТекДанные = Элементы.Реализация.ТекущиеДанные;
ТекДанные.СуммаСкидки = ТекДанные.Цена * ТекДанные.Количество * (ТекДанные.Скидка/100);
КонецПроцедуры
&НаКлиенте
Процедура РасчетСуммы()
ТекДанные = Элементы.Реализация.ТекущиеДанные;
ТекДанные.Сумма = ОбщиеФункцииКлиент.ПолучитьСумму(ТекДанные.Количество, ТекДанные.Цена) - ТекДанные.СуммаСкидки;
КонецПроцедуры
&НаКлиенте
Процедура ПокупательПриИзменении(Элемент) //процедура убирает отметку незаполненного поля, если покупатель - физлицо
Элементы.КонтактноеЛицо.ОтметкаНезаполненного = Ложь;
ЮрЛицо = ПокупательПриИзмененииНаСервере();
Если ЮрЛицо Тогда
Элементы.КонтактноеЛицо.АвтоОтметкаНезаполненного = Ложь;
Иначе
Элементы.КонтактноеЛицо.АвтоОтметкаНезаполненного = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПокупательПриИзмененииНаСервере() Экспорт
Возврат НЕ ТипЗнч(Объект.Покупатель) = ТипЗнч(Справочники.Контрагенты.ПустаяСсылка()); Объект.КонтактноеЛицо.ПолучитьОбъект().КонтактноеЛицо.ОтметкаЗаполнения = Истина;
КонецФункции // ПокупательПриИзмененииНаСервере() Экспорт
Печать документа сделал с помощью конструктора, в соответствии с образцом. Потом немного доработал полученный код, чтоб формировался заголовок и сумма прописью. Листинг Модуля менеджера документа РеализацияТоваров:
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
Макет = Документы.РеализацияТоваров.ПолучитьМакет("Печать");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваров.Дата,
| РеализацияТоваров.Номер,
| РеализацияТоваров.Покупатель,
| РеализацияТоваров.КонтактноеЛицо,
| РеализацияТоваров.Реализация.(
| НомерСтроки,
| Номенклатура,
| ЕденицыИзмерения,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка В(&Ссылка)";
Запрос.Параметры.Вставить("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьРеализацияШапка = Макет.ПолучитьОбласть("РеализацияШапка");
ОбластьРеализация = Макет.ПолучитьОбласть("Реализация");
Подвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Если ТипЗнч(Выборка.Покупатель) = ТипЗнч(Справочники.Контрагенты.ПустаяСсылка()) Тогда
ОбластьЗаголовок.Параметры.Заголовок = "Торг-12";
Иначе
ОбластьЗаголовок.Параметры.Заголовок = "Товарный чек";
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьРеализацияШапка);
ВыборкаРеализация = Выборка.Реализация.Выбрать();
ИтогСумма = 0;
Пока ВыборкаРеализация.Следующий() Цикл
ОбластьРеализация.Параметры.Заполнить(ВыборкаРеализация);
ТабДок.Вывести(ОбластьРеализация, ВыборкаРеализация.Уровень());
ИтогСумма = ИтогСумма + ВыборкаРеализация.Сумма;
КонецЦикла;
Подвал.Параметры.Заполнить(Выборка);
Подвал.Параметры.Пользователь = ИмяПользователя();
ФормСтрока = "Л = ru_RU; НП = Истина; ДП = Ложь";
ПарамПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
Подвал.Параметры.СуммаПрописью = ЧислоПрописью(ИтогСумма, ФормСтрока, ПарамПредмета);
ТабДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
//}}
КонецПроцедуры
Евгений, если это не сложно – задайте пожалуйста вопрос веб-мастеру. Не мог бы он прикрутить создание спойлеров в комментариях (по типу n-wp.ru/3122)? чтоб куски кода можно было прятать?
Просьбу передал.
Вполне возможно в ближайшее время сделаем.
Спасибо
Если получится, как нибудь централизованно сообщите пожалуйста ))
PS. А ещё можно было бы “прикрутить” плагин со смайликами, но это уже так….. мечты….
Факты закупки регистрируются документом ПоступлениеТоваров с реквизитами
ВидПоступления типа ПеречислениеСсылка.ВидыПоступления, Поставщик типа
СправочникСсылка.Контрагенты и ПодотчетноеЛицо типа СправочникСсылка.Сотрудники.
Перечисление ВидыПоступления имеет два значения ОтПоставщика и ЧерезПодотчетноеЛицо.
Табличная часть Товары содержит реквизиты Номенклатура, ЕдиницаИзмерения,
Количество, Цена, Сумма и СтепеньБрака типа СправочникСсылка.СтепениБрака.
У всех трех реквизитов документа у свойства проверка заполнения
установлено значение Выдавать ошибку.
В зависимости от выбора вида поступления устанавливается видимость либо поставщика,
либо подотчетного лица.
Все нестандартное поведение документа, обусловленное условиями задания,
реализовано с помощью процедур и функций модуля объекта и модуля основной формы документа.
Модуль формы:
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьВидимостьПоставщикаИПодотчетногоЛица();
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимостьПоставщикаИПодотчетногоЛица()
Если Объект.ВидПоступления = Перечисления.ВидыПоступления.ОтПоставщика Тогда
Элементы.Поставщик.Видимость = Истина;
Элементы.ПодотчетноеЛицо.Видимость = Ложь;
ИначеЕсли Объект.ВидПоступления = Перечисления.ВидыПоступления.ЧерезПодотчетноеЛицо Тогда
Элементы.Поставщик.Видимость = Ложь;
Элементы.ПодотчетноеЛицо.Видимость = Истина;
КонецЕсли;
КонецПроцедуры // УстановитьВидимостьПоставщикаИПодотчетногоЛица()
&НаСервереБезКонтекста
Функция ВидимостьПоставщика(ВидПоступления)
Если ВидПоступления = Перечисления.ВидыПоступления.ОтПоставщика Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции // ВидимостьПоставщика()
&НаКлиенте
Процедура ВидПоступленияПриИзменении(Элемент)
Если ВидимостьПоставщика(Объект.ВидПоступления) Тогда
Элементы.Поставщик.Видимость = Истина;
Элементы.ПодотчетноеЛицо.Видимость = Ложь;
Иначе
Элементы.Поставщик.Видимость = Ложь;
Элементы.ПодотчетноеЛицо.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТД = Элементы.Товары.ТекущиеДанные;
ТД.ЕдиницаИзмерения = ПолучитьБазовуюЕдиницуИзмерения(ТД.Номенклатура);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьБазовуюЕдиницуИзмерения(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору = ЕдиницыИзмеренияНоменклатуры.Владелец.БазоваяЕдиница
| И ЕдиницыИзмеренияНоменклатуры.К = 1”;
Запрос.УстановитьПараметр(“Владелец”, Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Справочники.ЕдиницыИзмеренияНоменклатуры.ПустаяСсылка();
КонецЕсли;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Возврат ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
КонецФункции // ПолучитьБазовуюЕдиницуИзмерения()
&НаКлиенте
Процедура ПересчитатьСумму()
ТД = Элементы.Товары.ТекущиеДанные;
ТД.Сумма = ТД.Цена * ТД.Количество;
КонецПроцедуры // ПересчитатьСумму()
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
ПересчитатьСумму();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
ПересчитатьСумму();
КонецПроцедуры
</code>
Модуль объекта:
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
ВидПоступления = Перечисления.ВидыПоступления.ОтПоставщика;
Поставщик = ДанныеЗаполнения;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка КАК Ссылка,
| ПоступлениеТоваров.Дата КАК Дата,
| ПоступлениеТоваров.Товары.(
| Номенклатура,
| ЕдиницаИзмерения,
| Количество,
| Цена,
| Сумма,
| СтепеньБрака
| )
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Поставщик = &Поставщик
| И ПоступлениеТоваров.Проведен
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ,
| Ссылка УБЫВ”;
Запрос.УстановитьПараметр(“Поставщик”, ДанныеЗаполнения);
Запрос.УстановитьПараметр(“Проведен”, Проведен);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Товары.Загрузить(ВыборкаДетальныеЗаписи.Товары.Выгрузить());
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидПоступления = Перечисления.ВидыПоступления.ОтПоставщика Тогда
Индекс = ПроверяемыеРеквизиты.Найти(“ПодотчетноеЛицо”);
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
ИначеЕсли ВидПоступления = Перечисления.ВидыПоступления.ЧерезПодотчетноеЛицо Тогда
Индекс = ПроверяемыеРеквизиты.Найти(“Поставщик”);
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ВидПоступления = Перечисления.ВидыПоступления.ОтПоставщика Тогда
ПодотчетноеЛицо = Справочники.Сотрудники.ПустаяСсылка();
ИначеЕсли ВидПоступления = Перечисления.ВидыПоступления.ЧерезПодотчетноеЛицо Тогда
Поставщик = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
</code>
Документ РеализацияТоваров реализован почти идентично за исключением мелких деталей.
Табличная часть совпадает полностью с табличной частью ПоступлениеТоваров. Реквизит ВидРеализации
типа ПеречислениеСсылка.ВидыРеализации (значения ЮридическомуЛицу и ФизическомуЛицу). Реквизиты
Покупатель (СправочникСсылка.Контрагенты) и КонтактноеЛицо (СправочникСсылка.КонтактныеЛицаКонтрагентов).
Если выбрать вид реализации ФизическомуЛицу, исчезают покупатель и контактное лицо.
Печать отгрузки я реализовал с помощью конструктора печати. Дальше добавил в макет
новую область ШапкаПокупатель и перенес в нее контрагента, сделал необходимые изменения в подвале.
Вот основные изменения в процедуре Печать() модуля менеджера документа:
1. В запрос добавил поле РеализацияТоваров.ВидРеализации.
2. В зависимости от вида реализации изменил вывод шапки:
<code>
Если Выборка.ВидРеализации = Перечисления.ВидыРеализации.ЮридическомуЛицу Тогда
ОбластьЗаголовок.Параметры.ВидДокумента = “ТОРГ-12”;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ШапкаПокупатель.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ШапкаПокупатель, Выборка.Уровень());
ИначеЕсли Выборка.ВидРеализации = Перечисления.ВидыРеализации.ФизическомуЛицу Тогда
ОбластьЗаголовок.Параметры.ВидДокумента = “Товарный чек”;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
КонецЕсли;
</code>
3. Вычисление суммы документа и вывод ее на печать прописью:
<code>
ФормСтрока = “Л = ru_RU; ДП = Ложь”;
ПарПредмета=”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″;
Подвал.Параметры.ВсегоСумма = ЧислоПрописью(Выборка.Товары.Выгрузить().Итог(“Сумма”),ФормСтрока,ПарПредмета);
</code>
Закупка запчастей реализована с помощью 2-х документов: “Поступление товаров” (покупка у контрагентов), “Авансовый отчет”. (закупка подотчетным лицом). Документы отличаются 1 реквизитом: контрагент или сотрудник. Поступления .
Брак реализован отдельной табличной частью в документах поступления с добавленной колонкой “Виды брака” (справочник с реквизитом процент)
Для справочника “контрагенты” добавлен реквизит (перечисление обязательного заполнения) ЮрФизЛицо.
Контакты необходимо хранить с помощью
объекта “Документ”
Контакты необходимо хранить с помощью объекта “Документ” – создан документ “Общение с клиентами”
Приведу код ввода на основании для документа “Поступление товаров”. Модуль объекта:
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
ПолучитьДанныеЗаполнения(ДанныеЗаполнения);
Контрагент = ДанныеЗаполнения.Ссылка;
Если ДанныеЗаполнения.Истина Тогда
ДоговорКонтрагента = ДанныеЗаполнения.ДоговорКонтрагента;
Таблица = ДанныеЗаполнения.Товары.Выгрузить();
Брак = ДанныеЗаполнения.Брак.Выгрузить();
Товары.Загрузить(Таблица);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьДанныеЗаполнения(ДанныеЗаполнения)
СсылкаК = ДанныеЗаполнения.Ссылка;
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить(“Ссылка”, СсылкаК);
ДанныеЗаполнения.Вставить(“Истина”, Истина);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ПоступлениеТоваров.Ссылка,
| ПоступлениеТоваров.МоментВремени КАК МоментВремени
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Контрагент = &Ссылка
| И ПоступлениеТоваров.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| МоментВремени”;
Запрос.УстановитьПараметр(“Ссылка”, СсылкаК);
Если Запрос.Выполнить().Пустой() Тогда
ДанныеЗаполнения.Вставить(“Истина”, Ложь);
Возврат;
КонецЕсли;
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
СсылкаДок = Результат.Ссылка;
КонецЦикла;
ДанныеЗаполнения.Вставить(“ДоговорКонтрагента”, СсылкаДок.ДоговорКонтрагента);
ДанныеЗаполнения.Вставить(“Товары”, СсылкаДок.Товары);
ДанныеЗаполнения.Вставить(“Брак”, СсылкаДок.Брак);
КонецПроцедуры // ПолучитьДанныеЗаполнения()
</code>
Реализован документ “Реализация товаров”
Модуль менеджера:
<code> Процедура Печать(ТабДок, Ссылка) Экспорт
//{{_КОНСТРУКТОР_ПЕЧАТИ(Печать)
Макет = Документы.РеализацияТоваров.ПолучитьМакет(“Печать”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваров.Дата,
| РеализацияТоваров.КонтактноеЛицо,
| РеализацияТоваров.Контрагент,
| РеализацияТоваров.Номер,
| РеализацияТоваров.Товары.(
| НомерСтроки,
| Номенклатура,
| ЕдиницаИзмерения,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка В (&Ссылка)”;
Запрос.Параметры.Вставить(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть(“Заголовок”);
Шапка = Макет.ПолучитьОбласть(“Шапка”);
ОбластьТоварыШапка = Макет.ПолучитьОбласть(“ТоварыШапка”);
ОбластьТовары = Макет.ПолучитьОбласть(“Товары”);
Подвал = Макет.ПолучитьОбласть(“Подвал”);
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Если Выборка.Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
ОбластьЗаголовок.Параметры.Реализация = “Торг-12”;
Иначе
ОбластьЗаголовок.Параметры.Реализация = “Товарный чек”;
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьТоварыШапка);
ВыборкаТовары = Выборка.Товары.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень());
КонецЦикла;
Подвал.Параметры.Заполнить(Выборка);
Пользователь = НайтиПользователя();
Подвал.Параметры.Пользователь = Пользователь.Наименование;
ФормСтрока = “Л = ru_RU; ДП = Истина”;
ПарПредмета=”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″;
Подвал.Параметры.СуммаПрописью = ЧислоПрописью(Ссылка.Получить(0).Ссылка.Товары.Итог(“Сумма”), ФормСтрока, ПарПредмета);
ТабДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
//}}
КонецПроцедуры
</code>
Одним словом, проблем не было :)
Задание выполнил.
1. Документ “ПоступлениеТоваров”. Кроме реквизита “Поставщик” – еще “Подотчетник” с типом “СправочникСсылка.Сотрудники”.
В т.ч. “Товары” у реквизита “ЕдиницаИзмерения” указал связь параметров выбора – владелец “Номенклатура”. “ВидБрака” выбирается из соотв. справочника. В форме, при изменении номенклатуры, делаю серверный вызов с запросом, возвращающий базовую ед. изм. ном-ры. Подставляю единицу в ТекущиеДанные соотв. элемента формы. Вид контрагента – реквизит, перечисление (ю.л. или ф.л.)
2. Документ “Контакт” с рекв. “Вид” – “ПеречислениеСсылка.ВидКонтакта”. На форме как радио-кнопка. Связи реквизитов по владельцу.
3. Ввод на основании справочника (для примера один):
<code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Покупатель = ДанныеЗаполнения;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваровТовары.Ссылка,
| РеализацияТоваровТовары.НомерСтроки,
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.ЕдиницаИзмерения,
| РеализацияТоваровТовары.Цена,
| РеализацияТоваровТовары.Количество,
| РеализацияТоваровТовары.Сумма,
| РеализацияТоваровТовары.ВидБрака
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка.Проведен
| И РеализацияТоваровТовары.Ссылка.Покупатель = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| РеализацияТоваровТовары.Ссылка.МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Товары.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецЕсли;
КонецПроцедуры</code>
4. Печать – конструктор с доработкой. В запросе сразу получаю заголовок документа через “Выбор” и проверки вида контрагента.
С суммой пропись помог СП:
<code>ФормСтрока = “Л=ru_RU; ЧЦ=15; ЧДЦ=2; ДП=Ложь”;
ПарПредмета=”рубль,рубля,рублей,м,копейка,копейки,копеек,м,2″;
Подвал.Параметры.СуммаПрописью = ЧислоПрописью(СуммаИтог, ФормСтрока, ПарПредмета);</code>
Задание сделал. Создал документы Закупка и Реализация. Добавил справочник Качество номенклатуры. В Закупке указал реквизит Подотчетное лицо, необязательный к заполнению. В контрагентах добавил признак юр.лицо/ физ.лицо (перечисление). Добавил документ Контакт с видом контакта (перечисление). Реализовал ввод на основании, единую процедуру вынес в общие – возвращает таблицу значений, которая загружается в табличную часть нового документа. Печатная форма также создана.
Задание выполнил.
Были созданы указанные в задании объекты, добавлен справочник “Качество”, для указания качества товара в табличной части. Созданы документы “Поступление товаров”, ” Реализация” и “Событие”.
Для заполнения документа при вводе на основании сделал универсальный запрос. Правда, не уверен, что он оптимальный.
Болванку печатной формы сделал конструктором, потом доработал некоторые моменты. Интересно, что при выполнении команды на печать происходит автоматическая запись документа. Понятно, почему это сделано – данные для печати выбираются запросом, поэтому запись необходима. Однако, все равно… несколько неожиданный эффект.
>Интересно, что при выполнении команды на печать происходит автоматическая запись документа.
Это одна из “фишек” платформы.
Мы ее рассматривали в серии “Осторожно, 1С” (см. бонусы на дисках).
Вопрос: “… закупка может осуществляться от поставщика, либо подотчетное лицо (собственного сотрудника )”. Сотрудник поставщика или наш?
Собственный сотрудник означает, что это наш человек.
Сделано.
Добавлены:
перечисление “ВидКонтакта”(Звонок/письмо/встреча)
справочники “СтепеньБрака” и “Сотрудники”
Документы “Поступление”, “Реализация”, “Контакт”
В обоих документах реквизит Контрагент имеет составной тип данных ссылки на справочники Контрагенты и Сотрудники. Для “Поступления” обеспечен ввод на основании справочника “Контрагенты”. При этом заполняется реквизит Контрагент документа. В шапку док. “Реализация” добавлен реквизит “КонтактноеЛицо”, выбор которого осуществляется с использованием отбора на основании выбранного Контрагента средствами платформы. Для ТаблЧастей документов обеспечен пересчет Колич/цены/Суммы. При выборе Номенклатуры базовая ед.измерения заносится в соответствующую колонку ТЧ. Для Поступления добавлен реквизит ТЧ “Брак”(ссылка на справочник), для реализации “Скидка”(число).
Заполнение ТЧ при вводе на основании реализовано через запрос, результаты которого загружаются в ТЧ(РезультатЗапроса.Выгрузить() и потом ТЧ.Загрузить()). Запрос “вложенный”. Сначала ищется ссылка на нужный док, а затем выбирается ТЧ этого дока.
Документ “Контакт”. На форме которого “ВидКонтакта” реализован полем переключателя, а тема как поле текстового документа.
Печать документа реализована в модуле команды “Печать”, которая добавлена в объект док.Реализация. Все реквизиты дока выбираются по ссылке через точку. Макет “нарисован руками”. Табличный документ заполняется “наСервере” и возвращается на клиента, где и показывается.
Не много запуталась только с вводом на основании, так как выбирала документ из двух видов(Поступления и Отгрузки- объединила эти ссылки в запросе)с отбором по данному контрагенту, уже вложенный запрос отсортировала по моменту времени убыв и из этого списка выбрала первые, после уже воспользовалась внутр.соединением с вложенным запросом(в котором объединены ТЧ.Товары поступления и отгрузки) по ссылке. Но даже так, всё получилось. Остальное без сложностей. Задание выполнено.
Задание выполнил.
Добавил
Перечисления:
ВидыКонтрагентов (ЮрЛицо,ФизЛицо), ВидыКонтактов(Встреча,Звонок,Письмо).
Справочники:
Сотрудники (реквизит Должность), СостоянияТоваров (реквизит ПроцентСкидки)
Добавил реквизит ВидКонтрагента в справочник Контрагенты.
Документы:
ПоступлениеТоваров. Шапка: Контрагент, ПодотчетноеЛицо – тип справочник “Сотрудники”,
ТЧ: Номенклатура, Единица, СостояниеТовара,Количество,Цена, Сумма + добавил для себя Коэффициент.
Привязываю Единицу к Номенклатуре на уровне реквизитов объекта. Подстановка значений по умолчанию и расчет суммы – как по видео-урокам.
РеализацияТоваров. Шапка: Контрагент, КонтактноеЛицо (связываю на уровне реквизитов с Контрагентом),
ТЧ: Номенклатура, Единица, СостояниеТовара,Количество,Цена, Сумма + добавил для себя Коэффициент и ПроцентСкидки (заполняю по умолчанию при изменении реквизита справочника СостоянияТоваров).
Соответственно расчет суммы – с учетом процента скидки.
Работа с формой – по аналогии с видео-уроками.
Для создания макета воспользовался Конструктором и внес свои изменения. В частности в зависимости от значения ВИДА КОНТРАГЕНТА меняю название печатной формы.
ИНТЕРЕСНЫМ показался сгенерированный запрос по табличным частям документов реализации – взял на “вооружение” :)
Для ввода на основании справочника “Контрагенты” вынес в общий серверный модуль функцию с запросом с параметром ВИДДокумента:
<code>
Функция ВернутьДокументОснованиеКонтрагента(Контрагент, ВидДока) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| Док.Ссылка КАК Основание
|ИЗ
| Документ.”+ВидДока+” КАК Док
|ГДЕ
| Док.Контрагент = &Контрагент
| И Док.Проведен = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| Док.МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
ВыборкаДетальныеЗаписи = Результат.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Возврат ВыборкаДетальныеЗаписи.Основание;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
</code>
Документ Контакт. Шапка: Сотрудник, ВидКонтакта, Контрагент, КонтактноеЛицо, Заголовок, Тема.
В документе ПоступлениеТоваров выбор между Контрагентом и Подотчетным лицом реализовал через радио-кнопки.
В лекции ”Сравнение оперативного проведения с механизмом точки актуальности платформы 7.7″ говорить, что время компьютера в платформе 8 в клиент серверном, берется с сервера, на самом деле в 8.1 береться с локального ПК с которого работают, или это как то настраивается, или речь шла о 8.2?
В серверном вызове и для 8.1 время будет браться серверное.
Если не сложно сообщите имя урока и время, я прослушаю его еще раз.
Задание выполнил.
Создал документ ПоступлениеТМЦ с реквизитом Контрагент ( тип справочник Контрагенты) и реквизит КонтактныеЛица (тип справочник КонтактныеЛица), добавил реквизит СуммаДокумента(тип число)
В справочник Номенклатура добавил реквизит ЕдиницаХраненияОстатков с типом ЕдиницыИзмеренияНоменклатуры.
Добавил табличную часть к документу ПоступлениеТМЦ и у реквизита ЕдиницаИзмерения установил связь параметров выбора с реквизитом Номенклатура. Заполнение в форме выполнил через вызов серверной функции из процедуры события ПриИзмененииНоменклатуры формы
Добавил справочник КачествоТовара и в него предопределенный элемент Новый
Добавил реквизит Качество в ТЧ документа ПоступлениеТМЦ
Добавил документ Событие и в него реквизиты ВидСобытия(тип Перечисление.ВидыСобытий), Контрагент (тип справочник.Контрагенты) , КонтактныеЛица (составной тип КонтЛица и КонтЛицаКонтрагентов), Заголовок и Тема (строки)
Ввод на основании сделал через процедуру ОбработкуЗаполнения. Привожу текст процедуры для ПоступленияТМЦ:
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст=”ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТМЦ.Ссылка
|ИЗ
| Документ.ПоступлениеТМЦ КАК ПоступлениеТМЦ
|ГДЕ
| ПоступлениеТМЦ.Проведен = ИСТИНА
| И ПоступлениеТМЦ.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТМЦ.Ссылка УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”,ДанныеЗаполнения.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество()> 0 Тогда
Пока Выборка.Следующий() Цикл
Товары.Загрузить(Выборка.Ссылка.Товары.Выгрузить());
КонецЦикла;
КонецЕсли;
Контрагент = ДанныеЗаполнения.Ссылка;
КонецЕсли;
КонецПроцедуры
</code>
Добавил в Справочник Контрагенты реквизит ФизЛицо (тип Булево).
Реализация сделана аналогично ПоступлениюТМЦ , без реквизита КонтактныеЛица. Сделан реквизит КонтактныеЛицаКонтрагента
Печать сделана с помощью Конструктора печати и добавлена проверка при выводе заголовка
Вопрос по ДЗ. Под последним проведенным документом контрагента (основание) подразумевать документ того же вида, что и вводимый на основании?
Да, речь идет о документе соответствующего вида.
Задание, сделал, сложностей не возникло.
Документ Поступление Товара.
Реквизиты : Поставщик – справочник Контрагенты, Состояние товара – Справочник Состояния товара (есть реквизит скидка), Подотчетное лицо – справочник Сотрудники.
Тч Товары. Товар (Номенклатура), ЕИ, Цена, Количество, Сумма. ЕИ связано с Товаром – отбор по Владельцу. При изменении Товара вызывается процедура СерверУстановитьЕИ. Запрос:
<code>ВЫБРАТЬ ЕИНоменклатуры.Ссылка
ИЗ Справочник.ЕИНоменклатуры КАК ЕИНоменклатуры
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО (ЕИНоменклатуры.Владелец = &Владелец)
И ЕИНоменклатуры.ЕИ = Номенклатура.БазоваяЕИ </code>
Документ Отгрузка
Реквизиты Покупатель – Контрагенты, КЛ –Контактные лица. Тч :Товары, Скидка, Цена, Количество, Сумма, ЕИ.
Документ КонтактыКлиентов реквизиты Клиент – справочник Контрагенты, ВидКонтакта – перечисление видыконтактов, КонтактноеЛицо – Контактные лица, Заголовок строка 80, Тема строка неогр.
Обработка ввода на основании справочника контрагенты. Так как не было указано, должен ли соответствовать тип последнего документа вводимому, то я проверяю как поступления, так и отгрузки, т.е запрос для получения данных один как для поступлений, так и для отгрузок с данным контрагентом. Далее совпадающие реквизиты выгружаются в ТЧ.
Печать с помощью конструктора печати. Для суммы прописью использовала функцию ЧислоПрописью
Автоматом пересчитываются суммы в табличных частях документов при изменении количества или цены.