Один Ответ на “Базовый курс. Занятие №6”

  1. Батагова Альбина 10.11.2015 в 10:50

    Добавим новые справочники Контрагенты и КонтактныеЛица, а также два вспомогательных справочника ФизическиеЛица и Должности. Для справочника КонтактныеЛица указываем владельца (справочник Контрагенты) и добавляем четыре реквизита: ФизическоеЛицо (тип: СправочникСсылка.ФизическиеЛица), Должность (СправочникСсылка.Должности), ДеньРождения (Дата) и Телефон (Строка).
    Добавляем новые справочники Номенклатура (на закладке Иерархия устанавливаем флажок Иерархический справочник) и КлассификаторЕдиницИзмерения, а также новое перечисление ВидыНоменклатуры с заданными значениями перечисления. В справочник Номенклатура добавляем реквизиты ВидНоменклатуры (перечисление ВидыНоменклатуры) и БазоваяЕдиницаИзмерения (справочник КлассификаторЕдиницИзмерения). Для проверки заполненности для реквизита Вид Номенклатуры можно в палитре свойств установить свойство Проверка заполнения в значение Выдавать ошибку, т.к. нет дополнительных проверок; а для реквизита БазоваяЕдиницаИзмерения нужно добавить код в модуль объекта, который проверит, что номенклатура не является услугой:

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
        Если НЕ ЭтоГруппа Тогда
            Если НЕ ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
                Если ВидНоменклатуры<>Перечисления.ВидНоменклатуры.Услуга Тогда
                    Сообщить("Укажите базовую единицу измерения!");
                    Отказ = Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры

    В модуле формы добавляем код для заполнения вида номенклатуры:

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        ВидНом = Объект.Родитель.ВидНоменклатуры;
        Если ЗначениеЗаполнено(ВидНом) Тогда
            Объект.ВидНоменклатуры = ВидНом;
        КонецЕсли;
    КонецПроцедуры

    Добавляем новый справочник ЕдиницыИзмерения, подчиненный Номенклатуре (с реквизитом Коэффициент (Число, 15, 3)), после чего добавим реквизит в справочник Номенклатура – ОсновнаяЕдиницаИзмерения (тип: ЕдиницыИзмерения). В модуле объекта прописываем заполнение основной единицы с соблюдением поставленных условий:

    Процедура ПередЗаписью(Отказ)
        Если НЕ ЭтоГруппа Тогда
            Если ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) Тогда
                Если НЕ ЗначениеЗаполнено(ОсновнаяЕдиницаИзмерения) Тогда
                    СпрЕдиницы = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
                    СпрЕдиницы.Наименование = СокрЛП(БазоваяЕдиницаИзмерения);
                    СпрЕдиницы.Владелец = Ссылка;
                    СпрЕдиницы.Коэффициент = 1;
                    СпрЕдиницы.Записать();
                    ОсновнаяЕдиницаИзмерения = СпрЕдиницы.Ссылка;
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;
    КонецПроцедуры

    Пока не сообразила, как можно решить задачу поиска контрагентов без контактных лиц с помощью одного запроса, поэтому пришлось использовать два отдельных запроса:

    &НаКлиенте
    Процедура Проверить(Команда)
        ПроверитьНаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ПроверитьНаСервере()
        З_1 = Новый Запрос;
        З_1.Текст=    "ВЫБРАТЬ
        |   КонтактныеЛица.Владелец
        |ИЗ
        |   Справочник.КонтактныеЛица КАК КонтактныеЛица
        |
        |СГРУППИРОВАТЬ ПО
        |   КонтактныеЛица.Владелец
        |АВТОУПОРЯДОЧИВАНИЕ";
       
        Результат_1 = З_1.Выполнить().Выгрузить();
       
        З_2 = Новый Запрос;
        З_2.Текст =
            "ВЫБРАТЬ
            |   Контрагенты.Ссылка
            |ИЗ
            |   Справочник.Контрагенты КАК Контрагенты
            |ГДЕ
            |   Контрагенты.ЭтоГруппа = ЛОЖЬ
            |
            |СГРУППИРОВАТЬ ПО
            |   Контрагенты.Ссылка
            |АВТОУПОРЯДОЧИВАНИЕ";

        Результат_2 = З_2.Выполнить();

        ВыборкаДетальныеЗаписи = Результат_2.Выбрать();

        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если ТипЗнч(Результат_1.Найти(ВыборкаДетальныеЗаписи.Ссылка)) = Тип("Неопределено") Тогда
                сообщить(ВыборкаДетальныеЗаписи.Ссылка);
            КонецЕсли;
        КонецЦикла;
    КонецПроцедуры // ПроверитьНаСервере()