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