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

Третье занятие по 1-му блоку базового курса.

Необходимо изучить следующие главы.
Глава 9. Формы.
Глава 10. Перечисления.
Глава 11. Администрирование.
Глава 12. Роли.
Глава 13. Пользователи.
Глава 14. Параметры ИБ.
Глава 15. Резервные копии.
Глава 16. Отладка.
Глава 17. Работа с запросами к БД.

Также нужно выполнить домашнее задание, текст которого доступен на странице.

Задание необходимо выполнять в ИБ после предыдущего ДЗ.

В этой же теме необходимо написать отчет о выполнении задания.

ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

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

  1. Задание выполнено.
    В модуле объектов спровочников  Контактные лица, Контрагенты, Номенклатура, Классификатор единиц,  делаю проверку на  существование дублирующих записей по Наименованию, а в справочнике Единицы (подчинен Номенклатуре) еще и по владельцу. Для этого в обработчике события ПередЗаписью() модуля соответствующего объекта вызываю общую серверную функцию, где текст запроса меняется в зависимости от вида справочника и наименования реквизита:
    <code>
    Функция ЕстьДубльЭлементаСправочникаПоРеквизиту(пВидСправочника, пНаимРеквизита, пЗначРеквизита, пСсылкаНаТекущийЭлемент, Владелец = “”) Экспорт
     
      ТекстЗапроса  =
      “ВЫБРАТЬ
      | Спр.Ссылка КАК Ссылка
      |ИЗ
      | Справочник.<*> КАК Спр
      |ГДЕ
      | (Спр.<**> = &Реквизит) И
      | (Спр.Ссылка <> &ТекущаяСсылка)
      |”;
      Если ЗначениеЗаполнено(Владелец) Тогда
       ТекстЗапроса =  ТекстЗапроса + ”
       | И(Спр.Владелец = &Владелец)
       |”;
      КонецЕсли;
      
      Запрос = Новый Запрос;
      
      ТекстЗапроса = СтрЗаменить(ТекстЗапроса,”<*>”,пВидСправочника);
      ТекстЗапроса = СтрЗаменить(ТекстЗапроса,”<**>”,пНаимРеквизита);
      
      Запрос.Текст = ТекстЗапроса;
      Запрос.УстановитьПараметр(“Реквизит”, пЗначРеквизита);
      Запрос.УстановитьПараметр(“ТекущаяСсылка”, пСсылкаНаТекущийЭлемент);
      Если ЗначениеЗаполнено(Владелец) Тогда
       Запрос.УстановитьПараметр(“Владелец”, Владелец);
      КонецЕсли;
      Результат  = Запрос.Выполнить();
      Возврат НЕ Результат.Пустой();
    КонецФункции
    </code>

    Дополнительно в справочнике Контрагенты в обработчике события ПриЗаписи() модуля объекта проверяю наличие дублирующих контактных лиц (как табличная часть справочника Контрагенты) и отказываюсь от записи при их наличии. Ниже – текст запроса:
      Запрос.Текст =
       “ВЫБРАТЬ
       | ККЛ.КонтактноеЛицо КАК КЛ,
       | КОЛИЧЕСТВО(ККЛ.КонтактноеЛицо) КАК Ссылка
       |ИЗ
       | Справочник.Контрагенты.КонтактныеЛица КАК ККЛ
       |ГДЕ
       | ККЛ.Ссылка = &ТекущаяСсылка
       |
       |СГРУППИРОВАТЬ ПО
       | ККЛ.КонтактноеЛицо
       |
       |ИМЕЮЩИЕ
       | КОЛИЧЕСТВО(ККЛ.КонтактноеЛицо) > 1 
       |”;
      Запрос.УстановитьПараметр(“ТекущаяСсылка”, ЭтотОбъект.Ссылка);
    Проверку Контрагентов без контактных лиц реализовал через ЛЕВОЕ соединение с табличной частью КонтактныеЛица справочника Контрагенты:
     Запрос.Текст =
      “ВЫБРАТЬ
      | К.Ссылка КАК Контрагент
      |ИЗ
      | Справочник.Контрагенты КАК К
      |  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КЛ
      |  ПО (К.Ссылка = КЛ.Ссылка)
      |ГДЕ
      | (К.ЭтоГруппа = ЛОЖЬ)И(КЛ.Ссылка ЕСТЬ NULL)
      | “;

  2. Задание выполнил. Решение еще не смотрел.
    Связь справочника Контрагенты и КонтактныеЛица выполнил через дополнительный справочник Контакты, подчиненный Контрагентам, в котором указывается контактное лицо и должность. Конечно, такую связь лучше реализовать через РегистрСведений, но мы его еще не проходили.
    ВидНоменклатуры реализовал через Перечисление. Для справочника Номенклатура создал подчиненный справочник ЕдиницаыИзмерения.
    В обработке Проверка Контрагентов изпользовал запрос.

  3. Дмитрий 30.04.2011 в 13:54

    Фух. Чуть не опоздал… :0)
    Задание выполнил. Решение еще не смотрел, комментарии не читал. Честное пионерское.
    1) Создал 3 независимых справочника “Контрагенты”,”Контактные лица”, “Должности”.
    В справочник “Контрагенты” добавил табличную часть для элементов с реквизитами: “Контактное лицо”, “Должность”. Имеют тип – ссылки на одноименные справочники.
    2) Создал 3 справочника “Контрагенты”, “Классификатор единиц измерения”, “Единицы измерения”. Справочник “Единицы измерения” подчинен справочнику “Контрагенты”.
    Для реквизитов “ВидНоменклатуры”, “БазоваяЕдиницаизмерения” справочника “Номенклатура” в свойстве  “Проверка заполнения” установил “Выдавать ошибку”.
    На форму элемента справочника “Номенклатура” поместил динамический список (СправочникСписок.ЕдиницыИзмерения)
    Модуль формы элемента справочника “Номенклатура”
    <code>

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ОтборПоВладельцу = Этаформа.ЕдиницыИзмерения.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ОтборПоВладельцу.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Владелец”);
    ОтборПоВладельцу.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборПоВладельцу.ПравоеЗначение = Объект.Ссылка;

    КонецПроцедуры
    &НаСервереПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОтборПоВладельцу = Этаформа.ЕдиницыИзмерения.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”)); ОтборПоВладельцу.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Владелец”); ОтборПоВладельцу.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборПоВладельцу.ПравоеЗначение = Объект.Ссылка; КонецПроцедуры
    </code>
    Модуль объекта справочника “Номенклатура”
    <code>

    &НаСервере
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

    ТекРодитель = Справочники.Номенклатура.ПустаяСсылка();

    Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) И НЕ ДанныеЗаполнения.Свойство(“ВидНоменклатуры”)
    И  ДанныеЗаполнения.Свойство(“Родитель”, ТекРодитель) И ЗначениеЗаполнено(ТекРодитель.ВидНоменклатуры) Тогда
    ВидНоменклатуры = ТекРодитель.ВидНоменклатуры;
    КонецЕсли;

    Если ЭтоНовый() Тогда
    Идентификатор = Новый УникальныйИдентификатор;
    НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
    УстановитьСсылкуНового(НоваяСсылка);
    КонецЕсли;

    КонецПроцедуры
     
    &НаСервере
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

    Если ЭтоГруппа Тогда
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“ВидНоменклатуры”));
    ИначеЕсли ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
    КонецЕсли;

    КонецПроцедуры
     
    &НаСервере
    Процедура ПриЗаписи(Отказ)

    Если ЭтоГруппа ИЛИ ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
    Возврат;
    КонецЕсли;

    Если БазоваяЕдиницаИзмерения <> Ссылка.БазоваяЕдиницаИзмерения Тогда

    ВыборкаЕдиницыИзмеренияТекНоменклатуры = Справочники.ЕдиницыИзмерения.Выбрать(,Ссылка, );

    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ЕдиницыИзмерения.Ссылка,
    | ЕдиницыИзмерения.ЕдиницаПоКлассификатору,
    | ЕдиницыИзмерения.Коэффициент
    |ИЗ
    | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
    |ГДЕ
    | ЕдиницыИзмерения.Владелец = &Владелец
    | И ЕдиницыИзмерения.ЕдиницаПоКлассификатору В(&СписокЕдиницИзмеренияКлассификатора)
    |”;

    Запрос.УстановитьПараметр(“Владелец”, Ссылка);

    СписокЕдиницИзмеренияКлассификатора = Новый СписокЗначений;
    СписокЕдиницИзмеренияКлассификатора.Добавить(БазоваяЕдиницаИзмерения);
    Если БазоваяЕдиницаИзмерения <> Ссылка.БазоваяЕдиницаИзмерения Тогда
    СписокЕдиницИзмеренияКлассификатора.Добавить(Ссылка.БазоваяЕдиницаИзмерения);
    КонецЕсли;
    Запрос.УстановитьПараметр(“СписокЕдиницИзмеренияКлассификатора”, СписокЕдиницИзмеренияКлассификатора);

    ТаблицаЕдиницИзмерения = Запрос.Выполнить().Выгрузить();

    Если БазоваяЕдиницаИзмерения <> Ссылка.БазоваяЕдиницаИзмерения Тогда
    //Если изменили базовую единицу удаляем соответствующий предыдущей базовой единице элемент справочника “Единицы измерения”
    НайденныйСтарыйЭлемент = ТаблицаЕдиницИзмерения.Найти(Ссылка.БазоваяЕдиницаИзмерения, “ЕдиницаПоКлассификатору”);
    Если ЗначениеЗаполнено(НайденныйСтарыйЭлемент) Тогда
    Попытка
    НайденныйСтарыйЭлементОбъект = НайденныйСтарыйЭлемент.Ссылка.ПолучитьОбъект();
    НайденныйСтарыйЭлемент.УстановитьПометкуУдаления(Истина);
    Исключение

    КонецПопытки;
    КонецЕсли;
    КонецЕсли;

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

    КонецПроцедуры

    </code>
    3) В форме внешней обработки на кнопку повесил команду “ПоискКонтрагентовСПустымСпискомКонтактныхЛиц”
    Модуль формы внешней обработки
    <code>

    &НаКлиенте
    Процедура ПоискКонтрагентовСПустымСпискомКонтактныхЛиц(Команда)

    МассивКонтрагентов = НайтиКонтрагентовСНезаполненнымиКонтактнымиЛицами();
     
    Для Каждого ТекКонтрагент Из МассивКонтрагентов Цикл
    Сообщить(ТекКонтрагент);
    КонецЦикла;

    КонецПроцедуры
     
    &НаСервере
    Функция НайтиКонтрагентовСНезаполненнымиКонтактнымиЛицами()

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Контрагенты.Наименование
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    | НЕ Контрагенты.ЭтоГруппа
    |СГРУППИРОВАТЬ ПО
    | Контрагенты.Наименование
    |
    |ИМЕЮЩИЕ
    | КОЛИЧЕСТВО(Контрагенты.КонтактныеЛица.КонтактноеЛицо) = 0”;

    ТаблицаКонтрагентов = Запрос.Выполнить().Выгрузить();
    МассивКонтрагентов = ТаблицаКонтрагентов.ВыгрузитьКолонку(“Наименование”);

    Возврат МассивКонтрагентов;

    КонецФункции

    </code>

    • Дмитрий 30.04.2011 в 14:03

      Обратная связь:
      Узнал много нового и интересного (все чем отличается 8.2 от 8.1)
      Наибольшую сложность вызывает необходимость мыслить понятиями 8.2. что касается контекстов и директив компиляции. В уроках все понятно, но как только начинаешь сам ковырять…
      Приходится разбираться во всем. что было переделано по сравнению с 8.1. В ДЗ №6 например, при попытке установить отбор в динамическом списке писал по привычке “… .Отбор.Установить…”, “ВидСравнения.Равно”. Расстроился, когда не заработало. :0)

  4. Обратная связь по курсу.
    Постепенно выстраивается понимание того, что есть управляемые формы и как с ними бороться. :)
    Но все еще трудно ориентироваться в этом многообразии контекстов и директив компиляции.
    То, что работы впереди еще много, я понял по сегодняшнему анекдотичному случаю.
    Попытался запустить обработку “Консоль запросов”, которая меня не подводила в 8.1 и успешно перекочевала со мной в 8.2 (в режиме совместимости).
    Сегодня она жестко ругнулась при попытке ее запустить: нет подходящих форм. И я понял, что да, нет – это точно. Но вот что с этим делать – я пока не знаю.
    Поэтому с большим интересом изучил бы тему – как переводить богатые по функционалу формы с 8.1 на 8.2. Есть ли такая методика?

    • >как переводить богатые по функционалу формы с 8.1 на 8.2
      Методики по сути нет. Формы совершенно разные.
      И большой ошибкой является – “сделать также как в 8.1”.
      Форму нужно разрабатывать исходя из требований пользователя и принципов разработки 8.2.

  5. Созданы справочники «Контрагенты» и «Контактные лица».
    В справочнике «Контрагенты» создана табличная часть «Контактные лица», в которой 2 реквизита: «Контактное лицо» и «Должность».
    Табличная часть используется только для элементов.
    Создано перечисление «ВидНоменклатуры», справочники «Номенклатура» и «КлассификаторЕдиницИзмерения».
    В модуле объекта справочника «Номенклатура» написаны процедуры:
    <code>
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    РодительВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
    Если ЗначениеЗаполнено(РодительВидНоменклатуры) Тогда
    ВидНоменклатуры = РодительВидНоменклатуры;
    КонецЕсли;
    КонецПроцедуры

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

    </code>
    Создан справочник «ЕдиницыИзмеренияНоменклатуры», подчиненный справочнику «Номенклатура». Реквизиты – «ЕдиницаИзмерения» и «КоэффициэнтПересчета»
    Для обеспечения условий задания в модуле объекта справочника «Номенклатура» написаны процедуры:
    <code>
    Процедура ПередЗаписью(Отказ)
    Если (НЕ ЭтоНовый()) И (БазоваяЕдиницаИзмерения <> Ссылка.БазоваяЕдиницаИзмерения) Тогда
    ОчиститьЕдиницыИзмеренияНоменклатуры(Ссылка);
    КонецЕсли;
    КонецПроцедуры

    Процедура ПриЗаписи()
    Если НЕ ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
    ЗаполнитьЕдиницуИзмеренияНоменклатуры(Ссылка);
    КонецЕсли;
    КонецПроцедуры

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

    Функция ПроверитьСправочникЕдиницИзмерения(ПарамВладелец, ПарамЕдиницаИзмерения = Неопределено)
    Запрос = Новый Запрос;
    Запрос.Текст =
    ” ВЫБРАТЬ
    | ЕдиницыИзмеренияНоменклатуры.Ссылка
    |ИЗ
    | Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
    |ГДЕ
    | ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец”;
    Если ПарамЕдиницаИзмерения <> Неопределено Тогда
    Запрос.Текст = Запрос.Текст + ”
    | И ЕдиницыИзмеренияНоменклатуры.ЕдиницаИзмерения = &ЕдиницаИзмерения”;
    Запрос.УстановитьПараметр(“ЕдиницаИзмерения”, ПарамЕдиницаИзмерения);
    КонецЕсли;
    Запрос.УстановитьПараметр(“Владелец”, ПарамВладелец);
    Результат = Запрос.Выполнить().Выгрузить();
    Возврат Результат;
    КонецФункции

    Процедура ОчиститьЕдиницыИзмеренияНоменклатуры(ПарамВладелец)
    ЕдиницыИзмерения = ПроверитьСправочникЕдиницИзмерения(ПарамВладелец);

    Для каждого ЕдИзм Из ЕдиницыИзмерения Цикл
    ЕдИзмОбъект = ЕдИзм.Ссылка.ПолучитьОбъект();
    ЕдИзмОбъект.Удалить();
    КонецЦикла;
    КонецПроцедуры

    </code>

    4. Создана служебная обработка.
    С вот таким запросом
    <code>
    Запрос=новый Запрос;
    Запрос.Текст=”
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Контрагенты.Ссылка
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
    | ПО Контрагенты.Ссылка <> КонтрагентыКонтактныеЛица.Ссылка
    |ГДЕ
    | (НЕ Контрагенты.ЭтоГруппа)
    |”;
    </code>

    • Кстати,  вопросы по оформление постов в данной и подобных темах.
      1. У меня по-прежнему нет табуляции, а вот у коллег, смотрю, кое у кого появилась. Я что-то пропустил?
      2. Если куски кода в посте разделены кусками “не кода”, то второй и все последующие куски кода перестают “раскрашиваться” красным.

      • > а вот у коллег, смотрю, кое у кого появилась
        Табуляции на сайте не появилось.
        А коллеги вставляют ее следующим образом: копируют программный код из MS Word.
        >2. Если куски кода в посте разделены кусками «не кода»
        Проблему передам вебмастеру.

  6. Елена 30.04.2011 в 01:07

    ДЗ 6
    Справочник «Контрагенты» содержит ТабличнуюЧасть «КонтакныеЛицы» со следующими реквизитами:
    КонтактныеЛица – Справочник.КонтактныеЛица
    Должности – Справочник.Должности;
    <code>
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    если ЭтотОбъект.ВидНоменклатуры=ПредопределенноеЗначение(“Перечисление.ВидНоменклатуры.Услуга”)тогда
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
    конецесли;
    КонецПроцедуры
     
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    если ТипЗнч(ДанныеЗаполнения)= Тип(“Структура”) тогда
    если ДанныеЗаполнения.Свойство(“Родитель”)=1 тогда
    Родитель=ДанныеЗаполнения.Родитель;
    Если Родитель.ВидНоменклатуры.Пустая()=0 тогда
    ВидНоменклатуры =Родитель.ВидНоменклатуры;
    конецЕсли;
     
    конецЕсли;
    конецЕсли;
    КонецПроцедуры
     
    Процедура ПередЗаписью(Отказ)
    Если ЭтотОбъект.ЭтоНовый() и НЕ ЭтотОбъект.ЭтоГруппа() тогда
    Табл=ЕдиницыИзмерения.Добавить();
    Табл.ЕдиницаИзмерения=БазоваяЕдиницаИзмерения;
    Табл.КоэффицентПересчета=1;
    КонецЕсли;
    КонецПроцедуры
    </code>

    Обработка «Список контрагентов с незаполненным реквизитом Контактные лицы»
    <code>
    &НаКлиенте
    Процедура Сформировать(Команда)
    Перем Результат;
    Результат=СформироватьНаСервере();
    Для каждого стрКонтрагент из Результат Цикл
    сообщить(стрКонтрагент)
    КонецЦикла;
    КонецПроцедуры
     
    функция СформироватьНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Контрагенты.Ссылка,
    | Контрагенты.Представление,
    | Контрагенты.КонтактныеЛица,
    | Контрагенты.ЭтоГруппа
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    | Не Контрагенты.КонтактныеЛица.Ссылка = Контрагенты.Ссылка
    | И Не Контрагенты.ЭтоГруппа”;
     
    Результат = Запрос.Выполнить();

    Возврат Результат.ВЫгрузить().ВыгрузитьКолонку(0) ;

    КонецФункции</code>
    Вопросы:

    Работала только 7.7, поэтому почти все новое, что дается в курсе
    Тема «Модули» трудно далась – последний урок почти все расставил по своим местам.

  7. Работу выполнила, сделала 2 независимых справочника Контрагенты и КонтактныеЛица с ТЧ с названиями наоборот.
    Код обработки такой:
    <code>

    &НаСервере
    Процедура ВыполнитьНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Контрагенты.Ссылка,
    | Контрагенты.Представление,
    | КонтрагентыКонтактныеЛица.КонтактноеЛицо
    |ИЗ
    | Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
    | ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    | ПО КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка
    |ГДЕ
    | Контрагенты.ЭтоГруппа = ЛОЖЬ”;
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    КонтактноеЛицо = ВыборкаДетальныеЗаписи.КонтактноеЛицо;
    Если  КонтактноеЛицо = null       Тогда
    Сообщить(ВыборкаДетальныеЗаписи.Ссылка);
    КонецЕсли
    КонецЦикла;
    КонецПроцедуры
    &НаКлиенте
    Процедура Выполнить1(Команда)
    ВыполнитьНаСервере();
    КонецПроцедуры

    &НаСервереПроцедура ВыполнитьНаСервере()
    Запрос = Новый Запрос; Запрос.Текст =  “ВЫБРАТЬ | Контрагенты.Ссылка, | Контрагенты.Представление, | КонтрагентыКонтактныеЛица.КонтактноеЛицо |ИЗ | Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица | ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты | ПО КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка |ГДЕ | Контрагенты.ЭтоГруппа = ЛОЖЬ”;
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл КонтактноеЛицо = ВыборкаДетальныеЗаписи.КонтактноеЛицо; Если  КонтактноеЛицо = null       Тогда Сообщить(ВыборкаДетальныеЗаписи.Ссылка); КонецЕсли КонецЦикла; КонецПроцедуры

    &НаКлиентеПроцедура Выполнить1(Команда) ВыполнитьНаСервере();КонецПроцедуры
    </code>
    В справочнике Номенклатура добавила булевский реквизит “Услуга”, поставила Выдавать ошибку на ВидНомеклатуры и такой код на проверку Единицы измерения:
    <code>&НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если Объект.БазоваяЕдиницаИзмерения.Пустая()   И Объект.Услуга = Ложь Тогда
    Текст = “Заполните базовую единицу измерения”;
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = Текст;
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецПроцедуры
    </code>

    • Почему-то снова 1 кусок кода 2 раза вставился…

      • Есть такая особенность при вставке из буфера и дальнейшей корректировке текста.

  8. 1. Создал Справочники Контрагенты с дополнит Табличной частью и реквизитами Контактноелицо тип СправочникСсылка.КонтактныеЛица и Должность тип СправочникСсылка.Должности
    справочн Контактныелица и должности не подчиненные контрагенту
    2.  Создал Справочник  Номенклатура  и Классификатор единицИзмерения Перечисление ВидНоменклатуры
    а также дополнительный справочник ЕдиницыИзмерения подчиненный Справочнитку.Номенклатура с реквизитами БазаЕдин тип СправочникСсылка.КлассификаторЕдиницИзмерения
    и Коэфициент число 10, 2
    в модуле Формы справочн номенкл
    &НаСервере
    перем ЭтоНовый;
    &НаСервере
    Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    //Вставить содержимое обработчика
    ЭтоНовый=Параметры.Ключ.Пустая();

    КонецПроцедуры

    &НаСервере
    Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    //Вставить содержимое обработчика
    Если ЭтоНовый Тогда
    Ед=Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    Ед.БазаЕдин=Объект.БазоваяЕдиницаИзмерения;
    Ед.Наименование=Объект.БазоваяЕдиницаИзмерения.Наименование;
    Ед.Владелец=Объект.Ссылка;
    Ед.Коэффициент=1;
    Ед.Записать();
    КонецЕсли;     
    КонецПроцедуры

    В модуле обьекта справочн номенклатуры

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    // Вставить содержимое обработчика.
    Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));            
    КонецЕсли;
    КонецПроцедуры

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

    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Вставить обработку выборки ВыборкаДетальныеЗаписи
    Сообщить(“У контрагеньа ” + ВыборкаДетальныеЗаписи.Ссылка + ” не заполнены контактные лица”);
    КонецЦикла;

    КонецФункции // СписокЛиц()

    &НаКлиенте
    Процедура Выполнить6(Команда)
    // Вставить содержимое обработчика.
    СписокЛиц();

    КонецПроцедуры

     
     
     

  9. Листинг номенклатуры
    Прошу прощения за последние посты
    отчет на СКД
    dt конфигурации задания 6

  10. Задание Выполнено. Создала справочники Контрагенты И КонтактныеЛица. В спр Контрагенты контактные лица в табличной части.
    Создала справочники Номенклатура и КлассификаторЕдиницИзмерения. У реквизитов поставила проверку заполнения.
    модульОбъектаНоменклатура
    МодульФормыЭлементаНоменклатура
    Не поняла, почему не работает Объект.ЭтоНовый() в проц ПриСозданииНаСервере() в модуле Формы элемента.
    ОбработкаПроверкиКонтрагентов
    вывела список контрагентов в таблицу ФормыОбработки.
    1.Узнала некоторые тонкости, на которые раньше или не обращала внимание или они были не документированы.
    2.Трудности были с распределением процедур на клиенте – сервере.  Как оптимальнее .
    3. не очень понятен пример с ГУИД-ом. Хотелось бы поподробнее об этом.

  11. Добрый день, задание выполнил.

    1. Контактные лица – независимый справочник.

    связь с контрагентами через таб.часть справочника Контрагенты, там же и должность. Должность – справочник.

    2. Номенклатура

    функциональный код приведён в листинге

    3. Отчет по контрагентам с пустыми конт.лицами выполнен на СКД
     
    Подскажите как делать вложение файлов?

    • Вложение файлов сделать не получиться.
      Можно вставлять ссылку на картинку с листингом.

  12. Создал:
    спр.  «Контактные лица» с реквизитами ДеньРождения Тип Дата, НомерТелефона Тип Строка 20
    спр. «Контрагенты» Табличная часть КонтактныеЛица: реквизиты КонтактноеЛицо Тип СправочникСсылка.КонтактныеЛица, Д олжность Тип Строка 20
    спр. «Номенклатура»: реквизиты ВидНоменклатуры Тип ПеречислениеСсылка.ВидНоменклатуры
    БазоваяЕдиницаИзмерения Тип СправочникСсылка.КлассификаторЕдиницИзмерения
    спр. «КлассификаторЕдиницИзмерения»
    спр. «ЕдиницыИзмерения»: Наименование = 0, Владельцы Справочник.Номенклатуры, реквизиты ЕдиницаПоКлассификатору Тип СправочникСсылка.Классиф.., Коэффициент Число 10.3
     
     «Номенклатура« – поставил Проверка заполнения = Выдавать ошибку для реквизитов, на уровне Объекта, создал ФормаЭлемента
    Модуль Формы
    <code>&НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
                   
                    Если НЕ(Объект.Родитель = Справочники.Номенклатура.ПустаяСсылка())
                                   И ЗначениеЗаполнено(Объект.Родитель.ВидНоменклатуры) Тогда
                                  
                                   Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
                                  
                    КонецЕсли;
                   
    КонецПроцедуры</code>
     
    Модуль объекта
    <code>Перем ЭтоНовый; // В переменной хранится признак нового элемента.
     
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
                   
                    Если НЕ ЭтоГруппа
                                   И ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
                                  
                                   ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
                                  
                    КонецЕсли;
                   
    КонецПроцедуры
     
    // Процедура – обработчик события ПередЗаписью.
    //
    Процедура ПередЗаписью(Отказ)
                   
                    ЭтоНовый = ЭтоНовый();
                   
    КонецПроцедуры // ПередЗаписью()
     
    Процедура ПриЗаписи(Отказ)
                   
                    // Создадим единицу измерения с коэффициентом 1, соответствующей базовой единицы.
                    Если ЭтоНовый
                                   И НЕ ЭтоГруппа
                                   И ЗначениеЗаполнено(БазоваяЕдиницаИзмерения)Тогда
                                  
                                   ЭтоНовый = Ложь;
                                  
                                   НоваяЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
                                  
                                   НоваяЕдиница.ЕдиницаПоКлассификатору = БазоваяЕдиницаИзмерения;
                                   НоваяЕдиница.Коэффициент = 1;
                                   НоваяЕдиница.Владелец = Ссылка;
                                   НоваяЕдиница.Записать();
                                  
                                   Записать();
                                  
                    КонецЕсли;
                   
    КонецПроцедуры</code>
     
    «ЕдиницыИзмерения» (дублирования не допускать)
    Модуль объекта
    <code>Процедура ПередЗаписью(Отказ)
     
                    Запрос = Новый Запрос;
                    Запрос.Текст =
                                   “ВЫБРАТЬ
                                   |             ЕдиницыИзмерения.Ссылка
                                   |ИЗ
                                   |             Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
                                   |ГДЕ
                                   |             ЕдиницыИзмерения.Владелец = &Владелец
                                   |             И ЕдиницыИзмерения.ЕдиницаПоКлассификатору = &ЕдиницаПоКлассификатору”;
     
                    Запрос.УстановитьПараметр(“Владелец”, Владелец);
                    Запрос.УстановитьПараметр(“ЕдиницаПоКлассификатору”, ЕдиницаПоКлассификатору);
     
                    Отказ = НЕ Запрос.Выполнить().Пустой();
     
    КонецПроцедуры</code>
     
    Обработка «ПроверкаКонтрагентов» в ветке Оработки
    Добавил реквизит Формы ТаблицаКонтрагенты Тип ТаблицаЗначений: колонки Контрагент Тип СправочникСсылка.Контрагенты , убрал Командная панель флаг Автозаполнение, добавил Команду ПроверитьКонтрагентов Заголовок Выполнить, все разместил на форме.
    Модуль формы (если временные таблицы для запосов еще рано, тогда вот самое понятное, но не оптимальное)
    <code>&НаКлиенте
    Процедура ПроверитьКонтрагентов(Команда)
     
     ПроверитьКонтрагентовНаСервере();
     
    КонецПроцедуры
    &НаСервере
    Процедура ПроверитьКонтрагентовНаСервере()
     Запрос = Новый Запрос();
     
     Запрос.Текст = “ВЫБРАТЬ
                    | 1 КАК НомСтроки,
                    | Контрагенты.Ссылка КАК Контрагент
                    |ИЗ
                    | Справочник.Контрагенты КАК Контрагенты
                    |ГДЕ
                    | Контрагенты.ЭтоГруппа = ЛОЖЬ
                    | И (НЕ Контрагенты.Ссылка В
                    |    (ВЫБРАТЬ
                    |     КонтрагентыКонтактныеЛица.Ссылка КАК Контрагент
                    |    ИЗ
                    |     Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
                    |    СГРУППИРОВАТЬ ПО
                    |        КонтрагентыКонтактныеЛица.Ссылка))”;
     
     ТаблицаКонтрагенты.Загрузить(Запрос.Выполнить().Выгрузить()); 
    КонецПроцедуры</code>

    • ? добавил колонку НомСтроки в ТаблицуЗначений на Форме, при заполнении ТаблицыЗначений из Запроса никак не смог получить в выходное поле номер строки запроса (поставил «костыль» 1 КАК НомСтроки). Можно ли номер строки в запросе заполучить? (см. последний фрагмент кода)

      • Можно, но это трудоемкая задача (для СУБД).
        По сути она решается соединением таблицы самой с собой. И если в таблице содержится несколько миллионов записей, то можно повесит сервер БД.
        Поэтому сейчас решение такой задачи приводить не буду (но мы ее разбираем в курсе продвинутом).
        Рекомендация – нумерацию реализуйте вне запроса.
        Однако, если требуется нумерация строк отчета, то эта задача легко решается средствами СКД (не запроса).

  13. S. Bashutin 29.04.2011 в 16:17

    Обратная связь по первому блоку.
    1) Значительно упорядочились знания по типам данных. Теперь всё по полочкам.
    2) Трудностей в данном блоке не было.
    3) Хотелось бы, чтобы в тему “Отладка” добавили материал по работе с замером производительности. А так всё классно;)
    Спасибо преподавателям;)

    • Тимур 20.06.2011 в 19:12

      Замеру производительности, по моему скромному мнению, не место в базовом курсе – это тема для “продвинутых”

  14. Для хранения списка всех возможных Контактных лиц создал отдельный справочник. У Контрагента создал Табличную часть для хранения должности и контактного лица для каждого контрагента. К сожалению, не понятно, как будут использоваться в дальнейшем контрактное лицо контрагента – т.е. нужно ли будет иметь ссылку на них.
    В реквизитах поставил проверку на заполнение, в коде прописал доп обработку на проверку заполненности
     
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ЭтотОбъект.ЭтоНовый() И ЭтотОбъект.ВидНоменклатуры.Пустая() И не ЭтотОбъект.Родитель.Пустая() Тогда
    ЭтотОбъект.ВидНоменклатуры = ЭтотОбъект.Родитель.ВидНоменклатуры;
    КонецЕсли;
     
    Если ЭтотОбъект.ЭтоГруппа Тогда
    Если ЭтотОбъект.ВидНоменклатуры.Пустая() Тогда
    Для Инд = 0 По ПроверяемыеРеквизиты.Количество()-1 Цикл
    Если ПроверяемыеРеквизиты.Получить(Инд) = “ВидНоменклатуры” Тогда
    ПроверяемыеРеквизиты.Удалить(Инд);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    Иначе
    Если ЭтотОбъект.БазоваяЕдиницаИзмерения.Пустая() И ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
    Для Инд = 0 По ПроверяемыеРеквизиты.Количество()-1 Цикл
    Если ПроверяемыеРеквизиты.Получить(Инд) = “БазоваяЕдиницаИзмерения” Тогда
    ПроверяемыеРеквизиты.Удалить(Инд);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
     
    Процедура ПередЗаписью(Отказ)
    Если ЭтотОбъект.ЭтоНовый() Тогда
    ТабЕдиницыИзмерения = ЭтотОбъект.ЕдиницыИзмерения;
    Для Каждого ТабЕдиницаИзмерения Из ТабЕдиницыИзмерения Цикл
    Если ТабЕдиницаИзмерения.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения Тогда
    Возврат;
    КонецЕсли;
    КонецЦикла;
    ТабНоваяСтрока = ТабЕдиницыИзмерения.Добавить();
    ТабНоваяСтрока.ЕдиницаИзмерения = ЭтотОбъект.БазоваяЕдиницаИзмерения;
    ТабНоваяСтрока.Коэффициент = 1;
    КонецЕсли;
    КонецПроцедуры
     
     
     
    Код обработки по проверке контрагентов
    &НаКлиенте
    Процедура ВыполнитьРасчет(Команда)
     
    ОбработатьКонтрагентов();
     
    КонецПроцедуры
     
    &НаСервереБезКонтекста
    Процедура ОбработатьКонтрагентов()
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |             Контрагенты.Ссылка
    |ИЗ
    |             Справочник.Контрагенты КАК Контрагенты
    |             ГДЕ
    |             не (Контрагенты.Ссылка В (ВЫБРАТЬ
    |             КонтрагентыКонтактныеЛица.Ссылка
    |                             ИЗ
    |             Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица))”;
     
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(“У контрагеньа ” + ВыборкаДетальныеЗаписи.Ссылка + ” не заполнены контактные лица”);
    КонецЦикла;
    КонецПроцедуры;

  15. Создал справочник  “Контактные лица” подчинен спр-ку “Контрагенты”,  условие “один и тот же человек” реализовал с помощью дополнительного справочника “Физические лица” и реквизита “ФЗ” , должности (создал справ-к с таким же именем) также находятся в “Контактных лицах” (скрин прилагаю)
    По номенклатуре: создал 2 справочника “КлассификаторЕдиницИзмерения” и “ЕдиницыИзмерения”, по заданию при записи создается новый элемент “ЕИ”. ( справочник “ЕИ” – подчинен номенклатуре, его реквизиты: коэффициент, ЕдиницаПоКлассификатору.)
    Модуль объекта номенклатуры:
    <code>Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

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

    Если ДанныеЗаполнения <> Неопределено И ЭтоНовый() Тогда
    ЭтотОбъект.ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
    КонецЕсли;
    КонецПроцедуры
    Процедура ПриЗаписи(Отказ)

    Если ЗначениеЗаполнено(ЕдиницаИзмерения) Тогда
    ПроверитьЕдиницуИзм(Отказ);
    КонецЕсли;

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

    НайденнаяЕдиницаОбъект.Записать();
    НайденнаяЕдиница = НайденнаяЕдиницаОбъект.Ссылка;
    КонецЕсли;
    КонецПроцедуры // ПроверитьЕдиницуИзм()

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) ТипНоменк = ПроверяемыеРеквизиты.Найти(“ЕдиницаИзмерения”); Если ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга И НЕ ЭтотОбъект.ЭтоГруппа Тогда ПроверяемыеРеквизиты.Удалить(ТипНоменк); КонецЕсли;КонецПроцедуры
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ДанныеЗаполнения <> Неопределено И ЭтоНовый() Тогда ЭтотОбъект.ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры; КонецЕсли; КонецПроцедуры
    Процедура ПриЗаписи(Отказ) Если ЗначениеЗаполнено(ЕдиницаИзмерения) Тогда ПроверитьЕдиницуИзм(Отказ); КонецЕсли; КонецПроцедуры
    Процедура ПроверитьЕдиницуИзм(Отказ)
    ВыборкаЕдиниц = Справочники.ЕдиницыИзмерения.Выбрать(, ЭтотОбъект.Ссылка); Если ВыборкаЕдиниц.Следующий() Тогда Иначе НайденнаяЕдиницаОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент(); НайденнаяЕдиницаОбъект.Наименование            = ЕдиницаИзмерения.Наименование; НайденнаяЕдиницаОбъект.ЕдиницаПоКлассификатору = ЕдиницаИзмерения; НайденнаяЕдиницаОбъект.Коэффициент             = 1; НайденнаяЕдиницаОбъект.Владелец                = Ссылка; НайденнаяЕдиницаОбъект.Записать(); НайденнаяЕдиница = НайденнаяЕдиницаОбъект.Ссылка; КонецЕсли;КонецПроцедуры // ПроверитьЕдиницуИзм()
    </code>
    Модуль формы номенклатуры: <code>

    &НаКлиенте
    Процедура ПослеЗаписи(ПараметрыЗаписи)
    ОбновитьТЧ();
    КонецПроцедуры
    &НаСервере
    Процедура ОбновитьТЧ()
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ЕдиницыИзмерения.Ссылка КАК ЕдиницаИзмерения,
    | ЕдиницыИзмерения.Коэффициент КАК Коэффициент,
    | ЕдиницыИзмерения.ЕдиницаПоКлассификатору КАК ПоКлассификатору
    |ИЗ
    | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
    |ГДЕ
    | ЕдиницыИзмерения.Владелец = &Владелец”;
    Запрос.УстановитьПараметр(“Владелец”, Объект.Ссылка);
    Объект.ЕдиницыИзмеренияТЧ.Загрузить(Запрос.Выполнить().Выгрузить());
    КонецПроцедуры // ОбновитьТЧ()
    </code>
    Обработка “Проверка  контрагентов”:<code>

    &НаКлиенте
    Процедура ВыполнитьСообщение(Команда)
    Вывод();
    КонецПроцедуры
     
    &НаСервереБезКонтекста
    Процедура Вывод()
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Контрагенты.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.КонтактныеЛица КАК КонтактныеЛица
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    | ПО КонтактныеЛица.Владелец = Контрагенты.Ссылка
    |ГДЕ
    | (НЕ Контрагенты.ЭтоГруппа)
    | И (НЕ КонтактныеЛица.Ссылка ЕСТЬ NULL )
    |
    |СГРУППИРОВАТЬ ПО
    | Контрагенты.Ссылка”;
    Результат = Запрос.Выполнить().Выгрузить();
    Для каждого СтрокаТЗ Из Результат Цикл
    Сообщить(Строка(СтрокаТЗ.Ссылка));
    КонецЦикла;
    КонецПроцедуры // Вывод()
    </code>

    • Забыл скрины вставить: КонтакнтыеЛица, Номенклатура

      • Ответы на вопросы:
        1. Очень интересные темы были в главах: “Типы данных” (все разложилось по полочкам), “Справочники” (события при, перед и т.д.), “Формы” (директивы компиляции).
        2. Проблемы были со списком пользователей и датами. =) Я все гуглил.
        3.  “Работа с запросами БД” – эта тема будет рассмотрена далее, но тут много всего вкусного, можно поделиться опытом и показать какие-нибудь фишки и т.д. =)
        Спасибо.

  16. Yuri Golovko 29.04.2011 в 15:14

    Контактные лица храним в табличной части справочника Контрагенты с реквизитами
    КонтактноеЛицо типа СправочникСсылка.КонтактныеЛица
    и Должность типа СправочникСсылка.Должности.
    В свойстве “Проверка заполнения” реквизитов ВидНоменклатуры и БазоваяЕдиницаИзмерения
    справочника Номенклатура устанавливаем значение “Выдавать ошибку”.
    Справочник ЕдиницыИзмерения подчинен справочнику Номенклатура.
    Модуль объекта справочника Номенклатура:
    <code>
    Перем ЭтоНоваяНоменклатура;
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
     Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) И ДанныеЗаполнения.Свойство(“Родитель”) Тогда
      Если Не ДанныеЗаполнения.Родитель.ВидНоменклатуры.Пустая() Тогда
       ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
      КонецЕсли;
     КонецЕсли;
    КонецПроцедуры
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
     Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
      ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
     КонецЕсли;
    КонецПроцедуры
    Процедура ПриЗаписи(Отказ)
     Если ЭтоНоваяНоменклатура И Не ЭтоГруппа Тогда
      НовЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
      НовЕдИзм.Владелец = Ссылка;
      НовЕдИзм.Наименование = Ссылка.БазоваяЕдиницаИзмерения.Наименование;
      НовЕдИзм.Коэффициент = 1;
      НовЕдИзм.БазоваяЕдиницаИзмерения = Ссылка.БазоваяЕдиницаИзмерения;
      НовЕдИзм.Записать();
     КонецЕсли;  
    КонецПроцедуры
    Процедура ПередЗаписью(Отказ)
     ЭтоНоваяНоменклатура = ЭтоНовый();
    КонецПроцедуры
    </code>
    Модуль формы обработки “Проверка контрагентов”,
     где процедура ВыполнитьНаКлиенте() – обработчик команды формы Выполнить:
    <code>
    &НаКлиенте
    Процедура ВыполнитьНаКлиенте(Команда)
     ВыполнитьНаСервере();
    КонецПроцедуры
    &НаСервереБезКонтекста
    Процедура ВыполнитьНаСервере()
     Запрос = Новый Запрос;
     Запрос.Текст =
      “ВЫБРАТЬ
      | Контрагенты.Ссылка,
      | Контрагенты.Представление
      |ИЗ
      | Справочник.Контрагенты КАК Контрагенты
      |ГДЕ
      | (НЕ Контрагенты.Ссылка В
      |    (ВЫБРАТЬ
      |     КонтрагентыКонтактныеЛица.Ссылка
      |    ИЗ
      |     Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица))
      | И (НЕ Контрагенты.ЭтоГруппа)”;
     Результат = Запрос.Выполнить();
     ВыборкаДетальныеЗаписи = Результат.Выбрать();
     Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      Сообщить(“У контрагента ” + ВыборкаДетальныеЗаписи.Представление + ” не заданы контактные лица” );
     КонецЦикла;
    КонецПроцедуры // ВыполнитьНаСервере()
    </code>

    • Yuri Golovko 29.04.2011 в 19:38

      Прочитал домашнее задание №7 и понял, что неправильно реализовал
       связь контрагентов и их контактных лиц.
      Переделал.
       Справочник КонтактныеЛица сделал подчиненным справочнику Контрагенты.
       Добавил справочник ФизическиеЛица и добавил в КонтактныеЛица реквизит ФизическоеЛицо
        с типом СправочникСсылка.ФизическиеЛица.
       Реквизит Должность типа СправочникСсылка.Должности.
        Реквизиты Телефон строкового типа и ДеньРождения типа Дата.
       При записи контактного лица его наименование заимствуется у физического лица.
       Т. е. в модуле справочника КонтактныеЛица:
      <code>
      Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
       Наименование = ФизическоеЛицо.Наименование;
      КонецПроцедуры
      </code>
      Соответственно переделал текст запроса в процедуре ВыполнитьНаСервере()
      модуля формы обработки “Проверка контрагентов”:
      <code>
       Запрос.Текст =
        “ВЫБРАТЬ
        | Контрагенты.Ссылка,
        | Контрагенты.Представление
        |ИЗ
        | Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        | (НЕ Контрагенты.ЭтоГруппа)
        | И (НЕ Контрагенты.Ссылка В
        |    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |     КонтактныеЛица.Владелец
        |    ИЗ
        |     Справочник.КонтактныеЛица КАК КонтактныеЛица))”;
      </code>

      • Yuri Golovko 30.04.2011 в 11:06

        В справочнике Номенклатура при записи группы с видом номенклатуры Услуга система выдает ошибку.
        Возникает она при отработке кода
        </code>
        Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
         Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
          ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
         КонецЕсли;
        КонецПроцедуры
        </code>
        Происходит это потому, что реквизит БазоваяЕдиницаИзмерения определяется только для элементов.
        Поэтому он не входит в массив ПроверяемыеРеквизиты, являющийся параметром
        процедуры ОбработкаПроверкиЗаполнения().
        Теперь становится понятным решение преподавателя, где он сначала проверяет,
        входит ли вообще реквизит в состав массива, и только при его наличии удаляет его из массива:
        <code>
         Индекс = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
         Если Индекс <> Неопределено Тогда
          ПроверяемыеРеквизиты.Удалить(Индекс);
         КонецЕсли; 
        </code>

  17. Задание выполнил. Были сложности с решением последней задачи при помощи одного запроса, но все разрешилось.
    <code>
    &НаКлиенте
    Процедура Сформировать(Команда)
    Результат=СформироватьНаСервере();
    Для каждого Элем Из Результат Цикл
    Сообщить(“”+Элем);
    КонецЦикла;
    КонецПроцедуры

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

    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(“Клиент”);
    КонецФункции // ()

    </code>
    Остальные задачи особых проблем не вызвали.
     

  18. S. Bashutin 29.04.2011 в 09:34

    Задание выполнил. Есть ощущение, что можно было бы решить более рационально.И так…
    1) Создал два справочника “Контрагенты” и “Контрактные лица”. В справочнике Контрагентов сделал табличную часть с двумя реквизитами Контактные лица(ссылка на справочник) и Должность. Как потом я понял, что всё таки надо было сделать справочник Контактные лица подчиненным справочнику Контрагенты.
    2) Создал справочники “Номенклатура” и “Классификатор единиц измерения”. Вид номенклатуры сделал как перечисление. Проверку заполнения реквизитов наименования и вид номенклатуры сделал через стандартную проверку заполнения. А вот реквизит базовой единицы сделал через собственную проверку. Создал процедуру при изменении реквизита ВидНоменклатуры:
     <code>
    Если Элемент.ВыделенныйТекст=”Услуга” Тогда
    ПроверкаБазовойЕдиницы=Ложь;
    Иначе
    ПроверкаБазовойЕдиницы=Истина;
    КонецЕсли;
    </code>
    Затем в процедуру “ПередЗаписью”:
    <code> 
    Если ПроверкаЗаполнения(ПроверкаБазовойЕдиницы) Тогда
    НовоеСообщение=Новый СообщениеПользователю;
    НовоеСообщение.Текст=”Заполните базовую единицу!”;
    НовоеСообщение.Поле=”Объект.БазоваяЕдиницаИзмерения”;
    НовоеСообщение.Сообщить();
    Отказ=Истина;
    КонецЕсли;
    </code>
     Функция ПроверкаЗаполнения: 
    <code>
    Функция ПроверкаЗаполнения(Параметр)Параметр2=Объект.БазоваяЕдиницаИзмерения;
    Если Параметр=Истина И  Параметр2=Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка() Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции
    </code>
    Проверку у родительской группы реализовал в процедуре “ПриОткрытии”:
    <code>
    Если ПроанализироватьРодителя(объект.Родитель, Родитель)=Ложь Тогда
    Объект.ВидНоменклатуры=Родитель;
    КонецЕсли;
    </code>
    Функция ПроанализироватьРодителя:
    <code>
    Функция ПроанализироватьРодителя(Родитель, ВидНоменклатуры)
    Если Родитель=Справочники.Номенклатура.ПустаяСсылка() Тогда
    Возврат Истина;
    Иначе
    ВидНоменклатуры=Объект.Родитель.ВидНоменклатуры;
    Возврат Ложь;
    КонецЕсли;
    КонецФункции
    </code>
    3) Для хранения списка доступных для номенклатуры единиц измерения создал справочник “ЕдиницыИзеренияХраненияОстатков”. Создал справочник “ЕдиницыИзмерения”, подчиненный справочнику “Номенклатура”. В справочнике “ЕдиницыИзмерения” создал реквизиты ЕдиницаИзмерения(ссылка на справочник ЕдиницыИзеренияХраненияОстатков), Коэффициент и БазоваяЕдиница.
    4) Запись нового элемента в справочнике ЕдиницаИзмерения реализовал в процедуре “ПослеЗаписи”, сделала вызов серверной процедуры ЗаписьЕдиницыИзмерения():
    <code>
    Номенклатура=Объект.Ссылка;
    БазоваяЕдиницаИзмерения=Объект.БазоваяЕдиницаИзмерения;
    ЕдиницаИзмерения=Справочники.ЕдиницыИзмеренияХраненияОстатков.НайтиПоНаименованию(БазоваяЕдиницаИзмерения.Наименование, Истина);
    ПустаяЕдиница=Справочники.ЕдиницыИзмеренияХраненияОстатков.ПустаяСсылка();
    Запрос = Новый Запрос;
    Запрос.Текст =”ВЫБРАТЬ
    |           ЕдиницыИзмерения.ЕдиницаИзмерения КАК Единица,
    |          ЕдиницыИзмерения.БазоваяЕдиницаИзмерения КАК БазоваяЕдиница
    |ИЗ
    |           Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
    |ГДЕ
    |           ЕдиницыИзмерения.Владелец = &Владелец
    |           И ЕдиницыИзмерения.ЕдиницаИзмерения.Наименование = &ЕдиницыИзмерения”;
    Запрос.УстановитьПараметр(“Владелец”, Номенклатура);
    Запрос.УстановитьПараметр(“ЕдиницыИзмерения”, БазоваяЕдиницаИзмерения.Наименование);
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    Если  ЕдиницаИзмерения=ПустаяЕдиница Тогда
    НоваяЕдиница=Справочники.ЕдиницыИзмеренияХраненияОстатков.СоздатьЭлемент();
    НоваяЕдиница.Наименование=БазоваяЕдиницаИзмерения.Наименование;
    НоваяЕдиница.Записать();
    ЕдиницаИзмерения=НоваяЕдиница;
    КонецЕсли;
    НовыйЭлемент=Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    НовыйЭлемент.ЕдиницаИзмерения=ЕдиницаИзмерения;
    НовыйЭлемент.Владелец=Номенклатура;
    НовыйЭлемент.БазоваяЕдиницаИзмерения=БазоваяЕдиницаИзмерения;
    НовыйЭлемент.Коэффициент=1;
    НовыйЭлемент.Записать();
    КонецЕсли;
    </code>
    5) Обработку проверки контрагентов создал через запрос: 
    <code>
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ РАЗЛИЧНЫЕ
    |           Контрагенты.Ссылка КАК СсылкаК,
    |           ВЫБОР
    |                       КОГДА Контрагенты.Ссылка = КонтрагентыКонтактныеЛица.Ссылка
    |                                   ТОГДА “”Есть контакное лицо””
    |                       ИНАЧЕ “”Нет контактного лица””
    |           КОНЕЦ КАК ПризнакК
    |ИЗ
    |           Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
    |                       ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
                           ПО КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка
    |ГДЕ
    |           Контрагенты.ЭтоГруппа = ЛОЖЬ”;
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Если ВыборкаДетальныеЗаписи.ПризнакК=”Нет контактного лица” Тогда
    Сообщить(ВыборкаДетальныеЗаписи.СсылкаК);
    КонецЕсли;
    КонецЦикла;
    </code>
    Не разобрался как в запросе отобрать, только те ссылки на котрагентов, которым соответствует NULL. Но в принципе перебором решил проблему:)

  19. Выполнил:
    1. Созданы Справочники: Контрагенты,  КонтактныеЛица,  дополнительные справочники -Должности и КонтактныеЛицаКонтрагентов  подчиненный Контрагентам, с реквизитами – КонтактноеЛицо (СправочникСсылка.КонтактныеЛица и Должность(СправочникСсылка.Должности)).
    Команда ВыполнитьПроверку в Обработке ПроверкаКонтрагентов:
    http://i063.radikal.ru/1104/12/18f23ad817b0.gif
    2.  Справочники: КлассификаторЕдиницИзмерения -с предопределенными значениями (Пакет,Бутылка)  и Номенклатура – реквизиты ВидНоменклатуры (ПеречислениеСсылка.ВидыНоменклатуры) и БазоваяЕдиницаИзмерения СправочникСсылка.КлассификаторЕдиницИзмерения)
    дополнительный Справочник – ЕдиницыИзмерения подчиненный Справочнику Номенклатура с реквизитами БазоваяЕдиница (СправочникСсылка.КлассификаторЕдиницИзмерения), Коэффициент (Число 10,3)
    Модуль Объекта справочника Номенклатура:
    http://i039.radikal.ru/1104/fb/f52fa878a8d5.gif

  20. Виталий Межаков 29.04.2011 в 00:22

    Обратная связь.

    1. Что нового я узнал в первом блоке или в чем поменялись взгляды после изучения
    материала?

    Упорядочил свои знания по универсальным коллекциям, открыл  для себя контекстную модель работы форм управляемого приложения.
     
    2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?
    В темах, посвященных контексту выполнения кода и особенностям модулей в управляемых приложениях. Несколько непривычно. Пока в процессе преодоления при помощи практических изысканий =)
     
    3. Какую тему, имеющую отношение к текущему блоку, вы бы хотели подробнее
    раскрыть в мастер-группе?

    Все было рассмотрено достаточно подробно, пробелы устранялись через мастер-группу.

  21. Виталий Межаков 29.04.2011 в 00:07

    Задание выполнил.
    Некоторые, не очевидные на мой взгляд моменты:
    1) Для хранения контактных лиц использовал табличную часть справочника “Контрагенты”, использование подчинения не позволило бы использовать одних и тех же контактных лиц у разных контрагентов.
    2) Для реквизита “ВидНоменклатуры” установил контроль проверки заполнения в конфигураторе. Реквизит “БазоваяЕдиницаИзмерения” проверяю программно.
    3) Дополнительные единицы измерения храню в подчиненном справочнике, поскольку для одних и тех же единиц могут использоваться различные коэффициенты в разной номенклатуре.
    4) Запись первой единицы измерения решил делать на сервере после записи элемента номенклатуры.
    5) Модуль формы обработки “Проверка контрагентов”

    • Виталий Межаков 29.04.2011 в 00:11

      Подумал еще раз, и пришел к выводу, что контактные лица контрагентов – это таки подчиненный справочник, в свете того, что в дальнейшем он будет использоваться в каких-то документах.

  22. В справочнике Контрагенты создал таб.часть Контактные лица с реквизитами: Контактное лицо (тип – СправочникСсылка.Контактное лицо) и Должность (тип СправочникСсылка.Должность).
    В обработчике события ОбработкаПроверкиЗаполнения анализирую вид номенклатуры и если это услуга то из массива ПроверяемыеРеквизиты удаляю элемент БазоваяЕдиницаИзмерения.
    В обработчике события ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) анализирую параметр ДанныеЗаполнения и если это структура, то вытаскиваю из нее реквизит Родитель. ВидНоменклатуры.
    Создал справочник ЕдиницыИзмерения подчиненный справочнику Номенклатура.
    В обработчике события ПередЗаписью модуля объекта Номенклатура  с помощью запроса определяю наличие записи в справочникеЕдиницыИзмерения  с отбором по условию ЕдиницаПоКлассификатору(справочник ЕдиницыИзмерения) = БазоваяЕдиницаИзмерения(справочник Номенклатура) и если записи нет, то создаю запись в спр.ЕдиницыИзмерения с коэффициентом = 1.
    Создал обработку по поиску контрагентов и вывел на форме в таблицу.
    1.Первый блок, как и предыдущий, для меня был весьма интересен. Новое узнал про модули, особенно про модуль сеанса (ошибку в своем решении предыдущего задания исправил).
    2.Особых трудностей не было.
    3.Вроде материала для базового курса достаточно, его бы переварить.

  23. Задание выполнил…ради инереса пробывал сделать через РегистрСведений связь Контрагента,контактного лица,должности =( не получилось вывести на форму как это делал в 8.1 (таб часть с ссылкой на регистр), сделал через подчиненность, вот терь жду урока по регистрам =) .

    Что касается 1. блока ,
    1)все что связано с управляемыми формами для меня интересно и ново.
    2) раньше ни когда не связывался с подсистемами
    3)обработчики события

  24. Создал справочники, добавил код в модуль объекта справочника “Номенклатура”. В форму обработки “Проверка контрагентов” добавил динамический список и произвольным запросом ищу контрагентов без контактных лиц.
    http://imagepost.ru/images/d/z6/dz6_screen.png
    Очень понравился первый блок – узнал много полезного.

  25. Юрий Торговцев 28.04.2011 в 22:48

    </code>Задание выполнил.
    Создал справочник Должности подчиненный справочнику Контрагенты с реквизитом КонтактноеЛицо  Тип СправочникСсылка.КонтактныеЛица.
    Таким образом, без программирования, реализован:
    отбор Должностей по Контрагентам;
    хранение информации о связи Должности и КонтактногоЛица;
    возможность выбрать одно и то же КонтактноеЛицо в разных Должностях разных Контрагентов.
    Для хранения списка доступных для номенклатуры единиц измерения и коэффициентов перечета текщей единицы в базовую создан справочник ЕдиницыИзмеренияНоменклатуры,  подчиненный справочнику Номенклатура, с реквизитами Коэффициент тип Число 10.3 и КлассификаторЕдиницИзмерения тип СправочникСсылка.КлассификаторЕдиницИзмерения.
    Для анализа определен ли ВидНоменклатуры и в случае истины установки его для нового элемента в модуль объекта справочника Номенклатура добавлен следующий код
    <code>
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

    Если ДанныеЗаполнения <> Неопределено И Не ДанныеЗаполнения.Родитель.ВидНоменклатуры.Пустая() Тогда

    ЭтотОбъект.ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;

    КонецЕсли;

    КонецПроцедуры
    </code>
    Для того чтобы создавалась единица измерения с коэффициентом 1 соответствующая базовой единице в том же модуле написана следующая процедура
    <code>
    Процедура ПриЗаписи(Отказ)

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

    КонецПроцедуры
    </code>
     
    В обработке ПроверкаКонтрагентов задача решена с помощью следующего кода помещенного в модуль формы обработки.
    <code>
    &НаКлиенте
    Процедура ВыполнитьКоманду(Команда)

    ВыполнитьНаСервере();

    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ВыполнитьНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Контрагенты.Наименование
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    | (НЕ Контрагенты.Наименование В
    | (ВЫБРАТЬ
    | Должности.Владелец.Наименование
    | ИЗ
    | Справочник.Должности КАК Должности
    | ГДЕ
    | Должности.КонтактноеЛицо.Ссылка <> ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка)))
    | И Контрагенты.ЭтоГруппа = ЛОЖЬ”;

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи.Наименование);
    КонецЦикла;

    КонецПроцедуры
    </code>
    1.Особенности использования модулей. Подчиненность справочников. Обработчики событий. Использование GUID. Другие возможности отладки.
    2.Подчиненность справочников. Использование GUID. Неоднократный внимательный просмотр видеоматериалов.
    3.Подчинение справочников(может быть есть какие то общие правила построения той или иной схемы).
     

  26. Андрей Кусанов 28.04.2011 в 18:20

    По блоку:
    1)Стало гораздо интереснее… С 8.2 не было опыта. Приятно, что теперь не нужно ковыряться “методом тыка”)
    Стал серьезнее относиться к красоте кода, да и интерес к кодированию возродился, так как появляется концептуальное понимание платформы 8.2. Да, задумался над способом архивирования рабочих баз! Все-таки нужно средствами SQL-сервера.
    2) Подробнее хотел бы о хитрых примерах применения обработчиков событий, уж очень их много! Контекст тоже штука важная, чем подробнее, тем лучше.
    3) Затруднения в применении обработчиков событий и во взаимодействии различных контекстов. Но помог Евгений (пересмотр видео) и наш общий друг – Отладчик.
    Спасибо Вам за курсы. То ли еще будет!

  27. Андрей Кусанов 28.04.2011 в 17:49

    1) Создал спр. “КонтактныеЛица” с подчинением справочнику “Контрагенты”.
    Создал спр. “ФизЛица” c рекв. “ДатаРождения”. У “КонтактныеЛица” реквизит с типом “СправочникСсылка.ФизЛица”,
    а так же строковый реквизит “Должность”.
    В форме элемента контрагентов добавил рекв. формы “КонтактныеЛица” с типом
    “ДинамическийСписок” со свойством “ОсновнаяТаблица” – “Справочник.КонтактныеЛица”.
    На форме разместил “КонтактныеЛица” на второй странице.

    Модуль формы спр. “Контрагенты”:
    <code>&НаКлиенте
    Перем ОбъектЗаписан;

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

    &НаСервере
    Процедура УстановитьОтборыВФорме(Ссылка)
    ЭлементыОтбора = КонтактныеЛица.Отбор.Элементы;
    ЭлементыОтбора.Очистить();
    ЭлементОтбора = ЭлементыОтбора.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Владелец”);
    ЭлементОтбора.ПравоеЗначение = Ссылка;
    КонецПроцедуры

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

    &НаКлиенте
    Процедура ПослеЗаписи(ПараметрыЗаписи)
    ОбъектЗаписан = Истина;
    ВидимостьЭлементов();
    КонецПроцедуры

    &НаКлиенте
    Процедура ВидимостьЭлементов()
    Элементы.Контакты.Видимость = ОбъектЗаписан;
    КонецПроцедуры

    &НаСервере
    Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    УстановитьОтборыВФорме(ТекущийОбъект.Ссылка);
    КонецПроцедуры</code>

    2)Создал спр. “КлассификаторЕдИзм”, “ЕдиницыИзмерения” подч. спр-ку “Номенклатура”.
    У спр. “ЕдиницыИзмерения” доб. рекв. “Коэффициент” число и “ЕдИзм” с типом
    “СправочникСсылка.КлассификаторЕдИзм”.
    У номенклатуры рекв. “ВидНоменклатуры” (для групп и элементов) – “ПеречислениеСсылка.ВидыНоменклатуры”
    и “БазоваяЕдИзм” тип “СправочникСсылка.КлассификаторЕдИзм” с проверкой заполнения
    “Выдавать ошибку”.

    Модуль формы элемента спр. “Номенклатура”:
    <code>&НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Объект.Ссылка.Пустая() Тогда
    Родитель = Объект.Родитель;
    Если Не Родитель.Пустая() И НЕ Родитель.ВидНоменклатуры.Пустая() тогда
    Объект.ВидНоменклатуры = Родитель.ВидНоменклатуры;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры</code>

    Модуль объекта спр. номенклатура:

    <code>Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
    Индекс = ПроверяемыеРеквизиты.Найти(“БазоваяЕдИзм”);
    Если НЕ Индекс = Неопределено Тогда
    ПроверяемыеРеквизиты.Удалить(Индекс);
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры

    Процедура ПередЗаписью(Отказ)
    Отказ = НЕ ПроверитьЗаполнение();
    КонецПроцедуры

    Процедура ПриЗаписи(Отказ)

    Если ЗначениеЗаполнено(БазоваяЕдИзм) Тогда

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ЕдиницыИзмерения.Ссылка
    |ИЗ
    | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
    |ГДЕ
    | ЕдиницыИзмерения.Владелец = &Владелец
    | И ЕдиницыИзмерения.ЕдИзм = &ЕдИзм”;

    Запрос.УстановитьПараметр(“Владелец”, Ссылка);
    Запрос.УстановитьПараметр(“ЕдИзм”, БазоваяЕдИзм);

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

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

    КонецПроцедуры</code>

    3) У всех ролей убрал права на непосредственное удаление ссылочных объектов.
    Обработка “ПроверкаКонтрагентов” модуль формы:

    <code>&НаКлиенте
    Процедура ВыполнитьОбработку(Команда)
    ПроверитьНаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ПроверитьНаСервере()

    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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

    Если Результат.Пустой() Тогда
    Сообщ = Новый СообщениеПользователю;
    Сообщ.Текст = “Ошибок нет!”;
    Сообщ.Сообщить();
    Иначе
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщ = Новый СообщениеПользователю;
    Сообщ.Текст = “У “+ВыборкаДетальныеЗаписи.КонтрагентПредставление+” нет ни одного контактного лица!”;
    Сообщ.Сообщить();
    КонецЦикла;
    КонецЕсли;

    КонецПроцедуры</code>

  28. Майор 28.04.2011 в 16:37

    Создал справочники: Контрагенты, КонтактныеЛица, Номенклатура, КлассификаторЕдиницИзмерения.
    Создал перечисление “ВидНоменклатуры”.
    Создал обработку “ПроверкаКонтрагентов”

    Очень сильно заставило задуматься условие, что если в качестве вида номенклатуры указана услуга, то базовую единицу измерения можно не заполнять. По смыслу – это включение-отключение Проверки заполнения для реквизита “БазоваяЕдиницаИзмерения”. Синтакс-помощник сказал, что если свойство “ОтметкаНезаполненного” поставить в Истину – отметка будет отображаться, если в Ложь – не будет. Кроме того сказал, что в тонком клиенте данное свойство доступно… На стороне клиента я добраться до этого свойства не смог. Пришлось передавать всю форму на Сервер при изменении в форме элемента справочника поля “ВидНоменклатуры”. Там уже смотреть какой вид номенклатуры выбран и уже в зависимости от значения устанавливать проверку заполнения. Причём напрямую “ОтметкаНезаполненного” работать правильно отказалась. Методом научного тыка получился следующий код:

    &amp;НаСервере
    Процедура ВидНоменклатурыПриИзмененииНаСервере() Экспорт
       
        Услуга = Объект.ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга; 
        Элементы.БазоваяЕдиницаИзмерения.ОтметкаНезаполненного = Ложь;
        Если Услуга Тогда       
            Элементы.БазоваяЕдиницаИзмерения.АвтоОтметкаНезаполненного = Ложь;
        Иначе
            Элементы.БазоваяЕдиницаИзмерения.АвтоОтметкаНезаполненного = Истина;
        КонецЕсли;
       
       
    КонецПроцедуры

    При этом код отрабатывает правильно вне зависимости от значения свойства “Проверка заполнения” реквизита “БазоваяЕдиницаИзмерения” справочника “Номенклатура”.

    Работу обработки “ПроверкаКонтрагентов” сделал с помощью выборки из справочника “Контрагенты”

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


    &amp;НаСервере
    Процедура  ПроверкаКонтрагентовНаСервере()
       
        Выборка = Справочники.Контрагенты.Выбрать();
       
        Пока Выборка.Следующий() Цикл
            Если (НЕ Выборка.ЭтоГруппа) И
                Выборка.КонтактныеЛица.Количество()=0 Тогда
               
                Сообщить(Выборка.Наименование); 
               
            КонецЕсли;
        КонецЦикла;
       
    КонецПроцедуры

    Очень сильные подозрения, что возможно реализовать всё с помощью запроса, но вменяемого результата достичь в этом направлении не удалось.

    • Майор 01.05.2011 в 09:19

      Выполнил работу над ошибками, на самом деле всё оказалось действительно проще. Табличные части справочников в топку! (не вообще конечно, а для связи справочников). Больше всего “убило”, что нет возможности программно дописывать уже существующие ТЧ в справочниках.
       
      Теперь обратная связь:
      1) Оглядываясь на Первый блок… Вроде как-то и раньше всё это знал, но по типам данных, контексту выполнения кода и отладке конфигурации безусловно знания улучшил!
      2) Затруднения у меня вызывают, наверное, только запросы. Какой-то информации не хватает для структуризации. Знаю как делать, но не всегда вижу что именно нужно. Хотя, это в принципе ко всему курсу относится…. Знаю КАК, но не всегда понимаю ПОЧЕМУ. Если ставить конкретную задачу – сделать то-то и то-то, по всей видимости, практически всё смогу. Но вот почему решается данным путём…. Не всегда для меня очевидно ))).
      3) Исходя из предыдущего пункта – очевидно, что запросы. Ну и ещё формы скорее всего.

      • >Больше всего «убило», что нет возможности программно дописывать уже существующие ТЧ в справочниках.
        Речь идет о программном добавлении реквизитов в объекты метаданных?

        • Майор 01.05.2011 в 17:54

          Судя по синтакс-помощнику – да! Цитата:
          “ОбъектМетаданных: Справочник (MetadataObject: Catalog)
          ТабличныеЧасти (TabularSections)
          Использование:Только чтение.”

          Наверное больше всего запутало то, что при программном создании нового элемента справочника добавление строк в ТЧ работает, и ещё синтакс-помощник говорит:
          “Табличная часть (Tabular section)
          Добавить (Add)
          Синтаксис: Добавить()
          Возвращаемое значение: Тип: Строка табличной части.
          Описание:
          Добавляет строку в конец табличной части.
          Доступность:
          Сервер, толстый клиент, внешнее соединение.
          Примечание:
          Использование метода допустимо только в том случае, если табличная часть получена из свойства объекта. Если табличная часть получена из свойства ссылки (или выборки), то использование этого метода будет вызывать ошибку выполнения.”
          А самое главное – подсказка в конфигураторе для СправочникОбъект.ТабличнаяЧасть даёт метод Добавить().

          • Строки в табличную часть программно добавить, конечно, можно.
            А вот реквизиты никак нельзя. Только вручную в конфигураторе.

            • Майор 01.05.2011 в 21:39

              Комментарий можно не публиковать, вопрос отправил в Мастер-группу

  29. Создал спр. контрагенты с табл частью с реквизитом КонтактныеЛица типа Справочник.КонтактныеЛица.
    Справочник номеклатура с подчиненным справочником единицы измерения с реквизитом справочник ОКЕИ. Для видов номенклатуры использовал перечисление.
    Модуль формы элемента спр. Номенклатура
    http://s51.radikal.ru/i132/1104/19/cde11b50d339.png
    Модуль объекта спр. номенклатура
    http://s004.radikal.ru/i208/1104/46/5926190f346d.png
    Текст запроса:
    ВЫБРАТЬ
    Контрагенты.Ссылка
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    (НЕ Контрагенты.Ссылка В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    КонтрагентыКонтактныеЛица.Ссылка
    ИЗ
    Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица))
    И НЕ ЭтоГруппа
     
    Обратная связь:
    Больше всего провозился с запросом, хочется поглубже их изучить. С синтаксис помощником тоже не все в порядке, теряюсь где что искать порой.

  30. Мария 28.04.2011 в 14:03

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

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если НЕ ЭтотОбъект.ЭтоГруппа И ВидНоменклатуры=Перечисления.ВидНоменклатуры.Услуга Тогда
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
    КонецЕсли;
    КонецПроцедуры
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Если НЕ ЭтотОбъект.ЭтоГруппа И ВидНоменклатуры=Перечисления.ВидНоменклатуры.Услуга Тогда ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”)); КонецЕсли; КонецПроцедуры

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если  ДанныеЗаполнения <> Неопределено Тогда
    ВидНоменклатуры=ДанныеЗаполнения.Родитель.ВидНоменклатуры;
    КонецЕсли;
    КонецПроцедуры
    Чтобы при записи нового элемента справочника Номенклатура создавалась единица измерения в процедуре ПередЗаписью  создаем новый идентификатор и новой ссылке справочника ЕдиницыизмеренияНоменклатуры присваиваем этот идентификатор.
    Далее в процедуре ПриЗаписи  если Новая ссылка не равна Неопределено создаем новый элемент справочника ЕдиницыИзмеренияНоменклатуры.
    В обработке проверяющей контрагентов создала запрос в результате которого получается список контрагентов без контактных лиц

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Контрагенты.Ссылка КАК Контрагент,
    | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыКонтактныеЛица.КонтактноеЛицо) КАК КонтактноеЛицо
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
    | ПО Контрагенты.Ссылка = КонтрагентыКонтактныеЛица.Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    | Контрагенты.Ссылка
    |
    |ИМЕЮЩИЕ
    | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыКонтактныеЛица.КонтактноеЛицо) = 0”;

    Результат = Запрос.Выполнить().Выгрузить();
    ЗначениеВДанныеФормы(Результат,Реквизит1);
    Затруднения вызвала тема про индивидуальные идентификаторы, хотелось бы раскрыть ее подробнее.

  31. Задание выполнил.

    1. Создал справочники Контрагенты и КонтактныеЛица.
    2. Связь между справочниками сделал через справочник КонтактныеЛицаКонтрагентов,
    подчиненных справочнику Контрагенты, с реквизитом КонтактноеЛицо
    (тип Справочник.КонтактныеЛица) и должность (строка).
    3. В справочнике Номенклатура добавил реквизит ВидНоменлатуры с типом Перечисление.ВидыНоменлатуры
    и реквизит БазоваяЕдиницаИзмерения с типом Справочник.КлассификаторЕдиницИзмерения.
    У реквизита ВидНоменклатуры установил проверку заполнения. У подчиненного справочнику Номенклатура
    справочника ЕдиницыИзмерения сделал реквизиты Коэффициент (тип число) и
    Реквизит ЕдиницаПоКлассификатору (тип Справочник.КлассификаторЕдиницИзмерения)

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

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ВидНоменклатуры <> Перечисления.ВидНоменклатуры.Услуга Тогда
    ПроверяемыеРеквизиты.Добавить(“БазоваяЕдиницаИзмерения”);    
    КонецЕсли;
    КонецПроцедуры

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

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

    4.Проверку контрагентов выполнил запросом:
    <code>
    Запрос.Текст =
    “ВЫБРАТЬ
    |    Контрагенты.Ссылка КАК Контрагент
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
    |        ПО (КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка)
    |ГДЕ
    |    Контрагенты.ЭтоГруппа = ЛОЖЬ
    |    И КонтактныеЛицаКонтрагентов.Ссылка  Есть NULL”;

    </code>

  32. Реализовал хранение Контактных лиц в ТЧ справочника Контрагенты. Виды номенклатуры – перечисление. Создал справочник Единицы измерения номенклатуры, подчиненный справочнику Номенклатура. Не сразу удалось создавать при записи справочника единицу измерения без дублирования. Запрос сделал через “не в списке” контрагентов с контактными лицами.

    1. Еще больше стало понятно о разделении серверного и клиентского контекста. Узнал о новых (по сравнению с 8.1) стандартных обработчиках у объектов и у форм, напр. ОбработкаПроверкиЗаполнения.
    2. Пожалуй наибольшие сложности были в работе с уникальным идентификатором, раньше не приходилось пользоваться.
    3. Хотелось бы подробнее узнать про работу управляемых форм – работа с интерфейсной частью, то что отличается от 8.1.

    • >Хотелось бы подробнее узнать про работу управляемых форм – работа с интерфейсной частью, то что отличается от 8.1.
      Посмотрите бонус “Управляемые и обычные формы” (есть на диске).

  33. Задание выполнил

  34. Три ответа по 1 блоку:

    Логика разработки в терминах клиент/сервер;
    Особых затруднений, пожалуй, не было;
    Упр.Формы и Запросы;

  35. Сделано.
    Создание справочников без проблем. КонтактныеЛица(Должность,СсылкаНаКонтЛица) и ЕдиницыИзмерения(СсылкаНаЕд.Изм,Коэфф) сделаны как Табл.Части в соответствующих справочниках. Виды номенклатуры сделаны как перечисление. Проверки при создании номенклатуры сделаны в модулеОбъекта в процедурах ОбработкаПроверкиЗаполнения,ОбработкаЗаполнения и ПередЗаписью. С обработкой ПроверкаКонтрагентов пришлось повозиться, из за того что пытался использовать КОЛИЧЕСТВО, которое нулей не возвращает. Помучился, пока не подглядел в решениях. Условие с частицей НЕ.
     

  36. Андрей Красник 25.04.2011 в 23:31

    С созданием элементов метаданных проблем не возникло.
    Соответствие между контрагентами и контактными лицами решил хранить в регистре сведений – измерения: Контрагент, Контактное лицо, ресурс – должность.
    Для отмены проверки заполнения базовой единицы номенклатуры в модуле объекта реализовал удаление ее из проверяемых реквизитов в процедуре ОбработкаПроверкиЗаполнения.
    Для поиска вида номенклатуры в иерархии создал следующую функцию
    <code>
    Функция ПолучитьВидНомерклатурыРодителя(СсылкаНаЭлемент) Экспорт
    Если Не СсылкаНаЭлемент.Пустая() Тогда
    Запрос = Новый Запрос;
    УровеньРодителя = СсылкаНаЭлемент.Уровень();
    ТекстЗапроса = “ВЫБРАТЬ
    | Номенклатура.ВидНоменклатуры,
    | 0 КАК Приоритет
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Ссылка = &Ссылка”;
    СтрокаЗапроса = “”;
    Для Сч = 1 По УровеньРодителя Цикл
    СтрокаЗапроса = СтрокаЗапроса + “.Родитель”;
    ТекстЗапроса = ТекстЗапроса + ”
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | Номенклатура” + СтрокаЗапроса + “.ВидНоменклатуры,
    | “+ Сч +”
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Ссылка = &Ссылка”;
    КонецЦикла;
    ТекстЗапроса = ТекстЗапроса + ”
    | УПОРЯДОЧИТЬ ПО
    | Приоритет”;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр(“Ссылка”,СсылкаНаЭлемент);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    Если ЗначениеЗаполнено(Выборка.ВидНоменклатуры) Тогда
    Возврат Выборка.ВидНоменклатуры;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецФункции // УстановитьВидНомерклатуры()
    </code>
    Размещается она в модуле менеджера справочника Номенклатура. Реализовал установку вида номенклатуры при интерактивном создании новых элемента и группы на сервере, а так же при интерактивном изменении родителя в форме. К сожалению, не удалось отловить изменение группы в форме списка.
    Единицы измерения номенклатуры сделал классическим способом – через подчиненный справочник справочника Номенклатура. Перед записью единицы сделал проверку на совпадение с другими единицами владельца.
    При записи элемента справочника Номенклатура реализовал создание основной единицы (сделал в модуле объекта).
    Данные по контрагентам без контактных лиц получил запросом, сначала получил таблицу контрагентов из регистра, а потом дополнение к ней.

     

  37. kuznetsovimail 25.04.2011 в 21:19

    Первый пункт решил созданием Табличной части с двумя реквизитами КонтактноеЛицо типа СправочникСсылка.КонтактныеЛица и должность.
    Второй пункт у ВидовНоменклатуры три предопределенных, в справочнике Номенклатура у
    реквизита ВидНоменклатуры использование установить для группы и элемента
    Модуль объекта
    <code>

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ЭтотОбъект.ЭтоГруппа Тогда
    ПроверяемыеРеквизиты.Удалить(0);
    ПроверяемыеРеквизиты.Удалить(0);
    Возврат ;
    КонецЕсли;
    Если ЭтотОбъект.Ссылка.Пустая() И
    Не ЭтотОбъект.Родитель.ВидНоменклатуры.Пустая() Тогда
    ЭтотОбъект.ВидНоменклатуры=ЭтотОбъект.Родитель.ВидНоменклатуры;
    КонецЕсли;
    Если Строка(ЭтотОбъект.ВидНоменклатуры)=”Услуга” тогда
    ПроверяемыеРеквизиты.Удалить(1);
    КонецЕсли;
    КонецПроцедуры
    Процедура ПриЗаписи(Отказ,Спр)
    Спр=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию
    (ЭтотОбъект.БазоваяЕдиницаИзмерения.Наименование,,ЭтотОбъект.Ссылка);
    Если Спр.Пустая()   Тогда
    Спр1=Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    Спр1.Наименование=ЭтотОбъект.БазоваяЕдиницаИзмерения.Наименование;
    Спр1.Базовая=Истина;
    Спр1.Владелец=ЭтотОбъект.Ссылка;
    Спр1.Коэффициент=1;
    Спр1.записать();
    КонецЕсли;
    КонецПроцедуры
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Если ЭтотОбъект.ЭтоГруппа Тогда ПроверяемыеРеквизиты.Удалить(0); ПроверяемыеРеквизиты.Удалить(0); Возврат ; КонецЕсли; Если ЭтотОбъект.Ссылка.Пустая() И Не ЭтотОбъект.Родитель.ВидНоменклатуры.Пустая() Тогда ЭтотОбъект.ВидНоменклатуры=ЭтотОбъект.Родитель.ВидНоменклатуры; КонецЕсли; Если Строка(ЭтотОбъект.ВидНоменклатуры)=”Услуга” тогда ПроверяемыеРеквизиты.Удалить(1); КонецЕсли;КонецПроцедуры
    Процедура ПриЗаписи(Отказ,Спр) Спр=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию (ЭтотОбъект.БазоваяЕдиницаИзмерения.Наименование,,ЭтотОбъект.Ссылка);
    Если Спр.Пустая()   Тогда Спр1=Справочники.ЕдиницыИзмерения.СоздатьЭлемент(); Спр1.Наименование=ЭтотОбъект.БазоваяЕдиницаИзмерения.Наименование; Спр1.Базовая=Истина; Спр1.Владелец=ЭтотОбъект.Ссылка; Спр1.Коэффициент=1; Спр1.записать(); КонецЕсли;КонецПроцедуры
    </code>
    Создаем Справочник ЕдиницыИзмерения с владельцем Номенклатура и реквизитами Коэффициент тип число и Базовая с типом Булево
    Код для записи нового элемента с коэф 1 приведен выше ПриЗаписи()
    Проверка контрагентов в двух вариантах
    <code>

    &НаКлиенте
    Процедура Выполнить1(Команда)
    Сообщить(“Вариант перебором”);
    ВыполнитьНаСервере();
    Сообщить(“Вариант с помощью запроса”);
    Запрос();
    КонецПроцедуры
    &НаСервереБезКонтекста
    Процедура ВыполнитьНаСервере()
    Выборка=Справочники.Контрагенты.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.ТабличнаяЧасть1.Количество()=0 И Выборка.ЭтоГруппа=Ложь тогда
    Сообщить(Выборка);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры // ВыполнитьНаСервере()
     
    &НаСервереБезКонтекста
    Процедура Запрос()
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ Контрагенты.Наименование
    | ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    | ГДЕ
    | Контрагенты.ЭтоГруппа = ЛОЖЬ
    | И
    | НЕ Контрагенты.ТабличнаяЧасть1.Ссылка =Контрагенты.Ссылка”;
     
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи.Наименование);
    КонецЦикла;
    КонецПроцедуры
    </code>
    Обратная связь.  Пока все нравится, обучение нахожу весьма интересным. Больше внимания хотелось бы уделить работе с запросами.
     

    • С запросами мы будем работать и далее, внимания им будет достаточно.

  38. kuznetsovimail 25.04.2011 в 12:14

    А можно ли отправить ссылку на конфигурацию с решением ДЗ ? Весит копейки.

    • Со своим решением? В этом нет необходимости.
      Если есть конкретный вопрос – задавайте..

      • kuznetsovimail 25.04.2011 в 12:27

        Со своим. Просто мне казалось что ответы на первые пункты проще смотреть в  самой конфигурации. Вечером доберусь до дома напишу отчет.

  39. Спасибо!

  40. Контактные лица (КЛ). Сделала через табличную часть КЛ в справочнике Контрагентов, с реквизитами ТЧ :  1. Контактное лицо – справочник Контактные лица,  2. должность – строка, 3.  реквизит ОсновноеКЛ – булево. Если конт. лицо одно, то автоматом перед записью ставится реквизит Основное в Истина. Если КЛ больше 1-го, то  пользователю предлагается указать основное конт. лицо, это обязательный реквизит для заполнения. Хотела в ПриВыводеСтроки сделать выделение основного конт. лица жирным шрифтом,  поняла, что нет такого метода в упр. формах ))
    Создан Справочник ЕИНоменклатуры, подчиненный справочнику Номенклатура . Реквизиты Еи и Коэффициент (пересчета).
    Проверка заполнения номенклатуры
    <code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    текРодитель = “”;
    Если ТипЗнч(ДанныеЗаполнения)= Тип(“Структура”) И ДанныеЗаполнения.Свойство(“Родитель”,текРодитель) Тогда
    ТекВидНом = текРодитель.ВидНоменклатуры;
    ЭтотОбъект.ВидНоменклатуры = ?(ЗначениеЗаполнено(ТекВидНом),ТекВидНом,ЭтотОбъект.ВидНоменклатуры);
    КонецЕсли
    КонецПроцедуры
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
    Индекс = ПроверяемыеРеквизиты.Найти(“БазоваяЕИ”);
    Если ЗначениеЗаполнено(Индекс)Тогда
    ПроверяемыеРеквизиты.Удалить(Индекс);
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры </code>
    Проверка контрагентов – сначала сделала цикл по контрагентам и их табличным частям.
    Потом поняла, что уже пришло время запросов.
    <code>ВЫБРАТЬ            Контрагенты.Наименование
    ИЗ          Справочник.Контрагенты КАК Контрагенты
    ГДЕ        Контрагенты.ЭтоГруппа = ЛОЖЬ
    И (НЕ Контрагенты.Ссылка В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ  Контрагенты.Ссылка
    ИЗ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты        ПО КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка)) </code>
    Обратная связь Легче стало писать в контексте клиент сервер
    Затруднения возникли при попытке использования ОбработкаВыбора – невозможно получить реквизит через точку, как раньше. Поняла, что опять связано с оптимизацией для тонкого клиента.
    В обычных формах я использовала форматирование внешнего вида в ПриВыводестроки, интересно, как сейчас это реализовать программно.

    • >В обычных формах я использовала форматирование внешнего вида в ПриВыводестроки, интересно, как сейчас это реализовать программно.
      Сейчас можно настраивать условное оформление для динамического списка.
      То есть возможна настройка вообще без конфигурирования.
      См. картинку
      1

      Для форм с табличными частями тоже возможна такая настройка. Для этого нужно обратиться в свойства самой формы.