Базовый курс. Домашнее задание №7
Начинаем второй блок базового курса и представляем первое задание по нему.
Для выполнения рекомендуется изучить следующие главы 2-го блока.
Глава 1. Документы
Глава 2. Ввод на основании
Глава 3. Создание печатных форм
Глава 4. Настройка форм документов.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Задание выполнено. С объектами метаданных вопросов не возникало. Немного застряла на Элементы.Товары.ТекущиеДанные. Не знала как обратиться к табл. части! После внимательного просмотра второго блока все получилось: и запросы и ввод на основании. Повозилась с МоментомВремени, а потом сделала по ссылке по убыв. Не догадалась одинаковые действия вынести в общий модуль.
Добрый день, задание выполнил.
1) Создал документы закупки: ПоступлениеТоваров и АвансовыйОтчет (в случае закупки через подотчетника).
2) Ввел типизацию контрагентов (через перечисление): ЮрЛицо, ФизЛицо.
3) Брак реализован через отдельный справочник.
=====
Сложностей в выполнении не возникло. Долго делал, потому что делал вперемешку с заданием №8. Доделаю задание №9 и буду смотреть ответы на задания этого блока.
Задание выполнено. Затруднений не возникло.
Задание выполнил. Примерно также как в решении. Правда сделал основные реквизиты: основную единицу измерения и основное контаткное лицо и выбирал их не запросом, а просто реквизит из справочника.
Задание выполнил. Сложность возникла при вводе документа на оснований справочника “Контрагенты”, сам до этого не дошел подсмотрел у преподавателя.
Задание выполнил. Для хранения сотрудников организации создал справочник физические лица, для раздленения поступления на поступление от контрагента и от подотченика создал перечисление “ХозяйственныеОперации” (Закупка у поставщика, Закупка через подотчетное лицо). Для разделения контрагента на юр и физ лицо создал перечтисление и реквизит в справочнике каонтрагенты. Для хранения степеней бракованности и качества новый создан справочник “Качества”. Для хранения контрактов создан документ “Событие” виды событий – перечисление
ДЗ №7 выполнил. Все получилось. Долго провозился с запросом, когда вложенный запрос неправильно упорядочивает документы по моменту времени. Хорошо что посмотрел ваше решение. Я долго не мог понять, что это глюк платформы…
Да, к сожалению, иногда из-за глюков приходится терять много времени..
С заданием справился.
Трудности только с падением системы. Обновление релиза не помогло. Как Вы и советовали – задал связь параметров выбора на уровне реквизитов объекта.
Возник вопрос – как организовать список выбора для единиц измерения в таб части?
>Возник вопрос – как организовать список выбора для единиц измерения в таб части?
Не совсем понятен вопрос.
Ведь для реквизита табличной части тоже можно задать связи параметров выбора..
Например в решении дз №7 (пока не досмотрел может в конце рассказываете) вы привязываете реквизит едица измерения к номенклатуре. Когда пользователь хочет сменить единицу измерения, то у него на выбор 2 варианта: либо ввод по строке, либо открывать форму выбора. Можно ли сделать чтобы открывался список (выпадающая менюшка что-ли…), не форма выбора, а именно список из одной или нескольких возможных единиц измерения.
Это можно организовать при помощи события “Начало выбора из списка”, а можно как-то попроще? Есть ведь свойство “Список выбора”, как им пользоваться, может есть какая та магия :)
Магия есть :)
Нужно установить свойство “Быстрый выбор” в значение “Да” у элемента формы, отображающем единицу измерения.
Вах, шайтан машина, получилось :) Спасибо
:)
Что я делаю не так:
создаю новый документ, добавляю табличную часть на ней 2 реквизита – Номенклатура тип СправочникСсылка.Номенклатура и ЕдиницаИзмерения тип СправочникСсылка.ЕдиницыИзмерения. ЕдиницыИзмерения подчинен Номенклатуре. Создаю форму документа и пытаюсь для ЕдиницыИзмерения указать “связи параметров выбора”. Добавляю параметр: Отбор.Владелец – Элементы.ТабличнаяЧасть1.ТекущиеДанные.Номенклатура- Очищать.
После этого закрываю диалог “Связи параметров выбора” и платформа успешно падает. Экспериментировал и с полностью новой базой, падает раз через раз. платформа 8.2.12.80
То что падает платформа, это конечно ошибка.
Что можно попробовать:
1. Обновиться до 8.2.13.
2. Задавать связи параметров выбора на уровне реквизитов объекта (я так понял вы для элемента формы настраиваете).
Задание выполнено.
Созданы объекты:
1. Документ “Поступление товаров”. Реквизиты: “Поставщик” тип “СправочникСсылка.Контрагенты, СправочникСсылка.Сотрудники”; табличная часть “Товары” с реквизитами “Товар” тип “СправочникСсылка.Номенклатура”, “ЕдиницаИзмерения” тип “СправочникСсылка.ЕдиницыНоменклатуры”, “Количество”, “Цена”, “Сумма” все – число, “СтепеньБрака” тип “СправочникСсылка.СтепениБрака”
2. Документ “Реализация товаров”. Реквизиты: “Покупатель” тип “СправочникСсылка.Контрагент”, “КонтактноеЛицо” тип “СправочникСсылка.КонтактныеЛицаКонтрагентов”; табличная часть “Товары” с реквизитами, аналогичными документу “Поступление товаров”.
3. Документ “Контакты с клиентами”. Реквизиты: “Контрагент” тип “СправочникСсылка.Контрагенты”, “КонтактноеЛицо” тип “СправочникСсылка.КонтактныеЛицаКонтрагентов”, “Заголовок” тип строка длины 80 и “Тема” тип строка неограниченной длины.
4. Справочник “Сотрудники”
5. Справочник “Степени брака”. Реквизит: “Скидка” тип число длина 3.
6. Перечисление “ЮрФизЛицо” со значениями “ЮрЛицо” и “ФизЛицо”.
Для подстановки базовой единицы измерения при выборе номенклатуры использовано событие “ПриИзменении” поля ввода “Товар” табличной части документа “Поступление товаров”. Для обращения к БД понадобилась вспомогательная функция с директивой компиляции НаСервере.
Для справочника “Контрагенты” добавлен реквизит “ЮрФизЛицо” тип “ПеречислениеСсылка.ЮрФизЛицо”.
Для ввода на основании использовались модули объектов соответствующих документов. Весь код размещен в процедуре “ОбработкаЗаполнения”:
Если ТипЗнч(ДанныеЗаполнения)=Тип(“СправочникСсылка.Контрагенты”) Тогда
….запрос по нужному типу док-в, сортировка по дате по убыванию (ВЫБРАТЬ ПЕРВЫЕ 1), обработка результата
КонецЕсли;
Для организации печатной формы использовался конструктор. Получившийся макет потребовал совсем незначительных доработок (в заголовке шапки вместо текста выражение, в подвале пара доп. строк для вывода суммы прописью и подписей). Вывод суммы прописью осуществлен с помощью функции глобального контекста “ЧислоПрописью()”.
Задание выполнил. Отстаю но постараюсь за неделю догнать.
При выполненни задания создал документы мПоступленияТоваров,мРеализацияТоваров,Контакты, справочник БракованныйТовар и перечисление ВидКонтактаСКонтрагентом (используется в документе Контакты). Еще вернул наименование у справочника единицыИзмерения (а то как то неудобно иметь основное представление в виде кода :) ). В принципе особых затруднений не испытал (очень поннравился конструктор печати и конструктор запроса с обработкой результата), но хотел бы спросить совета, так как думаю что некоторые вещи сделал как то неправильно.
1).при работе изменением единицы измерений: Проблем нет когда меняю базовую единицу (по умлолчанию принимаю за 1) допустим на упаковку с коэффициентом 10. Но допустим я решил изменить упаковку (коэф.=10) на палету (допустим коэф.=50). Для этого я должен сначала перевести упаковку в базовую единицу (перед вызовом процедуры ПриИзменении) и только потом перевести (в процедуре ПриИзменении) перевести в палеты. Сделал так:
<code>
&НаКлиенте
перем СтарыйКоэффициент;
&НаКлиенте
Процедура ТоварыЕдиницаИзмеренийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТД = Элементы.Товары.ТекущиеДанные;
СтарыйКоэффициент = ПолучитьКоэффициентНаСервере(ТД.ЕдиницаИзмерений);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЕдиницаИзмеренийПриИзменении(Элемент)
ТД = Элементы.Товары.ТекущиеДанные;
текКоэффициент = ПолучитьКоэффициентНаСервере(Тд.ЕдиницаИзмерений);
ТД.Количество = ТД.Количество*СтарыйКоэффициент/текКоэффициент;
ПересчитатьСумму();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКоэффициентНаСервере(текЕдиница)
возврат текЕдиница.Коэффициент;
КонецФункции // ПолучитьКоэффициентНаСервере()
</code> Но мне кажется как то не так я сделал. Посоветуйте как сделали бы Вы.
2).У меня контактное лицо контрагента хранится в табличной части справочника мКонтрагенты. Когда я хочу выбрать соответствующее контактное лицо я хочу сделать отбор только по тем контактным лицам которые есть у контрагента. Я сначала формирую запросом список значений с контактными лицами и потом из этого списка выбираю.
<code>
&НаКлиенте
Процедура КонтактноеЛицоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
если ТипЗнч(Объект.Контрагент)=Тип(“СправочникСсылка.мКонтрагенты”) тогда
СЗ = Новый СписокЗначений;
текКонтрагент = Объект.Контрагент;
СЗ = ПолучитьСписокКонтактныхЛицССервера(текКонтрагент);
СтандартнаяОбработка = ложь;
текКЛ = Объект.КонтактноеЛицо;
текКл = СЗ.ВыбратьЭлемент(“Выберите контактное лицо”,текКЛ);
если текКл<>Неопределено тогда
Объект.КонтактноеЛицо = текКЛ.Значение;
конецЕсли;
иначе
конецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьСписокКонтактныхЛицССервера(текКонтрагент)
СЗ = Новый СписокЗначений;
Запрос = Новый Запрос(“ВЫБРАТЬ
| мКонтрагентыКонтактныеЛица.КонтактноеЛицо
|ИЗ
| Справочник.мКонтрагенты.КонтактныеЛица КАК мКонтрагентыКонтактныеЛица
|ГДЕ
| мКонтрагентыКонтактныеЛица.Ссылка = &СсылкаКонтрагент”);
Запрос.УстановитьПараметр(“СсылкаКонтрагент”,текКонтрагент);
ТЗ = Новый ТаблицаЗначений;
ТЗ = Запрос.Выполнить().Выгрузить();
для Каждого Строка из ТЗ Цикл
СЗ.Добавить(Строка.КонтактноеЛицо);
КонецЦикла;
возврат СЗ;
КонецФункции // ПолучитьСписокКонтактныхЛицССервера()
</code>
Как бы вы сделали данный отбор? Т.е. вопрос более общий как правильнее делать произвольный отбор в списке выбора справочника, допустим открывать для выбора только тех сотрудников из Справочник.Сотрудники у которых пол мужской? Причем справочник не подчиненный, иначе легко установить отбор через “связи параметров выбора”.
3) Очень понравилось что почти автоматически сделал заполнение мПоступлениеТоваров на основании справочника мКонтрагенты
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.мКонтрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
ПолучитьПоследнийДокументПоступленияПоКонтрагенту(ДанныеЗаполнения.Ссылка);
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьПоследнийДокументПоступленияПоКонтрагенту(текКонтрагент)
Запрос = Новый Запрос;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| мПоступлениеТоваров.Ссылка КАК Ссылка,
| мПоступлениеТоваров.МоментВремени КАК МоментВремени,
| мПоступлениеТоваров.Товары.(
| Ссылка,
| НомерСтроки,
| Номенклатура,
| ЕдиницаИзмерений,
| Количество,
| Цена,
| Сумма,
| Брак
| )
|ИЗ
| Документ.мПоступлениеТоваров КАК мПоступлениеТоваров
|ГДЕ
| мПоступлениеТоваров.Проведен
| И мПоступлениеТоваров.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”,текКонтрагент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ВыборкаДетальныеЗаписи1 = ВыборкаДетальныеЗаписи.Товары.Выбрать();
пока ВыборкаДетальныеЗаписи1.Следующий() цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = ВыборкаДетальныеЗаписи1.Номенклатура;
НоваяСтрока.ЕдиницаИзмерений = ВыборкаДетальныеЗаписи1.ЕдиницаИзмерений;
НоваяСтрока.Количество = ВыборкаДетальныеЗаписи1.Количество;
НоваяСтрока.Цена = ВыборкаДетальныеЗаписи1.Цена;
НоваяСтрока.Сумма = ВыборкаДетальныеЗаписи1.Сумма;
НоваяСтрока.Брак = ВыборкаДетальныеЗаписи1.Брак;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
</code>
А можно ли как то заполнить программно ДанныеЗаполнения перед передачей их в процедуру ОбработкаЗаполнения()? Используется ли такое где либо и возможно ли такое заполнение?
P.S. Видео – решение задания еще не смотрел, так что если спрашиваю, что там уже освещено – не
отвечайте, просто я отстал сильно и времени посмотреть его еще не было. Но посмотрю обязательно!
По пункту 2.
Все таки нужно пересмотреть вариант хранения контактных лиц.
В вашем решении контрагент и контактное лицо между собой жестко не связаны.
Например, у контрагента А есть лиц Б и В.
В документе выбирают клиента А и лицо Б.
Вроде бы все ОК. Документ проводят.
Далее заходят в карточку клиента удаляют строку с лицом Б.
Получается, что есть в системе документ с контрактным лицом не своего контрагента.
См. решение преподавателя.
По пункту 3.
Можно было обойтись даже без цикла :) См. решение преподавателя.
ДанныеЗаполнения можно заполнить “снаружи”. Но только при программном создании документа.
Схема такая:
1. Создаем документ (ДокументОбъект)
2. Создаем структуру ДанныеЗаполнения.
3. Вызываем метод Заполнить, куда передаем структуру.
Задание выполнил. Наибольшую трудность вызвал запрос заполнения на основании. А так же сам не смог вывести суму строчно. Оч. удобная функция.
наконец нашел время и сделал зание )))
хотя имею большой опыт написания запросов на t-sql, все равно пришлось повозиться с запросом. особых сложностей не было.
Задание выполнил. В основном были трудности с принятием решения, какими элементами конфигурации реализовывать выполнение требований. Что касается собственно реализации, то там было всё вполне понятно, и сделал, в целом, как и у других участников.
Неожиданно было обнаружить, что в формах документов единицы номенклатуры и контактные лица выглядят неподобающим образом (когда удалял наименование, не подумал, что показывать пользователю код в данном случае нехорошо) – пришлось возвращать наименование. Устроил его установку перед записью элемента справочника. При этом можно в форме элемента наименование скрыть от пользователя, чтобы два раза одно и то же слово не появлялось. Конечно, проблема появится, если пользователь изменит наименование единицы измерения (контактного лица). Я встречал случаи, когда конфигурация сама формирует наименование элемента справочника на основании его реквизитов – как правило, возникающие впоследствии рассогласования уже не отслеживаются и поэтому приводят пользователя в недоумение. В общем, это решение ещё таит подводные камни.
Очень интересный глюк с упорядочиванием в подзапросе по моменту времени!
Создал два документа – ЗакупкаЗапчастей (Поставщик, ВидЗакупки, тчНоменклатура) и РеализацияЗапчастей (Контрагент, Менеджер, КонтактноеЛицо, тчНоменклатура).
Табличные части документов аналогичны (Товар, КачествоТовара, Количество, ЕдИзмерения, Стоимость, ОбщаяСУмма).
СОздал перечисление ВидЗакупки с двумя элементами (ОтПоставщика и ЧерезСотрудника).
СОздал перечисление ТипКонтрагента с элементами (ЮрЛицо и ФизЛицо).
СОздал перечисление ТипКонтакта с элементами (ЛичнаяВстреча, Звонок, Письмо).
Создал справочник КачествоТовара.
Создал еще один документ КонтактСКонтрагентами (Заголовок, Тема, КонтактноеЛицо, ТипКонтакта).
Соответствие единицы измерения выбранной на форме документа номенклатуре реализовал через свойство реквизита “Связи параметров выбора”.
Подстановку базовой единицы измерения сделал в обработчике события ПриИзменении() реквизита Товар табличной части тчНоменклатура. Выбранную номенклатуру определил с помощью свойства ТекущиеДанные. В серверном методе, выбирающем единицу измерения, создавал запрос вручную, с конструктором запросов пока разбираюсь.
Новым для меня был способ обхода результата выборки запроса – очень удобный и простой механизм. Также очень порадовал способ
заполнения табличной части документа результатом выборки.
ЭтотОбъект.тчНоменклатура.Загрузить(запросРезультат.Выгрузить());
Процедуру заполнения обоих документов (закупки и продажи) реализовал в общем модуле.
Наибольшие сложности были с водом на основании, взял из решения. Удивила невозможность сортировки по полю
МоментВремени.
На вкладке “Макеты” свойств документа РеализацияЗапчастей создал печатную форму с требуемыми областями вывода и параметрами.
Задание выполнено в целом аналогично выложенному Вами решению.
Существенным отличием является использование в качестве типа реквизита ЮрФизЛицо справочника Контрагенты не перечисления, а составного типа данных «СправочникСсылка.ФизическиеЛица, СправочникСсылка.ЮридическиеЛица» (в конфигурацию был добавлен справочник ЮридическиеЛица).
При просмотре Вашего решения заметил, что в реализации ввода на основании мной была допущена ошибка – в запросе сортировку делал только по дате документов, т.е. не учитывалось, что несколько документов могут располагаться в переделах одной секунды.
ДЗ сделал. Во-первых чуть переделал свою базу в соответствии с решением ДЗ №6: сделал подчиненный справочник контактные лица контрагентов вместо таб части справочника контрагенты.
Сделал справочники “Сотрудники” и “Качества”. Поступление товаров делал двумя разными документами: собственно само поступление и “авансовый отчет” – по аналогии с типовыми конфигурациями. В авансовом отчете в табличной части товары сделал реквизит “Контрагент”, чтобы можно было знать у кого реально купили товар.
Для табличных частей документов “Поступление товаров”, “Авансовый отчет” и “Реализация товаров” определил обработчики при изменении реквизитов:
для номенклатуры автоматически выбирается единица измерения, соответствующая базовой единице измерения. Также автоматически проставляется предопределенное качество “Новый”, выполняется пересчет суммы при изменении количества и цены и пересчет цены при изменении суммы.
Создал документ “Контакт” для отражения контактов менеджеров.
Заполнение при вводе на основании реализовал с помощью запроса:
ВЫБРАТЬ ПЕРВЫЕ 1
ПоступлениеТоваров.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТДок
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ГДЕ
ПоступлениеТоваров.Проведен = ИСТИНА
И ПоступлениеТоваров.Контрагент = &Контрагент
УПОРЯДОЧИТЬ ПО
Ссылка УБЫВ
АВТОУПОРЯДОЧИВАНИЕ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПоступлениеТоваровТовары.Ссылка,
ПоступлениеТоваровТовары.Номенклатура,
ПоступлениеТоваровТовары.Качество,
ПоступлениеТоваровТовары.ЕдиницаИзмерения,
ПоступлениеТоваровТовары.Количество,
ПоступлениеТоваровТовары.Цена,
ПоступлениеТоваровТовары.Сумма
ИЗ
Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары,
ВТДок КАК ВТДок
ГДЕ
ПоступлениеТоваровТовары.Ссылка В
(ВЫБРАТЬ
Т.Ссылка
ИЗ
ВТДок КАК Т)
Печать реализовал при помощи конструктора печати и немного подправил руками, не был выведен подвал табличной части и заголовок не устроил.
Да, для контрагентов добавил реквизит “ВидКонтрагента” – тип перечисление “ВидыКонтрагентов”, где выбираю является клиент Юр или Физ лицом. В зависимости от того кем он является, вывожу нужный заголовок в печатной форме документа реализации.
ДЗ №7 выполнил.
Видео с решением еще не смотрел.
Выполнение затянулось, ввиду желания все делать “путём” :)
Поступления товаров от поставщика или сотрудника решено было делать не одним документом с составным реквизитом, а двумя – “Поступление товаров” и “Авансовый отчет”. Все же это разные хоз.операции.
Для соответствия условиям задания пришлось переделать РС “КонтактныеЛицаКонтрагентов” в подчиненный справочник, чтобы можно было ссылаться на КЛ в документах.
В остальном сложностей не возникло. Приступаю к решению сл. ДЗ.
Задание сделала.
Созданы документы Поступление и Реализация товара. Реквизит Контрагент – составного типа: Контрагент или Сотрудник. Поле табличной части Брак заполняется из одноименного справочника, в котором есть числовой реквизит Скидка. При выборе номенклатуры в это поле ставится предопределенный элемент «Нет» со скидкой 0, но потом его можно изменить. Также для удобства расчетов (чтобы при расчетах не лазить в справочник Брак) введено поле табличной части Скидка, заполняемое автоматически, и участвующее в расчете Суммы.
Единица измерения заполняется вызовом серверной функции:
*********************************
Функция БазоваяЕдиница(Спр) Экспорт
ЕдИзм = Справочники.ЕдиницыИзмерения;
Если ЗначениеЗаполнено(Спр) тогда
Выборка = ЕдИзм.Выбрать(,Спр);
Пока Выборка.Следующий() Цикл
Если Выборка.Единица = Спр.БазоваяЕдиница тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ЕдИзм.ПустаяСсылка();
КонецФункции // БазоваяЕдиница ()
**********************************
Создан документ Контакты, где перечислением выбирается его вид, с реквизитами: Сотрудник, Контрагент, его Контактное лицо, Заголовок, Тема (на форме – поле текстового документа).
Печатная форма Реализации товара создана конструктором и подправлена. Кстати, обнаружила, что в типовой бухгалтерии печати документов организованы без команд.
Больше всего намучалась с вводом на основании, т.к. понятно, что надо делать запросом, а с ними самые большие проблемы. В общем сделала простенько, но действенно, до более сложных запросов еще расти и расти… В обработке заполнения:
*********************************
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТовара.Ссылка
|ИЗ
| Документ.РеализацияТовара КАК РеализацияТовара
|ГДЕ
| РеализацияТовара.Контрагент = &Контрагент
| И РеализацияТовара.Проведен
|
|УПОРЯДОЧИТЬ ПО
| РеализацияТовара.МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() тогда // основание найдено
ДокОсн=ВыборкаДетальныеЗаписи.Ссылка;
КонтактноеЛицо=ДокОсн.КонтактноеЛицо;
Для Каждого Стр из ДокОсн.Товары цикл
НовСтр=Товары.Добавить();
НовСтр.Номенклатура=Стр.Номенклатура;
НовСтр.ЕдиницаИзмерения=Стр.ЕдиницаИзмерения;
НовСтр.Брак=Стр.Брак;
НовСтр.Скидка=Стр.Скидка;
НовСтр.Количество=Стр.Количество;
НовСтр.Цена=Стр.Цена;
НовСтр.Сумма=Стр.Сумма;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Татьяна, можно ваше решение оптимизировать.
Вместе открытия выборки и организации цикла можно было написать строку:
Большое спасибо! Действительно вариант куда лучше. У меня, правда, запрос примитивней чем у Вас, и там нет реквизитов, а только ссылка на документ, но
ДокОсн=ВыборкаДетальныеЗаписи.Ссылка;
Товары.Загрузить(ДокОсн.Товары.Выгрузить());
– все как надо и без лишнего цикла.
Но здесь важно понимать, что ДокОсн.Товары.Выгрузить() по сути еще один запрос к БД.
Поэтому правильнее все данные выбирать одним запросом.
ДЗ выполнил.
Отстаем догоняем…
Новые документы ПоступлениеТовара и РеализацияТовара. В Поступлении реквизит Поставщик – составной тип Справочник.Контрагенты и Справочник.ФизическиеЛица.
Контакты менеджеров регистрируем документом Контакты. Реквизит ТипКонтакта через перечисление.. – проблем не возникло все по заданию. Печать документов тоже без проблем. Конструктор печати с ручными исправлениями.
С подстановкой единицы измерения по умолчанию возникли трудности и
второй сложный момент был в вводе документов по основанию – смог только с подсказкой.
Выполнил.
Создал документы: Заказ, Продажа, Контакты и справочник СтепеньБрака.
В документе Продажа чтобы не было лишнего при выборе КонтрактныхЛиц св-во «Связи параметров выбора»=Отбор.Владелец(Объект.Контрагент).
В документе Продажа сделать так же для выбора реквизита ТЧ ЕденицаИзмерения не получилось, т.к. переделал базу как в эталонном ДЗ№6 (т.е. убрал Наименование в справочнике ЕденицыИзмеренияНоменклатуры), в итоге получается что «Основное представление» может только Кодом. Решил это двумя способами: а)изменил ПутьКДанным, плюс при активации поля ЕденицаИзмерения модально открывается форма выбора б) вернуть реквизит Наименование :)
Со всем остальным вроде бы разобрался.
Да, наименование пришлось вернуть :)
В БД были добавлены:
1. Справочники:
– Сотрудники (используется в документах “Поступление”, “Контакт” )
– СтепеньБракаБрака (используется в документах “Поступление, Отгрузка”)
– МестаХранения (используется в документах “Поступление, Отгрузка”)
2. Перечисления:
– ТипЮрФиз ( Признак юр. и физ.л ица для спр-ка Контрагенты)
– ВидКонтакта (используется в документе “Контакт” )
3. Документы :
3.1 Поступление (реквизит Контрагент, имеет составной тип данных (спр-к Контрагенты и Сотрудники))
———————————————————–
??????? Вопрос??????? В форме документа при выборе реквизита “Контрагент” выводится список всех справочников и выбрать можно любой почему??? мы же задали, что либо спр-к Контрагенты, либо Сотрудники!!! Может я что-то упускаю???
————————————————————–
В табличной части использовала событие формы “ПриИзменении” :
&НаКлиенте
Процедура ТМЦПриИзменении(Элемент)
ТабТМЦ = Элементы.Товары.ТекущиеДанные;
ТабТМЦ.Ед = ПолучитьЕдСервер(ТабТМЦ.ТМЦ);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЕдСервер(Ссылка)
БазЕд = Ссылка.БазЕд;
Ед = Справочники.Единицы.ПустаяСсылка();
ЕдВыборка = Справочники.Единицы.Выбрать(,Ссылка);
Пока ЕдВыборка.Следующий() Цикл
Элемент = ЕдВыборка.ПолучитьОбъект();
Если Элемент.Ед= БазЕд Тогда
Ед = Элемент.Ссылка;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Ед;
КонецФункции // ПриИзмТМЦСервер()
Также в ТЧ, был добавлен реквизит “Брак” – тип Спр-к “СтепеньБрака”.
3.2 Документ Отгрузка , добавлен реквизит КЛ – тип “КонтактныеЛицаКонтрагентов”, с помощью свойства “Связи параметров выбора” связала с реквизитом “Контрагент” + свойство “Проверка заполнения” поставила в режим “Выдавать ошибку”.
Используя конструктор Макетов, создала Макет и при выводе области “Шапка”, проверяю у Контрагента реквизит ВидЮрФиз
Если Выборка.Контрагент.ВидЮрФиз = Перечисления.ТипЮрФиз.ФизЛицо Тогда
Отгрузка=”Товарный чек”;
Иначе
Отгрузка = “Торг-12”;
КонецЕсли;
ОбластьЗаголовок.Параметры.Отгрузка = Отгрузка;
В области “Подвал” вывожу :
Подвал.Параметры.СуммаПропись = ЧислоПрописью(Итого,”Л = uk_UA; ДП = Истина;”,”гривна, гривны, гривен, м, копейка, копейки, копеек, ж, 2″);
Подвал.Параметры.Кл = Выборка.Кл.Кл;
Подвал.Параметры.отгрузил = ПользователиИнформационнойБазы.ТекущийПользователь();
ТабДок.Вывести(Подвал);
4. ВВОД НА ОСНОВНИИ:
В спр-ке “Контрагенты” указала, что он является основанием для доков: “Поступление”, “Отгрузка”.
В модуле документов в процедуре “ОбработкаЗаполнения” используя запрос нахожу последний документ “Поступление”
“ВЫБРАТЬ ПЕРВЫЕ 1
| Поступление.Ссылка,
| Поступление.Контрагент
|ИЗ
| Документ.Поступление КАК Поступление
|ГДЕ
| (НЕ Поступление.ПометкаУдаления)
| И Поступление.Проведен = Истина
| И Поступление.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| Поступление.Дата УБЫВ”);
Запрос.УстановитьПараметр(“Контрагент”,ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Обращаюсь к результатам звпроса
Если Результат.Пустой() Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Иначе
Выборка =Результат.Выбрать();
Если Выборка.Следующий() Тогда
ДанныеЗаполнения = Выборка.Ссылка;
Контрагент = ДанныеЗаполнения.Контрагент;
МестоХранения = ДанныеЗаполнения.МестоХранения;
Товары.Загрузить(ДанныеЗаполнения.Товары.Выгрузить());
КонецЕсли;
КонецЕсли;
В документе “Отгрузка” сделано аналогично! :)
Ответ на вопрос.
Такого поведения быть не должно.
Вполне возможно, что при выборе составного типа вы поставили флажок на корневом элементе “СправочникСсылка”. Тогда действительно будет выбираться любой справочник.
Задание выполнила.
Из основных моментов:
В приходной накладной реквизит Контрагент составного типа: СправочникСсылка.Контрагент и СправочникСсылка.Сотрудник.
Добавлен справочник СтепениБрака. Этот реквизит в документах ПриходнаяНакладная и РасходнаяНакладная.
Добавлен документ Контакты.
Для заполнения документов РН и ПН в модуле объектов:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Документ = Вспомогательный.ВернутьПоследнийДокумент(ДанныеЗаполнения);
Если Документ <> Неопределено Тогда
Состав.Загрузить(Документ.Состав.Выгрузить());
Контрагент = ДанныеЗаполнения;
КонецЕсли;
КонецПроцедуры
Если я правильно поняла, последний проведенный документ надо искать среди ПН и РН.
В общем серверном модуле:
Функция ВернутьПоследнийДокумент(Контрагент) экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| ПриходнаяНакладная.Ссылка КАК Ссылка,
| ПриходнаяНакладная.МоментВремени КАК МоментВремени
|ИЗ
| Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
|ГДЕ
| ПриходнаяНакладная.Контрагент = &Контрагент
| И ПриходнаяНакладная.Проведен = Истина
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| РасходнаяНакладная.Ссылка,
| РасходнаяНакладная.МоментВремени
|ИЗ
| Документ.РасходнаяНакладная КАК РасходнаяНакладная
|ГДЕ
| РасходнаяНакладная.Контрагент = &Контрагент
| И РасходнаяНакладная.Проведен = Истина
|УПОРЯДОЧИТЬ ПО
| МоментВремени УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”,Контрагент);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Признак контрагента Юридическое либо Физическое лицо организовала перечислением.
При печати для вывода суммы прописью использовала функцию форматирования ЧислоПрописью()
Домашнее задание №7 выполнено.
1) В домашнем задании №6 хранение сведений о контактных лицах организовал в табличной части справочника Контрагенты. После просмотра решения от авторов курса, в домашнем задании №7 отказался от этой реализации. Сделал как в решении авторов курса.
2) Добавлено два справочника “ЮрЛица” и “ФизЛица”. В справочнике “Контрагенты” создал реквизит ЮрФизЛицо составного типа данных на основании этих справочников. В форме элемента справочника убрал поле ввода стандартного реквизита Наименование, значение в этот реквизит записывается в МО в процедуре ПередЗаписью, берется наименование из выбранного справочника (“ЮрЛица” или “ФизЛица”).
3) Создан документ ПоступлениеТоваров. Реквизиты шапки: Контрагент (составной тип данных СправочникСсылка.Контрагенты, СправочникСсылка.Сотрудники), СуммаДокумента (Ч15.2). Табличная часть Товары: Номенклатра, Единица, Количество, Цена, Сумма, ВидБрака (справочник необходимый для отражения степени брака закупленной позиции товара).
При выборе номенклатуры по умолчанию подставляется базовая единица.
В МО в процедуре ПереЗаписью записываю в реквизит СуммаДокумента сумму товаров из ТЧ. В процедуре ОбработкаПроверкиЗаполнения, проверяю ТЧ, если вид товара Услуга, то не требуем для этой строки ввода единицы измерения.
Реализовано заполнение документа на основании элементов справочника Контрагенты. Последний проведенный документ по контрагенту определяю с помощью запроса вида ВЫБРАТЬ ПЕРВЫЕ 1 + сортировка по дате документа по убыванию. В качестве параметра для запроса передаем элемент справочника Контрагенты из структуры ДанныеЗаполнения.
4) Создан документ Реализация. Реквизиты шапки: Контрагент (СправочникСсылка.Контрагенты), КонтрактноеЛицоКонтрагента (СправочникСсылка.КонтактныеЛицаКонтрагентов), СуммаДокумента (Ч15.2). Табличная часть Товары: Номенклатра, Единица, Количество, Цена, Сумма.
СуммаДокумента записывает аналогично как п.2.
При выборе номенклатуры по умолчанию подставляется базовая единица.
Базовая единица по умолчанию, проверка на вид номенклатуры, как в п.2. + Если контрагент – физическое лицо, то убираем из ПроверяемыеРеквизиты реквизит КонтрактноеЛицоКонтрагента. При выборе контрагента в форме документа, если контрагент – физическое лицо, скрываем поле ввода КонтрактноеЛицоКонтрагента, для юр.лиц – показываем.
Реализовано заполнение документа на основании элементов справочника Контрагенты, аналогично документу ПоступлениеТоваров.
Реализован вывод макета печатной формы в зависимости от того, какой вид контрагента – физ. или юр. лицо.
5) Для фиксации контактов менеджеров с клиентами создан регистр сведений КонтактыСКонтрагентами. Измерения: КонтактноеЛицо (СправочникСсылка.КонтактныеЛицаКонтрагентов), ВидКонтакта (перечисление ПеречислениеСсылка.ВидыКонтактов), Заголовок (строка 80). Ресурс: Тема (строка неогр. длины).
Вопросы:
1) Из текста задания не понятно необходимо ли организовать ввод данных в регистр КонтактыСКонтрагентами. Если да, то каким образом, регистратором или независимый ввод данных.
2) В связи с тем, справочник КонтактныеЛицаКонтрагентов (реквизиты: КонтактноеЛицо (СправочникСсылка.КонтактныеЛица), Должность (строка 50) является подчиненным справочнику Контрагенты, у него в свойствах выбрано “Основное представление” “В виде кода”. Таким образом, при выборе значения реквизита КонтрактноеЛицоКонтрагента в документе Реализация в поле формы подставляется код. Если сделать основное представление в виде наименования, то ФИО контактного лица из справочника КонтактныеЛица (реквизит Наименование), нужно будет еще записывать в наименование справочника КонтрактноеЛицоКонтрагента и отслеживать ситуацию, когда в справочнике КонтактныеЛица изменится значение наименования записи, которая присутствует в записях реквизита справочника КонтрактноеЛицоКонтрагента. Пока не знаю как обойти данную ситуацию (в версии 7.7 можно было на форме добавить элемент поле ввода и вручную прописать вызов необходимого справочника и обработку результатов подбора).
1. То что не сказано в задании остается на ваше усмотрение.
В вашей реализации можно оставить независимый ввод в регистр.
Хотя правильнее было контакты регистрировать в документах. Поскольку на документ можно сослаться.
В регистрах обычно хранится некоторая обобщенная информация.
2. К сожалению, без наименования здесь не обойтись..
Можно предложить следующее решение. В событии ПередЗаписью() заполнять наименование автоматически.
Для удобства можно отключить проверку заполнения у стандартного реквизита Наименование.
По п.2 до этого решения дошел, но возникает ситуация, когда исправили наименование элемента справочника КонтактноеЛицо, на который уже есть ссылка в реквизите элементов справочника КонтрактноеЛицоКонтрагента. Получается еще и в событии ПриЗаписи справочника КонтактноеЛицо нужно будет находить все элементы справочника КонтрактноеЛицоКонтрагента, в котрых уже есть ссылка на данную запись и обновлять наименование.
Да, для реализации устойчивого решения придется делать так…
К сожалению, разработчики никак не могут сделать, чтобы в качестве основного представления можно было выбирать реквизиты отличные от кода и наименования..
Задание сделано.
К уже имеющимся справочникам, а именно:
Контрагенты ,
Контактные лица (Физические лица) ,
Должности ,
Номенклатура ,
Классификатор единиц измерения
дабавлен ещё следующий:
Качество (для учёта брака) .
Созданы три типа документов:
Поступление товаров и услуг (ПТиУ) ,
Реализация товаров и услуг (РТиУ) ,
Контакты ,
с реквизитами, необходимыми по условию задания.
В документах ПТиУ и РТиУ у реквизита Контрагент выбран составной тип(спр Контрагенты и спр Контактные лица).
При выборе номенклатуры в документах ПТиУ и РТиУ по умолчанию подставляется базовая единица измерения(аналогично как в видеоуроках).
Ввод на основании реализован с использованием запросов.
Печать документа сделана при помощи конструктора печати.
Основные моменты выполнения задания:
– закупка товаров через документ “ПоступлениеТоваровИУслуг” где Контрагент – составной тип данных(справочники “Котрагенты” и “Сотрудники”). Для обеспечения учета в разных единицах измерения в табличной части реквизит “ЕдиницаИзмерения” и “Коэффициент”(выбираются из подч. справочника Номенклатуре), по умолчанию заполняется базовой через запрос. Факт брака – реквизит табличной части СтепеньБрака(тип справочник)
– реализация через документ “РеализацияТоваровИУслуг”, в справочнике “Контрагент” реквизит ЮрФизЛицо(тип перечисление). Для учета скидки в табличной части реквизит СуммаСкидки.
– отражение контактов менеджеров с клиентами через документ “КонтактыМенеджеров” с реквизитами Менеджер(спр Сотрудники), Контрагент, КонтактноеЛицоКонтрагента, ВидКонтакта(тип перечисление) и дальше по заданию.
– ввод на основании через запрос в процедуре ОбработкаЗаполнения для док-та “ПоступлениеТоваровИУслуг”
<code>”ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваровИУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
|ГДЕ
| ПоступлениеТоваровИУслуг.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| Ссылка УБЫВ”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);</code>
далее заполнение реквизитов док-та из рез-та запроса как в примере уроков.
– печать отгрузки сформировала через констуктор печати макетов
дополнила параметрами Заголовок – НазваниеДок заполнила так
<code>ОбластьЗаголовок.Параметры.НазваниеДок = ?(Выборка.Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо, “Торг-12”, “Товарный чек”);</code>
Подвал – Пользователь и СуммаДокументаПрописью
<code>Подвал.Параметры.Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Подвал.Параметры.СуммаДокументаПрописью = ЧислоПрописью(СуммаДокумента, “Л=uk_UA”, “гривна, гривны, гривен, м, копейка, копейки, копеек, ж, 2”);</code>
Задание выполнено. При выборе товара в табличной части подбираю базовую единицу.
<code>&НаСервере
Функция ПолучитьЕИНаСервере(Товар)
БЕ= Товар.БазоваяЕдиница;
Выборка=Справочники.ЕдиницыИзмеренияНоменклатуры.Выбрать(,Товар);
Пока Выборка.Следующий() Цикл
Если Выборка.ЕдиницаПоКлассификатору=БЕ Тогда
Возврат(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
КонецФункции // ЗаполнитьЕИНаСервере()
&НаКлиенте
Процедура ТоварыТоварОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Ед= ПолучитьЕИНаСервере(ВыбранноеЗначение);
ТекущийЭлемент.ТекущиеДанные.единица =Ед;
КонецПроцедуры</code>
Второй вариант- запросом
<code>Функция ПолучитьЕИНаСервере(Товар)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка как ЕИН,
| ЕдиницыИзмеренияНоменклатуры.Владелец,
| ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору = &ЕдиницаПоКлассификатору”;
Запрос.УстановитьПараметр(“Владелец”, Товар);
Запрос.УстановитьПараметр(“ЕдиницаПоКлассификатору”, Товар.БазоваяЕдиница);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.ЕИН;
КонецЕсли;
КонецФункции // ЗаполнитьЕИНаСервере()</code>
За связь с товаром при выборе другой единицы, отличной от базовой, отвечают СвязиПараметровВыбора в реквизите формы.
Условие задачи по вводу на основании я поняла так, что новый документ (приходная накладная или расходная накладная) может вводиться как на основании приходной, так и на основании расходной, в зависимости от того, документ какого типа окажется последним. Поэтому надо проверять момент времени документов обоих типов. Как это сделать запросом, пока не знаю. Поэтому решила без запроса.
<code>Функция ПолучитьПоследнийДок (Контрагент)Экспорт
Отбор= Новый Структура(“Контрагент”,Контрагент);
Выборка=Документы.ПриходнаяНакладная.Выбрать(,,Отбор,”Дата Убыв”);
Если Выборка.Следующий()тогда
Пн=Выборка.ПолучитьОбъект();
МоментПриходной=Пн.МоментВремени();
КонецЕсли;
Выборка=Документы.РасходнаяНакладная.Выбрать(,,Отбор,”Дата Убыв”);
Если Выборка.Следующий()тогда
Рн=Выборка.ПолучитьОбъект();
МоментРасходной=Рн.МоментВремени();
КонецЕсли;
Если Пн.Ссылка.Пустая()и Не Рн.Ссылка.Пустая() Тогда
//контрагент – только покупатель
Возврат (Рн);
ИначеЕсли Рн.Ссылка.Пустая()и Не Пн.Ссылка.Пустая() Тогда
//контрагент – только поставщик
Возврат (Пн);
ИначеЕсли Не Рн.Ссылка.Пустая()и Не Пн.Ссылка.Пустая() Тогда
//Контрагент и поставщик и покупатель
// будем сравнивать документы по времени
Если МоментПриходной.Дата> МоментРасходной.Дата Тогда
Возврат (Пн);
Иначе
Возврат (Рн);
КонецЕсли;
КонецЕсли;
КонецФункции
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
Контрагент = ДанныеЗаполнения.Ссылка;
ДокументОснование=ПолучитьПоследнийДок(Контрагент);
Основание= ДокументОснование.Ссылка;
Для Каждого ТекСтрокаТовары Из ДокументОснование.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Брак = ТекСтрокаТовары.Брак;
НоваяСтрока.Единица = ТекСтрокаТовары.Единица;
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.Товар = ТекСтрокаТовары.Товар;
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
КонецЦикла;
КонецПроцедуры</code>
С печатной формой проблем не возникло.
Все выполнено особых сложностей не возникло.
Для заполнения ед. измерения сделала в модулеформы серверную функцию которая возвращает необходимую ед. изм.
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
|ЕдиницыИзмеренияНоменклатуры.Ссылка КАК БазоваяЕдиница
|ИЗ
|Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
|ЕдиницыИзмеренияНоменклатуры.Владелец = &Номенклатура
|И ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору = &БазоваяЕдиница”;
Запрос.УстановитьПараметр(“Номенклатура”,Номенклатура);
Запрос.УстановитьПараметр(“БазоваяЕдиница”,Номенклатура.БазоваяЕдиница);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат “”;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.БазоваяЕдиница;
КонецЕсли;
Для хранения котнактов создала документ с запретом проведения.
Для заполнения док. на основании из контрагентов в “ОбработкаЗаполнения” использовала запрос в который передаю контрагента и получаю ссылку на последний проведенный документ.
Вопрос: как лучше заполнить табличную часть в новом документе?
Я использовала
Выборка.Следующий();
ТекДок = Выборка.Ссылка.ПолучитьОбъект();
Товары.Загрузить(ТекДок.ТОвары.Выгрузить());
>как лучше заполнить табличную часть в новом документе
Правильнее вот так:
Выборка.Следующий();
ТекДок = Выборка.Ссылка;
Товары.Загрузить(ТекДок.ТОвары.Выгрузить());
В вашем случае при получении объекта из базы будут выбираться лишние данные, чего желательно избегать.
Почти сделал, в общем почти ничего сложного… но вот форт “торг-12” и “товарный чек” под рукой дома не оказалось – нарисовал что-то своё. Единственное переделывал фиксацию контактов (сначало завёл как справочнки, но потом передумал и сделал документ).
И не могу сообразить как сделать так что-бы при ручном вводе номенклатуры в табличной части сразу втыкалась базовая единица измерения (насколько понял задание это предполагает).
1. Формы можно разработать свои, нам все равно их печатать не придется :)
2. Да, задание это предполагает.
См. событие ПриИзменении в колонке Номенклатура таблицы формы.
Подобные вещи рассматриваются во втором блоке базового курса.
Да, ПриИзменении() самое оно, рассматривается в самом начале 4-й главы… может имеет смысл список глав знание которых требуется для выполнения задания следует поправит?
Готово!
Здравствуйте! Задание выполнила.
1. Документ ПоступлениеТоваровУслуг.
Реквизиты:
-Контрагент;
-ХозяйственнаяОперация (перечисление, значения ЗакупкаУпоставщика, закупкаЧерезПодотчетноеЛицо);
-ПодотчетноеЛицо (тип Справочник.ФизическиеЛица).
Табличная часть:
-Номенклатура;
-ЕдиницаИзмерения (тип Справочник.ЕдиницыИзмерения, подчиненный Ном.);
-Брак (тип булево);
-СтепеньБрака (тип Справочник.СтепениБрака);
-Цена; Количество; Сумма.
Возможность выбора ед. изм, отличной от базовой реализована установкой в параметре “связи параметров выбора” отбора по владельцу. По умолчанию из справочника ЕдиницыИзмерения выбирается единица с коэффициентом 1, т.е. базовая.
2. Документ РеализацияТоваровУслуг.
В справочник Контрагенты добавлен реквизит ЮрФизЛицо (тип Перечисление ЮрФизЛица).
В зависимости от значения реквизита выводится название печатной формы.
Макет сформирован конструктором, далее допилен.
Сумма прописью реализована с пом. метода ЧислоПрописью.
3. Контакты.
Созданы три новых вида документов одинаковой структуры: ТелефонныйЗвонок, Встреча, Письмо. Возможно дальше будет понятно, будут ли у них новые различные реквизиты или они сольются в один документ Контакт с реквизитом типа Перечисление.ТипыКонтактов.
4. Ввод на основании.
Запрос по прежнему не поддался, задачу одолела выборкой… зато работает-)))
Задание выполнено.
1. В качестве единицы измерения в документах прихода и расхода
используется спр. “ЕдиницыИзмеренияНоменклатуры”,
подчиненный номенклатуре, хранит коэффициент пересчета
от базовой ед. изм. номенклатуры.
2. Для учет вида закупки, создан реквизит документа прихода
“ХозяйственнаяОперация”
(переч.: ЗакупкаУПоставщика,ЗакупкаЧерезПодотчетноеЛицо)
3.Для учета брака создан справочник “КачествоТовара”,
имеет предопр. элемент “Новый”, который по умолчанию
подставляется в док-ты поступления и отгрузки.
4. Для учета юридических/физических лиц создан реквизит
“ЮрФизЛицо” спр. “Контрагенты”, тип перечисление.
5. Печатная документа отгрузки реализована с
помощью конструктора.
6. Код, реализующий заполнение документа прихода при
вводе на основании элемента спр. “Контрагенты”:
&НаСервере
Процедура ЗаполнитьДокумент(Контрагент)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(“Контрагент”,Контрагент);
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| Поступление.ХозяйственнаяОперация,
| Поступление.Контрагент,
| Поступление.ПодотчетноеЛицо,
| Поступление.Товары.(
| Номенклатура,
| Количество,
| ЕдиницаИзмерения,
| КачествоТовара,
| Цена,
| Сумма
| )
|ИЗ
| Документ.ПоступлениеТоваров КАК Поступление
|ГДЕ
| Поступление.Контрагент = &Контрагент
| И Поступление.Проведен
|
|УПОРЯДОЧИТЬ ПО
| Поступление.МоментВремени УБЫВ”;
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
// шапка
ЗаполнитьЗначенияСвойств(ЭтотОбъект,Выборка);
// товары
Товары.Загрузить(Выборка.Товары.Выгрузить());
КонецЕсли;
КонецПроцедуры // ЗаполнитьДокумент()
Задание Сделал
Создал Документ Поступления. Создал Справочник ВидБракаИзделия где записываются название и скидка. В документ в ТЧ добавил реквизит В форме Документа Поступления в Для всех полей ТЧ кроме сумма и номер описал обработку события при Изменении, в каждом событии вызывается своя вспомогательная серверная функция и отдельная функция МФ Пересчитать сумму . ПриИзмение Номеклатуры подставляю цену поле Цена и БазоваяЕдиницаИзмерения в ее поле.
Создал Документ Реализация. Создал Перечисление ТипКонтрагента. В документе добавил реквизиты ТипКонтрагента, Контрагент, КонтактноеЛицо, ТЧ.
Создал Справочник ТипКонтакта. создал документ КонтактыСКлиентами.
Ввод на основании документа Поступления использовал конструктор. Для заполнения ТЧ сделал запрос. В нем полное соединение таблицы документа и его ТЧ. Условие в запросе: проведен истина, ПометкаУдаления ложь, Котрагент =&Контрагент(параметр, ссылка на контрагента), выбирать первые 1, упорядочивать по дате УБЫВ. Далее выполняю запрос и загружаю методом загрузить в ТЧ. Для Документа Реализации алгоритм аналогичный.
Печатную форму создал конструктором в заголовок добавил параметр ТипДокумента. В запросе в функции печать в модуле менеджера, добавил в выборку поле с произвольное условие
«ВЫБОР
КОГДА Реализации.ТипКонтрагента = &параметрКонтрагенты
ТОГДА “”Торговый Чек””
ИНАЧЕ “”Торг12″”
КОНЕЦ КАК ТипДокумента».
Задание выполнил.
ввода на основание: Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = НОвый Запрос(“ВЫБРАТЬ ПЕРВЫЕ 1
| ПриходнаяНакладная.Ссылка
|ПОМЕСТИТЬ Док
|ИЗ
| Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
|ГДЕ
| ПриходнаяНакладная.Контрагент = &Контрагент
| И ПриходнаяНакладная.Проведен
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Приходная.Номенклатура,
| Приходная.Количество,
| Приходная.Цена,
| Приходная.Сумма,
| Приходная.ЕдИзм,
| Приходная.Качество
|ИЗ
| Документ.ПриходнаяНакладная.Товары КАК Приходная
|ГДЕ
| Приходная.Ссылка В
| (ВЫБРАТЬ
| а.Ссылка
| ИЗ
| Док КАК а)”);
Запрос.УстановитьПараметр(“Контрагент”,ДанныеЗаполнения);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Пока Выборка.Следующий() Цикл
Стр = Товары.Добавить();
ЗаполнитьЗначенияСвойств(Стр,Выборка);
КонецЦикла;
Контрагент = ДанныеЗаполнения;
КонецЕсли;
печать с помощью конструктора + правки.
Домашнее задание в процессе выполнения. Есть вопрос.
В конфигурации создан документ ПоступлениеТоваров с реквизитом Номенклатура (тип СправочникСсылка.Номенклатура). При выборе номенклатуры по умолчанию, подставляется базовая единица измерения с помощью следующего кода в форме документа ПоступлениеТоваров:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТД = Элементы.Товары.ТекущиеДанные;
//ТД.Единица = ОбщийМодульСервер.ПолучитьБазовуюЕдиницуТовара(ТД.Номенклатура); //ПОЧЕМУ ОШИБКА???
ТД.Единица = ПолучитьБазовуюЕдиницуТовара(ТД.Номенклатура);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьБазовуюЕдиницуТовара(СсылкаТовар)
Возврат СсылкаТовар.БазоваяЕдиница;
КонецФункции // ПолучитьБазовуюЕдиницуТовара()
Я хотел вынести функцию ПолучитьБазовуюЕдиницуТовара в общий модуль ОбщийМодульСервер. У данного общего модуля проставлены свойства Клиент, Сервер, Вызов сервера и описана одна экспортная функция ПолучитьБазовуюЕдиницуТовара(СсылкаТовар) Экспорт с директивой &НаСервереБезКонтекста.
Но при вызове в процедуре ТоварыНоменклатураПриИзменении данной функции общего модуля генерируется ошибка:
{Документ.ПоступлениеТоваров.Форма.ФормаДокумента.Форма(28)}: Метод объекта не обнаружен (ПолучитьБазовуюЕдиницуТовара)
ТД.Единица = ОбщийМодульСервер.ПолучитьБазовуюЕдиницуТовара(ТД.Номенклатура);
Не могу понять, почему? Объясните пожалуйста.
Вы не привели текст общего модуля.
Предполагаю, что метод ПолучитьБазовуюЕдиницуТовара() объявлен с директивой &НаСервере.
А это означает, что вызов этого метода допустим только со стороны сервера.
Я понимаю, что вас смущает флаг “Вызов сервера”, к сожалению, при установке флагов Сервер + Клиент “Вызов сервера” не играет никакой роли.
Будем считать это особенностью 12-го и ниже релизов.
В 13-м релизе такой общий модуль нельзя будет создать.
Вы можете убрать директиву компиляции &НаСервере, тогда в модуле формы ошибок не будет. Но код все равно не будет работать, так как теперь
процедура будет и клиентской и серверной одновременно. А на клиенте недопустимо обращение к БД.
Для решения проблемы, вы можете снять флаг “Клиент” с общего модуля (Вызов сервера остается, директива компиляции не нужна), тогда система не найдет ошибок и все будет работать.
Задание выполнено.
В документе ЗакупкаЗапчастей определил реквизит Контрагент составного типа Контрагенты-Сотрудники и
ТЧ с номенклатурой,единицей,степенью брака,суммой.
В документе РеализацияЗапчастей определил реквизиты Контрагент и КонтактноеЛицоКонтрагента.
Оба документа зарегистрировал в журнале.
Контрагентам добавил реквизит ЮрФизЛицо типа Перечисление. Для степени брака и сотрудников создал новые справочники.
Для автоподстановки в форму документа базовых единиц товара в обработчике ТоварыНоменклатураПриИзменении() написал
ТД = Элементы.Товары.ТекущиеДанные;
ТД.Единица = БазоваяЕдиницаНаСервере(ТД.Номенклатура).
Функция БазоваяЕдиницаНаСервере возвращает результат запроса
“ВЫБРАТЬ ЕдиницыИзмеренияНоменклатуры.Ссылка ИЗ
Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры, Справочник.Номенклатура КАК Номенклатура
ГДЕ ЕдиницыИзмеренияНоменклатуры.Владелец = Номенклатура.Ссылка И Номенклатура.БазоваяЕдиница = &БазоваяЕдиница”.
Для выбора соответствующих номенклатуре единиц для поля Единица использовал связь параметров выбора
Отбор.Владелец(Элементы.Товары.Текущие данные.Номенклатура).
В документе РеализацияЗапчастей для выбора контактного лица контрагента использовал связь Отбор.Владелец(Объект.Контрагент).
Заполнение документа на основании текущего контрагента разбито на 2 части:
1.в модулях объекта документа обработка заполнения
Если ДанныеЗаполнения <> Неопределено Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
ПоследнийДок = ДокументыСервер.ПоследнийДокумент(ДанныеЗаполнения);
КонтактноеЛицо = ПоследнийДок.КонтактноеЛицо;
Товары.Загрузить(ПоследнийДок.Товары.Выгрузить()).
2.в общем модуле функция ПоследнийДокумент возвращает результат запроса
“ВЫБРАТЬ ПЕРВЫЕ 1 Журнал.Ссылка ИЗ ЖурналДокументов.Журнал КАК Журнал ГДЕ Журнал.Проведен
И Журнал.Контрагент = &Контрагент УПОРЯДОЧИТЬ ПО Журнал.Ссылка.МоментВремени УБЫВ”.
Создал новый документ Контакты с реквизитами Сотрудник (справочник), ТипКонтакта (перечисление), заголовок, тема.
Печать документа реализовал так, как показано в уроках. Сумма прописью – ЧислоПрописью(Ссылка.Товары.Итог(“Сумма”)).
Задание выполнено, но пришлось слегка попотеть. С наскока, как прошлые ДЗ, сделать не получилось.
В поступлении товаров автозаполнение поля ЕдиницаИзмерения сделал как в видео-уроке, считываем значение номенклатуры через ТекущиеДанные таблицы Элементы.Товары и затем в функции выполняемой на сервере без контекста получаем базовую единицу измерения.
Для учета брака добавил справочник СтепениБрака и добавил в табличную часть документа ПоступлениеТоваров соответствующее поле. Пока ни с чем его не увязывал, т.к. по условию не требовалось. Но думаю, тут РС просится в использование.
В документе реализацияТоваров поле Контрагент сделал составным (Контрагенты, ФизическиеЛица). Справочнику КонтактныеЛица назначил еще одного владельца – ФизическиеЛица.
Создал справочник Контакты, для регистрации контактов менеджеров с клиентами.
С вводом на основании проблем не было, последний проведенный документ по контрагенту выбирал в запросе функции, которую поместил в общий серверный модуль. Функции передавались параметрами Контрагент и тип документа (Метаданные().Имя). В запросе получал первую запись с ссылкой на документ, из совокупности упорядоченной по убыванию. Ну и затем, заполнял реквизиты документа-получателя данными из документа-источника.
Печать документа реализовал через конструктор печати. Автоматически сформированный запрос модифицировал, чтобы помимо прочего сразу считалась итоговая сумма по ТЧ.
Трудности, которые возникали в процессе реализации ДЗ:
1. Нет консоли запросов для управляемого интерфейса, запросы писал вслепую. Если тут выкладывалась ссылка на обработку, ткните носом плз, не смог найти.
2. Долго вспоминал ЧислоПрописью :)
3. Когда настраивал СвязиПараметровВыбора у поля КонтактноеЛицо в документе РеализацияТоваров, режим изменения связанного значения по умолчанию было “Очищать”, я сперва не обратил на это внимание и никак не мог понять, почему у меня не выполняется отбор контактных лиц по контрагенту. Потом установил в “Не изменять”.
P.s. очень высокий темп, чтобы выполнить ДЗ, с материалом приходится знакомиться “галопом”.
1. Консоль выкладывалась в материалах 1-го блока.
О ее подключении см. последний урок 1-го блока.
Спасибо, Евгений, разобрался.
Вот, вспомнил еще вопрос. Ситуация с которой столкнулся: создаем новый документ (он еще не сохранен в БД) и выбираем что-либо запросом на МоментВремени() вновь созданного документа. Естественно, момент времени возвращает пустую дату. Как правильно в такой ситуации получать данные на момент времени?
Ситуация следующая – для нового документа еще неизвестно время, которое присвоит ему система.
Поэтому брать остатки на момент времени кажется не совсем верно.
Предлагаю 2 варианта:
1. Пересмотреть решаемую задачу, чтобы не требовался момент времени, либо чтобы документ записывался.
2. Получать актуальные остатки, тогда в период ничего не нужно передавать.
1. Заполнение базовой единице и коэффициентом:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТД = Элементы.Товары.ТекущиеДанные;
ЗаполнитьЗначенияСвойств(ТД,ПолучитьБазоваюЕдиницу(ТД.Номенклатура));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьБазоваюЕдиницу(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка Как Единица,
| ЕдиницыИзмеренияНоменклатуры.К Как Коэффициент
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору = ЕдиницыИзмеренияНоменклатуры.Владелец.БазоваяЕдиница”;
Запрос.УстановитьПараметр(“Владелец”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Единица= Новый Структура(“Единица,Коэффициент”);
Единица.Единица=Выборка.Единица;
Единица.Коэффициент=Выборка.Коэффициент;
Возврат Единица;
КонецФункции
2. Т.к. на основании контрагента требуется вводить два вида документа, то получение параметров для заполнения вынес в общий неглобальные модуль “ВводНаОсновании”:
Функция ПолучитьДанныеЗаполнения(Данные,ВидДокумента) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| Документ.Ссылка
|ИЗ
| Документ.ВидДокумента КАК Документ
|ГДЕ
| Документ.Проведен
| И Документ.Контрагент=&Контрагент
|УПОРЯДОЧИТЬ ПО
| Документ.МоментВремени УБЫВ”;
Запрос.Текст=СтрЗаменить(Запрос.Текст,”ВидДокумента”,ВидДокумента);
Запрос.УстановитьПараметр(“Контрагент”,Данные);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
Пример ОбработкаЗаполниния для документа “ПоступлениеТоваров”:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
НовыеДанные=ВводНаОсновании.ПолучитьДанныеЗаполнения(ДанныеЗаполнения,”ПоступлениеТоваров”);
Контрагент = НовыеДанные.Контрагент;
Для Каждого ТекСтрокаТовары Из НовыеДанные.Товары Цикл
НоваяСтрока = Товары.Добавить();
Далее все что делал конструктор.
3. Пример поля для получения названия документа в запросе при подготовке к печати:
| ВЫБОР
| КОГДА РеализацияТоваров.Контрагент.ВидКонтрагента = ЗНАЧЕНИЕ(Перечисление.ВидКонтрагента.ЮридическоеЛицо)
| ТОГДА “”ТОРГ – 12″”
| ИНАЧЕ ВЫБОР
| КОГДА РеализацияТоваров.Контрагент.ВидКонтрагента = ЗНАЧЕНИЕ(Перечисление.ВидКонтрагента.ФизическоеЛицо)
| ТОГДА “”Товарный чек””
| КОНЕЦ
| КОНЕЦ”;
ДЗ №7 реализовал.
Никаких проблем не возникло.
Для ввода на основании реализовал процедуру в общем модуле:
Запрос = Новый Запрос(”
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЖурналУчетаТМЦ.Ссылка
|ИЗ
| ЖурналДокументов.ЖурналУчетаТМЦ КАК ЖурналУчетаТМЦ
|ГДЕ
| ЖурналУчетаТМЦ.Контрагент = &Контрагент И ЖурналУчетаТМЦ.Ссылка.Проведен
|
|УПОРЯДОЧИТЬ ПО
| ЖурналУчетаТМЦ.Ссылка.МоментВремени УБЫВ”);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ПоследнийДок = Выборка.Ссылка.ПолучитьОбъект();
ЗаполнитьЗначенияСвойств(Объект, ПоследнийДок,,”Номер, Дата”);
Объект.Товары.Загрузить(ПоследнийДок.Товары.Выгрузить());
КонецЕсли;
Для создания печатной формы использовал конструктор печати, после чего в сформированные форму и процедуру добавил требуемый функционал.
Реализация требования задания о том, что закупка может осуществляться как от контрагента так и от собственного сотрудника может быть реализовано двумя способами:
В документе Поступление товаров создать два реквизита Контрагент и Сотрудник и проверять необходимость заполнения одного из этих реквизитов при записи документа, можно пойти еще дальше и показывать один из реквизитов в зависимости от вида поступления которое задается дополнительным реквизитом.
Более простой способ заключается в создании одного реквизита Поставщик имеющего составной тип данных (СправочникСсылка.Контрагенты и СправочникСсылка.КонтактныеЛица)
Для реализации я выбрал второй способ.
Для хранения сведения о бракованном товаре с возможностью указания степени брака пользователями целесообразно создать отдельный справочник (КачествоТовара) и добавить реквизит Качество этого типа в табличную часть документа Посупления.
Вопрос:
Правильно ли я понял, что при обращении к свойству ТекущиеДанные табличной части из обработчика события ПриИзменении какого-либо реквизита этой табличной части, нет необходимости проверять на заполненность значение этого свойства, поскольку если вызван обработчик ПриИзменении то, значит свойство ТекущиеДанные точно заполнено?
Для реализации двух видов Контрагентов (юридических и физических) я рассматривал два варианта:
В справочнике Контрагенты создать реквизит ВидКонтрагента, который будет принимать одно из двух возможных значений. Этот простой способ, но он не оптимален поскольку в справочник Контрагенты необходимо будет включить все реквизиты для Юр. лиц и физ. Лиц (а они в общем случае разные), хотя одновременно будет использоваться только какая-то часть из них.
Юр. и физ. лица хранятся в отдельных справочниках, с разной структурой, а в справочник Контрагенты добавляется новый реквизит ЮрФизЛицо составного типа. Этот вариант используется в типовых конфигурациях 1С, он более оптимален, хотя и более сложен.
Для реализации я выбрал второй вариант, более оптимальный.
Ввод на основании реализовал с использованием запросов, при этом для выборки последнего проведенного документа использовал упорядочивание по убыванию по ссылке с установкой флага Автоупорядочивание, а для ограничения выборки одним документом использовал ограничение выборки «ПЕРВЫЕ 1».
Сумму прописью в макете документа Реализации выводил с использованием функции глобального контекста ЧислоПрописью.
Вопрос:
Как можно отследить факт создания нового документа в модуле формы этого документа? Свойство ЭтоНовый не получается использовать в процедуре ПриСозданииНаСервер ругается. Я использовал в процедуре ПриОткрытии проверку вида НЕ ЗначениеЗаполнено(Объект.Ссылка), это правильно?
1. Текущие данные. Да, нет необходимости проверять на заполненность, поскольку при изменении эти данные гарантированно есть.
2. ЭтоНовый, это не свойство, а метод.
Но, если вы напишете Объект.ЭтоНовый(), то обнаружите ошибку во время исполнения.
Связано это с тем, что тип данных у реквизита формы Объект – ДанныеФормыСтруктура.
Поэтому одним вариантом проверки на создание элемента является приведенный вами.
Другой – ЗначениеЗаполнено(Параметры.Ключ).
По фен-шую лучше использовать второй вариант :)
Поскольку параметры формы это структура, которая держит на готове свои свойства.
Но об этом подробно мы говорим в 1-ом блоке продвинутого.
Не получается скачать файл по указанной ссылке.
Исправлено!