Базовый курс. Занятие №6
Третье занятие по 1-му блоку базового курса.
Необходимо изучить следующие главы.
Глава 9. Формы.
Глава 10. Перечисления.
Глава 11. Администрирование.
Глава 12. Роли.
Глава 13. Пользователи.
Глава 14. Параметры ИБ.
Глава 15. Резервные копии.
Глава 16. Отладка.
Глава 17. Работа с запросами к БД.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Задание выполнено.
Создал справочники «Контрагенты», «Контактные лица». В контактные лица добавил 2 реквизита «День рождения», «Телефон». Создал справочник «Контактные лица контрагента» подчиненный справочнику «Контрагенты», с реквизитами «Должность» и «Контактное лицо».
Создал справочник «Номенклатура» и «Классификатор единиц измерения». Создал перечисление «Виды номенклатуры» со значениями (Товар, Набор, Услуга).
В справочник «Номенклатура» добавил реквизиты «Вид номенклатуры» тип «ПеречислениеСсылка.ВидыНоменклатуры» и «Базовая единица измерения» тип «СправочникСсылка.КлассификаторЕдиницИзмерения». В палитре свойств для реквизита «Базовая единица измерения» указал проверку заполнения. В процедуре «ОбработкаПроверкиЗаполнения» следующий код <code>
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга
и не ЭтоГруппа тогда
ИндексРеквизита = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
Если ИндексРеквизита <> Неопределено тогда
ПроверяемыеРеквизиты.Удалить(ИндексРеквизита);
КонецЕсли;
КонецЕсли; </code>
В процедуре «Обработка заполнения» добавил если у родителя элемента заполнен реквизит «Вид номенклатуры», то этот же реквизит подставляется для нового элемента.
4. Создал справочник «Единицы измерения», подчиненный справочнику «Номенклатура». Реквизиты: «ЕдиницаПоКлассификатору», «Коэффициент», «КоличествоВОднойЕдинице».
5. В процедуре «При записи» нового элемента справочника «номенклатура» создается элемент справочника «Единицы измерения» аналогичный базовой единице.
6. Список контрагентов у которых нет контактных лиц выбираю следующим запросом
<code>
“ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ЭтоГруппа
| И (НЕ Контрагенты.ПометкаУдаления)
| И (НЕ Контрагенты.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| КонтактныеЛицаКонтрагента.Владелец
| ИЗ
| Справочник.КонтактныеЛицаКонтрагента КАК КонтактныеЛицаКонтрагента
| ГДЕ
| (НЕ КонтактныеЛицаКонтрагента.ПометкаУдаления)))”
</code>
Здравствуйте!
1.
Создайте справочники «Контрагенты» и «Контактные лица». Для контрагентов должна
быть определена иерархия групп и элементов. Для контактного лица определены реквизиты
день рождения и телефон.
Создал справочники «Контрагенты» и «Контактные лица». Для контрагентов определил иерархию групп и элементов на вкладке Иерархия, а также создал реквизит Контактное лицо с ссылкой на соответствующий справочник. Для контактного лица определил реквизиты день рождения и телефон.
Также создал справочник Должности, и определил реквизит Контактное Лицо с типом СправочникСсылка.КонтактныеЛица. У справочник Должности определил владельца справочник Контрагенты
2. Создал справочник “Номенклатура” и “Классификатор единиц измерения”. Для справочника номенклатура определил иерархию и реквизиты вид номенклатуры и базовую единицу измерения. В палитре свойств при проверке заполнения указал значение “выдавать ошибку”, а также в модуле объекта при проверке заполнения реквизитов следующий код:
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга и ЭтоГруппа = Ложь Тогда
ПроверяемыеРеквизиты.Удалить(2);
КонецЕсли;
в модуле формы в обработчике при создании на сервере след.код:
Если (не Объект.ЭтоГруппа) И (Параметры.Ключ.Пустая()) Тогда
Если Объект.Родитель.ВидНоменклатуры<>0 Тогда
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
3. Создал справочник Единицы измерения и определил реквизиты коэффициент и базовая единица измерения. Владелец справочник Номенклатура. В модуле объекта при записи код:
Выборка = Справочники.ЕдиницыИзмерения.Выбрать(,Ссылка);
Если не Выборка.Следующий() Тогда
//т.е. единицы измерения еще не установлены
Элемент = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
Элемент.Владелец = Ссылка;
Элемент.Коэффициент = 1;
Элемент.Наименование = Строка(Ссылка.ЕдиницаИзмеренияБазовая);
Элемент.БазоваяЕдиницаИзмерения = Ссылка.ЕдиницаИзмеренияБазовая; Элемент.Записать();
КонецЕсли;
4. Создал обработку со след. кодом:
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
Запрос = новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка)
| И Контрагенты.ЭтоГруппа = ЛОЖЬ”;
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Стр из Результат Цикл
Сообщить(Стр.Ссылка);
КонецЦикла;
КонецПроцедуры // ВыполнитьНаСервере()
Спасибо. Все замечательно
1. Создал справочники “Контрагентов” и “КонтактныхЛиц”.
Создал табличную часть у Справочника “Контрагенты” “КонтактныеЛицаКонтрагентов” с необходимыми реквизитами (попутно справочник Должности)
2. Создал Справочники “Номенклатура”,”КлассификаторЕдиницИзмерения”, перечисление “ВидыНоменклатуры”
в модуле объекта, в процедуре обработкаПроверкиЗаполнения определяю индекс проверяемого реквизита, и при условии, что это не группа и Вид номенклатуры =услуга удаляю проверяемый реквизит.
3. В процедуре обработкаЗаполения работаю со структурой данныеЗаполнения, проставляю вид номенклатуры и родителя.
4. Создаю справочник “ЕдиницыИзмерения” подчинённый номенклат с реквизитами коэффициент и ссылку на класификатор Ед.Изм.
В процедуре передзаписью с помощью языка запросов, использую параметры владелец, и искомый класификатор проверяю на наличие такой записи.(проверка на дубляж)
5. Модуль объекта справочника “Номенклатура” В процедуре При записи проверяю на наличие базовой единицы в справочнике “ЕдиницИзмерения”, если ничего нет добавляю базовуюЕд.Изм и коэффициент 1.
6. в обработке использовал 2 процедуры: на клиенте вызвал процедуру на сервере, которая в свою очередь выполнила запрос(справочник контрагенты левое соединение табличная чать справочника контрагенты”Контактные лица контрагентов”) условиями убрал группы и использовал ЕСТЬ NULL.
Обратная связь по 1 блоку:
1. Интересно всё, всё систематизируется.
2.Трудность только в выделении времени на прослушивание материалов.
3. Материала более чем достаточно, если работаешь ))
ОбработкаЗаполнения
Задание выполнено. Замечаний не возникло, наоборот оно показалось самым легким из всех предыдущих.
Описание сделанного:.
1. Контрагенты и Контактные лица. При обеспечении того, что контактные лица могут относиться к нескольких контрагентам, меня смутила фраза “В дальнейшем контактные лица контрагентов будут использоваться в некоторых
документах”, подумал, что она означает выбор в документах контактого лица определенного контрагента, поэтому сделал еще один справочник КонтактныеЛицаКонтрагентов, подчиненный Контрагентам с реквизитами КонтактноеЛицо и Должность.
2. Номенклатура и КлассификаторЕдиницИзмерений. Добавил объектры конфигурации с реквизитами, обязательными для заполнения. Нов процедуре ОбработкаПроверкиЗаполнения проверяю вид номеклатуры, и если услуга – удаляю из массива ПроверяемыеРеквизиты элемент БазоваяЕдиница. Для заполнения вида номеклатуры из родителя в процедуре ОбработкаЗаполнения анализирую структуру ДанныеЗаполнения.
3. Для не базовых единиц измерений создал справочник ЕдиницыИзмерения, подчиненный Номеклатуре, с реквизитами ЕдиницаПоКлассификатору и Коэффициент. При записи элемента номеклатуры проверяю через запрос наличие элемента единиц измерений с условиями
<code>|ГДЕ
ЕдиницаИзмерения.БазоваяЕдиницаПоКлассификатору = &БазоваяЕдиницаПоКлассификатору
| И ЕдиницаИзмерения.Коэффициент = 1
| И ЕдиницаИзмерения.Владелец = &ТекущаяНоменклатура”;
</code>
если запрос выдает пустой результат, записываю единицу измерения, соответсвующую базовой.
4. Обработка ПроверкаЗаполнения.
Запросом получаю нужный список контрагентов и вывожу с помощью ВыбратьЭлементы (требуется только вывести).
Запрос: <code>
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
ПО (КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка)
ГДЕ
Контрагенты.ЭтоГруппа = ЛОЖЬ
И ЕСТЬNULL(КонтактныеЛицаКонтрагентов.КонтактноеЛицо, “Не заполнены контактные лица”) = “Не заполнены контактные лица”
</code>
Выполнено:
1) Созданы спр. Контрагенты и подчиненный ему спр. КонтактныеЛица. В КонтактныхЛицах созданы реквизиты ФизЛицо (спр. Физлица, должность, таб.часть Телефоны)
2) Созданы спр. Номенклатура, КлассификаторЕдиницИзмерения, ЕдиницыИзмерения (подчинен Номенклатуре с реквизитами спр. КлассификаторЕдиницИзмерения и Коэффициент), перечисление ВидыНоменклатуры.
Проверка заполнения реквизита ВидНоменклатуры на уровне свойств, реквизита БазоваяЕдиницаИзмерения – в проц. ПередЗаписью.
Подставление группы в новый элемент – в проц. модуля объекта
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЭтоНовый() И ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
Вид = Неопределено;
Если ДанныеЗаполнения.Свойство(“Родитель”, Вид) Тогда
ДанныеЗаполнения.Вставить(“ВидНоменклатуры”, Вид.ВидНоменклатуры);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЭтоНовый() И ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
Вид = Неопределено;
Если ДанныеЗаполнения.Свойство(“Родитель”, Вид) Тогда
ДанныеЗаполнения.Вставить(“ВидНоменклатуры”, Вид.ВидНоменклатуры);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проверка и создание в спр. ЕдиницыИзерения нового элемента на основе БазовойЕдиницыИзмерения в проц. ПослеЗаписиНаСервере
3) В обработке ПроверкаКонтрагентов конрагенты выбираются с помощью запроса
|ВЫБРАТЬ
| ВложенныйЗапрос.Контрагент
|ИЗ
| (ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| КОЛИЧЕСТВО(КонтактныеЛица.Ссылка) КАК КоличествоКонтактныхЛиц
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
| ПО (КонтактныеЛица.Владелец = Контрагенты.Ссылка)
| ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
|
| СГРУППИРОВАТЬ ПО
| Контрагенты.Ссылка) КАК ВложенныйЗапрос
|ГДЕ
| ВложенныйЗапрос.КоличествоКонтактныхЛиц = 0
1. Заводим справочник “Контрагенты”
2. Заводим справочник “Контактные лица”
3. Связь справочников осуществляем через регистр сведений, можно использовать периодический, измерение – контрагент, ресурс – контактное лицо.
4. Создаем справочник “Классификатор едениц измерения”
5. Создаем перечисление “ВидыНоменклатуры” с указанными значениями
6. Создаем справочник “Номенклатура” и создаем необходимы реквизиты (для вида номенклатуры указываем использование для элментов и групп) и указываем в свойства обязательность их заполенения.
7. В процедуре ПриСозданииНаСервере добавляем код:
Объект.ВидНоменклатуры =
Объект.Родитель.ВидНоменклатуры;
8. Для хранения доступных реквизитов используем регистр сведений не периодический с 2 измерения номенклатура и ед.изм и ресурсом коэффициент
9. В процедуру ПриЗаписиНаСервере добавляем код:
РС=РегистрыСведений.ЕденицыИзмеренийНоменклатуры.СоздатьМенеджерЗаписи();
РС.Номенклатура = ТекущийОбъект.Ссылка;
РС.ЕдиницаИзмерения = ТекущийОбъект.БазоваяЕдиницаИзмерения;
РС.Коэффициент = 1;
Рс.Записать();
10. Создаем обработку проверку контрагентов:
10.1. добавляем новую команду ВыполнитьПроверку
&НаКлиенте
Процедура ВыполнитьПроверку(Команда)
МассивКонтрагентовДляИсправления = НайтиКонтрагентовДляИсправления();
Если МассивКонтрагентовДляИсправления.Количество() > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Для каждого ТекСтрока Из МассивКонтрагентовДляИсправления Цикл
Сообщение.Текст = Сообщение.Текст + ТекСтрока + Символы.ПС;
КонецЦикла;
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиКонтрагентовДляИсправления()
Запрос = Новый Запрос(“ВЫБРАТЬ
| КонтактныеЛицаКонтрагентов.Контрагент,
| КонтактныеЛицаКонтрагентов.КонтактноеЛицо
|ИЗ
| РегистрСведений.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
|ГДЕ
| КонтактныеЛицаКонтрагентов.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактноеЛицо.ПустаяСсылка)”);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Новый Массив;
Иначе
Возврат Результат.Выгрузить().ВыгрузитьКолонку(“Контрагент”);
КонецЕсли;
КонецФункции
P.S.:
Очень понравились задания этого блока, несмотря на то что вовремя не получилось на них отвечать.
Новое было в использовании глобальных переменных.
Писал-писал отчет по выполнению ДЗ №6, отправил его, а в комментариях не вижу. Опять писать? Или куда-то не туда отправил?
Геннадий, отчет одобрен, все ок.
ДЗ №6 выполнил.
В справочнике КОНТРАГЕНТЫ создал реквизит КонтактноеЛицо, при выборе которого из справочника КОНТАКТНЫЕЛИЦА в реквизит спр-ка КОНТРАГЕНТЫ ТЕЛЕФОН прописывается значение номера телефона контактного лица. Значения реквизита ДОЛЖНОСТЬ беру и спр-ка ДОЛЖНОСТИ.
В спр-ке НОМЕНКЛАТУРА с видом номенклатуры (использую перечисление ВИДЫНОМЕНКЛАТУРЫ) проблем не возникло.
Чтобы при виде номенклатуры не проверялось заполнение реквизита БАЗОВАЯЕДИНИЦАИЗМЕРЕНИЯ использовал обработчик модуля объекта ОбработкаПроверкиЗаполнения, удалив эту единицу из проверяемых реквизитов.
Чтобы у вновь создаваемого элемента проставлялся тот же вид номенклатуры, что и у родителя, использовал обработчик модуля объекта ОбработкаЗаполнения, проверив на заполненность его параметр ДАННЫЕЗАПОЛНЕНИЯ, откуда в результате и взял значение вида номенклатуры родителя.
Для хранения основных единиц номенклатуры создал подчиненный спр-ку НОМЕНКЛАТУРА спр-к ЕДИНИЦЫИЗМЕРЕНИЯНОМЕНКЛАТУРЫ.
На форме элемента спр-ка НОМЕНКЛАТУРА объединил для наглядности в одну группу ЕДИНИЦЫИЗМЕРЕНИЯ три реквизита: БАЗОВАЯ, ОСНОВНАЯ и КОЭФФИЦИЕНТ (основной единицы). При записи нового элемента номенклатуры с помощью обработчика модуля объекта ПРИЗАПИСИ проверяется наличие основной единицы измерения, подчиненной новому элементу, такой же, как базовая, понятно, что ее нет (пустая ссылка), после этого она создается в спр-ке ЕДИНИЦЫИЗМЕРЕНИЯНОМЕНКЛАТУРЫ с коэффициентом = 1 и оттуда выбирается в новый элемент номенклатуры вместе с коэффициентом.
При выборе других основных единиц, подчиненных какой-то конкретной номенклатуре (тут я использую связи параметров выбора – Отбор.Владелец) для записи соответствующего выбранной единице коэффициента я использую обработчик модуля формы элемента ОСНОВНАЯЕДИНИЦАПРИИЗМЕНЕНИИ (на Клиенте) с вызовом созданной мною функции ПОЛУЧИТЬКОЭФФИЦИЕНТЕДИНИЦЫИЗМЕРЕНИЯ(Объект) (на Сервере).
В обработке ПРОВЕРКАКОНТРАГЕНТОВ все проверки выполняю на сервере, там же заполняю список контрагентов, который и вывожу на клиенте.
1. Создал справочники “Контрагенты” и “Контактные лица” согласно заданию. Для удобства использования в документах создал “Контактные лица контрагентов”, подчиненный справочнику “Контрагенты”, с реквизитами:
“Контактное лицо” – ссылка на справочник “Контактные лица”
“Должность” – строка (при желании можно внести в справочник “Должности”)
2. Обработку “Проверка контрагентов” создал по средствам конструтора запросов с обработкой результата:
&НаКлиенте
Процедура Выполнить1(Команда)
ТабДок = Новый ТабличныйДокумент;
ВыполнитьСервер(ТабДок);
ТабДок.Показать();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьСервер(ТабДок)
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Макет = Обработки.ПроверкаКонтрагентов.ПолучитьМакет(“СписокКонтрагентовБезКонтактныхЛиц”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ВложенныйЗапрос.Контрагент
|ИЗ
| (ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| КОЛИЧЕСТВО(КонтактныеЛицаКонтрагентов.Ссылка) КАК КоличествоКонтактныхЛиц
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
| ПО КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка
|
| СГРУППИРОВАТЬ ПО
| Контрагенты.Ссылка) КАК ВложенныйЗапрос
|ГДЕ
| ВложенныйЗапрос.КоличествоКонтактныхЛиц = 0
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Контрагент”;
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть(“Заголовок”);
ОбластьПодвал = Макет.ПолучитьОбласть(“Подвал”);
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть(“ШапкаТаблицы”);
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть(“ПодвалТаблицы”);
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть(“Детали”);
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецПроцедуры
3. Создаю справочник “Номенклатура”, “Классификатор единици измерения” и “Единицы ищмерения номенклатуры”, подчиненный справочнику “Номенклатура”
Модуль справочника “Номенклатура”:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЭтоНовый() Тогда
Если ЗначениеЗаполнено(ДанныеЗаполнения) Тогда
Если ЗначениеЗаполнено(ДанныеЗаполнения.Родитель) Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
Если НЕ ЗначениеЗаполнено(ВидНоменклатуры) Тогда
ВидНоменклатуры = ПолучитьВидНоменклатурыРодителя(ДанныеЗаполнения.Родитель);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьВидНоменклатурыРодителя(ЭлементСправочника) Экспорт
РодительЭлементаСправочника = ЭлементСправочника.Родитель;
Если ЗначениеЗаполнено(РодительЭлементаСправочника) Тогда
ВидУРодителя = РодительЭлементаСправочника.ВидНоменклатуры;
Если ЗначениеЗаполнено(ВидУРодителя) Тогда
Возврат ВидУРодителя;
Иначе
Возврат ПолучитьВидНоменклатурыРодителя(РодительЭлементаСправочника);
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”))
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
ЕдИзм = Справочники.ЕдиницыИзмеренияНоменклатуры.НайтиПоРеквизиту(“ЕлиницаПоКлассификатору”, БазоваяЕдиницаИзмерения,,Ссылка);
Если НЕ ЗначениеЗаполнено(ЕдИзм) Тогда
НоваяЕдИзм = Справочники.ЕдиницыИзмеренияНоменклатуры.СоздатьЭлемент();
НоваяЕдИзм.Владелец = Ссылка;
НоваяЕдИзм.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НоваяЕдИзм.ЕлиницаПоКлассификатору = БазоваяЕдиницаИзмерения;
НоваяЕдИзм.Коэффициент = 1;
НоваяЕдИзм.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Выполнено, вопросов и затруднений нет.
Задание Выполнено
У Справочника Номенклатура есть табличная часть ЕдиницыИзмерения
У справочника Контрагенты есть табличная часть контактные лица
Модуль объекта справочника Номенклатура:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если (ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Услуга)
тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕИ”));
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Если ЗначениеЗаполнено(БазоваяЕИ)
Тогда
Если (ЕдиницыИзмерения.Найти(БазоваяЕИ,”ЕИ”)=Неопределено)
тогда
НоваяСтрока=ЕдиницыИзмерения.Добавить();
НоваяСТрока.ЕИ=БазоваяЕИ;
НоваяСтрока.Коэффициент=1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Модуль формы элемента справочника Номенклатура:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтоНовый = Объект.Ссылка.Пустая();
Если ЭтоНовый и (ЗначениеЗаполнено(Объект.Родитель.ВидНоменклатуры))
тогда
Объект.ВидНоменклатуры=Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Модуль обработки проверка контрагентов:
&НаКлиенте
Процедура Сформировать(Команда)
Массив=СформироватьнаСервере();
Для к=0 По Массив.Количество()-1 Цикл
Сообщить(Массив[к]);
КонецЦикла
КонецПроцедуры
&НаСервере
Функция СформироватьнаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.Контактныелица КАК КонтрагентыКонтактныелица
| ПО (КонтрагентыКонтактныелица.Ссылка = Контрагенты.Ссылка)
|ГДЕ
| Контрагенты.ЭтоГруппа = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО
| Контрагенты.Ссылка
|
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыКонтактныелица.НомерСтроки) = 0”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Массив= Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Массив.Добавить(ВыборкаДетальныеЗаписи.ССылка);
КонецЦикла;
Возврат Массив
КонецФункции
1. Создала справочники «Контрагенты» и «Контактные лица» и “Должности”.
Список контактных лиц и их должностей у контрагента храню в табличной части справочника Контрагенты.
2. Создала справочник «Номенклатура» и «Классификатор единиц измерения». Для хранения вида номенклатуры создала одноименное перечисление.
Список доступных единиц измерения и коэффициентов храню в табличной части справочника.
В модуле справочника в процедуре “ОбработкаПроверкиЗаполнения” анализирую необходимость заполнения единицы измерения.
В процедуре “ОбработкаЗаполнения” заполняю значение реквизита ВидНоменклатуры родительским значением.
В процедуре “ПередЗаписью” проверяю вхождение базовой единицы в табличную часть, и если не нахожу, то добавляю:
<code>
Если ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
Нашли = СписокЕдиницИзмерения.НайтиСтроки(Новый Структура(“ЕдиницаИзмерения”,БазоваяЕдиницаИзмерения));
Если Нашли.Количество()=0 Тогда
Нов = СписокЕдиницИзмерения.Добавить();
Нов.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
Нов.КоэффициентПересчета = 1;
КонецЕсли;
КонецЕсли;
</code>
3. Создала обработку “Проверка контрагентов”.
По команде проверить вызывается серверная процедура “ПолучитьРезультатПроверкиСправочникаКонтрагенты()”
Модуль формы:
<code>
&НаКлиенте
Процедура Проверить(Команда)
ПолучитьРезультатПроверкиСправочникаКонтрагенты();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПолучитьРезультатПроверкиСправочникаКонтрагенты()
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий()Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Если Выборка.КонтактныеЛица.Количество()=0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нет контактного лица: “+Выборка.Наименование;
Сообщение.КлючДанных = Выборка.Ссылка;
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
</code>
Задание выполнено.
Конт лиц и реализовал через регистр сведений с ведущими измерениями “контрагент” и “контЛицо” и строковым ресурсом должность, список ед.измерения также – регистр сведений с измерениями “номенклатура” и “КлассификаторЕдИзм” и ресурсом “коэффициент пересчета”.
обработка запросом
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
(НЕ Контрагенты.ЭтоГруппа)
И (НЕ Контрагенты.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
КонтактныеЛицаКонтрагентов.Контрагент
ИЗ
РегистрСведений.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов))
Чтобы обеспечить использование контактного лица для разных контрагентов, используем два справочника – “Контактные лица” для хранения списка контатных лиц и “Контактные лица контрагентов” для привязки контактного лица к контрагенту с указанием должности (подчинен справочнику “Контрагенты”, реквизиты КонтакноеЛицо, Должность). Для хранения должностей можно создать отдельный справочник.
В справочнике “Номенклатура” для реквизита “ВидНоменклатуры” устанавливаем тип перечисление. Для проверки заполнения используем средства платформы.
Для проверки заполнения реквизита “БазоваяЕдиницаИзмерения” используем процедуру ОбработкаПроверкиЗаполнения() модуля справочника.
В процедуре ОбработкаЗаполнения() для новых элементов подставляем вид номенклатуры из родительской группы, используя параметр “ДанныеЗаполнения” (учитываем, что элемент не должен быть группой и параметр заполнен, т.е. элемент имеет родителя).
Создаем подчиненный “Номенклатуре” справочник “Единицы измерения” с реквизитами “Базовая единица измерения”, “Коэффициент”. В дальнейшем необходимо будет предусмотреть механизмы пересчета с учетом коэффициента при изменении единицы измерения в форме.
При записи нового элемента номенклатуры добавляем новый элемент в справочник “Единицы измерения” – в процедуре ПередЗаписью() номенклатуры задаем переменной НоваяСсылка модуля объекта уникальный идентификатор для единицы измерения, в процедуре ПриЗаписи(), если значение переменной задано, создаем новую единицу измерения, соответствующую базовой единице.
В обработке “Проверка контрагентов” запросом получаем список нужных контрагентов. Запрос выполняем в процедуре с директивой компиляции &НаСервереБезКонтекста, выводим значения выборки в цикле.
ВЫБРАТЬ Контрагенты.Ссылка
ИЗ Справочник.Контрагенты КАК Контрагенты
ГДЕ (НЕ Контрагенты.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ КонтактныеЛицаКонтрагентов.Владелец
ИЗ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов))
И (НЕ Контрагенты.ЭтоГруппа)
Выполнил.
Контактные лица реализовал через табличную часто Контрагентов
На форму элемента номенклатуры и в процедуру ОбработкаПроверкиЗаполнения повесил проверку обязательных к заполнению реквизитов.
Через ОбработкаЗаполнения реализовал наследование базовой единицы.
Проблемы по выполнению:
1. в процедуре ПриЗаписи не работает свойство ЭтоНовый – куда правильно вставить создание подчиненных базовых единиц?
2. в обработку ПроверкаКонтрагентов вставил запрос с обработкой результата – не показывает табличный документ – что проверять?
> в процедуре ПриЗаписи не работает свойство ЭтоНовый
Конечно, в этом методе элемент уже записан.
Завтра выложу решение, посмотрите.
>не показывает табличный документ – что проверять?
Проверьте, что табличный документ у вас формируется на сервере, а его отображение (метод Показать) на клиенте.
Создала справочники Контрагенты, Контантконые лица, номенклатура, КлассификаторЕдиницИзмерения, ЕдиницыИзмерения (подчинен Номенклатуре) с соответствующими реквизитами.
В модуле справочника Номенклатура реализовала
1. проверку перед записью
Если не ЭтоГруппа и ВидНоменклатуры<>Перечисления.ВидыНоменклатуры.Услуга и БазоваяЕдиницаИзмепрения.Пустая() Тогда
Сообщить(“Укажите единицу измерения”);
Отказ=истина;
КонецЕсли;
2. обработку заполнения
Если ДанныеЗаполнения <> Неопределено и ДанныеЗаполнения.свойство(“Родитель”) Тогда
ВидНоменклатуры= ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
3. процедуру создания базовой единицы измерения
Если не Этогруппа и Справочники.ЕдиницыИзмерения.НайтиПоРеквизиту(“БазоваяЕдиницаИзмерения”,БазоваяЕдиницаИзмепрения.УникальныйИдентификатор(), ,ЭтотОбъект.Ссылка).Пустая() Тогда
НовыйЭлемент=Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовыйЭлемент.БазоваяЕдиницаИзмерения=БазоваяЕдиницаИзмепрения.УникальныйИдентификатор();
НовыйЭлемент.Владелец=ЭтотОбъект.Ссылка;
НовыйЭлемент.КоэффициентПересчета=1;
НовыйЭлемент.Наименование=БазоваяЕдиницаИзмепрения.Наименование;
НовыйЭлемент.Записать();
КонецЕсли;
Создала обработку ПроверкаКонтрагентов
с функцией на сервере, которая получает список контрагентов без контактных лиц запросом
запрос =новый запрос(“ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.КонтактноеЛицо = &КонтактноеЛицо
| И Контрагенты.ЭтоГруппа = ЛОЖЬ”);
Запрос.УстановитьПараметр(“КонтактноеЛицо”,Справочники.КонтактныеЛица.ПустаяСсылка());
Обратная связь
1. Новой была информация про уникальные идентификаторы, директивы компиляции, транзакции, тип МенеджерПользователейИнформационнойБазы
2. опять наибольшую трудность вызвали директивы, но сейчас вроде бы разобралась
3. хотелось бы мастер группы про сложные запросы, временные таблицы, язык запросов
Задание выполнила.
Для записи Нового элемента справочника “Номенклатуры” и одновременно записи единицы измерения в подчиненный справочник “единиц измерения” использовала УникальныйИдентификатор (как было Вами показано ).
Обработку “Проверка контрагентов” сделала через запрос:
<code>
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (НЕ Контрагенты.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| КонтрагентыКонтЛица.Ссылка
| ИЗ
| Справочник.Контрагенты.КонтЛица КАК КонтрагентыКонтЛица))
| И Контрагенты.ЭтоГруппа = &ЭтоГруппа”;
Запрос.УстановитьПараметр(“ЭтоГруппа”, Булево(Ложь));
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Сообщить(“У этих контрагентов не указаны контактные лица:”);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
</code>
Обратная связь:
1. Нового очень много.
2.Когда смотришь материалы все вроде понятно, но как только начинаешь выполнять ДЗ просто ступор какой-то особенно с модулями, что в каком модуле правильнее написать?! До этого была проблема Клиент или Сервер, сейчас вроде начинаю понимать и привыкать и то только благодаря тому, что Вы в своих объяснениях постоянно обращаете на это внимание. Немного помогла схема Модулей “Запись элемента”.
3.Мастер-группы пока не смотрю (только скачиваю -на будущее). Но для меня было бы очень полезным что-то вроде того что Вы уже дали (схема модулей “Запись элементов”), т.е. какой-то краткий схематичный путеводитель по модулям для тех кто на бронепоезде :).
Задание выполнено. Созданы требуемые объекты конфигурации.
Реализация работы с номенклатурой в модуле справочника “Номенклатура”
<code>
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Не ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения <> Неопределено и ДанныеЗаполнения.Свойство(“Родитель”) Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
КоэффициентПересчета =1;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Номенклатура.БазоваяЕдиницаИзмерения.Ссылка,
| Номенклатура.БазоваяЕдиницаИзмерения.ДоступныеЕдиницыИзмерения.(
| ЕдиницаИзмерения,
| КоэффициентПересчета
| )
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.БазоваяЕдиницаИзмерения.ДоступныеЕдиницыИзмерения.КоэффициентПересчета = &КоэффициентПересчета”;
Запрос.УстановитьПараметр(“КоэффициентПересчета”, КоэффициентПересчета);
Если Запрос.Выполнить().Пустой() Тогда
СтрокаТЧ = БазоваяЕдиницаИзмерения.ДоступныеЕдиницыИзмерения.Добавить();
СтрокаТЧ.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
СтрокаТч.КоэффициентПересчета = КоэффициентПересчета;
КонецЕсли;
КонецПроцедуры
</code>
Обработка ПроверкаКонтрагентов проверяет на пустоту табличную часть справочника Контрагенты.
Модуль формы
<code>
&НаКлиенте
Процедура Команда1(Команда)
ПроверитьКонтрагентов();
КонецПроцедуры
&НаСервере
Процедура ПроверитьКонтрагентов()
Выборка=Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.ЭтоГруппа Тогда
ТабЧасть=Выборка.Сотрудники;
Если ТабЧасть.Количество()=0 тогда
Сообщить(Выборка.Ссылка.Наименование);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры // ПроверитьКонтрагентов()
</code>
Обратная связь
1)Знания приобрели некую систему и стройность
2)Пока все понятно
3)Рекомендации по использованию методов объектов Выбрать() и запросов (сравнительный анализ)
Задание выполнено.
В первой части задания, где требовалось создать справочник Контрагенты и Контактные лица и потом сделать возможность для одного Контрагента выбирать нескольких Контактных лиц, я использовал регистр сведений с тремя измерениями: Контрагент – ведущее, Контактное Лицо и должность(т.к. смутило высказывание, что в дальнейшем будет использоваться это для документов).
Создал спр. Номенклатура с реквизитами: 1. ВидНоменклатуры типа перечисление с тремя данными значениями. 2. БазоваяЕдиницаИзмерения типа справочник ссылка Классификатор Единиц Измерения. Оба реквизита указал обязательными к заполнению (Выдавать ошибку),но в обработчике Проверки заполнения в модуле объекта спр.Номенклатура анализирую условие является ли услугой, если да, то отменяю проверку реквизита Базовой Единицы Измерения удалив это поле из параметра процедуры Проверяемые Реквизиты.
В задании, где нужно анализировать определён ли вид номенклатуры у родительской группы и если да, то подставить для нового вида элемента , я сделал следующее : В модуле формы элемента спр. Номенклатура в обработчике при создании на сервере я проверяю является ли элемент элементом, а не группой и является ли его родитель не пустой ссылкой, если Истина, то присваиваю виду номенклатуры элемента вид номенклатуры родителя.
Для создания единицы измерения с коэф. 1 я использовал модуль объекта – обработчик При Записи :
<cod>
Процедура ПриЗаписи(Отказ)
Если Не ЭтоГруппа Тогда
СоздатьЕдиницуИзмерения();
КонецЕсли;
КонецПроцедуры
Процедура СоздатьЕдиницуИзмерения()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Владелец = &Ссылка
| И ЕдиницыИзмерения.ЕдиницаПоКлассификатору = &БазоваяЕдиницаИзмерения”;
Запрос.УстановитьПараметр(“БазоваяЕдиницаИзмерения”, БазоваяЕдиницаИзмерения);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
НоваяЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НоваяЕдиница.Владелец = Ссылка;
НоваяЕдиница.ЕдиницаПоКлассификатору = БазоваяЕдиницаИзмерения;
НоваяЕдиница.Коэффициент = 1;
НоваяЕдиница.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НоваяЕдиница.Записать();
КонецЕсли;
КонецПроцедуры
</cod>
Создал обработку, создал кнопку и поместил её на форме. В обработчике события кнопки ввёл след. код:
<cod>
&НаКлиенте
Процедура ВыполнитьПроверку(Команда)
ПроверкаКонтрагентов();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверкаКонтрагентов()
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка,
| КонтактныеЛицаКонтрагентов.КонтактноеЛицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
| ПО (КонтактныеЛицаКонтрагентов.Контрагент = Контрагенты.Ссылка)
|ГДЕ
| Контрагенты.ЭтоГруппа = ЛОЖЬ
| И КонтактныеЛицаКонтрагентов.КонтактноеЛицо ЕСТЬ NULL “;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецПроцедуры // ПроверкаКонтрагентов()
</cod>
Всё обработано как надо, показался контрагент у которого нет ни одного Контактного Лица.
После изучения материала больше теперь внимание обращаю на всякие мелочи, которые потом могут сильно помешать разработке, либо усложнить ее.
Сложностей не было, все было интересно и понятно выложено. Благодарю
Задание выполнено.
Были некоторые затруднения, с разрешением формулировки домашнего задания. Описано, что нужно хранить должности по контактным лицам, причем одно лицо может быть в разных должностях. Очень хочется использовать регистр сведений для этого, но мы его, типа, не проходили. И указание на то, что _контактные лица_ контрагентов будут использоваться в некоторых документах скорее всего подразумевает, что на должности, в последствии, будут ссылки, а значит лучше положить эту связь контрагентов и контактных лиц через должности в справочник. Так и сделал, обозвал его должности. В наименовании пишу должность. Строка. Правильнее, конечно, справочник должностей с владельцем по контрагенту и потом, ссылаться на этот справочник в справочнике связи, но этого в задании пока нет :)
Проверка заполнения базовой единицы сделал аналогично описанному в уроках, удалением из Проверяемых реквизитов нужного про условии вида услуги. Метод очень понравился.
Справочник единиц измерения – такая организация справочника знакома по типовым, поэтому трудностей в понимании не вызвала. Единственность записи добиваюсь проверкой ЭтоНовый(). По хорошему, надо иметь возможность изменять базовую единицу, если не было движений с ней, но это может быть только в следующих сериях :)
Обработка с выводом контрагентов без контактных лиц основана на запросе
<code>
ВЫБРАТЬ
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
(НЕ Контрагенты.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Должности.Контрагент
ИЗ
Справочник.Должности КАК Должности))
И Контрагенты.ЭтоГруппа = ложь”;
</code>
Домашнее задание выполнено.
Перечислю самые интересные моменты при решении задания:
1. Созданы справочники “Контрагенты” и “Контактные лица”. Для справочника “Контрагенты” определены реквизиты “КонтактноеЛицо” и “ДолжностьКонтактногоЛица”.
2. Создан справочник “Номенклатура” с необходимыми реквизитами и справочник “Классификатор единиц измерения”. Реализована проверка реквизитов справочника “Номенклатура” – на интерфейсном уровне (обработчик события “ОбработкаПроверкиЗаполнения”) и на программном (обработчик события “ПередЗаписью”).
3. С помощью обработчика события “ОбработкаЗаполнения” реализуем подстановку вида номенклатуры родительской группы.
4. Создаем справочник “Единицы измерения номенклатуры”, подчиненный справочнику “Номенклатура”. Определяем реквизит “Коэффициент”. В обработчике события “ПриЗаписи” справочника “Номенклатура” создаем единицу измерения с коэффициентом 1 (для новых элементов справочника “Номенклатура” и при условии заполненности реквизита “БазоваяЕдиницаИзмерения”).
5. Создаем обработку проверки контрагентов. Требование задания реализуется простым запросом, где в качестве условия нужно написать “Контрагенты.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка)”. При этом нет необходимости писать дополнительное условие вида “Контрагенты.ЭтоГруппа = ЛОЖЬ”, т.к. реквизит “КонтактныеЛица” используется для элементов справочника, в случае группы его значение равно Null (а не пустая ссылка).
Обратная связь:
1. Узнал много нового. Очень понравилось подробное освещение событий модулей объектов справочников, модулей форм. Интересный материал про решение задачи перекрестных ссылок.
2. Одна из сложных тем – задача перекрестных ссылок. Как обычно, такие темы понимаются только после многократного просмотра уроков и экспериментов.
3. Таких тем пока нет.
Быстро создал справочники с реквизитами. В табличной части справочника Контрагенты создал реквизиты Контактое лицо и Должность из соответствующих справочников. Для реквизита ВидНоменклатуры создал Перечисление.
С кодом сложнее: где же расположить проверку на ВидНоменклатуры услуга? Можно в форме элемента Номенклатура, но форм может быть несколько. В итоге расположил проверку в Модуле объекта Номенклатуры : Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты). Там-же в Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) проверяю на вид номенклатуры у родительской группы. Создал справочник ЕдиницыИзмерения с реквизитами ЕдиницаИзмерения, Коэффициент. Владелец у ЕдиницыИзмерения Справочник.Номенклатура. В Модуле объекта в Процедура ПриЗаписи(Отказ) проверяю заполнена ли БазоваяЕдиницаИзмерения и обращаясь к Общему модулю ОбщиеФункцииСервер в функции проверяю на существование ЕдиницыИзмерения. Если её нет, то создаю для номенклатуры элемент Справочники.ЕдиницыИзмерения по Ссылка.БазоваяЕдиницаИзмерения с коэффициентом 1.
Из формы обработки ПроверкаКонтрагентов обращаюсь к общему модулю ОбщиеФункцииСервер.ПроверкаКонтрагентовСервер(), там с помощью обхода результата запроса сообщаю контрагентов, у которых не задано контактное лицо.
Три ответа:
1. Узнал про типы данных. Коллекции значений. Типы, образованные объектами конфигурации. Клиентский и серверный контекст. Директивы компиляции. Предназначение модулей, взаимные вызовы. Работа форм объекта. Основной реквизит формы. Работа с запросами.
2. Клиентские и серверные обработчики, помог повтор материала.
3. Интересные приемы работы с формами.
Задание выполнено.
1. Справочники Контрагенты и Контактные Лица созданы. Необходимые реквизиты определены.
2. Для справочника Контрагенты создано табличное поле Контактные лица с реквизитами ФИО и должность. Таким образом для разных контрагентов может быть определено одно контактное лицо.
3.Созданы справочники “Номенклатура” и “Классификатор единиц измерения” . Справочник “Номенклатура ” иерархический. Определены реквизиты. Для того чтобы выбрать одно из трех жестко заданных значений (товар, услуга, набор) создан объект перечисления с соответствующими реквизитами.
4. В процедуре ОбработкаПроверкиЗаполнения выполняется проверка и если вид номенклатуры «Услуга» то удаляется проверяемый реквизит “БазоваяЕдиницаИзмерения”
<code>
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
</code>
5. Проверка значения «Вид номенклатуры» у родительской группы в процедуре ОбработкаЗаполнения. Если значение в структуре не пустое, оно присваивается новому элементу.
<code>
Если ДанныеЗаполнения.Родитель <> Неопределено Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
</code>
6. Для хранения не базовых единиц измерения и коэфициента пересчета создана табличная часть справочника “Классификатор единиц измерения”.
7. Для проверки базовой единицы при записи элемента справочника выполняется запрос к справочнику “Классификатор единиц измерения”, условием отбора является значение новой единицы измерения. Если результат запроса не пустой запись новой единицы в “Классификатор единиц измерения” не производится.
8.Поиск Контрагентов без контактных лиц выполняется в запросе с левым соединением справочника Контрагенты и его Табличной части Контактные лица
<code>
Запрос = новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Контрагенты.Наименование КАК ИМЯ
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
| ПО (КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка)
|ГДЕ
| КонтрагентыКонтактныеЛица.ФИО ЕСТЬ NULL И НЕ Контрагенты.ЭтоГруппа”;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.ИМЯ);
конецЦикла;
</code>
Наибольшую сложность в этом блоке для меня представляет работа с запросами.
Задание выполнено.
1) Создал справочники Контрагенты, КонтактныеЛица (реквизиты: ДеньРождения и Телефон), Контакты (подчинен контрагентам, реквизиты: Контакт – ссылка на КонтактныеЛица, Наименование используется для указания должности, в формах проставлен соответсвующий заголовок).
2) Создал перечисление ВидыНоменклатуры, справочник ЕдиницыИзмерения. Также справочник Номенклатура – реквизиты: ВидНоменклатуры, БазоваяЕдиницаИзмерения, табличная часть ЕдиницыИзмерения (реквизиты: ЕдиницаИзмерения, Коэффициент). В модуле объекта справочника в процедуре ОбработкаПроверкиЗаполнения проверяем, если вид номенклатуры услуга, то очищаем массив ПроверяемыеРеквизиты, позволяя оставить поле базовой единицы незаполненным. Анализ и заполнение вида товара из родительской группы производим в процедуре ОбработкаЗаполнения с помощью параметра ДанныеЗаполнения (если это структура, то ищем по ключу Родитель, нашли – заполняем). Создание единицы с коэф-том 1 делаем в процедуре ПередЗаписью, сначала проверяем коллекцию на предмет наличия базовой единицы в табл. части, если нет то создаем новую строку.
3) Проверку контрагентов решил сделать с помощью запроса, получился вот такой текст:
“ВЫБРАТЬ
| Контрагенты.Наименование КАК КА
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (НЕ Контрагенты.ПометкаУдаления)
| И (НЕ Контрагенты.ЭтоГруппа)
| И (НЕ Контрагенты.Ссылка В
| (ВЫБРАТЬ
| Контакты.Владелец КАК Контрагент
| ИЗ
| Справочник.Контакты КАК Контакты
| ГДЕ
| (НЕ Контакты.ПометкаУдаления)))”
Результат запроса возвращает список наименований контрагентов (не групп), для которых нет ни одного не помеченного на удаление контакта. Достаточно обойти выборку в цикле и вывести сообщения.
Обратная связь по первому блоку. Здесь уже было гораздо больше новой информации, чем в нулевом блоке, начал лучше понимать схему взаимодействия клиент-сервер, привыкать к написанию такого “распределенного” кода. Наибольший интерес и наибольшую же сложность пока представляют запросы – язык, построение с помощью конструктора, тут еще разбираться и разбираться.
Например в запросе из 6-го задания в конструкторе вложенный запрос по контактам пришлось писать как простой текст в условии внешнего запроса, хорошо что он примитивный. Но не нашел способа описать оба запроса иструментами конструктора так чтобы они правильно встали один в другой. Может вообще запрос надо было не так строить? :)
Вложенные запрос можно описывать с помощью конструктора.
Для этого используется следующий прием: контруктор запроса можно вызывать для выделенного фрагмента текста.
Чтобы обеспечить возможность назначить одно конт. лицо разным котнрагентам, в справ-ке Контрагентов создал ТабЧасть “КонтактныеЛица”, в ней определил реквизиты: КонтактноеЛицо (ссылка на справочник Контактных лиц) и Должность (строка).
Создал перечисление ВидыНоменклатуры.
В свойствах реквизитов справ-ка Номенклатуры указал ПроверкаЗаполнения = ВыдаватьОшибку.
В ОбработкеПроверкиЗаполениния справочника Номенклатура анализирую ВидНоменклатуры, если это Услуга то из массива ПроверяемыеРеквизиты удаляю элемент “БазоваяЕдиницаИзмерения”, чтобы для неё проверка на пустоту не осуществлялась.
Подстановку ВидаНоменклатуры из Родителя хотел сделать в ОбработкеЗаполнения, но в ней, даже если создаю новый эл-т справочника находясь в группе, Родитель еще не заполнен (равен ПустойСсылке), а после открытия формы нового элемента, Родитель заполняется как надо. Поэтому ВидНоменклатуры присваиваю в ПриСозданииНаСервере() в форме группы и элемента справочника Номенклатуры. Здесь была проблема, как определить, новый ли это элемент, или уже существующий.
Чтобы это определить делаю так: ЭтоНовый = РеквизитФормыВЗначение(“Объект”).ЭтоНовый();
Создал справочник ЕдиницыИзмеренияНоменклатуры, подчиненный справочнику Номенклатуры. В нем два рекизита – ЕдиницаИзмерения (тип СправочникСсылка.КлассификаторЕдиницИзмерения) и Коэффициент (число).
Для автоматического создания базовой единицы измерения с коэффициентом 1, в модуле объекта справочника Номенклатуры определил переменную ЗаписьНовогоЭлемента, инициализирую ее в событии ПередЗаписью() модуля объекта: ЗаписьНовогоЭлемента = ЭтоНовый();
Далее в событии ПриЗаписи() если (ЗаписьНовогоЭлемента = Истина и НЕ ЭтоГруппа() и НЕ БазоваяЕдиницаИзмерения.Пустая()), то создаю в справочнике ЕдиницыИзмеренияНоменклатуры подчиненный элемент.
Чтобы исключить для определенной номенклатуры дублирование единиц измерения в справочнике ЕдиницыИзмеренияНоменклатуры, в модуле этого справочника в процедуре ПередЗаписью() запросом проверяю, есть ли в нем уже для Владельца записываемого элемента элемент с ЕдиницейИзмерения как у записываемого элемента, и если есть, то не сам ли это записываемый элемент. В зависимости от результата запроса разрешаю или запрещаю запись (параметр ОТКАЗ).
Ну и для поиска контрагентов без контактных лиц сделал такой запрос:
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
(НЕ Контрагенты.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
КонтрагентыКонтактныеЛица.Ссылка
ИЗ
Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица))
как обычно перемудрил)
Родителя оказывается можно было брать из ДанныеЗаполнения в ОбработкеЗаполнения()
По обратной связи:
Очень интересные темы в первом блоке – Запросы, Параметры ИБ. Узнал новые для себя вещи!
Сильных затруднений вроде бы не было.
Хотелось бы подробнее раскрыть тему про ОбработкуПолученияДанныхВыбора (разобрать какой-нибудь примерчик), плюс пробовал разбираться с многофирменным учетом и установкой префиксов у документов в процедуре ПриУстановкеНовогоНомера(), там возникли непонятки, написал вопрос на е-мэйл мастер-группы.
Дмитрий, не вижу вашего вопроса о префиксах документов на ящике мастер-группы.
Отправил еще раз
Так и не вижу..
На какой ящик отправляете вопрос?
>делаю так: ЭтоНовый = РеквизитФормыВЗначение(«Объект»).ЭтоНовый();
Лучше делать так:
ЭтоНовый = Объект.Ссылка.Пустая();
или
ЭтоНовый = Параметры.Ключ.Пустая();
да, так действительно проще
Спасибо!
Выполнено.
Добавил справочник должности. В справочник Контрагенты добавил реквизиты контактное лицо (то же справочник) и должность. Вид номенклатуры сделал с помощью перечисления.
В справочнике Номенклатура для реквизитов вид номенклатуры и базовая единица измерения выставил проверку заполнения в “выдавать ошибку”. В процедуре “ПроверкаЗаполнения” проверял, если это услуга. то удалял базовую ед. изм. из массива проверяемых реквизитов.
Вид номенклатуры у родителя проверяется следующим способом:
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения <> Неопределено Тогда
Родитель = ДанныеЗаполнения.Родитель;
Если ЗначениеЗаполнено(Родитель) Тогда
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Номенклатура.ВидНоменклатуры
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка
| И Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.ПустаяСсылка)”;
Запрос.УстановитьПараметр(“Ссылка”, Родитель);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ВидНоменклатуры = Выборка.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Для хранения всевозможных единиц измерения для номенклатуры создан подчиненный справочник. Базовая же ед. изм. записывается в него в процедуре “ПередЗаписью и ПриЗаписи”
<code>
Процедура ПередЗаписью(Отказ)
Если ЭтоНовый() И Не ЭтоГруппа Тогда
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку();
УстановитьСсылкуНового(НоваяСсылка);
НоваяЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НоваяЕдИзм.Владелец = ПолучитьСсылкуНового();
НоваяЕдИзм.КлассификаторЕдиницыИзмерения = БазоваяЕдиницаИзмерения;
НоваяЕдИзм.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НоваяЕдИзм.Коэффициент = 1;
//НоваяЕдИзм.Записать();
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если НоваяЕдИзм <> Неопределено Тогда
НоваяЕдИзм.Записать();
КонецЕсли;
КонецПроцедуры
</code>
Осталось непонятным почему я не смог записать единицу измерения в процедуре “ПередЗаписью”(строчка закомментирована)? Ругалась на то, что владелец задан неверно, хотя я назначил ссылку. Загадка
Обработка «Проверка контрагентов» реализуется следующим запросом:
<code>
&НаСервере
Процедура ВыполнитьПроверкуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Контрагенты.Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка)
| И (НЕ Контрагенты.ЭтоГруппа)”;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЦикла;
КонецПроцедуры
</code>
Обратная связь:
1. во многих уроках есть что-то новое, относительно 8.2. На все что отличает 8.2. от 8.1 меняются взгляды. Но и в общих моментах есть вещи о которых не знал или не пользовался ими.
2. Трудностей не возникло
3. Возник один вопрос по изаполнению СпискаЗначений. Мы в предыдущем ДЗ в запросе получаем ссылочные поля и потом их загружаем в СписокЗначений и потом его показываем пользователю. Но ведь пользователю показвается поле Представление из СпискаЗначений. Получается, что платформа сделает еще неявные обращения к БД, чтобы получить представления от ссылки (или нет?). Не правильнее было бы получать в запросе два поля: Ссылка, Наименование, – и циклом заносить их в СписокЗначений: Ссылку в Значение, а Наименование в Представление?
И, если мои домыслы верны, стоит ли так заморачиваться если я СписокЗначений никогда не покажу пользователю в интерфейсе, т.е. в какой момент платформа будет делать неявные обращения к БД?
>Получается, что платформа сделает еще неявные обращения к БД, чтобы получить представления от ссылки (или нет?)
Это не так.
На клиента вместе с ссылкой всегда возвращается ее представление. Будь то через список значений или просто возвращается независимая ссылка.
Может вместе с ссылкой и возвращается, но, как показал эксперимент, в поле “Представление” СпискаЗначений не записывается. Поэтому как только я показываю список значений пользователю, то происходит обращение на сервер. Если же на сервере предварительно заполнить поле “Представление”, то такого обращения не происходит. Вот код эксперимента:
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Справочник = Справочники.ТестовыйСправочник;
//Для Индекс = 1 По 10000 Цикл
//
// НовыйЭлемент = Справочник.СоздатьЭлемент();
// НовыйЭлемент.Наименование = “Тестовый элемент – ” + Индекс;
// НовыйЭлемент.Код = Индекс;
// НовыйЭлемент.Записать();
//КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыполнить(Команда)
Список = ВыполнитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Список = Новый СписокЗначений;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ТестовыйСправочник.Ссылка,
| ТестовыйСправочник.Наименование
|ИЗ
| Справочник.ТестовыйСправочник КАК ТестовыйСправочник”;
Результат = Запрос.Выполнить();
//Выборка = Результат.Выгрузить();
//Массив = Выборка.ВыгрузитьКолонку(“Ссылка”);
//Список.ЗагрузитьЗначения(Массив);
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
Возврат Список;
КонецФункции
&НаКлиенте
Процедура ПоказатьСписок(Команда)
Элемент = Список.ВыбратьЭлемент();
КонецПроцедуры
</code>
Заполнение Списка в цикле действительно несколько медленне загрузки из массива, но заполение из массива потом, при первом отображении списка пользователю, ведет к обращению на сервер
Действительно наблюдается обращение на сервер.
Спасибо за эксперимент.
Здравствуй Евгений
По поводу 6 домашнего задания, не могу сообразить как можно добавить
строку для табличной части справочника. Смотрел по темам, не нашел.
Делаю следующее,
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ПараметрыОтбора= Новый Структура;
ПараметрыОтбора.Вставить(“ЕдиницаИзмерения”,ТекущийОбъект.БазоваяЕдиницаИзмерения);
Если Не ТекущийОбъект.ЕдиницыХраненияНоменклатуры.НайтиСтроки(ПараметрыОтбора).Количество()>0 Тогда
//Хочу добавить в табличную часть
//(ЕдиницыХраненияНоменклатуры которая имеет
// два реквизита 1.ЕдиницаИзмерения ссылка на другой
//спр. и 2.Коэффициент ) Базовую единицу измерения с коэфициентом 1
// А КАК ????? Всяко пробывал не получается.
// Справка не богата или я не туда смотрю
КонецЕсли;
КонецПроцедуры
Если где то этот вопрос расматривается, подскажи.
за ранее благодарен
Давайте воспользуемся событием ПередЗаписью() модуля объекта (чтобы оно выполнялось при записи из любой формы).
Процедура ПередЗаписью(Отказ)
ПараметрыОтбора= Новый Структура;
ПараметрыОтбора.Вставить(«ЕдиницаИзмерения»,БазоваяЕдиницаИзмерения);
Если Не ЕдиницыХраненияНоменклатуры.НайтиСтроки(ПараметрыОтбора).Количество()=0 Тогда
НоваяСтрока = ЕдиницыХраненияНоменклатуры.Добавить();
НоваяСтрока.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
КонецЕсли;
КонецПроцедуры
Табличная часть это обычная коллекция элементов, подчиненная определенному объекту (в вашем случае справочнику).
См. в синтакс-помощник – ТабличнаяЧасть.
Блин, всё так просто, а я всё танцую с бубном:)))
СПАСИБО.
Задание выполнил, правда так как не хотелось бы.
Затруднения в следующим.
1.Создал спр ВидРабот
2.Создал спр Контактных лиц, в котором для КЛ определяю в табличной части его виды работ(ссылкаВидРабот)
3.Создал спрКонтрагенты, в котором для контрагента определяю в табл.части 1.его КЛиц,(ссылкаКл)2. в реквизите должности ХОЧУ ПОДСТАВЛЯТЬ ТЕ ВИДЫ РАБОТ КОТОРЫЕ ОПРЕДЕЛЕННЫ ДЛЯ КОНКРЕТНОГО КЛ.Но вот тут то я и сел…. Пока сделал так, что должности имеет ссылку на спрВидРабот.
Так же были проблемы с Табличной частью, с вашей помощью разобрался.
Так же при создании Обработки «Проверка контрагентов» наткнулся на первую проблему, это с кнопкой «Выполнить» – так как это зарезервированное слово. Так же не понял как просмотреть результат табличной части справочника, в результате выдаёт «Наименование поля» и результат «ТаблицаЗначений», а как вот заглянуть туда с помощью консоли запросов я не разобрался. Или так как эта коллекция её можно вывести только в табДок или обработать программно???
ОБРАТНАЯ СВЯЗЬ
Что нового я узнал в первом блоке или в чем поменялись взгляды после изучения материала?
Для меня было всё новое, так как нет опыта.
2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?
Затруднений очень много. Ваша огромная проделанная работа, я имею в виду видео уроки – очень помогают. Я нахожу такое обучение на много эффективнее так как могу в любое время вернуться к материалу и посмотреть его ещё раз. Некоторые уроки смотрю по 3 и более раз, только потом понимаю суть. Вообще я очень благодарен вам за такой метод обучения, не зря он называется Профессиональное программированиеJ.
3. Какую тему, имеющую отношение к текущему блоку, вы бы хотели подробнее
раскрыть в мастер-группе?
Для меня материала очень даже достаточно, не успеваю переваривать то что есть
>ХОЧУ ПОДСТАВЛЯТЬ ТЕ ВИДЫ РАБОТ КОТОРЫЕ ОПРЕДЕЛЕННЫ ДЛЯ КОНКРЕТНОГО КЛ
Не совсем понятен практический смысл решаемой задачи. Кажется вы сами немного запутались: должности, виды работ и т.д.
Но в целом понятно, что хотите при открытии отображать не все элементы справочника, а с некоторым отбором.
Задача имеет несколько вариантов решения:
1. Без программирования. За счет интерактивной настройки свойств объектов. Для реквизита табличной части можно определить свойство “Параметры выбора”, где и задать значения отбора. Насколько я понял, при вашей структуре БД этого сделать невозможно. А вообще способ хороший, мы его рассматриваем во втором блоке курса.
2. Вместо стандартной формы открывать форму выбора программно и передавать туда отбор. Способ чуть более сложный. Для отбора используются параметры формы (коллекция, передаваемая во второй параметр метода ОткрытьФорму()).
3. При открытии формы выбора устанавливать программно отбор. Можете посмотреть пример в бонусных материалах о формах.
>Так же не понял как просмотреть результат табличной части справочника, в результате выдаёт «Наименование поля» и результат «ТаблицаЗначений»
Я так понял речь идет о просмотре элементов коллекции в отладчике.
Еще раз обратитесь к главе Отладка 1-го блока.
В частности можно нажать на кнопку “Изменить” или F2, находясь в окне “Вычислить выражение” и посмотреть элементы коллекции.
Имено что не в отладчике, а в консоли запроса. Например есть спр и в нём есть табличная часть. Хочу теперь вывести ссылку и реквизит с табличной части. В результате выводиться к примеру строка Алхимов и реквизит табличной части с значением ТаблицаЗначений, то есть вместо ТаблицаЗначений зотелось бы видеть Алхимов и его должности из табличной части.
Пожелание понятно.
Для его реализации запрос необходимо запрос выполнять не к таблице документа, а к его табличной части. А реквизит документа получать через ссылку
Примерно так:
Выбрать
ТабЧасть.Ссылка.РеквизитДокумента,
ТабЧасть.Должность
Из
ДОкумент.ИмяДокумента.ИмяТабчасти ТабЧасть.
Спасибо Евгений, всё получилось, как всегда ларчик открывался просто:))
Отл )
Создал справочники Контрагенты и КонтактныеЛица. Контрагентам выставил флаг иерархического справочника. Для КонтактныеЛица создал необходимые реквизиты – ДатаРождения тип[Дата] с составом Дата; Телефон тип[Строка].
Для выполнения второго пункта задания, создал справочник, подчиненный справочнику Контрагенты, КонтактныеЛицаКонтрагентов и добавил в него реквизиты: Должность тип[Строка] и КонтактноеЛицо тип[СправочникСсылка.КонтактныеЛица].
Создал справочники Номенклатура, КлассификаторЕдиницИзмерения и Перечисление ВидНоменклытуры со значениями Товар, Услуга, Набор. Для Номенклатуры определил реквизиты: ВидНоменклатуры тип[ПеречислениеСсылка.ВидНоменклатуры], для свойства Использование выставил значение “Для группы и элемента”; БазоваяЕдиницаИзмерения тип[СправочникСсылка.КлассификаторЕдиницИзмерения].
На уровне реквизитов выставил свойство Проверка заполнения в значение “Выдавать ошибку”. Для того чтобы не выдавалась ошибка при записи элемента Номенклатуры с ВидомНоменклатуры Услуга в модуле объекта справочника Номенклатура в событии “ОбработкаПроверкиЗаполнения” вставил код:
<code>
Если ЗначениеЗаполнено(ВидНоменклатуры) Тогда
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
Индекс = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
</code>
Для подстановки Вида Номенклатуры для нового элемента от родительской группы можно воспользоваться событием МодуляОбъекта “ОбработкаЗаполнения” и получать данные из структуры ДанныеЗаполнения.
</code>
Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
ТекРодитель = 0;
Если ДанныеЗаполнения.Свойство(“Родитель”, ТекРодитель) Тогда
ВидНоменклатуры = ТекРодитель.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
</code>
Можно также воспользоваться событием Модуля Формы Элемента “ПриСозданииНаСервере” и данные получать из основного реквизита формы “Объект”. Возможно, что второй вариант будет более подходящим, если для элемента нужно будет определять какие-то дополнительные реквизиты по умолчанию. Но пока остановился на первом.
Для хранения дополнительных единиц измерения создал справочник ЕдиницыИзмерения и подчинил его справочнику Номенклатура. Определил реквизиты: Единица тип[СправочникСсылка.КлассификаторЕдиницИзмерения] и Коэффициент тип[Число]
А вот в выборе того места, где производить запись элемента подчиненного справочника, возникли сложности. В конце концов остановился на Модуле Объекта. Пытался повторить подход записи подчиненного справочника с использованием ГУИДа по памяти, но напоролся на ту же проблему что и в уроке – иерархичность справочника владельца. Пришлось заново пересматривать этот блок. Код приводить не буду.
Использовал события ПередЗаписью и ПриЗаписи.
И при создании дополнительных элементов справочника ЕдиницыИзмерения ставлю запрет на запись элементов с уже существующей единицей измерения.
<code>
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) //модуль объекта ЕдиницыИзмерения
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ ПЕРВЫЕ 1
| ЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Единица = &Единица
| И ЕдиницыИзмерения.Владелец = &Владелец”;
Запрос.УстановитьПараметр(“Владелец”, Владелец);
Запрос.УстановитьПараметр(“Единица”, Единица);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.Ссылка <> Ссылка Тогда
Сообщить(“Такая единица измерения уже существует”);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
По последнему пункту задания. Создал обработку. На ее форму вывел команду в виде кнопки “Выполнить”. В обработчике команды происходит безконтекстный серверный вызов процедуры проверки.
После долгих мучений консоли запросов текст запроса получился таким:
<code>
Запрос.Текст = “ВЫБРАТЬ
| КонтактныеЛицаКонтрагентов.Владелец,
| Контрагенты.Ссылка
|ИЗ
| Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
| ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
| И (КонтактныеЛицаКонтрагентов.Владелец ЕСТЬ NULL) “;
</code>
На тестовых данных отрабатывает верно, но осталось чувство, что все же что-то не так.
Что касается обратной связи.
1. Практически весь материал был для меня новым, однако подход к отладке все же претерпел изменения. Вот только это произошло не вовремя изучения материала, а во время просмотра домашних заданий.
Конечно же обо всех интересных моментах было рассказано в самих уроках, но они, что называется, остались за кадром.
2. Затруднения вызвали Запросы. Очень помогла обработка “Консоль запросов”, но ясного понимания пока так и не пришло.
3. На мой взгляд для начального уровня все достаточно полно раскрыто. Переизбыток информации в процессе освоения тоже вреден. Переварить бы и усвоить то, что уже вложено. :)
извините, как то неудачно вставился текст.
по опросу
1. повторюсь, новое для меня все.
2. затруднений не было. первый блок раскрыт просто отлично, огромное спасибо создателям курсов!
3. таких тем нет, уверен, вопросы будут после продвинутого курса.
Сделано.
Созданы справочники
Номенклатура КлассификаторЕдиниц
Контрагенты КонтактноеЛицо
Подчиненные справочники
Единицы (подчинен Номенклатуре)
Для того чтобы одно и то же контактное лицо могло быть определено для
разных контрагентов и с разными должностями сделан дополнительный справочник Должности, а для элементов Контрагент сделана Табличная часть с реквизитами Контактное лицо и Должность (они заполняются из одноименных справочников)
Код для Номенклатуры
Перем НовыйЭл;
Процедура ПередЗаписью(Отказ)
если НЕ ЭтоГруппа тогда
Если (ЭтоНовый()=1) и (Не ВидНоменклатуры=Перечисления.ВидНоменклатуры.Услуга) тогда
НовыйЭл=Истина;
КонецЕсли
КонецЕсли
КонецПроцедуры
&насервере
Процедура ПриЗаписи(Отказ)
Если НовыйЭл=Истина тогда
ЕдиницаНовая = Справочники.Единицы.СоздатьЭлемент();
ЕдиницаНовая.Владелец=ЭтотОбъект.Ссылка;
ЕдиницаНовая.Наименование=БазоваяЕдиница;
ЕдиницаНовая.Коэффициент=1;
ЕдиницаНовая.Записать();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если НЕ ЭтоГруппа тогда
Если ЗначениеЗаполнено(Родитель.ВидНоменклатуры) тогда
ВидНоменклатуры=Родитель.ВидНоменклатуры;
КонецЕсли;
Если Не ЗначениеЗаполнено(ВидНоменклатуры) тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = “Не указан вид номенклатуры!”;
Сообщение.Поле = “Видноменклатуры”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ=Истина;
ИначеЕсли (Не ВидНоменклатуры=Перечисления.ВидНоменклатуры.Услуга) и (Не ЗначениеЗаполнено(БазоваяЕдиница)) тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = “Нет базовой единицы!”;
Сообщение.Поле = “БазоваяЕдиница”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для проверки Контрагентов на наличие контактного лица используем выборку.
Создаем спр-ки Контрагенты, КонтактныеЛица, КонтактныеЛицаКонтрагентов (подчиненный Контрагенты), Номенклатура, КлассификаторЕдиницИзмерения, ЕдиницыИзмеренияНоменклатуры (подчинен Номенклатура), перечисление ВидНоменклатуры
В модуле объекта справочника номенклатура в процедуре ОбработкаПроверкиЗаполнения Если ВидНоменклатуры = перечисления.ВидНоменклатуры.Услуга тогда из проверяемых реквизитов удаляем БазоваяЕдиницаИзмерения
В процедура ОбработкаЗаполнения если у номенклатуры есть родитель, то вид номенклатуры берем у него.
В Процедура ПриЗаписи создаем новый элемент Справочники.ЕдиницыИзмеренияНоменклатуры с базовая Единица Измерения и коэфициентом = 1.
Обработку выполнил через запрос, выводящий количество подчиненных элементов. Далее выводим только те позиции, у которых количество равно нулю. К сожалению, добавить это условие сразу в текст запроса не смог. Возможен еще вариант с перебором справочников как в 7.7 – он не понравился.
Это ДЗ оказалось легче предыдущего. Наибольшую трудность вызвали попытки добавить в текст запроса условие о нуле подчиненных. Хитрость с зарезервированным словом Выполнить исправил сразу.
1.
Добавил спр-ки Контрагенты и КонтактныеЛица, плюс добавил справочник “Должности”.
В спр-ке Контрагенты создал 2 ссылочных реквизита КонтактноеЛицо и Должность.
2.
Добавил перечисление “ВидыНоменклатуры”
В спр. Номенклатура для реквизита ВидНоменклатуры выставил использование для группы и элемента
Выставил проверку заполнения для требуемых реквизитов.
Для отключения контроля базовой единицы для услуг использовал пар-р ПроверяемыеРеквизиты(массив)
процедуры ОбработкаПроверкиЗаполнения модуля объекта.
Удаляю из него элемент со значением “БазоваяЕдиница” по требуемому условию.
3.
Создал форму элемента спр-ка Номенклатура.
В процедуре ПриСозданииНаСервере прописал автоустановку вида номенклатуры из родителя(если выбран).
4.
Создал спр-к ЕдиницыИзмерения подчиненный спр-ку Номенклатура.
В нем реквизит: КоэффициентПересчета
Создал соотв. реквизит ЕдиницаИзмерения в спр-ке Номенклатура.
Для реквизитов со ссылками на подчиненный спр-к использовал “Связь параметров выбора”: Отбор.Владелец(Ссылка).
5.
Момент с записью подчиненного элемента сделал через GUID, как было в примерах.
5.
Во внешней обработке для запроса создал процедуру &НаСервереБезКонтекста и использовал конструктор запроса
с обработкой результата. Задействовал параметр запроса ПустоеКонтактноеЛицо (Справочники.КонтактныеЛица.ПустаяСсылка()).
Можно уточнить один момент
Необходимо обеспечить, чтобы одно и то же контактное лицо могло быть определено для
разных контрагентов. Например, Иванова Мария является главным бухгалтером организации
«Альфа» и кассиром организации «Бетта». Нужно хранить информацию о том, в какой должности
числится контактное лицо для определенного контрагента.
Речь идет об одном и том же человеке (т.е. реквизиты ДР и телефон будут одинаковые) или это совпадение имен?
Речь идет об одном и том же человеке.
Создал справочники Контрагенты, КонтактныеЛица. Добавил требуемые реквизиты, проставил галочки по иерархии. У Контрагента сделал Табличную часть КонтактныеЛица, где храню контактное лицо и должность (строка). По идее надо было организовать реестр сведений, но его мы еще не проходили.
Далее создал справочники Номенклатура, КлассификаторЕдиницИзмерений; перечисление ВидыНоменклатуры
В модуль объекта Номенклатуры добавил след. код:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если НЕ ЭтоГруппа и ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(2);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения <> Неопределено и ДанныеЗаполнения.Свойство(“Родитель”) Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Далее создал справочник ЕдиницыИзмерения, который подчинен Номенклатуре и имеет реквизиты: ЕдиницаИзмерения, КоэффициентПересчета.
Для создания единицы измерения добавил в модуль объект Номенклатуры следующий код:
Процедура ПриЗаписи(Отказ)
Если ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
Спр = Справочники.ЕдиницыИзмерения;
СпрВыборка = Спр.Выбрать(,Ссылка);
Нашли = Ложь;
Пока СпрВыборка.Следующий() Цикл
Если СпрВыборка.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения Тогда
Нашли = Истина;
Если СпрВыборка.КоэффициентПересчета <> 1 Тогда
СпрОб = СпрВыборка.ПолучитьОбъект();
СпрОб.КоэффициентПересчета = 1;
СпрОб.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НЕ Нашли Тогда
ТекЭл = Спр.СоздатьЭлемент();
ТекЭл.Владелец = Ссылка;
ТекЭл.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
ТекЭл.КоэффициентПересчета = 1;
ТекЭл.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Хоть в задании и было написано, что при записи нового элемента справочника должно работать, но на пользователя никакой надежды, поэтому сделал проверку при любой записи элемента, а так же выставление коэффициента пересчета в 1, если он отличается.
Со “служебной” обработкой пришлось немного повозиться, т.к. решил сделать экспортный метод модуля объекта обработки:
Функция ПроверитьКонтактныхЛицКонтрагентов() Экспорт
СЗ = Новый СписокЗначений;
СпрВыборка = Справочники.Контрагенты.Выбрать();
Пока СпрВыборка.Следующий() Цикл
Если СпрВыборка.ЭтоГруппа Тогда Продолжить; КонецЕсли;
Если СпрВыборка.КонтактныеЛица.Количество() = 0 или НЕ ЗначениеЗаполнено(СпрВыборка.КонтактныеЛица[0].КонтактноеЛицо) Тогда
СЗ.Добавить(СпрВыборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат СЗ;
КонецФункции
А вот вызвать ее из формы этой же обработки получилось не с первого раза. Опять же беда в четком разделении НаКлиенте/НаСервере. В итоге у меня получилось в форме обработки следующее:
&НаКлиенте
Процедура ПроверитьКонтактныхЛиц(Команда)
СписокКонтрагентов = ПроверитьКонтактныхЛицСервер();
Для Каждого Эл Из СписокКонтрагентов Цикл
Сообщить(“У контрагента “”” + Эл.Значение + “”” не задано (задано некорректно) контактное лицо”);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПроверитьКонтактныхЛицСервер()
ОбъектСервер = ДанныеФормыВЗначение(Объект,Тип(“ОбработкаОбъект.ПроверкаКонтрагентов”));
Возврат ОбъектСервер.ПроверитьКонтактныхЛицКонтрагентов();
КонецФункции
Так и не понял, зачем делать в базе задания 5, т.к. код не пересекался. Но думаю, что в дальнейшем что-то их объединит.
Задание выполнил. Трудности в основном возникали из за непонимания синтаксиса помощника, т.е. проблем с обращением к желаемым свойствам и методам, пока это мне часто не очевидно. Также заново пришлось переосмыслить роль модулей формы и объекта, была путаница в голове.
Вот решение
-в справочнике контрагенты создана таб. Часть с реквизитами КонтактноеЛицо и ДолжностьКонтактногоЛица
-Создан справочник номенклатуры, реквизит ВидНоменклатуры сделан перечислением, реквизит базоваяЕдиница выбирается из справочника, добавлена табличная часть ЕдиницыИзмерения с реквизитами Единица и Коэффициент.
Проверка заполнения базовой единицы производится в модуле формы в процедуре
<code>
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если Объект.ВидНоменклатуры<>Перечисления.ВидыНоменклатуры.Услуга тогда
Если Объект.БазоваяЕдИзмер.Пустая() тогда
Сообщить(“Заполните базовую единицу”);
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
/<code>
Проверка родителя и его ввод при вводе нового элемента делаю в модуле объекта
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если Не ЭтотОбъект.Родитель.ВидНоменклатуры.Пустая() тогда
ЭтотОбъект.ВидНоменклатуры=ЭтотОбъект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
/<code>
Создание базовой единицы измерения в таб части (без дублирования) создаю процедурой в модуле формы при выборе базовой единицы измерения
<code>
&НаКлиенте
Процедура БазоваяЕдИзмерОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ТабЧасть=Объект.ЕдиницыИзмерения;
БазЕдИзм=Объект.БазоваяЕдИзмер;
ЗаписатьБазЕд=Истина;
Для каждого строка из ТабЧасть Цикл
Если Строка.ЕдИзм=БазЕдИзм тогда
ЗаписатьБазЕд=Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗаписатьБазЕд=Истина тогда
НоваяСтрока=ТабЧасть.Добавить();
НоваяСтрока.ЕдИзм=Объект.БазоваяЕдИзмер;
НоваяСтрока.Коэффициент=1;
КонецЕсли;
КонецПроцедуры
/<code>
Контрагентов в обработке проверяю следующими процедурами
<code>
&НаКлиенте
Процедура ПроверкаКонрагентов(Команда)
ПроверкаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПроверкаНаСервере()
Выборка=Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.ЭтоГруппа тогда //Цикл по таб частям
ТабЧасть=Выборка.КонтактныеЛица;
Если ТабЧасть.Количество()=0 тогда
Сообщить(“Контрагент “+Выборка.Ссылка.Наименование+” не имеет контактных лиц”);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
/<code>
Задание выполнено.
Чтобы одно контактное лицо могло присутствовать у разных контрагентов, не нужно делать справочник контактных лиц подчиненным справочнику контрагенты. Для хранения данных о контактных лицах контрагента в справочнике создаем табличную часть “КонтактныеЛица”. Для должностей завел отдельный справочник, чтобы не писать ручками должность, а выбирать из справочника.
Справочники номенклатуры и классификатора единиц измерения тоже завел. Для вида номенклатуры необходимо создать перечисление. Для реквизита “ВидНоменклатуры” проверка заполнения установлена в “Выдавать ошибку”. Заполненность же базовой номенклатуры проверяем в событии “ПередЗаписью” модуля формы (для анализа, является ли товар услугой или нет)
В модуле объекта справочника номенклатуры в обработке заполнения проверяем, есть ли данные в “ДанныеЗаполнения”. Если есть, то создается номенклатура из группы и нужно установить вид номенклатуры, взяв его из родителя.
Для учета нескольких единиц измерения создан справочник “ЕдиницыИзмерения”, который подчинен справочнику номенклатуры. В процедуре “ПослеЗаписиНаСервере” проверяется, есть ли какие-либо записи в справочнике единиц измерения текущей номенклатуры. И если нет ни одной записи – создается новая единица измерения, равная базовой и с коэффициентом 1.
Обработка “Проверка контрагентов” тоже создана. Данная задача выполнена двумя способами: через запрос и через выборку с проверкой количества контактных лиц в табличной части контрагента.
Обратная связь.
1. По большей части, конечно, уже все знакомо, но тем не менее, что в 0-м, что в 1-м блоках есть несколько моментов, о которых либо просто не знал, либо знал, но не пользовался. А оказались довольно полезные штукенции.
2. Да пока особо проблем не возникло. Просто бывает сам начинаешь тупить. :)
3. Все, что хотелось бы, выходит за рамки данного блока и может быть, даже курса. :)
Блин…. Забыл про “ОбработкаПроверкиЗаполнения” в модуле объекта. Исправил проверку заполнения базовой единицы измерения, используя эту процедуру.
Задание сделал.
При выполнении проблем не было. Только постоянно забывал добавить доступность новых справочников в роль пользователя.
Рекомендую поставить флаг “Устанавливать права для новых объектов” для роли.
В учебных целях очень полезная опция.
Обратная связь:
1. Поменялись взгляды по многим позициям , в основном это касается иерархии классов объектов и контекста выполнения кода.
2.Особых затруднений не было.
3. Хотелось бы поподробнее узнать о запросах к БД в частности по функциям в запросах.
С запросами мы будем работать и далее на протяжении всего курса.
Задание готово:
1.Создал справочники «Контрагенты», «Контактные лица». У справочника «Контрагенты» добавил табличную часть «контактные лица» с 2-мя реквизитами , контактное лицо тип «СправочникСсылка.КонтактныеЛица» и должность. Таким способом можно указать что одно контактное лицо может быть у разных контрагентов.
2.Для номенклатуры добавил в конфигурацию перечисление «Вид номенклатуры» с жесткими значениями из задания. В модуле объекта в событии ОбработкаПроверкиЗаполнения добавил код который удаляет проверку на реквизит ВидНоменклатуры , если это услуга:
<code>
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга и НЕ ЭтоГруппа Тогда ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
</code>
Также при вводе в какой либо группе , добавил автоматическое заполнение реквизита «Вид номенклатуры» для элемента или группы номенклатуры:
<code>
Если НЕ ДанныеЗаполнения = Неопределено
и ЗначениеЗаполнено(ДанныеЗаполнения[“Родитель”].ВидНоменклатуры) Тогда
ВидНоменклатуры = ДанныеЗаполнения[“Родитель”].ВидНоменклатуры;
КонецЕсли;
</code>
3. Завел новый справочник «Классификатор единиц измерения» , а для справочника «Номенклатура» создал подчиненный справочник единицы измерения с реквизитами единица измерения тип «СправочникСсылка.КлассификаторЕдиницИзмерения» и коэффициент тип число.
В справочнике «единицы измерения» подчиненному справочнику «номенклатура» в модуле объекта при событии призаписи(), обращаюсь к функции расположенной в общем модуле для проверки есть ли такая единица измерения в этом справочнике, и если есть то свойству отказ присваиваю истина;
<code>
Функция ПроверитьНаличиеЕдиницыИзмерения(Владелец,ЕдИзм) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ЕдиницыИзмеренияНоменклатуры.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
|ГДЕ
| ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
| И ЕдиницыИзмеренияНоменклатуры.ЕдиницаИзмерения = &ЕдИзм”;
Запрос.УстановитьПараметр(“Владелец”,Владелец);
Запрос.УстановитьПараметр(“ЕдИзм”,Владелец.БазоваяЕдиницаИзмерения);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
</code>
Также вызываю данную функцию при событии ПриЗаписи() элемента справочника «Номенклатура» и в зависимости от возвращаемого значения создаю новый элмент подчиненного спр-ка «единицы измерения».
<code>
НовыйЭлементСправочникаЕдИзмНоменклатуры = Справочники.ЕдиницыИзмеренияНоменклатуры.СоздатьЭлемент();
НовыйЭлементСправочникаЕдИзмНоменклатуры.Владелец = Ссылка; НовыйЭлементСправочникаЕдИзмНоменклатуры.ЕдиницаИзмерения = Ссылка.БазоваяЕдиницаИзмерения;
НовыйЭлементСправочникаЕдИзмНоменклатуры.Коэффициент = 1;
НовыйЭлементСправочникаЕдИзмНоменклатуры.Записать();
</code>
4. Обработка по проверке справочника «Контрагенты», был использован запрос с текстом
<code>
«ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
(НЕ Контрагенты.ЭтоГруппа)
СГРУППИРОВАТЬ ПО
Контрагенты.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.КонтактныеЛица.КонтактноеЛицо) = 0»
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Контрагент);
КонецЦикла;
</code>
В данном запросе выбираем элементы справочника «Контрагенты» с пустой табличной частью.
Далее перебираем выборку и функцией Сообщить() выводим на экран;
Сначала ответы на дополнительные вопросы по 1 блоку.
Ответ мой будет подобен ответу после первого блока:
Я новичок в 1С, и многие темы для меня были темным лесом. Объяснения подобные поэтому разобраться не составляет труда.
Первое знакомство с 1С у меня было с 8.1 а В управляемых формах до меня не доходило, как же обратиться к данным формы, все время в форме хотелось что-то изменить, а оказывается правильнее это делать зачастую в Модуле объекта.
Затруднений особенно нет, особенно после изучения и понятия полной структуры Синтаксис помощника.
А вот какую тему подробнее, пока не известно, у меня и так слишком большой поток информации сначала нужно его переварить, возможно потом появятся вопросы, но думаю в Продвинутом курсе.
Задание Выполнил.
Все что требуется создал, есть одно НО!
Для реализации контактных лиц использовал два реквизита у контрагента, должность и ссылка на контактное лицо.
Для создания ВидаНоменклатуры использовал Перечисления .
Для проверки условий использовал
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Не ПустаяСтрока(Родитель) Тогда
Если ВидНоменклатуры <> Родитель.ВидНоменклатуры Тогда
Сообщить(“Вид номенклатуры для подчененного элемената должен быть: ” + Родитель.ВидНоменклатуры);
Сообщить(“У Вас выбран: ” + ВидНоменклатуры);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли
КонецПроцедуры
Для обеспечения создания новой единицы измерения использовал
Форму элемента и
&НаКлиенте
Процедура БазоваяЕдиницаИзмеренияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
ПроверкаБазовойЕдиницыНаСервере(Текст);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверкаБазовойЕдиницыНаСервере(Текст);
ЕдИзм = Справочники.КлассификаторЕдиницИзмерения;
Если ЕдИзм.НайтиПоНаименованию(Текст) = ЕдИзм.ПустаяСсылка() Тогда
НоваяЕдИзм = ЕдИзм.СоздатьЭлемент();
НоваяЕдИзм.Наименование = Текст;
НоваяЕдИзм.Колво = 1;
НоваяЕдИзм.Записать();
КонецЕсли;
КонецПроцедуры
Вот непонятно одно только что именно с этим сделать.
Необходимо учесть, что товар может закупаться и продаваться не только в базовых
единицах измерения. Для этого нужно создать объект, в котором будут храниться список
доступных для номенклатуры единиц измерения. Кроме того, необходимо хранить коэффициент
пересчета текущей единицы в базовую. Например, для номенклатуры «Молоко 2,5% пак.»
базовой единицей является «Пакет». Но кроме того могут быть определены единицы «Упаковка»,
в которой содержится 8 пакетов, и паллета, содержащая 64 пакета.
Создан справочник КлассификаторЕдиницИзмерения, иерархия элементов, с реквизитом количество… для верхнего уровня 1 для последующих 8.
>Вот непонятно одно только что именно с этим сделать.
В дальнейшем единицу измерения можно будет выбирать в документах.
Пока, кроме создания справочников, ничего не требуется.