Базовый курс. Занятие №6
Третье занятие по 1-му блоку базового курса.
Необходимо изучить следующие главы.
Глава 9. Формы.
Глава 10. Перечисления.
Глава 11. Администрирование.
Глава 12. Роли.
Глава 13. Пользователи.
Глава 14. Параметры ИБ.
Глава 15. Резервные копии.
Глава 16. Отладка.
Глава 17. Работа с запросами к БД.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
ДЗ самостоятельно выполнить удалось лишь элементарные вещи, но все еще не отчаиваюсь. Для человека не имевшего ни малейшего представления об 1С – я уже знаю очень много.
Обратная связь
Уважаемые команда
Очень рад что выбрал Ваш курс для обучения.
1) Для меня все очень новое.
2) Затруднительными показались главы касающиеся Передачи параметров(0Блок), Запросы – пока лишь частично понимаю.
3) Я бы сказал не то что бы подробнее раскрыть, а добавить чуть больше
Еще у меня вопрос касательно ДЗ, а почемув ОбработкеПроверкиЗаполнения, нельзя было сразу удалить из ПроверяемыхРеквизитов Базовую Единицу? Я пробовал – мне не удалось, так и не понял почему…
Эльчин, правильно делаете, что не останавливаетесь. То что прогресс виден, это очень хорошо.
По поводу Вашего вопроса:
> а почемув ОбработкеПроверкиЗаполнения, нельзя было сразу удалить из ПроверяемыхРеквизитов Базовую Единицу
Каким образом пробовали удалить?
Приведите пример программного кода.
У базовой единицы в свойствах реквизита проверка заполнения установлена?
Пока вспоминал как я удалял, понял почему не получалось, я пытался удалить ТЕКСТ вместо индекса, когда надо было указать индекс… Правильно говорят, нужно уметь задавать вопросы.=) И пользоваться Великим Синтаксис другом)))
Было
ПроверяемыеРеквизиты.Удалить(“БазоваяЕдиница”);
А возможно было и
ПроверяемыеРеквизиты.Очистить();
ПроверяемыеРеквизиты.Очистить();
Ок, хорошо!
Выполнил.
Возникшие трудности:
1. Задание: (при создании элемента справочника нужно анализировать определен ли вид номенклатуры у родительской группы. Если да, что нужно подставить данный вид для нового элемента)
Так и не удалось понять, как определить родителя (группу) при создании нового элемента.
В обработке события ОбработкаЗаполнения реквизит Родитель у нового элемента не заполнен. Но! Если в этом обработчике оставить значение параметра СтандартнаяОбработка истинным – после открытия формы платформа сама заполнит реквизит Родитель. Отсюда можно прийти к выводу, что нужно анализировать Родителя в обработчиках формы, но уж очень не нравится мне такое решение.
2. Неясен следующий момент: в начале задания говорится “У одного контрагента может быть несколько контактных лиц”. Исходя из этого положения самым простым решением было бы создание табличной части КонтактныеЛица справочника Контрагенты.
Но далее дается задание: “Создайте обработку … должна выдавать тех контрагентов, у которых не задано контактное лицо”.
Во-первых, складывается ощущение что контактное лицо должно быть только одно у контрагента, что противоречит указанному выше условию.
Во-вторых, как при использовании как табличной части, так и подчиненных справочников, вроде придется использовать левые соединения в запросах, которых мы на момент урока еще не проходили.
Посмотрел решение, все стало понятно.
Ок
> Отсюда можно прийти к выводу, что нужно анализировать Родителя в обработчиках формы, но уж очень не нравится мне такое решение
Ознакомьтесь с решением задания
> складывается ощущение что контактное лицо должно быть только одно у контрагента, что противоречит указанному выше условию.
Это не так. Контактных лиц может быть множество.
Задание выполнено.
Обратная связь:
1. Изменения в 8.2 по отношению к 8.1
2. Проблем не было
3. Пока вопросов нет
Задание выполнила.
Не сразу разобралась где размещать программный код для проверки заполнения реквизитов. В результате:
Проверку по заполнению реквизита «Вид номенклатуры» для группы справочника разместила в модуле формы в процедуре ПриСозданииНаСервере:
<code>
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
РодительЭлемента = Объект.Родитель.ВидНоменклатуры;
Если ЗначениеЗаполнено(РодительЭлемента) Тогда
Объект.ВидНоменклатуры = РодительЭлемента;
КонецЕсли;
КонецПроцедуры
</code>
Проверку по заполнению реквизита «Вид номенклатуры» при создании элемента справочника и проверки заполнения реквизита «БазоваяЕдиницаИзмерения» разместила в модуле объекта в процедуре ОбработкаПроверкиЗаполнения:
<code>
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоГруппа Тогда
РеквизитВидНоменклатуры = ПроверяемыеРеквизиты.Найти(“ВидНоменклатуры”);
ПроверяемыеРеквизиты.Удалить(РеквизитВидНоменклатуры);
Иначе
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
РеквизитБазоваяЕдиница = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
ПроверяемыеРеквизиты.Удалить(РеквизитБазоваяЕдиница);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Процедуру для записи единицы измерения равной базовой единицы измерения с коэффициентом 1 при записи нового элемента справочника разместила в модуле формы в процедуре ПередЗаписьюНаСервере:
<code>
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Отбор = Новый Структура(“ЕдиницаИзмерения”,ТекущийОбъект.БазоваяЕдиницаИзмерения);
БазЕдиницВТЧ = ТекущийОбъект.ЕдиницыИзмеренияТЧ.НайтиСтроки(Отбор);
КоличествоБазЕдиницВТЧ = БазЕдиницВТЧ.Количество();
Если НЕ КоличествоБазЕдиницВТЧ Тогда
НоваяСтрокаТЧ = ТекущийОбъект.ЕдиницыИзмеренияТЧ.Добавить();
НоваяСтрокаТЧ.ЕдиницаИзмерения = ТекущийОбъект.БазоваяЕдиницаИзмерения;
НоваяСтрокаТЧ.КоэффициентПересчетаТекущейВБазовую = 1;
КонецЕсли;
КонецПроцедуры
</code>
Обратная связь
В первом блоке получила много новой информации. Более понятной стала работа с универсальными коллекциями значений и иерархией классов справочников. Новым оказался раздел о процедурах проверки заполнения и возможности задания проверки в реквизитах, некоторые приемы работы с ролями и по отладке приложения.
Пока не очень получается определять где необходимо размещать программный код. Слушая объяснения кажется все понятным, а когда начинаешь разбирать на практике, то путаешься.
Здравствуйте. Выполнение ДЗ №6:
1.Справочники Контрагенты, контактныеЛица. +у Контрагентов таблица КонтактныеЛица, должность
2. Справочники Номенклатура, КлассификаторЕдИзм, ЕдИзмНоменклатуры(у него владелец номенклатура)
3.Перечисление ВидНоенклатуры
4. в спр.Номенклатура в модуле объекта следующий код:
<code>Перем НовыйЭлемент;
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения = Неопределено Тогда
Иначе
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если (ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга и БазоваяЕдИзм.Пустая()) или ЭтоГруппа Тогда
Инд = ПроверяемыеРеквизиты.Найти(“БазоваяЕдИзм”);
ПроверяемыеРеквизиты.Удалить(Инд);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
НовыйЭлемент = Ложь;
Если Ссылка.Пустая() Тогда
НовыйЭлемент = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если НовыйЭлемент Тогда
ЕдИзмНоменкл = Справочники.ЕдИзмНоменклатуры.СоздатьЭлемент();
ЕдИзмНоменкл.Владелец = Ссылка;
ЕдИзмНоменкл.БазоваяЕдИзм = БазоваяЕдИзм.Ссылка;
ЕдИзмНоменкл.Наименование = БазоваяЕдИзм.Наименование;
ЕдИзмНоменкл.Коэффициент = 1;
ЕдИзмНоменкл.Записать();
КонецЕсли;
КонецПроцедуры
</code>
5.Внешняя обработка;
<code>
&НаКлиенте
Процедура ВыполнитьРасчет(Команда)
Сообщить(Обработка());
КонецПроцедуры
&НаСервере
Функция Обработка()
Счетчик = 0;
Контр = Справочники.Контрагенты.Выбрать();
Пока Контр.Следующий() Цикл
Если Контр.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Если Контр.КонтактныеЛица.Количество()=0 Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Возврат(Счетчик);
КонецФункции
</code>
Как обычно работу над ошибками проведу после отчета.
Обраьная связь.
1.Все новое.
2.К конце первого блока возникли некоторые пожелания, как бы был построен курс:
– в слайдах хотелось бы иметь кусочки кода с видео. Руками писать – очень громоздко, а по коду проще бы было искать, какое видео пересмотреть. Иногда хочется какую то выжимку по коду, а пока найдешь – столько времени теряется. А если еще глобальнее, то нужна книжка с конспектом, чтобы что-то выделить или закладочку заложить. Пусть даже и за дополнительные деньги.
– Главу по работе с отладчиком и работе с БД нужно было бы в начале, а то тыкалась на ощупь. Хорошо тем, кто раньше с восьмеркой работал
Спасибо за лекции. Очень интересно и познавательно.
Пожелания понятны, рассмотрим их, спасибо.
Задание выполнил. Пошел по неправильному пути – созданием табличной части для записи контактных лиц контрагентов.
Обратная связь:
1. почти в каждом уроке что-то подчерпнул новое, поменял субъективное представление или более подробно раскрыл для себя. появилась ясность с директивами компиляции и поразвернутей познакомился с отладкой.
2. как таковых особых трудностей не возникает пока – все списываю не не хватку времени более детально подумать, а в итоге все оказывается на поверхности лежит.
3. в этом блоке пока нет таких тем.
1) Платформа 8.2.13.202
2) Выдала ошибку
«Ошибка при выполнении файловой операции ‘C:\Consol\Console_Spec8_RU.epf’
по причине:
Неверный формат хранилища данных ‘file://C:/Consol/Console_Spec8_RU.epf’
Правильно я понял, что ошибка появляется при открытии в конфигураторе?
Только что проверил на релизах 8.2.13.219, 8.2.14.439. В конфигураторе все корректно открывается.
Попробуйте следующее:
– скачайте повторно обработку, возможно она не докачалась в прошлый раз;
– обновите платформу до 219 сборки.
Наверное неправильно скачивается, потому что размер файла всего 188байт, может вы вышлете мне обработку на мыло hohina@mail.ru. Заранее спасибо.
Выслать, конечно, можно. Но правильнее разобраться в чем проблема.
Попробуйте с этой страницы скачать другие файлы, они нормально закачиваются?
На всякий случай уточню, закачку производите с этой страницы https://mg.spec8.ru/1cdevbase-block1/?
Спасибо все получилось
Светлана, расскажите в чем была проблема..
Обратная связь по 1-му блоку:
1. Все новое :) Количество информации впечатляет
2. Только в процессе выполнения ДЗ осознала значение понятий модуля, контекста и директив компиляции, эти темы были самыми сложными для понимания, которое более менее пришло после уроков по работе со справочниками и документами (во многом благодаря неоднократным повторам ранее сказанного немного другими словами ну и благодаря живым примерам, конечно)
3. Возможно это не относится к теме 1-го модуля, но немного запутавшись в накопившихся конфигурациях возникла необходимость их сравнения и объединения и следовательно хотелось бы разобраться с этой темой.
Обратная связь по 1-му блоку:
1. Все новое :) Количество информации впечатляет
2. Только в процессе выполнения ДЗ осознала значение понятий модуля, контекста и директив компиляции, эти темы были самыми сложными для понимания, которое более менее пришло после уроков по работе со справочниками и документами (во многом благодаря неоднократным повторам ранее сказанного немного другими словами ну и благодаря живым примерам, конечно)
3. Возможно это не относится к теме 1-го модуля, но немного запутавшись в накопившихся конфигурациях возникла необходимость их сравнения и объединения и следовательно хотелось бы разобраться с этой темой.
Я же писала, что скачивала отсюда https://mg.spec8.ru/2010/07/06/%d0%ba%d0%be%d0%bd%d1%81%d0%be%d0%bb%d1%8c-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2-spec8-ru/
А эта ссылка значит нерабочая
Ссылку исправили, спасибо.
хоть и со значительным опозданием в силу различных обстоятельств :)- но задание выполнено. по первой части сложностей не было. Помимо указанных в задании созданы справочники КонтактныеЛицаКонтрагентов и ЕдиницыИзмеренияНоменклатуры.
В задании по автоматическому созданию записи для базовой ед.измерения почему-то перемудрила и усложнила реализацию через описанный в одном из уроков механизм перекрестных ссылок и делала долго, так как хотела выполнить без подглядывания в урок.
Проверку на заполненность конт.лиц для контрагентов реализовала через запрос в запросе (в Вашем решении это оказался второй вариант, он менее правильный?). при написании пользовалась конструктором, как хорошо что придумали такой инструмент, пока без него делать даже “простые” запросы сложно.
Использование вложенных запросов не является лучшей практикой, поскольку время выполнения запроса в этом случае будет сложно прогнозируемым.
Это актуально для сложных запросов, особенно тех, что выполняются в транзакции (например, при проведении).
Но об оптимизации мы будем подробно говорить в рамках курса продвинутого.
Поэтому пока считаем такой вариант решения приемлемым.
У меня консоль запросов даже не открывается в Конфигураторе через файл – Открыть. Поэтому дальше с ней ничего и не сделаешь согласно видео урока. Скачивала отсюда
https://mg.spec8.ru/2010/07/06/%d0%ba%d0%be%d0%bd%d1%81%d0%be%d0%bb%d1%8c-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2-spec8-ru/
Какая у Вас версия платформы?
Какая ошибка возникает при открытии?
1) Вся информация, отличающаяся от 1с7 была новой. Понятнее стали директивы компиляции
2) Затруднений не было;
3) Пока таких тем нет.
Задание выполнила, все получилось. Пришлось подумать чтоб сообразить с запросом. Скачала
консоль запроса в разных вариантах с разных сайтов, установилась только с другого сайта.
Ваша обработка не захотела добавиться как внешняя обработка. Выдала ошибку
“Ошибка при выполнении файловой операции ‘C:\Consol\Console_Spec8_RU.epf’
по причине:
Неверный формат хранилища данных ‘file://C:/Consol/Console_Spec8_RU.epf’
Но поработать с чужой консолью немного получилось. Очень удобно, видишь сразу результат
выполнения.
————————————————————————–
Справочник “КонтактныеЛица” (добавлен реквизит “Должность”) – подчинен Справочнику
“Контрагенты”
Создан новый справочник “ЕдиницыИзмеренияНоменклатуры” (добавлены реквизиты
“Коэффциент”, “ЕдиницаИзмерения”) – подчиненный “Номенклатуре”
————————————-
// Справочник.Номенклатура.МодульОбъекта
Процедура ПриЗаписи(Отказ)
Если (ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга) и (не ЭтоГруппа)
Тогда
НовЕдиница = Справочники.ЕдиницыИзмеренияНоменклатуры.СоздатьЭлемент();
НовЕдиница.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения.Ссылка;
НовЕдиница.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НовЕдиница.Коэффициент = 1;
НовЕдиница.Владелец = ЭтотОбъект.Ссылка;
Если НовЕдиница.ПроверитьЗаполнение() Тогда
НовЕдиница.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
———————————-
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если не ЭтоГруппа Тогда
ВидРодителя = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
Если не ВидРодителя.Пустая() Тогда
ВидНоменклатуры = ВидРодителя;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
———————————–
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если (ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга) тогда
сч = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
Если сч<>Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(сч);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
—————————————————
// Обработка.ПроверкаКонтрагентов.МодульФормы
&НаКлиенте
Процедура ВыполнитьНаКлиенте(Команда)
ВыполнитьНаСервере();
КонецПроцедуры // ВыполнитьНаКлиенте(Команда)
—————————————————-
&НаСервере
Процедура ВыполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Наименование,
| КонтактныеЛица.Владелец
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК
КонтактныеЛица
| ПО (КонтактныеЛица.Владелец = Контрагенты.Ссылка)
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
|
|СГРУППИРОВАТЬ ПО
| Контрагенты.Наименование,
| КонтактныеЛица.Владелец”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Сообщение = Новый СообщениеПользователю;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Владелец = Null Тогда
Сообщение.Текст = “Отсутствуют контактные лица у “+
ВыборкаДетальныеЗаписи.Наименование;
Сообщение.Поле = “”;
//Сообщение.УстановитьДанные();
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры // ВыполнитьНаСервере()
Посмотрите последний урок первого блока, там рассказано как добавлять нашу консоль запросов.
Задание выполнил.
В справочнике “Контрагенты” создал табличную часть для хранения контактных лиц, с реквизитами “Должность” и “Лицо”. Для удобства пользователей, создал справочник “Должности”.
В справочнике “Номенклатура” у обоих реквизитов свойство “Проверка заполнения” выставил в “Выдавать ошибку”.
<code>
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Объект.Родитель.ВидНоменклатуры) Тогда
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
</code>
Хранение единиц измерения каждой номенклатуры реализовал через табличную часть, а не подчиненный справочник, т.к.
1) единицы измерения в данном случае не являются самостоятельной сущностью;
2) во избежание перекрестных ссылок.
<code>
Процедура ПередЗаписью(Отказ)
Если ЭтоНовый() Тогда
НовСтр = ЕдиницыИзмерения.Добавить();
НовСтр.Единица = БазоваяЕдиницаИзмерения;
НовСтр.Коэф = 1;
КонецЕсли;
КонецПроцедуры
</code>
Долго мучился с запросом в обработке проверки контрагентов, т.к. с запросами еще почти не работал.
<code>
Процедура ВыполнитьПоискНаСервере() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Клиент,
| КонтрагентыСотрудники.Лицо КАК Лицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.Сотрудники КАК КонтрагентыСотрудники
| ПО (КонтрагентыСотрудники.Ссылка = Контрагенты.Ссылка)
|ГДЕ
| КонтрагентыСотрудники.Лицо ЕСТЬ NULL
| И (НЕ Контрагенты.ЭтоГруппа)
|
|УПОРЯДОЧИТЬ ПО
| Клиент,
| Лицо
|АВТОУПОРЯДОЧИВАНИЕ”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Клиент);
КонецЦикла;
КонецПроцедуры
</code>
Обратная связь по первому блоку:
1. Новой оказалась тема по уникальным идентификаторам и перекрестным ссылкам, знала ранее про их существование, но понимания как это можно использовать – до конца не было, хотя на практике не раз встречалась с необходимостью использования подобного механизма.
2. Путалась в событиях форм, которые выполняются на сервере (при создании на сервере и т.п.) и обработчиках событий в модуле объекта, не понятно было когда лучше какой обработчик использовать. После соответствующих тем курса все встало на свои места.
ДЗ6 выполнил.
1.Создал справочники Контрагенты, КонтактныеЛицаКонтрагентов, подчиненный справочнику Контрагенты. (Так как связь
справочников должна быть многое ко многим – то (вспоминаем теорию БД) нужен еще один справочник – “Физические
лица”). Для указания должностей создал справочник Должности.
Реквизиты справочника КонтактныеЛицаКонтрагентов: Должность, ФизическоеЛицо, Владелец(стандартный). Таким образом
связь многое-ко-многим справочников ФизическиеЛица и Контрагенты будет осуществляться через два последних
реквизита.
Реквизиты справочника ФизическиеЛица: ДеньРождения(тип Дата), Телефон(Строка)
2. Создал справочники Номенклатура, и подчиненный ему ЕдиницыИзмерения.
Создал справочник КласифЕдиницИзмерения – для уникальных Единиц Измерения.
Реквизиты справочника Номенклатура – Вид(тип ПеречислениеСсылка.ЕдиницыИзмерения), БазоваяЕдиницаИзмерения(тип
СправочникСсылка.КласифЕдиницИзмерения)
Реквизиты справочника ЕдиницыИзмерения: Коэффициент (тип Число 3,2), ЕдиницаИзмерения(тип
СправочникСсылка.КласифЕдиницИзмерения)
Справочник Номенклатура – Иерархический (иерархия групп и элементов)
3. Условие о незаполнении БазовойЕдиницыИзмерения указал в ОбработкеПроверкиЗаполнения модуля объекта справочника Номенклатура
4. Также учел при изменении Номенклатуры, чтоб не записывалось дублирующее значение для БазовойЕдиницыизмерения.
Выполнил без создания запросови с запросом.
5. Обработку сделал запросом
Обратная связь
1. Узнал много нового. Очень много ньюансов. За элементарными вещами приходится лезть в синтакс-помощник. Понял для чего нужна книжка:) Делаю в ней пометки. Из-за этого решения ДЗ и затянулись – пересматривал почти полностью весь первый блок.
2. Затруднения возникают на начальном этапе проектирования структуры приложения. Надеюсь это пройдет со временем.
3. Автоматизация резервного копирования средствами различных БД (MSSQL, MySQL, Oracle, IBM DB2)
Пожелания:
1. Рассказывать про тип данных “Уникальный идентификатор” в блоке 1
2. Главу 15 объединить с Главой 11
>3. Автоматизация резервного копирования средствами различных БД (MSSQL, MySQL, Oracle, IBM DB2)
MySQL не поддерживаемся, зато можно использовать PostgreSQL.
Задание выполнил:1. Создал справочники Контрагенты, КонтактныеЛица и
Должности без указания владельцев.
В справочнике Контрагенты добавил ТЧ с реквизитами
типа СправочникСсылка.КонтактныеЛица и СправочникСсылка.Должности.
2. Создал справочники Номенклатура и КласиификаторЕдиницИзмерения,
Перечисление ВидНоменклатуры.
В св-вах Реквизита ВидНоменклатуры значение Использование установил
“Для группы и элемента”.
МодульОбъекта справочника Номенклатура:
<code>
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ПустаяСсылка = Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка();
Если (ВидНоменклатуры <> Перечисления.ВидНоменклатуры.Услуга) И (БазоваяЕдиницаИзмерения = ПустаяСсылка) Тогда
Отказ = Истина;
Сообщить(“Не заполнена базовая единица измерения.”);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
ПустаяСсылка = Перечисления.ВидНоменклатуры.ПустаяСсылка();
Если ДанныеЗаполнения <> Неопределено Тогда
РодительВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
Если РодительВидНоменклатуры <> ПустаяСсылка Тогда
ВидНоменклатуры = РодительВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
</code>
3. Создал справочник ДоступныеЕдиницыИзмерения с реквизитами ЕдиницыИзмерения, КоэффициентПересчета
В модуле объекта:
<code>
Процедура ПриЗаписи()
Если ВидНоменклатуры <> Перечисления.ВидНоменклатуры.Услуга Тогда
ЕдиницыИзмерения = Проверка(Ссылка);
Если ЕдиницыИзмерения.Количество() = 0 Тогда
НовыйЭлемент = Справочники.ДоступныеЕдиницыИзмерения.СоздатьЭлемент();
НовыйЭлемент.Владелец = Ссылка;
НовыйЭлемент.ЕдиницыИзмерения = БазоваяЕдиницаИзмерения;
НовыйЭлемент.КоэффициентПересчета = 1;
НовыйЭлемент.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция Проверка(Пар)
Запрос = Новый Запрос;
Запрос.Текст =
” ВЫБРАТЬ
| ДоступныеЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ДоступныеЕдиницыИзмерения КАК ДоступныеЕдиницыИзмерения
|ГДЕ
| ДоступныеЕдиницыИзмерения.Владелец = &Владелец”;
Если БазоваяЕдиницаИзмерения <> Неопределено Тогда
Запрос.Текст = Запрос.Текст + ”
| И ДоступныеЕдиницыИзмерения.ЕдиницыИзмерения = &ЕдиницыИзмерения”;
Запрос.УстановитьПараметр(“ЕдиницыИзмерения”, БазоваяЕдиницаИзмерения);
КонецЕсли;
Запрос.УстановитьПараметр(“Владелец”, Пар);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;
КонецФункции
</code>
4. Модуль формы внешней обработки:
<code>
&НаКлиенте
Процедура ВыполнитьНаКлиенте(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Представление,
| Контрагенты.ЭтоГруппа,
| Контрагенты.КонтактныеЛица
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
| И (НЕ Контрагенты.КонтактныеЛица.Ссылка = Контрагенты.Ссылка)”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Представление);
КонецЦикла;
КонецПроцедуры // ВыполнитьНаСервере()
</code>
По вопросам:
1. Новое для меня практически все.
2. Основные затруднения были по контексту исполнения кода.
3. Администрирование БД.
Только-только смог сегодня добраться до решения ДЗ. Но хотя бы успел до начала нового занятия.
Структура справочников:
– КонтактныеЛица
– Должности
– Контрагенты, табличная часть с реквизитами КонтактноеЛицо и Должность, оба ссылки
– Номенклатура
– КлассификаторЕдиницИзмерения
– ЕдиницыИзмерения, подчинен Номенклатуре
Проверку на ненадобность заполнения базовой единицы (если это услуга), реализовал в модуле формы в обработчике “ПередЗаписью”. Заполнение ВидаНоменклатуры релизовал в модуле формы в обработчике “ПриСозданииНаСервере”. Заполнение подчиненного справочника базовой единицей в обработчике “ПослеЗаписи” – простой запрос к подчиненному, если запрос пустой, то записываем базовую единицу. Кода как такового получилось очень мало.
Почесать в голове пришлось при создании обработки “Проверка контрагентов” – левое соединение не проходили, значит нельзя, получился дважды вложенный запрос – сначала получаем таблицу с контрагентами и количеством строк в табличных частях, потом из нее получаем таблицу только со ссылками, а затем выбираем из справочника контрагентов только тех, что не вошли в эту таблицу.
“ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (НЕ Контрагенты.Ссылка В
| (ВЫБРАТЬ
| К.Ссылка
| ИЗ
| (ВЫБРАТЬ
| КонтрагентыКонтактныеЛица.Ссылка КАК Ссылка,
| КОЛИЧЕСТВО(КонтрагентыКонтактныеЛица.НомерСтроки) КАК НомерСтроки
| ИЗ
| Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
| СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактныеЛица.Ссылка
| ) КАК К))”;
Теперь пошел смотреть как правильно.
Извините за опоздание.
Задание выполнил. Для хранения информации о единицах измерения и контактных лицах использовал регистры сведения. Проверку заполнения базовой единицы измерения для услуг обрабатывал в модуле объекта в процедуре “ОбработкаПроверкиЗаполнения”. В ней анализировал “Проверяемые реквизиты”. По остальным пунктам домашнего задания вопросов не возникало.
1. Очень интересный блок. Информация про уникальные идентификаторы уже пригодилась. Также мастер-группа по переходу на 8.2.
2. Проблем при изучении блока не возникало
3. Пока нету вопросов по темам. Если появятся, то первым делом напишу
1) Добавил справочники «Контрагенты», «КонтактныеЛица»(владелец -«Контрагенты»), «ДолжностиКонтрагентов», «ФизическиеЛица». 2)Добавил справочники “Номенклатура”( перечисление – «ВидНоменклатуры». ), “Классификатор единиц измерения”. Свойство ‘Использовать для груп и элементов’ — зевнул при изучении, но поотлаживал зато.
3)Справочники.Номенклатура.ОМ
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
<code>
//Если в качестве номенклатуры указана услуга – то базовую ед.изм. можно не заполнять
Если ВидНоменклатуры=ПредопределенноеЗначение(“Перечисление.ВидНоменклатуры.Услуга”) Тогда
Индекс=ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
Если НЕ Индекс=Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
<code>
//При создании элемента если вид номенклатуры у родителя определен, то нужно подставить этот вид для новой номенклатуры
Если ЗначениеЗаполнено(ДанныеЗаполнения) Тогда
Если ЗначениеЗаполнено(ДанныеЗаполнения.Родитель.ВидНоменклатуры) Тогда
ВидНоменклатуры=ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
4) Добавил справочник «ЕдиницыИзмеренияНоменклатуры»(с владельцем «Номенклатура»)
5)Справочник ЕдиницыИзмеренияНоменклатуры.МО
Процедура ПередЗаписью(Отказ)
<code>
//Проверка против дублирования информации по Ед.Изм
Если ЭтоНовый() или (Не Ссылка.Владелец = Владелец) или (Не Ссылка.ЕдИзм = ЕдИзм) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
|ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
|Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
|ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
|И ЕдиницыИзмеренияНоменклатуры.ЕдИзм = &ЕдИзм” ;
Запрос.УстановитьПараметр(“Владелец”, Владелец);
Запрос.УстановитьПараметр(“ЕдИзм”, ЕдИзм);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Сообщить(“C такими значениями запись уже есть!”);
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
6) Справочник Номенклатура:форма Элемента
<code>
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ТекущийОбъект.ЭтоНовый() И НЕ ТекущийОбъект.ЭтоГруппа Тогда
Ключ = Новый УникальныйИдентификатор;
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Ключ);
ТекущийОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект = Справочники.ЕдиницыИзмеренияНоменклатуры.СоздатьЭлемент();
НовыйОбъект.Владелец = НоваяСсылка;
НовыйОбъект.ЕдИзм = ТекущийОбъект.БазоваяЕдиницаИзмерения;
НовыйОбъект.КоэфПересчета = 1;
НовыйОбъект.Записать();
КонецЕсли;
КонецПроцедуры
</code>
7) Проверка Контрагентов
<code>
&НаКлиенте
Процедура ПроверитьКонтрагентов(Команда)
СЗПроверкаК = Новый СписокЗначений;
ПроверитьКонтра(СЗПроверкаК);
СЗПроверкаК.ОтметитьЭлементы(“Контрагенты без Контактного Лица”);
КонецПроцедуры
&НаСервере
Процедура ПроверитьКонтра(СЗПроверкаК)
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Код,
| Контрагенты.Наименование,
| КонтактноеЛицо.Владелец
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактноеЛицо КАК КонтактноеЛицо
| ПО (КонтактноеЛицо.Владелец = Контрагенты.Ссылка)
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
Если НЕ ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.Владелец) Тогда
СЗПроверкаК.Добавить(ВыборкаДетальныеЗаписи.Код+ВыборкаДетальныеЗаписи.Наименование);
КонецЕсли
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецПроцедуры
</code>
Обратная Связь
Весь материал новый.
Решение «…при записи нового элемента справочника создавалась ед изм с коеф 1, соответствующая базовой…» — помогло видео 214.
Запросы. В том числе когда на стороне сервера СУБД Oracle и как в запросах использовать «связные переменные»(в терминах Oracle)
В запросах нельзя создавать переменные, нельзя использовать DML запросы.
Тем не менее большинство задач решаются с помощью SELECT и временных таблиц.
1) Упорядочила свои знания по методам компиляции упр.форм и узнала много новых мелочей, касающихся упр.приложения;
2) Затруднений не было;
3) Пока таких тем нет.
Извините за опоздание, не всегда получается разорваться между работой и курсами. Решение: 1) В спр.Контрагенты добавила ТЧ.КонтактныеЛица, в кот. определила реквизиты КонтЛицо(СпрСсылка) и Должность(строка). 2) В Спр.Номенклатура для рекв.ВидНоменкл. в св-вах ПроверкаЗаполнения поставила ВыдаватьОшибку, в обработкеЗаполнения проверила ДанныеЗаполнения на наличие ключа = родителю, если истина, то подставляла Значение.ВидНоменклатуры из ДанныхЗаполнения. В проц.ПередЗаписью модуля объекта проверяла
Если ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга И БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка() Тогда
Отказ = Истина;
Сообщить(“Не выбрана единица измерения!”);
КонецЕсли;
НайденныйЭлем = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(БазоваяЕдиницаИзмерения);
Если НайденныйЭлем = Справочники.ЕдиницыИзмерения.ПустаяСсылка() Тогда
НовыйОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовыйОбъект.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НовыйОбъект.Записать();
КонецЕсли;
Если ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга И БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка() Тогда Отказ = Истина; Сообщить(“Не выбрана единица измерения!”); КонецЕсли; НайденныйЭлем = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(БазоваяЕдиницаИзмерения); Если НайденныйЭлем = Справочники.ЕдиницыИзмерения.ПустаяСсылка() Тогда НовыйОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент(); НовыйОбъект.Наименование = БазоваяЕдиницаИзмерения.Наименование; НовыйОбъект.Записать(); КонецЕсли;
Процедура ПриЗаписи(Отказ)
ЭлемНайден = Ложь;
Для Каждого Элем Из ЕдиницыИзмерения Цикл
Если Элем.ЕдИзм.Наименование = БазоваяЕдиницаИзмерения.Наименование Тогда
ЭлемНайден = Истина;
КонецЕсли;
КонецЦикла;
Если НЕ ЭлемНайден Тогда
СтрокаТЧ = ЕдиницыИзмерения.Добавить();
СтрокаТЧ.ЕдИзм = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(БазоваяЕдиницаИзмерения.Наименование);
СтрокаТЧ.Коэфициент=1; КонецЕсли;КонецПроцедуры
3) МодульФормы обработки “ПроверкаКонтрагентов” &НаКлиенте
Процедура ВыполнитьОк(Команда)
ВыборкаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыборкаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| КонтрагентыКонтактныеЛица.КонтактноеЛицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
| ПО КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.КонтактноеЛицо = Null Тогда
Сообщить(” ” + ВыборкаДетальныеЗаписи.Ссылка + ” не имеет контактных лиц!”);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проблем с ДЗ не возникло (вовремя отчитаться не получиось из-за фосмажора)
Резюме:
1. узнал нового: очень четкая структура классов и их использование, конструктором запросов можно сформировать практически любой запрос, а не только накидать структура и допиливать вручную, подсистемы
2. затруднений небыло
3. Было бы полезно в этом блоке рассмотреть параметры сеанса, но в вопросах МГ эта тема раскрыта
ДЗ 6
Справочники “Контрагенты” и “Контактные лица” создала. Для контактных лиц контрагента сделала табличную часть в контрагентах. Для хранения значения должности также создала соответствующий справочник.
По номенклатуре – для реквизитов “Вид номенклатуры” и “Базовая единица измерения” установила флаг проверки заполнения.
Код модуля справочника:
<code>
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если не ЭтоГруппа и ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если Не ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Владелец = &Владелец
| И ЕдиницыИзмерения.ЕдиницаКлассификатора = &ЕдиницаКлассификатора”;
Запрос.УстановитьПараметр(“Владелец”,Ссылка);
Запрос.УстановитьПараметр(“ЕдиницаКлассификатора”,БазоваяЕдиницаИзмерения);
РезЗапроса = Запрос.Выполнить().Выбрать();
Если Не РезЗапроса.Следующий() Тогда
НоваяЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НоваяЕдиница.Владелец = Ссылка;
НоваяЕдиница.ЕдиницаКлассификатора = БазоваяЕдиницаИзмерения;
НоваяЕдиница.Коэффициент = 1;
НоваяЕдиница.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НоваяЕдиница.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Установку вида номенклатуры по родителю хотела поместить в модуль объекта, в обработчик события “Обработка заполнения”, но не смогла там обратиться к родителю, сделала в форме:
<code> &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецПроцедуры
</code>
Обработка проверки контрагентов:
<code>
&НаКлиенте
Процедура Проверить(Команда)
ПроверитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| ЕСТЬNULL(КоличествоКЛ.КонтактноеЛицо, 0) КАК КоличествоКонтактныхЛиц
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| КонтрагентыКонтактныеЛица.Ссылка КАК Контрагент,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыКонтактныеЛица.КонтактноеЛицо) КАК КонтактноеЛицо
| ИЗ
| Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
|
| СГРУППИРОВАТЬ ПО
| КонтрагентыКонтактныеЛица.Ссылка) КАК КоличествоКЛ
| ПО Контрагенты.Ссылка = КоличествоКЛ.Контрагент
|ГДЕ
| ЕСТЬNULL(КоличествоКЛ.КонтактноеЛицо, 0) = 0
| И (НЕ Контрагенты.ЭтоГруппа)”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Контрагент);
КонецЦикла;
КонецПроцедуры
</code>
Резюме по 1 блоку.
Насыщенный новыми понятиями блок. Приходит понимание управляемого приложения. Теперь любой модуль приходится рассматривать “по слоям” : слой сервера, клиента…
Идею первоначального получения всех необходимых данных от сервера с отработкой вывода на клиенте реализовывал в 7.7 прямыми запросами через компрненту 1CPP. В 8.2 – это уже не просто готовый механизм, а стандарт работы.
Для меня, как человека переходящего с 7.7 сразу на 8.2, затруднение вызвало … ИЗОБИЛИЕ методов объектов и возможностей реализации обработки событий (в попытке найти оптимальный вариант), а также непривычным показалось “отвязанность” формы от объекта. Но это дело опыта, который накапливается в том числе и на Ваших примерах.
Если говорить о теме мастер-группы, то я бы остановился на создании какой-нибудь унивесальной структуры понимания взаимодействия формы и объекта данных (возможно это будет дальше), или, например, одного МЕТОДИЧЕСКОГО примера (претендующего на универсальность), раскрывающего сущности обработчиков событий элементов и в целом формы.