Базовый курс. Занятие №6
Третье занятие по 1-му блоку базового курса.
Необходимо изучить следующие главы.
Глава 9. Формы.
Глава 10. Перечисления.
Глава 11. Администрирование.
Глава 12. Роли.
Глава 13. Пользователи.
Глава 14. Параметры ИБ.
Глава 15. Резервные копии.
Глава 16. Отладка.
Глава 17. Работа с запросами к БД.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Выполняю домашнее задание. Возникло затруднение с этим пунктом
“Оба реквизита являются обязательными для заполнения. Но если в качестве вида номенклатуры указана услуга, то базовую единицу измерения можно не заполнять.”
Для этого в форме элемента Справочника Номенлатура, для реквизита Вид номенклатуры использую событие “ПриИзменении”, но при интерактивном изменении Вида номенклатуры обработка события не срабатывает. Ставлю точку остонова, но исполняемый код туда не попадает.
<code>
&НаКлиенте
Процедура ВидНоменклатурыПриИзменении(Элемент)
Обработать()
КонецПроцедуры
</code>
убирал директиву &НаКлиенте – все равно не помогло.
Директива должна быть именно НаКлиенте.
Проверьте, что у элемента формы действительно назначена в качестве обработчика события ПриИзменении данная процедура.
Если да, то поставьте точку останова на конец этой процедуры – КонецПроцедуры.
После изменения этого поля отладчик должен остановиться. Получилось?
Да получилось. Спасибо
Задание выполнено.
1. Для организации связи “многие ко многим” между справочниками “Контрагенты” и “Контактные лица” создал справочник “Контактные лица контрагентов”, подчиненный справочнику “Контрагенты”
В справочнике “Контактные лица контрагентов” сделал Наименование = 0. Возник вопрос, можно ли сделать так, чтобы реквизит справочника “Контактное лицо” отображался как основное представления объекта?
По остальным пунктам задания вопросов не возникло. Единственное, при работе с данными заполнения пришлось пересмотреть соответствующий урок, чтобы вспомнить, как это делается.
> можно ли сделать так, чтобы реквизит справочника «Контактное лицо» отображался как основное представления
К сожалению, платформа 8 не обладает подобным функционалом.
После просмотра решения ДЗ 6 нашел ответ на свой вопрос. Спасибо!
Не знаю что за чертовщина, но в этот раз событие сработало, хотя я ничего не менял.
Спасибо.
Задание выполнил, нового было много, времени не хватает, чтобы все отработать
Сделал справочники Контрагенты и Контактныелица, также сделал табличную часть КонтактныеЛица в спр Контрагенты и поставил реквизит КонтактноеЛицо для добавления нескольких контактных лиц. Создал справочник Номенклатура с реквизитом ВидНоменклатуры(типа ПеречислениеСсылка.ВидНоменклатуры, который я перед этим добавил), он заполняется в ОбработкаЗаполнения модуля объекта. Для единиц измерения реализовал след.механизм: создал справочник ОКЕИ, где были добавлены предопр базовые единицы измерения, создал реквизит спр Номенклатура БазоваяЕдиница. Также создал подчиненный спр-ку Номенклатура справочник ЕдиницыИзмерения(с реквизитами ОКЕИ, Коэффициент), добавил реквизит ОсновнаяЕдиница типа ЕдиницыИзмерения. Запись в данный справочник и реквизит реализовывается процедурой ПриЗаписиНаСервере модуля формы элемента:
<code>
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если НЕ ТекущийОбъект.ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
ВыборкаПоВладельцу = Справочники.ЕдиницыИзмерения.Выбрать(,ТекущийОбъект.Ссылка);
Если НЕ ВыборкаПоВладельцу.Следующий() Тогда
ЕдИзмОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
ЕдИзмОбъект.Владелец = ТекущийОбъект.Ссылка;
ЕдИзмОбъект.Наименование = ТекущийОбъект.БазоваяЕдиница.Наименование;
ЕдИзмОбъект.Коэффициент = 1;
ЕдИзмОбъект.ОКЕИ = ТекущийОбъект.БазоваяЕдиница;
ЕдИзмОбъект.Записать();
ТекущийОбъект.ОсновнаяЕдиница = ЕдИзмОбъект.Ссылка;
ПризнакЗаписи = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Да, контраль заполнения реализуется через свойства реквизитов Выдавать ошибку плюс обработкчик ОбработкаПроверкиЗаполнения, там при виде номенклатуры Услуга удаляется соотв.элемент из массива ПроверяемыеРеквизиты.
В обработке проверки заполнения контактными лицами справочника Контрагенты(его табличной части КонтактныеЛица) реализован следующий запрос:
<code>
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.ЭтоГруппа
И Контрагенты.Ссылка НЕ В
(ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.КонтактныеЛица.Ссылка = Контрагенты.Ссылка)
</code>
Обошлось безо всяких соединений, исключительно теми механизмами, о которых было рассказано в лекционной части первого блока. Вот пожалуй и все.
Задание выполнил.
Изначально упустил, что контактные лица будут использованы в документах и сделал табличную часть в контрагенте. На те же грабли наступил и с единицами измерения, но исправился и сделал необходимые справочники.
Не пришло в голову, что можно в “Обработке заполнения” для справочника Номенклатура сразу присвоить необходимое значение реквизиту номенклатуры, я сделал это через добавление параметра в структуру “Данные заполнения”.
В обработке “Проверка контрагентов” использовал следующий запрос:
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
| ПО Контрагенты.Ссылка = КонтактныеЛицаКонтрагентов.Владелец
|ГДЕ
| КонтактныеЛицаКонтрагентов.КонтактноеЛицо ЕСТЬ NULL
| И (НЕ Контрагенты.ЭтоГруппа)”
Обратная связь:
– очень полезная инфа была о модулях и директивах компиляции. После этих видео уроков, стало намного проще ориентироваться в коде.
– Видео по запросам тоже очень помогло, то чего не хватало, так сказать с самых азов.
Спасибо, за такую подачу материала!
При каждом просмотре курсов, все больше осознаешь выгоду, удачно вложенных инвестиций:)!
Тему, которую хотелось бы рассмотреть в МГ – это резервное копирование в клиент-серверном режиме работы, на примере любой СУБД (если конечно изучение этой темы не предусмотрено в продвинутом курсе)
ДЗ выполнил! сложность возникла при создании обработки. Не сразу сообразил, как можно реализовать это задание. Помог разбор ДЗ!
При создании элемента справочника нужно анализировать определен ли вид номенклатуры у родительской группы. Если да, то нужно подставить данный вид для нового элемента.
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если не ДанныеЗаполнения=Неопределено и Не ЭтоГруппа и не ДанныеЗаполнения.Родитель.ВидНоменклатуры.Пустая() Тогда
ВидНоменклатуры=ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить( ПроверяемыеРеквизиты.Найти(“ЕдиницаИзмерения”));
КонецЕсли
КонецПроцедуры
Необходимо учесть, что товар может закупаться и продаваться не только в базовых единицах измерения. Для этого нужно создать объект, в котором будут храниться список доступных для номенклатуры единиц измерения.
// проверка пустоты Табличной части
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.ЕдиницаИзмерения.Пустая() Тогда
Элементы.ЕдиницыИзмерения.Доступность=Ложь;
КонецЕсли
КонецПроцедуры
Обеспечьте, чтобы при записи нового элемента справочника номенклатура создавалась единица измерения с коэффициентом 1, соответствующая базовой единице (дублирования не нужно допускать). Например, для товара «Масло Mobil 1» указана базовая единица «Бутылка», при записи элемента нужно создать единицу измерения, подчиненную этой номенклатуре, с указанием на соответствующую базовую единицу, и коэффициентом 1.
&НаКлиенте
Процедура ЕдиницаИзмеренияПриИзменении(Элемент)
Если не Объект.ЕдиницаИзмерения.Пустая() Тогда
Элементы.ЕдиницыИзмерения.Доступность=Истина;
ЗаписьЕдИзмНаСервере();
КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ЗаписьЕдИзмНаСервере()
Если не Объект.Ссылка=Объект.Ссылка.Пустая() ИЛИ Объект.Ссылка.ПолучитьОбъект().ЕдиницаИзмерения <>Объект.ЕдиницаИзмерения Тогда
Объект.ЕдиницыИзмерения.Очистить();
НовЗнач= Объект.ЕдиницыИзмерения.Добавить();
НовЗнач.ЕдиницаИзмерения=Объект.ЕдиницаИзмерения;
НовЗнач.Кэффициент =1;
Записать();
КонецЕсли;
КонецПроцедуры
// Запрет на выбор базовой ед. измерения
&НаКлиенте
Процедура ЕдиницыИзмеренияЕдиницаИзмеренияПриИзменении(Элемент)
ТекЭл= Элементы.ЕдиницыИзмерения.ТекущиеДанные.ЕдиницаИзмерения;
Если не ПроверкаЕдИзмере(ТекЭл) Тогда
Предупреждение(“Это базовая еденица”);
Элементы.ЕдиницыИзмерения.ТекущиеДанные.ЕдиницаИзмерения=””;
КонецЕсли
КонецПроцедуры
&НаСервере
Функция ПроверкаЕдИзмере(ТекЭл)
ТабЗнач= Объект.Ссылка.ПолучитьОбъект().ЕдиницыИзмерения.Выгрузить();
Если ТабЗнач.Найти(ТекЭл, “ЕдиницаИзмерения”)=Неопределено Тогда
Возврат Истина;
Иначе
Возврат Ложь ;
КонецЕсли
КонецФункции
Создайте служебную обработку «Проверка контрагентов». При нажатии на кнопку «Выполнить» система должна выдавать список тех контрагентов, у которых не задано контактное лицо. При этом группы справочника контрагенты не должны обрабатываться.
&НаКлиенте
Процедура Исполнить(Команда)
ПроверкаКонтрагентаНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверкаКонтрагентаНаСервере()
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.ЭтоГруппа Тогда
ВыборкаКонтрагенты= Справочники.КонтактныеЛица.Выбрать();
ВыборкаЭлем= Выборка.Ссылка;
Счет=0;
Пока ВыборкаКонтрагенты.Следующий() Цикл
Если ВыборкаЭлем=ВыборкаКонтрагенты.Владелец Тогда
Счет=Счет+1;
КонецЕсли;
КонецЦикла;
Если Счет=0 тогда
Сообщить(Выборка.Наименование);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Задание выполнено полностью затруднений не возникло. Из нового использование процедуры обработка проверки заполнения.
Был дедлайн на работе только освободился поэтому с задержкой, завтра догоню материал и другие задачи.
Забыл отметится.
Решено.
Задание выполнил
1.Создал справочники Контрагенты и Контактные лица. Определил реквизиты. Создал еще один справочник Контактные лица контрагентов, подчиненый справочнику Контрагентов, определил реквизиты – Должность и Контактное лицо.
2.Создал справочники Номенклатура и Классификатор единиц хранения. Проверку заполнения организовал в процедуре ОбработкаПроверкиЗаполнения:
Если Не ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга И НЕ ЭтотОбъект.ЭтоГруппа Тогда
Если ЭтотОбъект.БазоваяЕдиницаИзмерения.Пустая() Тогда
Сообщить(“Заполните Единицу измерения”);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Контроль родителя:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не Объект.Родитель.ВидНоменклатуры.Пустая() Тогда
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
3. Контроль создания единицы измерения – через запрос. Если запрос пустой, тогда создать новую единицу измерения.
ВЫБРАТЬ
ЕдиницыИзмерения.Ссылка
ИЗ
Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
ГДЕ
ЕдиницыИзмерения.Владелец = &Ссылка
И ЕдиницыИзмерения.ЕдиницаПоКлассификатору = &БазоваяЕдиницаИзмерения
4. Проверка контрагентов:
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ЭтоГруппа = ЛОЖЬ
И Контрагенты.КонтактныеЛица = ЗНАЧЕНИЕ(Справочник.КонтактныеЛицаКонтрагентов.ПустаяСсылка)
Обратная связь:
Упорядочил знания про Модули, Справочники, интересный механизм “Изменение значение переменной”. Затруднений не было.
Для хранения информации о контактных лицах контрагентов использую Регистр сведений.
Спр. Номенклатура.
Вид номенклатуры (перечисление) заполняется в процедуре ОбработкаЗаполнения модуля справочника.
Проверка на заполнение вида номенклатуры в процедуре ОбработкаПроверкиЗаполнения.
Создание новой единицы измерения для Номенклатуры произвожу в процедурах ПередЗаписью и ПриЗаписи, проверяя, заполнена ли у номенклатуры БазоваяЕдиницаИзмерения и то, что номенклатура является новой.
Проверку контрагентов реализую с помощью запроса в котором получаю данные левым соединением таблиц спр. Контрагенты и регистра сведений КонтактныеЛицаКонтрагентов. Условия контрагент не является группой и Контактное лицо ЕСТЬ NULL.
Необходимо обеспечить, чтобы одно и то же контактное лицо могло быть определено для
разных контрагентов. Например, Иванова Мария является главным бухгалтером организации
«Альфа» и кассиром организации «Бетта». Нужно хранить информацию о том, в какой должности
числится контактное лицо для определенного контрагента.
В данном случае можно воспользоваться непериодическим регистром сведений с измерениями: Контрагент, Контактное лицо, Должность.
Оба реквизита являются обязательными для заполнения. Но если в качестве вида
номенклатуры указана услуга, то базовую единицу измерения можно не заполнять.
Здесь при записи элемента справочника “Номенклатура” следующее условие
Процедура ПриЗаписи(Отказ)
Отказ = Не ЗначениеЗаполнено(БазоваяЕдиница) И ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга;
КонецПроцедуры
При создании элемента справочника нужно анализировать определен ли вид
номенклатуры у родительской группы. Если да, то нужно подставить данный вид для нового элемента.
в форме элемента в процедуре ПриОткрытии(Отказ)
делаем вызов серверной процедуры, которая заполняет реквизит справочника “ВидНоменклатуры” из родительской группы, если ЭтоНовый() = Истина
Необходимо учесть, что товар может закупаться и продаваться не только в базовых
единицах измерения. Для этого нужно создать объект, в котором будут храниться список
доступных для номенклатуры единиц измерения. Кроме того, необходимо хранить коэффициент
пересчета текущей единицы в базовую. Например, для номенклатуры «Молоко 2,5% пак.»
базовой единицей является «Пакет». Но кроме того могут быть определены единицы «Упаковка»,
в которой содержится 8 пакетов, и паллета, содержащая 64 пакета.
Заводим подчиненный справочник “Единицы измерения”, в данном справочнике заводим числовой реквизит “Коэффициент”
Обеспечьте, чтобы при записи нового элемента справочника номенклатура создавалась
единица измерения с коэффициентом 1, соответствующая базовой единице (дублирования не
нужно допускать). Например, для товара «Масло Mobil 1» указана базовая единица «Бутылка»,
при записи элемента нужно создать единицу измерения, подчиненную этой номенклатуре, с
указанием на соответствующую базовую единицу, и коэффициентом 1.
1. Добавляем справочнику “Номенклатура” реквизит “Основная единица измерения”.
3. При записи проверяем, заполнен ли реквизит “Основная единица измерения”, если не заполнен, то записываем номенклатуру и создаём подчиненную единицу измерения
4. Присваиваем ссылку на единицу измерения в реквизит номенклатуры “Основная единица измерения” и записываем номенклатуру.
Создайте служебную обработку «Проверка контрагентов». При нажатии на кнопку
«Выполнить» система должна выдавать список тех контрагентов, у которых не задано контактное
лицо. При этом группы справочника контрагенты не должны обрабатываться.
если соответствие контактных лиц и контрагентов хранить в регистре сведений, то делаем запрос:
1. помещаем контрагентов во временную таблицу, делаем там условие (НЕ ЭтоГруппа)
2. Левое соединение Временная таблица со справочником контрагентов и регистр сведений “Контактные лица контрагентов”
3. Условие КонтактноеЛицо есть NULL
Создал спр. Контрагенты и Контактные лица. Для справочника Контрагенты создал таб. часть Контактные лица с реквизитами КонтактноеЛицо (спр. Контактные лица) и Должность (строка хотя можно было бы тоже справочник).
Создал спр. Номенклатура и Классификатор ед. изм. Для реквизита ВидНоменклатуры установил тип Перечисление. ВидНоменклатуры, а для рек. БазоваяЕдиницаИзмерения тип спр. и Классификатор ед. изм. Для данных реквизитов в свойствах “Проверка заполнения” установил “Выдавать ошибку”. Дале в МО спр Номенклатура описал процедуру.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Не ЭтоГруппа Тогда
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Не ЭтоГруппа Тогда
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
А в Модуле Формы спр. Номенклатура
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецПроцедуры
Далее в спр. Номенклатура создал таб. Часть ЕдинницыИзмерения с реквизитами ЕдИзмерения (спр. Единицы измерения) и Коэффициент (тип число 10,2) и МО процедуру:
Процедура ПередЗаписью(Отказ)
Если ЗначениеЗаполнено(БазоваяЕдиницаИзмерения) И ЭтоНовый() Тогда
Если ЕдиницыИзмеренеия.Найти(БазоваяЕдиницаИзмерения ,”ЕдиницаИзмерения”) = Неопределено Тогда
НоваяСтрока = ЕдиницыИзмеренеия.Добавить();
НоваяСтрока.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
НоваяСтрока.Коэффициент = 1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Отчет создал с помощью СКД. В запросе левым соединением таблиц Спр.Контрагенты и таб. Часть КонтактныеЛица спр-ка Контрагенты. В условии запроса сравнивал если ЭтоГруппа = ложь и если ЕСТЬNULL.
Немного отстал от графика, только сегодня удалось добраться до 6-го задания. Надеюсь то, что решение выложил только сейчас это не поздно? Решение свое, видео с ДЗ № 6 пока не смотрел.
Да, все ок.
Обратная связь.
Первый модуль базового курса очень и очень полезная и нужная штука, даже имея некий опыт работы. Материала много все по существу, систематизирует существующие знания и добавляет много новых. Видно, что проделана большая и кропотливая работа по созданию блока, большое Вам спасибо. Для получения таких знаний при самостоятельном изучении потребовало бы у меня намного больше времени.
задание выполнил, проблеммы были со справочником многие ко многим ввиду разных способов реализации, не знал как лучше. с запросом(= старые знания кажется мешают. и при заполнении справочника не сразу заметил\вспомнил что родитель в параметре передается.
по блоку. 1: нового оч много: контекст выполнения, модули, дерективы пред компиляции, формы да и запросы(=классы объектов, собралась структурка в голове. 2: незнаю как описывать как я справлялся с трудностями(= оч сложный вопрос (приведите пример(=) 3: материала итак много не успеваю дополнительный смотреть….
и да по 3 пункту, еще не смотрел бонус по формам но хотел бы подробно рассмотреть работу с обычными формами, надеюсь в бонусе это рассматривается?
Да, рассматривается, но не глубоко.
Все-таки обычные формы не являются основным, а скорее вымирающим механизмом.
курс всетаки по 8.х меня часто пугают сложные формы динамически собираемые в типовых, программист 8.2 сперва должен механизмы 8.1 правильно перенести на 8.2 для этого с формами нужно повозится… разве нет?
материал по формам лучше всего получать в виде ваших видео уроков чем читать в книжке и смотреть картинки…
> программист 8.2 сперва должен механизмы 8.1 правильно перенести на 8.2 для этого с формами нужно повозится… разве нет
С одной стороны это так. С другой стороны:
1. Обычные формы вымирают. В обозримом будущем они вообще не будут использоваться в типовых конфигурациях.
2. Если у вас есть какая-то нетиповая обычная форма, то в точности переносить ее поведение в управляемую плохая практика.
Нужно использовать новые механизмы платформы, учитывать клиент-серверное взаимодействие. То есть нужно с нуля нарисовать новую управляемую форму.
Поэтому считаю, что детально знать работу обычных форм не обязательно.
Но в бонусном материале есть информация о них.
и еще по рекурсиям хорошую лекцию послушать охота..
как организовывают графы на платформе?
Эту тему рассматриваем в рамках продвинутого курса.
Между справочниками “Контрагенты” и “Контактные лица” отношение многие-ко-многим. Поэтому создан справочник “Контактные лица контрагентов”, подчиненный справочнику “Контрагенты” и с дополнительными реквизитами “Контактное лиц” тип СправочникСсылка.КонтактныеЛица и должность тип Строка.
Справочник “Номенклатура”.
Для новых элементов справочника вид номенклатуры заполняется в модуле объекте в событии Обработка Заполнения.
Необязательность заполнения базовый единицы обрабатывается в модуле объекта в событии ОбработкаПроверкиЗаполнения.
Для справочника “Номенклатура” создан подчиненный справочник “Единицы измерения” с реквизитами “ЕдиницаИзмерения” тип СправочникСсылка.КлассификаторЕдиницИзмерения и “КоэффициентПересчета” тип Число
Для новой номенклатуры добавляется единица измерения в событии ПриЗаписи модуля объект.
Программный код модуля объекта справочника “Номенклатура”
Перем ЭтоНовыйЭлемент;
&НаСервере
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
Результат = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
Если Результат <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Результат);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
Значение = “”;
Если ДанныеЗаполнения.Свойство(“Родитель”, Значение) Тогда
ВидНоменклатуры = Значение.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ЭтоНовыйЭлемент Тогда
НоваяЕИ = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НоваяЕИ.Владелец = Ссылка;
НоваяЕИ.Наименование = БазоваяЕдиницаИзмерения.Наименование;
НоваяЕИ.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
НоваяЕИ.КоэффициентПересчета = 1;
НоваяЕИ.Записать();
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
ЭтоНовыйЭлемент = ЭтоНовый();
КонецПроцедуры
Обработка Проверка контрагентов. В ней создан реквизит типа СписокЗначений, в который загружаются данные из запроса:
&НаКлиенте
Процедура ПроверитьКонтрагентов(Команда)
СписокКонтрагентов.ЗагрузитьЗначения(ПроверитьКонтрагентовСервер());
КонецПроцедуры
&НаСервере
Функция ПроверитьКонтрагентовСервер()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка,
| КонтактныеЛицаКонтрагентов.Ссылка КАК Ссылка1
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
| ПО (КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка)
|ГДЕ
| КонтактныеЛицаКонтрагентов.Ссылка ЕСТЬ NULL
| И Контрагенты.ЭтоГруппа = Ложь”;
Результат = Запрос.Выполнить();
Возврат Результат.Выгрузить().ВыгрузитьКолонку(“Ссылка”);
КонецФункции // ПроверитьКонтрагентов()
В дополнение к разделу “Обратная связь”. Может быть я и не прав, но хотелось бы видеть, хотя бы фрагментами, что работа в конфигураторе и с базами данных выполняется в контексте “управления проектом”. Что тот, кто управляет требованиями, ждет от нас вполне конкретных ответов, что разработчики работают в рамках некоторого регламента проекта. Разделены, но взаимосвязаны этапы: проектирования, разработки, тестирования, развертывания, опытной эксплуатации, сопровождения. Есь “хранимые” документы. Ведь 82 – это взрослая система, претендующая на место среди гигантов программного обеспечения. Можеть быть есть возможность включить проектный контекст в обучение по разработке в 82. Например, в процесс обучения можно неприметно вставить слова типа ” … это-то и то-то существенно облегчает жизнь разработчику … а это жизненно необходимо для быстрого и четкого тестирования … этот элемент облегчит сопровождение … а это повысит надежность … это необходимо отразить в “хранимых” документах … и т.п. … И даже если мы просто разработчики – мы все равно в команде, где есть и проектанты и бизнес-аналитики и системщики и консультанты и технические писатели и др. Конечно есть спец. курсы по управлению проектами, но неплохо было бы и для разработчков обозначить связь с проектным окружением, в некоторых значимых моментах разработки. Мне так кажется. Возможно я ошибаюсь.
Спасибо за обратную связь.
Сходу реализовать пожелание невозможно, но я взял его на заметку.
Пока лишь могу порекомендовать ресурс http://1sproject.ru/
Знакомые лица! Сверхагрессивный стиль. Но все правильно. Так и надо. Для меня оч. полезная ссылка. Спасибо!
:)
Задание выполнил. С трудом и, к сожалению, с опозданием.
Создал справочники Контрагенты и Контакты. Связал их через справочник КонтактыКонтрагентов.
Создал справочники Номенклатура и КлассификаторЕдиниц. Связал их через справочник ЕдиницыИзмеренияНоменклатуры.
Обеспечил выполнение доп. условий задания
Создал обработку и в ней запрос, формирующий сообщение об контрагентах без контактов.
Помучился с поиском вкладки Представление у справочников. Надо было отжать кнопку “Показывать только важные”.
Непросто дался запрос. Ключевое слово ИМЕЮЩИЕ подсмотрел в решении.
Огромная благодарность за очень хитрые задания. Выполняя их приходиться ( и это хорошо! ) сильно потрудиться, находя возможности решения.
____________________________________
В первом блоке отметил для себя важность правильно спланировать решение и не меньшую важность знать инструментарий решения. Синтакс-помошник, здесь не помошник. Именно знание всех ключевых возможностей Вы и даете, а еще даете знание весьма тонких нюансов. Эти знания составляют навык, без которого невозможно работать в 82. Нарабатывать такой навык самостоятельно – весьмо сомнительное, долгое и трудное мероприятие. У Вас же этот навык мы получаем ОЧЕНЬ БЫСТРО, ОЧЕНЬ ГЛУБОКО и ОЧЕНЬ ЛЕГКО. Да и деньги вроде бы тоже не такие уж и большие. Спасибо Вам огромное!!!
____________________________________
7-е задание постараюсь выполнить вовремя.
Первая часть. Создал три справочника: Контрагенты, КонтактныеЛица, Должности (подчинен спр. КонтактныеЛица).
Для Спр.Контрагенты задал два реквизита СправочникСсылка.КонтактноеЛицо и СправочникСсылка.Должность. Для реквизита Должность установил свойство “Связь Параметрова Выбора” в значение Отбор.Владелец(КонтактноеЛицо).
Программный код не использовал.
Вторая часть. Думал подвох в перекрестных ссылках, пересмотрел эти уроки, но после того как начал делать понял, что они здесь не участвуют. Все обработки и условия уместились в трех процедурах модуля объекта Справочник.Номенклатура:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры <> Перечисления.ВидНоменклатуры.Услуга
и БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка() тогда
Отказ = Истина;
Сообщить(“Не заполнен реквизит Базовая единица!!!”);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если Не ЭтотОбъект.ЭтоГруппа тогда
ЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
ЕдИзм.Наименование = ЭтотОбъект.БазоваяЕдиницаИзмерения.Наименование;
ЕдИзм.БазоваяЕдиница = ЭтотОбъект.БазоваяЕдиницаИзмерения.Ссылка;
ЕдИзм.Владелец = ЭтотОбъект.Ссылка;
ЕдИзм.КоэффициентПересчета = 1;
ЕдИзм.Записать();
КонецЕсли;
КонецПроцедуры
В последней части, самое сложное было не написать запрос с двумя условиями одно из которых ссылается на параметр. А отобразить результат этого запроса в форме, в ТаблицеЗначений. Ошибся на одну букву в именовании полей в выборке запроса и в наименовании поля в ТаблицеЗначения в форме и все, метод ЗначениеВДанныеФормы выдавал ошибку, в стиле “Неверный параметр ‘2’ “. Мучался минут 15 пока нашел свою ошибку.
На простых примерах Универсальных коллекций значений стал понимать логику доступности свойств и методов на клиенте/сервере (о чем уже упоминал, в связи с исправлением процедуры экспорта заказов из Excel).
С синтакс-помощником работа стало более понятной. Уже не возникает вопросов почему в описание какого-либо объекта есть ссылка на другой объект/метод, а у того на третий и т.д. и уже забываешь с чего начал.
Создал справочники “Контрагенты”, “Контактные лица”, “Должности”. У справочника “Контрагенты” создал табличную часть для хранения контактных лиц и их должностей.
Создал справочники “Номенклатура”, “Классификатор единиц измерения” и “Единицы измерения номенклатуры”. Создал перечисление “Виды номенклатуры” с необходимыми значениями.
Справочник “Номенклатура” сделал иерархическим, вид иерархии: “Иерархия групп и элементов”; для реквизита “ВидНоменклатуры” определил параметр “использование” как “Для группы и элемента”
Владельцем справочника “Единицы измерения номенклатуры” сделал справочник “Номенклатура”.
В процедуре “ПриЗаписи” модуля объекта “Номенклатура” реализовал функционал заполнения справочника “Единицы измерения номенклатуры” значением базовой единицы измерения текущей номенклатуры и коэффициентом 1. При этом происходит проверка реквизитов “ЭтоГруппа”, “ВидНоменклатуры” (Услуга или нет), а также проверка на дубль записываемой строки.
В процедуре “ОбработкаПроверкиЗаполнения” модуля объекта “Номенклатура” включаем или выключаем проверку заполнения реквизита “БазоваяЕдиницаИзмерения” в зависимости от значения реквизита “ВидНоменклатуры” (Услуга или нет).
Создал форму элемента для справочника “Номенклатура”. В обработке события “ПриСозданииНаСервере” формы проверяю на существование родителя для нового элемента. Если Родитель не равен Справочники.Номенклатура.ПустаяСсылка() и значение “ВидНоменклатуры” равно Перечисления.ВидыНоменклатуры.ПустаяСсылка(), тогда присваиваю вид номенклатуры родителя виду номенклатуры нового элемента.
Создал внешнюю обработку для проверки заполнения контактных лиц контрагентов. Поиск контрагентов без контактных лиц провожу с помощью запроса.
Очень познавательными были главы про виды модулей конфигурации, а также про справочники. Упорядочил свои знания, которые были получены до этого на практике.
Затруднений не было.
В первом блоке таких тем не было.
1. Для решения задачи создаем реквизит справочника “Контрагенты”
– «Сотрудник» с типом данных СправочникСсылка .КонтактныеЛица.
При организации Справочника “Контрагенты” назначаем
группы первого (единственного) уровня …С названием организации
элемент справочник – Наименование должности.
Таким образом, получаем возможность назначить контактное лицо на любые должности в любой организации.
Примечание:Правда , в этом случае справочник “Контрагенты” похож на справочник – Организации и долджности…
2
МО
/// Для случая передачи параметра(Родитель) в Данных заполнения.///
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
ЭтотОбъект.ВидНоменклатуры = Справочники.Номенклатура.НайтиПоНаименованию(ДанныеЗаполнения.Родитель).ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
///// Используем этот обработчик для для отмены обязательности заполнения ВидыНоменклатуры для услуг
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.удалить(2);
КонецЕсли;
// Вставить содержимое обработчика.
КонецПроцедуры
МФ
…..////// Если параметр в данных заполнения не был передан и поле оказалось не выбранным, то мы его выбираем и в обработчике вычисляем ВидНоменклатуры,//////
&НаКлиенте
Процедура РодительОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
перем Вид;
ЗаполнитьВидНоменклатуры(ВыбранноеЗначение,Вид);
Объект.ВидНоменклатуры = Вид;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьВидНоменклатуры(ВыбранноеЗначение, Вид) Экспорт
Вид = Справочники.Номенклатура.НайтиПоНаименованию(ВыбранноеЗначение).ВидНоменклатуры;
КонецПроцедуры
.////Вторая часть задания.
Для решения создаем справочник варианты поставок , назначая владельцем справочник ” Номенклатура”
А поле Вариант является ссылкой на справочник “КлассификаторЕдиницИзмерения
”
Для заполнения его создаем комаду на форме элемента “Номенклатура” И далее реализуем алгоритм
1 С помощью выборки Справочника “КлассификаторЕдиницИзмерения” Получаем ;
ТЗ= Запрос.Выполнить().Выгрузить();
2 Получаем Массив = ТЗ .ВыгрузитьКолонку(“Ссылка”);
Создаем СписокЗначений и заполняем его
СпЗнч.ЗагрузитьЗначения(Массив)
3 Полученный список возвращаем на клиента для выбора клиентом соответствующих значений для выбора необходимого набора СпЗнч.ОтметитьЭлементы(«Определите возможные измерения для номенклатуры»)
4 После выбора передаем на снрвер для формирования записи элементов в справочник “ВариантыПоставок;
“Процедура ПередатьНаСерверДляЗаписиСправочника(СпЗнч,Ссыл)
Для каждого Элемент Из СпЗнч Цикл
Если Элемент.пометка = ложь Тогда
продолжить;
Иначе
НовыйЭлемент = Справочники.ВариантыПоставок.СоздатьЭлемент();
НовыйЭлемент.Вариант = Элемент.значение;
НовыйЭлемент.Владелец = Ссыл;
НовыйЭлемент.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Таким образо реализована возможность настройки номенклатуры.
Далее создал документ с реквизитами Номенклатура и Измерения но после выбора номенклатуры хотел средствами связей осуществить выборку измерений–не получилось….
Вопрос принципиальный возможно ли штатными средствами(установками связей)?
Последнию часть задания не понял. Контрагенты у меня определены на уровне групп, а значит только там можно узнать о наличии контрагентов…а без этого?..не понял.
1. То есть в вашем решении справочник Контрагенты выглядит примерно так:
Альфа (группа)
—Бухгалтер Уточник(элемент)
—Кассир Гурерниев (элемент)
Бетта (группа)
….
Это не совсем правильное решение. Контрагент должен быть один, а расширенную информацию нужно хранить в отдельном справочнике.. Поскольку по контрагентам ведутся взаиморасчеты, продажи и прочая информация.
Причем контрагент должен быть элементом справочника, а не группой. Так как в дальнейшем он будет выбираться в различных документах.
Рекомендую ознакомиться с решением.
>Далее создал документ с реквизитами Номенклатура и Измерения но после выбора номенклатуры хотел средствами связей осуществить выборку измерений–не получилось…
Правильно я понял, что справочник измерений является подчиненным номенклатуре? Если да, то можно ограничить вывод нужных единиц измерений.
Для этого нужно заполнить свойство “Связи параметров выбора” на уровне свойств реквизита документа. Указать, что свойство Владелец, заполняется значением номенклатуры из документа.
Демонстрация этого механизма будет приводиться во втором блоке курса.