Базовый курс. Домашнее задание №6

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

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

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

комментария 124 на “Базовый курс. Домашнее задание №6”

  1. iporozhnyakov 19.01.2011 в 16:48

    Задание выполнил. Создал обработку в которой при нажати на кнопку выполнить отрабатывает запрос (проверяет контрагентов с незаполненным контактным лицом):

    ВЫБРАТЬ
                            | Контрагенты.Наименование,
                            | Контрагенты.ЭтоГруппа,
                            | Контрагенты.КонтактноеЛицо
                            |ИЗ
                            | Справочник.Контрагенты КАК Контрагенты
                            |ГДЕ
                            | Контрагенты.ЭтоГруппа = ЛОЖЬ
                            | И Контрагенты.КонтактноеЛицо = &КонтактноеЛицо”

  2. Задание сделал, судя по отчитывающимся я не единственный опоздун и нас даже не двое :)
    Справочники сделал норм, только протупил и сделал табличной частью контакные лица, в целом не преступление, не видя реальной картины как на самом деле будет использоваться данное решение. Нужны, не нужны будут ссылки, как удобнее будет работать с КЛ и тд. С процедурой ОбработкаЗаполнения в справочнике номенклатура из группы голову ломал где то с час, чуяло сердце что где то здесь решение, скачав решение понял как надо было. С обработкой запрос так и не осилил, левые правые соеденения(что это вообще значит?), может я тормоз, но запросы почему то сложновато, мб где то упустил, пытаюсь проходить материал макс быстро, что бы все успеть просмотреть.
    По обратной связи, очень таки хочется про запросы, чем больше тем лучше! В 1С почти все можно отладчиком посмотреть, типовые поковырять, с запросами все сложнее.

    • В первом блоке есть большая глава по запросам. Где в частности рассматриваются соединения.
      Также в каждом из последующих блоков мы работаем с запросами.

  3. Андрей 08.01.2011 в 18:04

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

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

    </code>

  4. Задание выполнил.
    Наибольшие трудности возникли при проверке контактных лиц контрагентов.Сделал тоже с использованием запроса, но практика по запросам 8-ки пока нулевая, поэтому не смог сделать в запросе условие отбора только контрагентов без контактных лиц, в результате чего выборка при большом списке контрагентов получилась бы большая.

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

  5. stevelagory 30.12.2010 в 12:32

    Доброго всем времени суток!

    Решил задание, потом сверился с преподавательским ответом. Вот мой отчет о выполнении:

    – Контактные лица поместил в табличную часть справочника Контрагенты,а не в отдельный справочник, как это сделал Фарит.
    – Создал отдельный справочник Должности
    – Я считал, что для Группы справоника Номенклатура можно не заполнять реквизит ВидНоменклатуры, для элемента справочника необходимо заполнять в любом случае, а для вида номенклатуры Услуга можно не указывать реквизит БазоваяЕдиницаИзмерения. В остальных случаях бузовую единицу изменрения для элемента необходимо указать в любом случае.
    Поэтому я не стал указвать в свойствах реквизита справочника необходимость обязательной проверки заполнения, а в модуле объекта реализовал следующий обработчик ОбработкаПроверкиЗаполнения:

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

    То есть я не УБИРАЛ реквизиты, а ДОБАВЛЯЛ их в массив ПроверяемыеРеквизиты.

    Трудности вызвала реализация нализа вида номенклатуры у родительской группы – пытался сделать это с помощью объекта элемента справоника, а не структуры данных формы, как у Преподавателя.
    В результате перемудрил и слелал лишний контекстный серверный вызов. Ниже привожу мой код:

    <CODE>
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ОбработкаНаСервере( Объект ) ;
    КонецПроцедуры

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

    Кстати, столкнулся с ситуацией что если писать “ОбработкаНаСервере( Знач Объект )” – то взов аботает, а если “ОбработкаНаСервере( Объект )” – не работает. Для себя этого объснить внятно не смог.

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

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

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

    Условие отбора контрагентов я написал через проверку на NULL.

    • >Кстати, столкнулся с ситуацией что если писать «ОбработкаНаСервере( Знач Объект )» – то взов аботает, а если «ОбработкаНаСервере( Объект )» – не работает. Для себя этого объснить внятно не смог.
      Этот эффект рассматривается в продвинутом.
      Коротко – нельзя передавать данные формы, передача по значению будет создавать аналогичную структуру в памяти еще раз (а она может быть немаленькой).
      Поэтому лучше передавать не объект, а именно требуемые значения.

  6. Выполнил. Запрос по проверке контрагентов формировал в общем модуле, после просмотра решения вспомнил про выполнение на сервере без контекста.  Неочевидным было и использование  обработки проверки заполнения для записи номенклатуры.

  7. Задание выполнила. Особые трудности возникли в запросах. Обычные семерочные запросики по проще:)
    И еще, в решении у Вас вместо “Контактных лиц контрагентов” стоит контрактные:)
     

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

  9. Задание выполнил. В целом оно несложное, но обработка проверки далась сложнее. Основная сложность пока все те же “клиент “и” сервер”. Но есть вопрос по записи нового элемента номенклатуры с таким же видом номенклатуры как и у группы. В решении это делается через процедуру  “ОбработкаЗаполнения”. Однако изначально попытался через модуль формы и процедуру “ПриОткрытии” и условие:
    Если ЭтоНовый() Тогда
    ВидНоменклатуры = Родитель.ВидНоменклатуры
    КонецЕсли;
    Но, этот код не сработал, пришлось делать правильно:) Но, по моему, в 8.1 так можно было делать?
    По вопросам:
    В основном новое это управляемые формы , виды модулей и “клиент”,”сервер”. основные затруднения этот опять же “клиент и сервер”, но видимо здесь нужно больше практики. Насчет мастер-группы не скажу,т.к. пока не хватает времени их смотреть, пока просто скачиваю их на будущее.
     
     

    • >Но, по моему, в 8.1 так можно было делать?
      И в 8.2 это тоже сработало бы. Но для обычной формы.
      Дело здесь в том, что СправочникОбъект (а это реквизит формы с одноименным типом данных) доступен напрямую в обычной форме.
      В управляемой же форме объект справочника используется в один момент при открытии, а потом уничтожается.
      Поэтому в управляемой форме проверка на новый элемент должна выглядеть так:
      НЕ ЗначениеЗаполнено(Параметры.Ключ)
      или так:
      НЕ ЗначениеЗаполнено(Объект.Ссылка).
      Предпочтительнее первый вариант.

  10. Задание выполнено, но “со скрипом” :) Трудности возникли, когда пыталась проверить есть ли уже базовая единица в подчиненном справочнике. Искала что то в роде “ИспользоватьВладельца”, что бы хотя б перебором воспользоваться. Метод “ЭтоНовый()” пришлось подсматривать. Запросы пока понятны.
    Обратная связь:
    1. Новое для меня: контекст исполнения модуля, СправочникМенеджер/Ссылка/Выборка/Объект – пытаюсь зазубрить кто из них кто и в каком случае получается
    2. Затруднения возникают, когда пытаешься что то сделать в программе, а каким методом воспользоваться – не знаешь. Хелпник тоже пока не всегда помогает, ищешь по аналогии с 7.7, а оказывается совсем не там и не то искала… :) Конечно же, спасают эталонные решения.
    3. Дополнительно пока пожеланий нет, потому что по возникающим вопросам или непониманиям есть ответы в этал. решениях, лекциях, мастер-группе и конечно же в комментах. Больше осилить не успеваю.
    Спасибо.

  11. comradeegor 06.12.2010 в 21:13

    Задание выполнил. Для справочника Контрагенты создал ТЧ “Контакты”, для справочника Номенклатура – ТЧ “ДоступныеЕдИзм”.
    При выполнении задания переопределял обработчики ОбработкаЗаполнения, ОбработкаПроверкиЗаполнения, ПередЗапись
    МО “Номенклатура”. Затруднений особых не возникло.
     
    Обратная связь:
    1. Очень много нового узнал про серверный и клиентские контексты, серверные вызовы и т.п. Также немного ознакомился с управляемымти формами, правда в голове пока ещё они не уложились. Практики надо побольше.
    2. Затруднений нет, но при конфигурировании форм чувствуется неуверенность. Хотелось бы побольше материалов по ним.

    • >при конфигурировании форм чувствуется неуверенность. Хотелось бы побольше материалов по ним.
      А бонусный материал по формам смотрели?

  12. Задание выполнил. Контактные лица решил табличной частью.  Единицы измерения подчиненным справочником, как в типовых конфигурациях.
    Вопрос по вашему решению: Обязательна ли проверка на на тип данных параметра ДанныеЗаполнения. В каких случаях туда приходит не структура?
    Обратная связь: Наибольшие затруднения были в пятом задании. В принципе внимательный пересмотр относящихся к теме материалов помогает справиться. Но синхронизацию пользователей я так и не одолел самостоятельно.
    Из всего объема выдаваемого материала я успеваю просматривать только основные блоки и решать ДЗ.  И то опаздываю… Так что неделя амнистии очень кстати.

    • >Обязательна ли проверка на на тип данных параметра ДанныеЗаполнения. В каких случаях туда приходит не структура?
      Да, обязательна.
      При вводе нового элемента в параметре будет значение Неопределено.
      При вводе на основании другого объекта – будет значение ссылки.

  13. Сделано. оказалось проще, чем ДЗ №5 . Поняла, что  игнорирую клиент/серверные вызовы, пока не упрусь в ошибку.

  14. Выполнено

  15. Андрей Медведев 30.11.2010 в 16:23

    Задание выполнил.
    Обработку добавил. Получение строки соединения методом СтрокаСоединенияИнформационнойБазы() проверил на файловой и клиент-серверной базах. Операции проверки синтаксиса, выгрузки в резервную копию и тестирования БД выполнял при помощи запуска 1С с необходимыми параметрами запуска – через метод ЗапуститьПриложение().
    Проверку подключенных пользователей выполнял через попытку установки монопольного режима.

  16. ДЗ № 6. Задание выполнил. Трудностей не возникло. Контактные лица хранятся в табличной части спр.Контрагенты.    Дополнительные единицы измерения хранятся в подчиненном Номенклатуре справочнике “ЕдиницыИзмерения”. Реквизитом этого справочника является “Коэффициент”.
    Обратная Связь: 1. Всё, что касается отличия 8.2 от 8.1. И прежний материал более “плотно” лёг в голове.
    2. Наибольшее затруднение – разделение контекста на клиентский и серверный… Суть постепенно проясняется, но не хватает какого-то логического обоснования. Почему сделано так, а не иначе?
     

    • Конечно возможен и такой сценарий: разработчик пишет код, не думая о контексте, как в 8.1. А платформа сама вызывает сервер при необходимости.

      Но в этом случае были бы постоянные и не нужные вызовы сервера. А сейчас разработчик может их группировать и за один вызов решать несколько задач.

      Представьте, что на тонком канале связи один вызов занимает 1.5 сек. В этом случае есть разница между сотней вызов и двумя-тремя..

      • Почему возникла необходимость  разработчику самому управлять тем, где именно будет выполняться то или иное действие “его” системы – это как раз понятно и не вызывает вопросов. Но в платформе очень большое количество объектов, еще больше их свойств и методов. Запомнить, где именно доступно то или иное свойство или метод – сложно… Поэтому нужно знать (а лучше –  понимать) чем руководствовались разработчики платформы, определяя доступность того или иного объекта (метода, типа данных) только на клиенте или только на сервере. И даже самые базовые их идеи тоже понятны. (Сервер большой и быстрый, клиент маленький и слабенький, каналы тоненькие…) Но все равно, назначение области доступности, скажем, для констант только на сервере и толстом клиенте – непонятно! Ведь объем данных для передачи – очень мал… И так по многим объектам конфигурации.

        • Заучивать ничего не требуется. Синтакс-помощник подскажет правильный ответ (с вероятностью 99% :)).
          Здесь следует помнить одно правильно – любая работа с БД выполняется только на сервере.
          Что касается констант. Не факт, что объем маленький. Например, в константе может лежать видео размером, например, 700 Мб.

      • Или вот такая непонятка! В 8.1 у формы есть вполне понятные события. (ПередОткрытием, ПриОткрыии, ПередЗакрытием, ПриЗакрытии, ну и др.). Здесь (в 8.2) появляются события серверные, например ПриСозданииНаСервере(). Откуда это событие, если форма работает на клиенте? А сервер вызывается только явно, при явно заданном обращении… Предполагаю (т.к. форме надо общаться с данными, в том числе и из БД), что форма “существует” не только на клиенте. Что форма изначально состоит из двух частей – клиентской и серверной (которые, скорее всего, между собой общаются). Тогда понятно наличие серверных событий у “чисто клиентской” формы. Но тогда почему об этом нигде ничего не написано??? (или я плохо искал?)

        • Да, форма существует и на сервере и на клиенте.
          Изначально она создается на сервере, передается на клиента, потом уничтожается на сервере.
          Механику работы управляемых форм на низком уровне мы разбираем в продвинутом курсе.
          Где об этом написано? Наверное в документации что-то есть..

          • ОК, буду ждать продвинутого курса, благо я его уже приобрел.  Спасибо за информацию…

  17. Sergey.Volkov 28.11.2010 в 16:15

    Скажите пожалуйста, в каком поле хранится текстовое наименование элемента перечисления. Ранее в одном из проектов возникала задача выборки SQL-запросом текстовых значений, но именно для перечисления этого сделать не удалось. Даже в результате преобразования к тестовому представлению запрос возвращал ссылку в виде идентификатора. Пришлось заполнять эти данные вручную.

    • Правильно я понимаю, что хотелось бы обратиться прямым SQL запросом к представлению перечисления?

      • Sergey.Volkov 28.11.2010 в 23:29

        Да, Вы правильно поняли.

        • Печально, но этого сделать запросом будет нельзя (без создания собственных таблиц).
          В таблицах EnumXX хранятся только GUID и порядковый номер перечисления.
          Наименование же хранится в БД, но внутри cf файла. Который специальным образом упакован и сохраняется в одной из таблиц.

  18. Вячеслав Вязигин 28.11.2010 в 13:18

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

    • По успеваемости проведем опрос в ближайшее время..

  19. Sergey.Volkov 28.11.2010 в 12:02

    Возник еще вопрос.
    Встроенный язык запросов 1С полностью аналогичен SQL или есть какие-то различия, ограничения ?

    • Есть небольшие различия.
      Например, нельзя в полях выборки использовать вложенные запросы.
      Также есть удобный механизм итогов.

  20. Sergey.Volkov 28.11.2010 в 01:49

    1. Создал справочники Контрагенты и ФизЛица с требуемыми реквизитами. для связи справочников создал еще один справочник
    Контрагенты_ФизЛица. Создал справочники “Номенклатура” и для двух его реквизитов – справочник
    “КлассификаторЕдиницИзмерения” и перечисление “ВидНоменклатуры”.
    2. В модуле справочника “Номенклатура” переопределил  стандартный метод ОбработкаПроверкиЗаполнения() через изменение
    массива ПроверяемыеРеквизиты, чтобы позволить не заполнять реквизит ЕдиницаИзмерения.
    3. В модуле справочника “Номенклатура” переопределил  стандартный метод ОбработкаЗаполнения() путем заполнения реквизита
    ВидНомерклатуры элемента из родительского значения, полученного через аргумент ДанныеЗаполнения.Свойство().
    4. Реализация перевода в базовые единицы аналогична первому пункту – через дополнительный справочник, у которого одним из
    реквизитов является коэффициент отношения к базовой единице. Единицу измерения при добавлении номенклатуры заполняю в
    стандартном событии ПриЗаписи().
    Сложности были следующие.
    Привык мыслить терминами реляционных таблиц, поэтому не всегда сразу понимаю, какой должна быть структура данных в
    конфигурации. Например, в дз-6 отношение таблиц ФизЛица – Контрагенты это “один ко многим”, т.е одно Физлицо может
    относиться к нескольким Контрагентам. В реляционной БД для реализации такой связи не потребовалось бы создания
    дополнительных таблиц, а лишь создание внешнего ключа в таблице Контрагенты. Если я правильно понял, в 1С на табличной
    части такая связь не реализуется, т.к у ТЧ нет своего ключа. Поэтому для связи “один ко многим” создается еще одна таблица
    (дополнительный справочник).
    Как же тогда реализоваать связь “многие ко многим” ?

    • Добрый день, Сергей!

      По вашему вопросу.
      Связь “один ко многим” в 1с:8, как и в реляционной БД реализуется без дополнительных таблиц.
      Есть 3 варианта:
      1. Внешний ключ в таблице
      2. Связь по владельцу.
      3. Табличная часть.

      Любой из вариантов приводит к созданию внешнего ключа во второй таблице. Например:
      1. В справочке “Контактные лица” определяется реквизит “Контрагент”
      2. В справочке “Контактные лица” появляется реквизит “Владелец” за счет настройки подчинения.
      3. Для каждой строки табличной части существует реквизит “Ссылка”, который указывает на контрагента.

      А для связи “многие ко многим” требуется дополнительная таблица, что и требовалось реализовать.

      Рекомендую посмотреть решение ДЗ.

      • Sergey.Volkov 28.11.2010 в 11:54

        Посмотрел решение. Действительно там есть слова “чтобы у одного контрагента могло быть любое количество контактных лиц”.
        Но в тексте задания таких слов нет, там описана связь ОДИН-ко-МНОГИМ : “чтобы одно и то же контактное лицо могло быть определено для разных контрагентов”.
        Я просто не понял, что нужно создать связь многие-ко-многим.

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

  22. Антон К. 26.11.2010 в 23:31

    Добрый вечер, домашнее задание выполнил.

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

    ==============
    Обратная связь:
    Новое (оно же вызвало основные затруднения) – клиент-серверное взаимодействие (всегда приходится следить за тем, что можно делать на тонком клиенте, а что нельзя. Собственно говоря материал курс и помог разобраться.
    по поводу того, что хотелось бы рассмотреть подробнее: работа с временными таблицами.

    • Работа с временными таблицами и оптимизация запросов – в продвинутом курсе.

  23. Сергей Войстрик 26.11.2010 в 13:14

    Готово. Для номенклатуры. Проверку заполнения реквизитов выполнил в ОбработкаПроверкиЗаполнения МО, для услуги из массива удалял элемент “БазоваяЕдиницаИзмерения”; заполнение родители – в ОбработкаЗаполнения.
    Есдиницы храню в ТС справочника, реквизиты – единица и коэффициент.
    Контрагенты и физ.лица – все просто.
    Проверка заполнения контактного лица – запрос, условия (Не Контрагент.ЭтоГруппа) и (Контрагенты.КонтактноеЛицо = &ПустоеКонтактноеЛицо) . Параметр – ПустаяСсылка справочника конт. лиц.
    Обратная связь – чуть позже, надо подумать

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

    • Ответ на ваш вопрос: можно.
      Существует несколько способов.
      1. Параметр в запросе и его установка в событии ПриАктивацииСтроки (см. бонусные материалы по формам).
      2. Настройка отборов в списке единиц и его установка в событии ПриАктивацииСтроки (см. бонусные материалы по формам).
      3. Есть еще один вариант – стандартная команда, размещенная в панели навигации формы. Но об этом в продвинутом курсе…