Базовый курс. Домашнее задание №6
Третье задание по 1-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 1-го блока.
Глава 9. Формы.
Глава 10. Перечисления.
Глава 11. Администрирование.
Глава 12. Роли.
Глава 13. Пользователи.
Глава 14. Параметры ИБ.
Глава 15. Резервные копии.
Глава 16. Отладка.
Глава 17. Работа с запросами к БД.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Задение выполнил. Хранение контактных лиц контрагентов организовал в виде справочника КонтактныеЛицаКонтрагентов, подчиненному Контрагенты, реквизиты – КонтактноеЛицо, Должность. Хранение единиц измерения номенклатуры организовал в виде справочника УпаковкиНоменклатуры, подчиненного Номенклатура, реквизиты – ЕдиницаИзмерения, Коэффициент. Создане базовой единицы измрения происходит в модуле формы номенклатуры в событии ПриЗаписиНаСервере.
Задание выпонил.
Для учета контактных лиц контрагентов в справочнике Контрагенты добавил табличную часть КонтактныеЛица, т.к. исходил из того, что контактные лица будут использоваться только как справочная информации о контрагенте, и не будут использоваться самостоятельно.
Виды номенклатуры реализовал в виде перечисления ВидыНоменклатуры со значениями Товар, Услуга и Набор.
Для проверки заполненности реквизитов номенклатуры ВидНоменклатуры и БазоваЕдиница у этих реквизитов свойство «Проверка заполнения» установлено в значение «Выдавать ошибку». В обработчике события ОбработкаПроверкиЗаполнения объекта справочника Номенклатура при необходимости корректируется массив проверяемых реквизитов:
<code>Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ((ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга) И (НЕ ЭтоГруппа)) Тогда
Индекс = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиница”);
Если (Индекс <> Неопределено) Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецПроцедуры</code>
Для учета товара в различных единицах создал справочник ЕдиницыИзмерения с реквизитами Коэффициент (тип Число) и ВидЕдиницы (тип СправочникСсылка.КлассификаторЕдиницИзмерения) , подчиненный справочнику Номенклатура и с нулевой длиной наименования.
Для получения списка контрагентов, у которых отсутствуют контактные лица, в обработке «ПроверкаКонтрагентов» использовался запрос с текстом:
“ВЫБРАТЬ
| КонтрагентыКонтактныеЛица.КонтактноеЛицо КАК КонтактноеЛицо,
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
| ПО (КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка)
|ГДЕ
| (НЕ Контрагенты.Ссылка.ЭтоГруппа)
| И КонтрагентыКонтактныеЛица.КонтактноеЛицо ЕСТЬ NULL ”
Обратная связь:
1. В блоке было достаточно много новой для меня информации, в частности в разделе о модулях.
2. Затруднений при изучении не возникло.
3. Интересует тема использования запросов. Появилось ли что-то новое в 8.2 по сравнению с 8.1?
Из нового в запросах можно отметить конструктор запроса с обработкой результата.
Появилось ряд незначительных ограничений в запросах.
А все принципы остались теми же самыми.
Запросы тема большая и обширная, неочевидные моменты мы разбираем в 1-ом блоке продвинутого курса.
1. Самое интересное и неожиданное из нового – это работа со ссылками ещё не записанных объектов.
2. Затруднения, в основном, при работе с управляемыми формами – все-таки непривычный предмет. В частности, некоторые вопросы, с которыми пришлось столкнуться, так и не удалось решить (по крайней мере в ограниченное время) – они в моих комментариях к моим решениям ДЗ – как распознать пометку удаления на клиенте (ведь она отображается в в форме) и в последнем ДЗ – с визуальной отметкой незаполненного.
Общее место – нехватка времени, но по прошествии недели я обнаруживаю, что требуемых, как минимум, 20-ти часов мне не удалось посвятить данным занятиям.
3. (и 2. тоже) Конечно же, запросы. В видеоуроках пока что всё просто, но когда я вижу запросы в работающих типовых конфигурациях, я чаще всего не могу понять, как в них можно разобраться.
В отличие от объектной техники, где, разбирая циклы и условия, можно прояснить используемый алгоритм, в запросах способ анализа мне пока что непонятен.
2. Распознать пометку удаления:
Объект.ПометкаУдаления.
3. Приходит с практикой и опытом :)
Понятно. Спасибо.
1. Сначала в задании не было требования возможности выбирать контактное лицо в качестве реквизита, и тогда наиболее простым способом было бы организовать табличную часть в справочнике Контрагенты, что я и сделал первоначально. Когда требование появилось, стало ясно, что должен быть создан справочник с реквизитами Контрагент и Контактное лицо. До того, что Контрагент должен быть Владельцем, так и не додумался – подсмотрел в решениях. Сейчас думаю, что на это должна указывать неравноправность контрагентов и контактных лиц – нас скорее будут интересовать
1) у одного контрагента его различные контактные лица (и их должности у него), чем
2) у одного контактного лица различные контрагенты (и должности, которые он занимает у этих контрагентов).
2. Если в качестве вида номенклатуры указана услуга, то базовую единицу измерения можно не заполнять. Возможность не заполнять реализовал в процедуре ОбработкаПроверкиЗаполнения модуля объекта путем удаления элемента из массива проверяемых реквизитов. Однако осталась проблема с визуализацией: хотя пользователь может в случае услуги записать пустую базовую единицу измерения, в форме она отмечена как обязательная к заполнению. Попытался сделать следующее: свойства “АвтоОтметкаНезаполненного” и “ОтметкаНезаполненного” регулировал программно в процедуре:
<code>
&НаКлиенте
Процедура УстановитьОтметкуНезаполненногоБазовойЕдиницыИзмерения()
ЭлементФормыБазоваяЕдиницаИзмерения = Элементы.БазоваяЕдиницаИзмерения;
Если Объект.ВидНоменклатуры = мВидНоменклатурыУслуга Тогда
ЭлементФормыБазоваяЕдиницаИзмерения.АвтоОтметкаНезаполненного = Ложь;
ЭлементФормыБазоваяЕдиницаИзмерения.ОтметкаНезаполненного = Ложь;
Иначе
ЭлементФормыБазоваяЕдиницаИзмерения.АвтоОтметкаНезаполненного = Неопределено;
КонецЕсли;
КонецПроцедуры
</code>
вызываемой при изменении поля “ВидНоменклатуры” и при открытии формы.
– Поначалу все хорошо работает при открытии формы и при изменении вида номенклатуры. Однако, если попытаться записать элемент с незаполненной базовой единицей измерения при “не услуге” (запись не выполняется), то после этого визуальная отметка незаполненности не исчезает при выборе вида номенклатуры – “Услуга”. При этом в отладчике можно видеть, что выражение
Элементы.БазоваяЕдиницаИзмерения.ОтметкаНезаполненного устанавливается в Ложь. Победить такое поведение мне не удалось.
Далее, в случае выбора “Услуги”, пустой базовой единицы измерения и видимой отметки незаполненного удаётся записать элемент – при этом визуальная отметка незаполненности исчезает, и дальше всё работает нормально.
Более того, в процедуре ПередЗаписью() (&НаКлиенте) выставляю отказ в случае “Услуги” – по кнопке “Запись” запись не происходит – и визуальная отметка незаполненности исчезает.
Таким образом, получается, что визальная отметка незаполненности не соответствует значению выражения Элементы.БазоваяЕдиницаИзмерения.ОтметкаНезаполненного.
Есть ли объяснение такого поведения?
3. При создании нового элемента номенклатуры в процедуре ОбработкаЗаполнения() модуля объекта значение реквизита “Родитель” ещё не установлено, поэтому анализировать его надо в следующей точке – в процедуре ПриСозданииНаСервере() модуля формы. Там и заполняем в структуре данных формы:
<code>
Если ЗначениеЗаполнено(Объект.Родитель) Тогда
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
</code>
4. Добавил в конфигурацию справочник ЕдиницыИзмеренияНоменклатуры, подчиненный Номенклатуре, реквизиты ЕдиницаИзмерения и Коэффициент. При записи элемента номенклатуры создаётся и записывается новый элемент справочника ЕдиницыИзмеренияНоменклатуры с реквизитами:
.Владелец = Ссылка;
.ЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
.Коэффициент = 1;
– при выполнении следующих условий:
ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга И НЕ ЭтоГруппа И мЗаписьНового,
где мЗаписьНового = ЭтоНовый() – определяется перед записью.
Предполагаем, что если пользователь изменил реквизиты у существующего элемента номенклатуры, то он должен вручную проследить за правильностью данных в справочнике ЕдиницыИзмеренияНоменклатуры.
5. С запросом долго мучился – получалось очень громоздко. В итоге подсмотрел аналоги в комментариях: выбираем контрагентов по условию “НЕ Контрагенты.ЭтоГруппа” И “Не в списке”, где список:
ВЫБРАТЬ РАЗЛИЧНЫЕ КонтактныеЛицаКонтрагентов.Владелец
ИЗ Справочник.КонтактныеЛицаКонтрагентов
Обратная связь чуть позже.
1. Верные рассуждения, спасибо.
2. Забавное поведение платформы.
У меня получилось так, если после неуспешной записи выбрать услугу, то отметка не снимается.
А если выбрать услугу еще раз, то снимается.
То есть, с первого раза не “доходит”.
Такое ощущение, что виновато кэширование и оптимизация форм.
Конечно, это поведение нельзя назвать нормальным, возможно в будущих релизах оно будет исправлено.
3. А все-таки в обработке заполнения можно анализировать. См. решение.
Дополнительно к 2.
У меня отметка не снималась, сколько бы раз я не выбирал услугу. Единственный вариант – попытка записи, причем даже прерванная на самом первом этапе. Вобщем, понятно, что это, видимо, ошибка платформы.
Дополнительно к 3.
В метаданных реквизита может быть снят флажок “Заполнять из данных заполнения”. Тогда в данных заполнения Родитель есть, а новый элемент будет создан с пустым родителем. Можно, конечно, дополнительно анализировать ещё и флажок, но это уже попытка прогнозировать будущее (т.е. какой получится реквизит в результате), а хотелось бы иметь точное знание, что реквизит уже такой, и таким и останется, независимо от чего-либо ещё. При создании на сервере-то есть такая уверенность.
Понял, что в “Дополнительно к 3.” написал глупость. Ведь может так случиться, что будет открыта другая форма (об этом же было в видеоуроках). Стало быть, придётся всё-таки анализировать возможные варианты заполнения реквизитов объекта (в т.ч. состояние флажка “Заполнять из данных заполнения”) в процедуре заполнения.
По п. 2. Вмешаемся в работу оптимизатора.
Вот код, который работает железно:
Процедура СнятьОтметкуПриИзменении(Элемент)
Если СнятьОтметку Тогда
ВызовСервера();
Иначе
Элементы.Реквизит1.АвтоОтметкаНезаполненного = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВызовСервера()
Элементы.Реквизит1.АвтоОтметкаНезаполненного = Ложь;
Элементы.Реквизит1.ОтметкаНезаполненного = Ложь;
КонецПроцедуры //
Сейчас прочитал в синтакс-помощнике про ОтметкаНезаполненного: “Изменение свойства на клиенте требует обращения к серверу”. – Т.е. на клиенте на запись это свойство, вообще говоря, не работает. Поэтому обращение к процедуре ВызовСервера в приведенном примере решает проблему.
Тот факт, что удавалось изменить отметку на клиенте, пока не было неудачной попытки записи, стало быть, следует отнести к недокументированным возможностям.
Не совсем так.
То что свойство можно менять на клиенте, это правильно и это документированная возможность.
Да, действительно, при изменении этого свойства делается неявный вызов сервера, и это связано с тем, что нужно выполнить синхронизацию формы между клиентом и сервером.
А вот то, что изменение свойства ни к чему не приводит, относим к недокументированным особенностям. Которые, надеюсь, будут исправлены.
Сделав явный вызов сервера, я заставил платформу выполнить принудительную синхронизацию формы между клиентом и сервером, поэтому все заработало.
Понятно
Здравствуйте, наконец-то добрался до выполнения задания №6.
Особенности:
Для справочника “Контрагенты” определил табличную часть, где задаются контактные лица.
Вид номенклатуры сделал перечислением.
Проверку на заполненность базовой единицы измерения выполняю в процедуре ОбработкаПроверкиЗаполнения модуля объекта.
Заполнение вида номенклатуры сделал в процедуре ПриСозданииНаСервере модуля формы элемента.
Сложностей с выполнением ДЗ не было.
Обратная связь:
1. Из нового были некоторые нюансы, остальное в общем-то знал, упорядочил знания.
2. Затруднений не было.
3. Было бы интересно рассмотреть особенности работы с формами, поскольку сейчас разрабатываю формы под Touch интерфейс. Конкретно было бы интересно узнать:
-можно ли открыть форму максимизированной, т.е. на весь экран? Если нет, то можно ли каким-нибудь образом привязать размеры формы к разрешению экрана, например получить разрешение и на основании этого задать ширину и высоту формы?
-можно ли управлять размером шрифта заголовков элементов: пробовал увеличить шрифт, он увеличивается, но тогда заголовок не влезает в отведенное для него поле.
-можно ли увеличить размеры кнопок, помещаемых на командную панель формы?
P.S. 1. Поскольку решение ДЗ №6 уже опубликовано, говорю, что его не смотрел.
2. Надеюсь ничего, что так поздно отчитался по ДЗ? А то что-то на работе завал сплошной, не успел. Постараюсь исправиться!
>2. Надеюсь ничего, что так поздно отчитался по ДЗ? А то что-то на работе завал сплошной, не успел. Постараюсь исправиться!
Все ок.
По остальным вопросам ответить с ходу не готов.
Но если дисплей маленький, то возможно придется рассмотреть возможность использования обычных форм.
Там можно добиться более компактного размещения элементов.
Спсибо за ответ. Дисплей нормальный, просто есть некоторые неудобства от работы с управляемыми формами, но плюсов пока что больше :)
Задание сделала следующим образом:
Контактные лица – табличная часть справочника Контрагенты.
ВидНоменклатуры – перечисление
Проверку заполнения базовой ед. при услуги проверяла в процедуре ОбработкаПроверкиЗаполнения
Если вид номенклатуры задан для родителя в процедуре ОбрабокаЗаполнения присваиваю вид номенклатуры созданному элементу
Единицы измерения – подчинен справочнику номенклатуры. При записи (процедура ПриЗаписи) нового элемента справочника номенклатура создается ед измерения с коэффициентом 1
Список контрагентов с незаполненной контактной информацией выбирала запросом.
1. Для меня почти все новое
2. Затруднений нет
3. Пока времени хватает только на самое основное.
Задание выполнил.
Запутался с проверками номенклатуры, приходилось возвращаться к материалу и пересматривать.
Справочники:
Контрагенты ,
Контактные лица ,
Должности ,
Номенклатура ,
Классификатор единиц измерения ,
Вид номенклатуры поместил в перечисление.
В сравочнике Номенклатура создал табличную часть Единица измерения, где хранится единица измерения и коэффициент пересчета текущей единицы в базовую.
В модуле объекта Номенклатура выполнил необходимые проверки для элементов справочника.
В Обработка Проверка контрагентов, проверку контрагентов выполнил при помощи запроса к базе.
Обратная связь
1. Для меня много новой информации. Особенно было интересно клиент-серверное взаимодействие, дерективы компиляции, доступность методов и объектов.
2. Затруднений нет. Материал подготовлен здорово. Проблема с нехваткой времени.
3.Директивы компиляции, клиент-серверное взаимодействие, событие формы «при создании на сервере».
Спасибо !
Задание выполнил.
Запутался с проверками номенклатуры, приходилось возвращаться к материалу и пересматривать.
Создал Справочники: Контрагенты, Контактные лица, Должности, Номенклатура, Классификатор единиц измерения.
Вид номенклатуры поместил в перечисление.
В сравочнике Номенклатура создал табличную часть Единица измерения, где хранится единица измерения и коэффициент пересчета текущей единицы в базовую.
В модуле объекта Номенклатура выполнил необходимые проверки для элементов справочника.
В Обработка Проверка контрагентов, проверку контрагентов выполнил при помощи запроса к базе.
Обратная связь
1. Для меня много новой информации. Особенно было интересно клиент-серверное взаимодействие, дерективы компиляции, доступность методов и объектов.
2. Затруднений нет. Материал подготовлен здорово. Проблема с нехваткой времени.
3.Директивы компиляции, клиент-серверное взаимодействие, событие формы «при создании на сервере».
Спасибо !
Домашнее задание выполнил. Затруднений не возникло. В справочнике Контрагенты добавлена табчасть Контакты с реквизитами Контактное лицо и Должность.
Для Справочника номенклатура заведен подчиненный справочник Единицы с реквизитами ЕдиницаКлассификатор и коэффициент (Длина наименования = 0).
Для контроля проверки заполнения реквизита БазоваяЕдиница в обработке проверки заполнения из массива проверяемых элементов удаляется элемент БазоваяЕдиница если Реквизит ВидНоменклатуры равен услуге
Заполнение реквизита вид номенклатуры реализовано так:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Перем ЭлРодитель;
Если ДанныеЗаполнения.Свойство(“Родитель”,ЭлРодитель) Тогда
Если ЗначениеЗаполнено(ЭлРодитель.ВидНоменклатуры) Тогда
ВидНоменклатуры = ЭлРодитель.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
запрос
ВЫБРАТЬ
Контрагенты.Ссылка,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыКонтактныеЛица.Контакт) КАК Контакт
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
ПО (КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка)
СГРУППИРОВАТЬ ПО
Контрагенты.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыКонтактныеЛица.Контакт) = 0
Итог главы:
вызовы клиентских и серверных процедур междусобой скомпилированных на сервере и на клиенте, процедуры при окрытии формы.
проблемм с изучением не возникало(просто иногда мало времени на просмотр большого количества информации, но ничего прорвемся:) )
Темы раскрыты в доступной и понятной форме.
Спасибо Евгений:)
Задание выполнил.
Контактные лица хранятся в табличной части Контрагентов так как не дошли еще до регистров сведений. Ниже текст запроса обработки
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
(НЕ Контрагенты.Ссылка В
(ВЫБРАТЬ
КонтрагентыКонтактныеЛица.Ссылка
ИЗ
Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
СГРУППИРОВАТЬ ПО
КонтрагентыКонтактныеЛица.Ссылка))
И (НЕ Контрагенты.ЭтоГруппа)
Задание выполнено.
1. Структура конфигурации:
спр “Контрагенты”
-КонтактноеЛицо, “СправочникСсылка.КонтактныеЛица”
-Должность, “СправочникСсылка.Должности”
спр “Номенклатура”
-ВидНоменклатуры, “ПеречислениеСсылка.ВидыНоменклатуры”
-БазоваяЕдИзм,”СправочникСсылка.КлассификаторЕдиницИзмерения”
спр “ЕдиницыИзмерения” (подчинен спр. “Номенклатура”)
-ЕдИзм,”СправочникСсылка.КлассификаторЕдиницИзмерения”
-Коэффициент, Число
2. Проверка обязательных реквизитов номенклатуры
осуществляется с помощью свойств реквизитов “ПроверкаЗаполнения”.
Ситуация возможности пустой базовой единицы измерения для
услуги обрабатывается с в событии ОбработкаПроверкиЗаполнения()
3. Определение вида номенклатуры по родительской группе
осуществляется в процедуре ПриСозданииНаСервере()
4. Поиск контрагентов без контактных лиц осуществляется
с помощью запроса:
&НаСервере
Процедура ВывестиКонтрагентовБезКонтактныхЛиц()
Запрос = новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
| И Контрагенты.КонтактноеЛицо
= ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка)”;
РезультатЗапроса = Запрос.Выполнить();
Объект.КонтрагентыБезКонтактныхЛиц.Загрузить(
РезультатЗапроса.Выгрузить());
КонецПроцедуры //ВывестиКонтрагентовБезКонтактныхЛиц()
Обратная связь:
1. Новое
– Задача перекрестных ссылок
– Директивы компиляции
– Работа с управляемыми формами
2. Затруднений нет, времени все посмотреть нет
3. Материалов достаточно
Спасибо за труд!
Как-бы в задании не указано, что для 1 контрагента должно быть много контактных лиц, соответственно так и сделал.
Код для обработки (2 вараинта поиска через методы менеджерасправочника и через запрос, СписокК – реквизит типа “СписокЗначений” на канве формы обработки):
&НаКлиенте
Процедура Заполнить(Команда)
// Вставить содержимое обработчика.
СписокК=ОбходСправочникаНаСервере2();
КонецПроцедуры
&НаСервере
Функция ОбходСправочникаНаСервере1()
СК = новый списокЗначений;
Контрагент = Справочники.Контрагенты;
Выборка = Контрагент.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.КонтактноеЛицо=Справочники.КонтактныеЛица.ПустаяСсылка() Тогда
Если НЕ Выборка.Ссылка.ЭтоГруппа Тогда
СК.Добавить(Выборка.Наименование,,,);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СК;
КонецФункции
&НаСервере
Функция ОбходСправочникаНаСервере2()
СК = новый списокЗначений;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ К.Наименование, К.Ссылка, К.КонтактноеЛицо
| ИЗ Справочник.Контрагенты К “;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если не Выборка.ссылка.ЭтоГруппа Тогда
Если Выборка.КонтактноеЛицо=Справочники.КонтактныеЛица.ПустаяСсылка() Тогда
СК.Добавить(Выборка.Наименование,,,);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СК;
КонецФункции
код для проверки корректности элементов справочника “Номенлатура” из модуля формы элемента справочника:
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
//Вставить содержимое обработчика
//Вставить содержимое обработчика
Если Не (ТекущийОбъект.Тип=Перечисления.ТипТовара.Услуга) Тогда
Если ТекущийОбъект.БазоваяЕдиница.Пустая() Тогда
Сообщить(“Не заполнена базовая Единица”);
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Коретность заполнения вида номенклатуры (не пустое значение) решается установкой галочки
Задание выполнил. Модуль Справочника Номенклатура:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения <> Неопределено и ДанныеЗаполнения.Свойство(“Родитель”) <> Неопределено Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиница”));
КонецЕсли;
КонецПроцедуры
Модуль Формы Обработки :
&НаКлиенте
Процедура Команда1(Команда)
ПодборКонтрагентов();
КонецПроцедуры
&НаСервере
Процедура ПодборКонтрагентов()
Запрос = новый Запрос(“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| КонтрагентыКонтактныеЛица.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
| ПО КонтрагентыКонтактныеЛица.Ссылка = Контрагенты.Ссылка
|ГДЕ
| Не Контрагенты.ЭтоГруппа
| И КонтрагентыКонтактныеЛица.Ссылка ЕСТЬ NULL “);
Реквизит1.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
1. Скорее упорядочил знания, хотя были нюансы которых не знал.
2. Небыло.
3. Пока материалов достаточно.
Выполнил. Сложностей не было. Единственное задание создать объект, открыло весьма обширный полет фантазии ))). Открыл логистику аксилота и сделал, как у них )))
1. Знания постепенно структурируются и дополняются многими мелочами. Очень полезно.
2. затруднений особых не было. Думаю в продвинутом возникнут )
3. Для базовой группы дмаю все описано хорошо и подробно. Вопросов на этом уровне нет.
p.s. честно сказать с трудом успеваю просматривать все материалы ))) с учетом, что еще есть работа и куплен курс по ошибкам в проектах УПП, который сейчас очень пригодился. Ибо…
Задание выполнил. Для Справочника Контрагенты определил ТЧ Сотрудники. Создал перечисление ВидНоменклатуры. В модуле объекта В событии ОбработкаЗаполнения справочника Номеклатура заполняю вид номенклатуры по родителю. В ОбработкаПроверкиЗаполнения корректирую массив ПроверяемыеРеквизиты в зависимости от ВидНоменклатуры. В модуле формы ПриОткрытии определяю доступность поля БазоваяЕдиницаИзмерения. В событии ПриИзменении ВидНоменклатуры определяю доступность поля БазоваяЕдиницаИзмерения и его значение. ПроверкуКонтрагентов выполняю запросом в нем левое соединение Контрагенты и ТЧ. С условием что (ЕСТЬNULL(КонтрагентыСотрудники.ФИО, 0) = 0)и НЕ(контрагенты.ЭтоГруппа)
Очень много узнал нового. В книгах так не объясняют. Новое что особо заполнилось: работа со универсальными коллекциями, работа с синтакс –помощником, директивы компиляции, использование параметров обработчиков событий, работа с формами.
Пока практики у меня мало, кажется что все понятно.
Не совсем разобрался с основным реквизитом формы. Раз основные типы объектов конфигурации на клиенте не доступны, то где формируется форма. На Клиенте, На сервере. и какй тип данных у основного реквизита формы наКлиенте.
Форма изначально создается на сервере, далее передается на клиента и там живет все время.
Что касается типов данных, то недоступные на клиенте данные преобразуются в специальные типы.
Например, СправочникОбъект преобразуется в ДанныеФормыСтруктура, вы можете в этом убедится, запустив отладчик.
Задание выполнено. Создал справочники мКонтрагенты, мКонтактныеЛица,ВидыДолжности,мНоменклатура, мКлассификаторЕдиницИзмерений, ЕдиницыИзмерения(подчиненный справочнику мНоменклатура). Сначала сделал и справочник мКонтактныеЛица подчиненным справочнику мКонтрагенты, но посмотрев видео решил что сделал не правильно, т.к. я нигде не прописываю допустим измерение регистра где проставляю контактное лицо, и добавил в справочник мКонтрагенты реквизиты реквизиты с типом ВидыДолжности и с типом ссылка мКонтактныеЛицамКонтактныеЛица, а подчиненность удалил. Правильно я понимаю, что использование подчиненности справочника или использование табличной части никакого влияния допустим на масштабируемость решения не несет, и используется исключительно для удобства разработчика?
При проверке на наличие у контрагента контактных лиц использовал запрос
<code> Запрос.Текст =
“ВЫБРАТЬ
| мКонтрагенты.Ссылка,
| мКонтрагентыКЛ.КонтактноеЛицо
|ИЗ
| Справочник.мКонтрагенты КАК мКонтрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.мКонтрагенты.КонтактныеЛица КАК мКонтрагентыКЛ
| ПО (мКонтрагентыКЛ.Ссылка = мКонтрагенты.Ссылка)
|ГДЕ
| (НЕ мКонтрагенты.Ссылка.ЭтоГруппа)
| И (мКонтрагентыКЛ.КонтактноеЛицо ЕСТЬ NULL) “;
</code>
Тут наконец то понял когда используется NULL. Дальше обычным перебором по выборке вывожу контрагентов у кого нет контактных лиц.
При открытии реализовал заполнение реквизита ВидНоменклатуры. Сделал 2 варианта. 1-й в модуле объекта справочника номенклатуры:
<code> Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЭтоНовый() Тогда
если ДанныеЗаполнения<>Неопределено Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
2-й в модуле формы
<code> &НаКлиенте
Процедура ПриОткрытии(Отказ)
ПолучитьВидНоменклатурыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПолучитьВидНоменклатурыНаСервере()
Если НЕ ЗначениеЗаполнено(Объект.ВидНоменклатуры) тогда
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры // ПолучитьВидНоменклатурыНаСервере()()
</code>
Хотел посмотреть какой вариант отработает быстрее (думаю что в модуле объекта но хотел проверить). В модуле объекта замер производительности показал цифру 0.00439, а при попытке поставить точку останова и запустить замер производительности система намертво вешается. Использую 8.2.12.80. Может посоветуете что делать в данном случае, как проверить время работы? И еще вопрос про отладчик. В 7.7 если я допустим попадал в отладке в бесконечный цикл, то я мог прервать процесс без закрытия режима 1с:Предприятия. Можно ли тоже самое сделать в 8.2? или при завершении такого процесса я однозначно должен перезапустить режим предприятия?
И последние при записи справочника номенклатуры я автоматически записываю единицу измерения равную базовой (из справочника мКлассификаторЕдиницИзмерений) и коэффициентом 1. Данную запись провожу в модуле формы в процедуре ПослеЗаписи(ПараметрыЗаписи). Делаю это из-за того что считаю что транзакция по записи нового элемента справочника номенклатуры закончена и я могу инициировать запись друго транзакции. Справочник ЕдиницыИзмерения подчинен справочнику мНоменклатура и имеет в своем составе реквизиты Единица(СправочникСсылка.мКлассификаторЕдиницИзмерений) и Коэффициент (число). Тут кстати тоже возник вопрос. При записи единицы измерения на основании базовой написал два однотипных варианта кода. 1-й на основании использования индексированого реквизита Единица справочника ЕдиницыИзмерения
<code>
Отбор = Новый Структура(“Единица”,текЕдиница);
Спр = Справочники.ЕдиницыИзмерения.Выбрать(,текСсылка,Отбор);
если НЕ Спр.Следующий() тогда
НовыйЭлемент = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовыйЭлемент.Владелец = текСсылка;
НовыйЭлемент.Единица = текЕдиница;
НовыйЭлемент.Коэффициент = 1;
НовыйЭлемент.Записать();
КонецЕсли;
</code>
2-й на основании запроса
<code> Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Владелец = &Владелец
| И ЕдиницыИзмерения.Единица = &Единица”;
Запрос.УстановитьПараметр(“Владелец”, текСсылка);
Запрос.УстановитьПараметр(“Единица”, текЕдиница);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
если НЕ ВыборкаДетальныеЗаписи.Следующий() тогда
НовыйЭлемент = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовыйЭлемент.Владелец = текСсылка;
НовыйЭлемент.Единица = текЕдиница;
НовыйЭлемент.Коэффициент = 1;
НовыйЭлемент.Записать();
КонецЕсли;
</code>
где текСсылка – ссылка на справочник мНоменклатура котрый является владельцем записываемой единицы измерения, текЕдиница – значение единицы измерения из классификатора единиц измерений.
Какой вариант предпочтительнее использовать при разработке своего решения? Замер производительности показал соизмеримую скорость работы. При записи нового элементы используя 1-й вариант время = 0.02307, используя 2-й – 0.02935.
Обратная связь:
Очень нравится курс, и что главное курс заставляет не просто запоминать как делается та или иная “плюшка”, а подталкивает подумать и попытаться решить задачу без посторонней помощи. Нравится, что к одной и той же задаче предпологается иногда по нескольку вариантов решения. Если раньше при какой либо трудной ситуации сразу лез в интернет , то теперь еще разок внимательнее читаю синтаксис помошник:). Из предложений по 1-му блоку: 1) Хотелось бы чтобы авторы рассказали побольше о работе с формами. В 8.1 например можно описать создание элементов формы программно. Это удобно когда осуществляешь обновление с типовой конфигурацией, тупо обновляешь все формы, а потом просто вставляешь свой код по созданию элементов формы и все работает как и до обновления. А можно ли чтото подобное сделать и в 8.2? 2) Очень хотелось бы чтобы авторы упомянули о реализации рассматриваемых алгоритмов в web-интерфейсе. Допустим сделал я фиксированную ширину поля ввода, а в web- интерфейсе из-за этого возможно с формой работать нельзя. Ведь работа по web-интерфейсу одно из несомненых преимуществ 8.2 по сравнению с предшественниками.
А так все супер!!!!
>Правильно я понимаю, что использование подчиненности справочника или использование табличной части никакого влияния допустим на масштабируемость решения не несет, и используется исключительно для удобства разработчика?
На масштабируемость…ну если сильно преувеличить, то будет влиять.
Давайте абстрагируемся.
Есть 2 справочника А и Б, причем Б зависим от А.
Можно в справочнике А сделать табличную часть и указывать там элементы.
Представим, что в А есть элемент с количеством строк 90 000 в табличной части. В одно утро пользователь понимает, что нужно добавить еще одну 90 001 строку.
Он это делает и….вешает систему (особенно если база файловая). Поскольку запись такого мега-объекта происходит не быстро.
Другое дело, если бы у вас был подчиненный справочник, запись нового элемента не составила бы проблем.
Рекомендую еще раз обратиться к уроку 1-го блока “Отличия подчиненного справочника от табличной части.”.
>Хотел посмотреть какой вариант отработает быстрее (думаю что в модуле объекта но хотел проверить)
В данном случае корректнее спросить: какой вариант правильнее ОбработкаЗаполнения() модуля объекта или ПриОткрытии() модуля формы.
Конечно же первый. Поскольку нам нужно заполнять реквизит только для новых элементов, а событие ПриОткрытии отрабатывает всегда.
Более ПриОткрытии привязано к конкретной форме, а обработка заполнения нет.
Что касается зависания, то возможно у вас срабатывает другая точка останова (в другом модуле). Попробуйте снять все точки останова (гл. меню Отладка) и вновь поставьте брейк-поинт в модуле объекта.
>И еще вопрос про отладчик. В 7.7 если я допустим попадал в отладке в бесконечный цикл, то я мог прервать процесс без закрытия режима 1с:Предприятия.
Это возможно, но трудоемко.
Нужно сымитировать появление ошибки в программном коде.
Для этого нужно из отладчика вызвать функцию, где заведомо есть ошибка.
Кажется в этом случае игра не стоит свеч, ведь вечный цикл это ошибка, которую нужно исправить. А значит все равно нужно будет перезапускать систему.
Поэтому жмем Shift + F5, и исправляем ошибки :)
>Данную запись провожу в модуле формы в процедуре ПослеЗаписи(ПараметрыЗаписи)
Использовать это событие не правильно с логической точки зрения.
Давайте представим, что запись элемента номенклатуры прошла успешно, а единица измерения почему-то не может быть записана.
Может случится, что пользователь никак не отреагирует на эту ситуацию.
А если бы вы проводили запись двух элементов в одной транзакции, то она бы полностью откатилась, если бы единица не была записана.
>Какой вариант предпочтительнее использовать при разработке своего решения?
В любом раскладе предпочтительнее использовать запрос.
>В 8.1 например можно описать создание элементов формы программно.
Этот момент рассматриваем в 1-ом блоке продвинутого.
Однако, по новой идеологии программно модифицировать форму не рекомендуется, поскольку в этом случае отключается оптимизация трафика клиент-серверного взаимодействия.
То есть в веб-клиенте форма будет тормозить, и чем больше элементов на форме, тем сильнее будут заметны тормоза.
Пожелание по особенностям разработки веб-интерфейса записали.
Спасибо за содержательный ответ.
1) Что табличная часть не может содержать более 90 000 строк даже не подумал. Спасибо за напоминание
2)Зависание при попытке замера производительности между точками останова не исправилось после удаление всех точек останова. Хотя странно , но в пошаговом режиме все проходит без проблем. Буду надеятся что при установке 8.2.12.96 все исправится.
3)Перенес в модуль объекта все что относится к записи данных
Еще раз спасибо за такой развернутый ответ
1. Смысл был в том, что запись большого объекта происходит долго.
А в табличной части может быть до 99999 строк.
Всегда пожалуйста :)
Задание оказалось не сложным :)
1. Создала спр-к “Контрагенты”, “КонтактныеЛица”, при этом спр-к “КонтактныеЛица” не подчинен спр-ку “Контрагенты”, т.к. один и тот же человек может быть контактным лицом разных контрагентов. В спр-ке “Контрагенты”, добавила дополнительные реквизиты :
– ДолжностьКЛ
-КЛ – тип “Справочники.КонтактныеЛица”
2. Создала Перечисление.ВидТМЦ (Товар, услуга,Набор). Создала спр-ки “Номенклатура” и “КласЕдИзм”, а также подчиненный спр-ку “Номенклатура” справочник “Единицы”.
В спр-ке “Номенклатура” создала реквизиты:
– ВидТМЦ – тип Перечисления.ВидТМЦ
-БазЕд – тип.Справочники.КласЕдИзм
Для этих реквизитов выставила Свойство “Проверка заполнения” – Выдавать ошибку.
В МО для реализации условия (если услуга, то не проверяем базовую единицу) использовала
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидТМЦ = Перечисления.ВидТМЦ.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазЕд”));
КонецЕсли;
КонецПроцедуры
Тут же делаю заполнение поле Вид ТМЦ из Родителя, если элемент создается внутри группы
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения)<>Тип(“Неопределено”) Тогда
ВидТМЦ = ДанныеЗаполнения.Родитель.ВидТМЦ;
КонецЕсли;
КонецПроцедуры
И тут же использую процедуру “ПриЗаписи”, для записи базовой единицы в подчиненный спр-к “Единицы” , если нет еще не одной записи в подчиненном справочнике.
Процедура ПриЗаписи(Отказ)
Если ВидТМЦ <> Перечисления.ВидТМЦ.Услуга Тогда
ВыборкаЕд = Справочники.Единицы.Выбрать(,Ссылка);
Если ВыборкаЕд.Следующий()=Ложь Тогда
СпрЕд = Справочники.Единицы.СоздатьЭлемент();
СпрЕд.Наименование = БазЕд;
СпрЕд.Кооф = 1;
СпрЕд.Ед = БазЕд;
СпрЕд.Владелец = ССылка;
СпрЕд.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
3. В обработке “ПроверкаКонтрагентов” организовала вызов “серверной без контекста” процедуры и реализовала вывод контрагентов, у которых не заполнено поле “КонтактноеЛицо” 2-мя способами:
– через обычное обращение к справочнику
Выборка = справочники.Контрагенты.Выбрать();
Пока Выборка.следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Если Выборка.КЛ.Пустая() Тогда
Сообщить(“обычное !!!”+Выборка.Наименование);
КонецЕсли;
КонецЦикла;
– через запрос
ПустаяССылка = справочники.КонтактныеЛица.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Наименование,
| Контрагенты.КЛ
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.КЛ = &ПустаяССылка”;
Запрос.УстановитьПараметр(“ПустаяССылка”, ПустаяССылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(“ЗАПРОС !!!”+ВыборкаДетальныеЗаписи.Наименование);
КонецЦикла;
————————————————————-
Обратная связь:
1. Нового много, очень много :))) Практически вся информация для меня новая!!! Но, тем не менее уже после прохождения 0-го и 1-го блока в конфигураторе 8.2 чувствую себя достаточно уверенно. Уже знаю что где надо искать, правда не всегда удается быстро найти :)))
2. Очень сильных затруднений не возникает, хотя иногда приходиться заново прослушивать отдельные темы. Могу лишь отметить, что объясняете все доходчиво и доступно! А вот в голове, к сожалению, не все с первого раза откладывается :)))
3. Очень интересна тема касающаяся Запросов и темы связанные с общими модулями, модулями приложений, модулями сеансов.
>правда не всегда удается быстро найти :)
Это придет с опытом.
Спасибо :)
Задание выполнил.
Соответствие контактных лиц храню в регистре сведений. На форму “контрагента” вывожу динамический список в виде запроса по регистру “Контактные лица” и справочнику контактные лица. Пока не очень удобно заносить новое контактное лицо – сначала добавляется запись, а уже в ней создаем новое контактное лицо. Вообщем надо над этим поработать.
Для хранения единиц измерения создал подчиненный справочник (подчинен номенклатуре) “Единицы измерения”. На форму вывожу динамический список с отбором по владельцу.
Обработка – запрос по справочнику и регистру сведений.
Обратная связь:
1) клиент- серверное взаимодействие. Директивы компиляции, общие модули, доступность методов и объектов на разных сторонах.
2) клиент-серверное взаимодействие, события форм, преобразование объекта формы в нормальный объект.Помогают видео, особенно отдельный блок по формам.
3) Пока не все события форм и модулей улеглись в голове. Может стоит вынести, либо еще раз пересмотреть :) Как то с трудом воспринимаю событие формы “при создании на сервере”, что в нем стоит делать, чего не стоит… и тп
Забыл добавить про новое – динамический список, сильная штука
Задание сделано.
Созданы следующие справочники:
Контрагенты ,
Контактные лица ,
Должности ,
Номенклатура ,
Классификатор единиц измерения ,
с соответствующими свойствами иерархии и реквизитами, необходимыми по условию задания.
Создано перечисление Виды номенклатуры для значений – товар, услуга, набор.
В сравочнике Номенклатура создана табличная часть Единица измерения с двумя полями, для единицы измерения, в которой будет храниться номенклатура, и коэффициента пересчёта текущей единицы в базовую соответственно.
Все необходимые проверки и анализ элементов справочника Номенклатура выполняются в модуле объекта с использованем следующих обработчиков событий:
ОбработкаЗаполнения() ,
ОбработкаПроверкиЗаполнения() ,
ПередЗаписью() .
Создана служебная обработка Проверка контрагентов, в которой проверка контрагентов выполнена при помощи запроса к базе.
Обратная связь:
1. Директивы компиляции.
2. Директивы компиляции.
3. ЗАПРОСЫ.
С запросами мы будем работать в течение всего курса.
Ну а решать мега-задачи с помощью запросов – в продвинутом курсе.
ДЗ выполнил.
– для того чтобы одно и то же контактное лицо могло быть определено для разных контрагентов в справочнике контрагенты определил табличную часть контактактныелица с реквизитами контактное лицо и должность (оба реквизита справочники)
-для необязательности проверки заполнености базовой единицы установил проверку
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры=Перечисления.ВидНоменклатуры.услуга Тогда
ПроверяемыеРеквизиты.Удалить(2);
КонецЕсли;
-про видноменклатуры у родителя:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения<>Неопределено тогда
ВидНоменклатуры=ДанныеЗаполнения.Родитель.ВидНоменклатуры;
-несколько единицизмерения делал через табличную часть справочника Номенклатура
-Обработку ПроверкаКонтрагентов делал простым перебором и проверкой на пустое значение с откидыванием групп
1.новое это разделение “на клиенте” “на сервере” – пока никак в голове не уложиться
2.самая большая трудность это ограниченность времени – присоединяюсь к высказанным пожеланиям других участников немного растянуть курс по времени….
3.хотелось бы какой нибудь обобщающий материал со сквозным примером по главе 3 из первого блока
2-3. Пожелание записали.
Д.З. №6 Выполнил.
Созданы справочники Контрагенты и Контактные лица. В справочнике Контрагенты создана табличная часть Работники с двумя реквизитами Должность и Работник.
Созданы справочники КонтактныеЛица и КлассификаторЕдиницИзмерения.
Для выбора вида номенклатуры используется соответствующее Перечисление.
Для справочника Номенклатура определены реквизиты ВидНоменклатуры с типом данных ПеречислениеСсылка.ВидНоменклатуры и БазоваяЕдиницаИзмерения с типом данных СправочникСсылка.КлассификаторЕдиницИзмерения.
Также в модуле объекта справочника Номенклатура определены процедуры ОбработкаПроверкиЗаполнения и ОбработкаЗаполнения.
Содержимое первой процедуры:
Если ВидНоменклатуры=Перечисления.ВидНоменклатуры.Услуга Тогда Отказ = Ложь
Иначе Отказ = БазоваяЕдиницаИзмерения.Пустая()
КонецЕсли
Содержимое второй процедуры:
Если ДанныеЗаполнения<>Неопределено Тогда
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры;
КонецЕсли
Для выбора контрагентов, у которых не задано контактное лицо используется обработка.
Обратная связь по первому блоку:
1. Учитывая, что изучаю материал с нуля, то новое – почти все.
2. При просмотре видеороликов складывается ошибочное впечатление понимания всего материала, но как только доходит дело до самостоятельной реализации – появляются проблемы и приходится пересматривать видеоролики по нескольку раз.
3. Пока затрудняюсь ответить на данный вопрос. Буквально вся информация новая, для начала необходимо усвоить этот материал.
P.S. По количеству отчетов о выполненных ДЗ наблюдается тенденция значительно уменьшения выполнивших работу слушателей. Это наводит на мысль, что люди не могут по каким-то причинам выполнить работу. Скорее всего, причина не только в нехватке времени, а еще и в некоторых случаях невозможности выполнения ДЗ из-за непонимания как это реализовать (ведь далеко не все являются программистами). Понимание всех механизмов и нюансов возможно только через решение практических задач, причем на первом этапе – это должны быть достаточно простые задачи, максимально приближенные к тем, которые разбираются в видеороликах. Нужно “набить руку” на простых задачах. Может стоит ввести дополнительную рубрику – типа “Простые задачи”, выполнение которых не будет являться обязательным, но они будут позиционироваться для новичков. Как вариант – в ДЗ можно разделять задания по уровню сложности.
Это размышления, а в общем все СУПЕР. Очень нравится обучение на Ваших курсах.
3. Пожелание понятно.
Пока предлагаю такой алгоритм.
Параллельно с просмотром видео выполнять простые примеры в своей базе.
Тогда, не отходя от кассы, будет определенная наработка практики.
Ну а если есть непреодолимые сложности можно писать либо в комментариях на сайт, либо в мастер-группу.
Задание выполнила.
Основные моменты:
Контактные лица для контрагентов храню в регистре сведений “Работники”. Контрагент, КонтактноеЛицо-измерения, Должность-реквизит(строка).
Добавила перечисление ВидыНоменклатуры.
В справочнике Номенклатура для обоих реквизитов ПроверкаЗаполнения – Выдавать ошибку.
В процедуре ОбработкаПроверкиЗаполнения
Если Не ЭтоГруппа И ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”)); КонецЕсли;
В процедуре ОбработкаЗаполнения
НайденныйРодитель = Неопределено;
Если ДанныеЗаполнения<>Неопределено И ДанныеЗаполнения.Свойство(“Родитель”, НайденныйРодитель) <> Неопределено Тогда
ВидНоменклатуры = НайденныйРодитель.ВидНоменклатуры;
КонецЕсли;
Список доступных единиц измерения храню в справочнике ЕдиницыИзмерения, подчиненном Номенклатуре.
Обработка ПроверкаНаличияКонтактныхЛиц:
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| КОЛИЧЕСТВО(Работники.КонтактноеЛицо) КАК КвоЛиц
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Работники КАК Работники
| ПО (Работники.Контрагент = Контрагенты.Ссылка)
|ГДЕ
| Контрагенты.ЭтоГруппа = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО
| Контрагенты.Ссылка”;
Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
ПараметрыОтбора = Новый Структура(“КвоЛиц”,0);
МассивПустых = ТЗ.НайтиСтроки(ПараметрыОтбора);
Список = Новый СписокЗначений;
Для Каждого Эл Из МассивПустых Цикл
Список.Добавить(Эл.Контрагент);
КонецЦикла;
Список возвращаю на клиента и показываю пользователю с помощью ВыбратьЭлемент();
Основные моменты выполнения задания:
– для обеспечения, чтобы одно и тоже контактное лицо могло быть определено для разных контрагентов создала спр. “КонтактныеЛицаКонтрагентов” (подчинен контрагентам) с реквизитами КонтактноеЛицо(ссылка на спр “КонтактныеЛица”) и Должность(описала строкой, но можно и справочником если надо потом отбирать по должностям)
– реквизит Вид в спр.”Номенклатура” – перечисление
– обязательность заполнения в спр. “Номенклатура” реквизитов “Вид” и “БазоваяЕдиницаИзмерения” реализовала через свойство ПроверкаЗаполнения в конфигураторе (в “Выдавать ошибку”), а в модуле объекта прописала
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Вид = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”));
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если НЕ Родитель.Вид.Пустая() Тогда
Вид = Родитель.Вид;
КонецЕсли;
КонецПроцедуры
– для того чтобы учитывать товар в разных единицах измерения создала справочник “ЕдиницыИзмерения”(подчинен “Номенклатура”) с реквизитами ЕдиницаПоКлассификатору(ссылка на спр “КлассификаторЕдиницИзмерения”) и Коэффициент(для пересчета в базовую)
– проверку контрагентов выполнила с помощью запроса
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| КонтактныеЛицаКонтрагентов.КонтактноеЛицо КАК КонтактноеЛицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
| ПО КонтактныеЛицаКонтрагентов.Владелец = Контрагенты.Ссылка
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
| И КонтактноеЛицо ЕСТЬ Null”;
вернув список у кого не заполнены контактные лица
По обратной связи:
1) В этом блоке уже много нового и интересного, но если честно еще не прониклась управляемым интерфейсом, да фишек там много, но обычный как-то пока удобней :)
2) Наибольшие затруднения вызвала глава модули, тяжело запомнить что где надо выполнять и как описывать, но очень помогают схемки которые преподаватель чертит в лекциях, пока приходится частенько к ним возвращаться.
Очень много всяких “полезностей” почти из каждой главы. Особено главы “Модули”, “Формы”.
Хотелось бы (я понимаю впереди еще будет и не мало) побольше работы с формами. Я плохо смотрел или действительно, во втором выпуске мастер-группы по УФ практически ничего нет о программном управлении проверкой заполнения? Хотя в июньском (халявном) выпуске очень легко нашел этот раздел.
А что было в июне? дайте ссылку…
У Контрагентов создал табличную часть “Контактные лица”. Запрос на проверку отсутствия контактных лиц:
“ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕССЫЛКИ(Контрагенты.Ссылка) КАК Контрагент
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (НЕ Контрагенты.ЭтоГруппа)
| И (НЕ Контрагенты.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| КонтрагентыКонтактныеЛица.Ссылка
| ИЗ
| Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица))”;
Создал “КлассификаторЕдиниц” и “ЕдиницыНоменклатуры”, который подчинен Номенклатуре, имеет коеэффициент пересчета. На уровне реквизитов установил проверку на заполнение. При создании нового создается подчиненный элемент единицы, который заполняется базовой единицей. Модуль объекта справочника Номеклатура:
Перем СоздатьЕдиницу;
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга И Не ЭтоГруппа Тогда
ИндексЕдиницы=ПроверяемыеРеквизиты.Найти(“БазоваяЕдиница”);
ПроверяемыеРеквизиты.Удалить(ИндексЕдиницы);
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если СоздатьЕдиницу Тогда
Единица=Справочники.ЕдиницыНоменклатуры.СоздатьЭлемент();
Единица.Владелец=Ссылка;
Единица.Наименование=БазоваяЕдиница.Наименование;
Единица.Единицы=БазоваяЕдиница;
Единица.Коэффициент=1;
Единица.Записать();
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
СоздатьЕдиницу=ЭтоНовый()И (Не ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Услуга) И Не ЭтоГруппа;
КонецПроцедуры
“Публикую” свой вариант заполнения видом номенклатуры по родителю, хотя можно было сделать все проще в ОбработкаЗаполнения().
Модуль формы:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекСправ=РеквизитФормыВЗначение(“Объект”);
Если ТекСправ.ЭтоНовый() Тогда
ТекСправ.ВидНоменклатуры=ТекСправ.Родитель.ВидНоменклатуры;
ЗначениеВРеквизитФормы(ТекСправ,”Объект”);
Иначе
Элементы.БазоваяЕдиница.Доступность=Объект.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Услуга;
КонецЕсли;
КонецПроцедуры
Домашнее задание №6 выполнено.
Объекты конфигурации:
1) Справочник “Контрагенты”. Табличная часть “КонтактныеЛица”, ее реквизиты: КонтактноеЛицо (тип СправочникСсылка.КонтактныеЛица), Должность (тип Строка).
2) Справочник “КонтактныеЛица”. Реквизиты: ДеньРождения (тип Дата), Телефон (тип Строка).
3) Справочник “Номенклатура”. Реквизиты: Вид (тип ПеречислениеСсылка.ВидНоменклатуры), БазоваяЕдиница (тип СправочникСсылка.Единицы, свойство “Связь параметров выбора” = “Отбор.Владелец(Ссылка)”).
4) Справочник “КлассификаторЕдиницИзмерения”.
5) Справочник “Единицы”. Владелец справочник “Номенклатура”. Реквизиты: ЕдиницаИзмерения (тип СправочникСсылка.КлассификаторЕдиницИзмерения), Коэффициент (тип Число (10.3)).
6) Перечисление ” ВидНоменклатуры”. Значения: Товар, Услуга, Набор.
7) Обработка “ПроверкаКонтрагентов”.
Для обеспечения возможности чтобы одно и то же контактное лицо могло быть определено для разных контрагентов используется табличная часть справочника Контрагенты.
Для автоматической установки вида номенклатуры у нового элемента используется:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ДанныеЗаполнения.Родитель) Тогда
Вид = ДанныеЗаполнения.Родитель.Вид;
КонецЕсли;
КонецПроцедуры
Обязательность заполнения реквизитов справочника Номенклатура реализована:
Процедура ПередЗаписью(Отказ)
Если НЕ ЗначениеЗаполнено(Вид) Тогда
Сообщить(“Не выбран вид товара!”);
Отказ = Истина;
ИначеЕсли НЕ Вид = Перечисления.ВидНоменклатуры.Услуга Тогда
//пока не запишем новый элемент Номенклатуры, не сможем записывать подчиненные элементы справочника Единицы
Если ЗначениеЗаполнено(Ссылка) Тогда
Если НЕ ЗначениеЗаполнено(БазоваяЕдиница) Тогда
Сообщить(“Не выбрана базовая единица!”);
Отказ = Истина;
ИначеЕсли БазоваяЕдиница.Коэффициент <> 1 Тогда
Сообщить(“В качестве базовой может быть выбрана только единица с коэффициентом равным 1!”);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Множественность единиц измерения для одного элемента справочника Номенклатура реализована через подчиненность справочника Единицы справочнику Номенклатура.
Обработка “ПроверкаКонтрагентов” проверяет наличие контактных лиц у элемента справочника Контрагенты через проверку количества строк табличной части КонтактныеЛица элемента.
Ответы на вопросы по итогам 1-го блока:
1) Разделение функций сервера и клиента в плане выполнения задач, организация данного разделения на уровне платформы и с помощью программного кода. Новые возможности и приемы работы с классом Справочники по сравнению с версией платформы 7.7. Новый, более удобный по сравнению с 7.7, редактор запросов.
2) Наибольшее затруднение вызывает организация разделения программного кода на серверный и клиентский, возможно сказывается стереотип мышления под версию 7.7. Помогает повторное изучение материалов курса по данному вопросу и практика в конфигураторе.
3) Пока затрудняюсь предложить тему мастер-группы для 1-го блока.
Задание сделала
Оно показалось сильно проще пятого. Проблема была, только когда я пыталась писать обработку проверки заполнения в модуле формы, а не объекта, в этом случае в проверяемых реквизитах только один элемент – “Объект”, но в модуле объекта сразу все заработало.
*****************************
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтотОбъект.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Услуга тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиница”));
КонецЕсли;
КонецПроцедуры
******************************
Под должности сделала отдельный справочник. У номенклатуры подчиненный справочник единиц измерения, в котором обязательный к заполнению реквизит коэффициент.
С обработкой выводящей контрагентов без контактных лиц проблем не возникло.
По общим вопросам:
Очень много нового и полезного! Неприятно удивило наличие очевидных и очень легких в исправлении глюков в платформе, типа того что не отрабатывает процедура ПередЗавершениемРаботыСистемы при закрытии приложения через Файл – Выход. Неужели за столько лет нельзя исправить… Сталкивалась с подобными ошибками в типовой конфе, но все ж они не так очевидны.
Наибольшие затруднения в разделении на клиентское и серверное, модули формы и объекта, путаю педали. Должно с опытом пройти. Самая глобальная проблема, конечно, со временем. Очень высокий темп! Еще не просмотрела последнюю главу первого, а уже во всю второй блок пора… Буду очень рада, если Вы чуть-чуть растяните, первый поток ведь растянули.
Все равно на просмотр, уверена очень интересных, дополнительных материалов мастер группы, к сожалению, времени пока совсем нет. Мне про работу с пользователями не хватило материалов уроков, пришлось копаться в типовой конфигурации, но все необходимое было найдено.
Спасибо! Хороший курс!
Задание выполнено.
Концепция решения скорее всего выходит за рамки базового курса, но “по-простому” делать уже отвык, прошу отнестись с пониманием :) Реализация довольно объемная получилась, поэтому выкладываю кусками.
Все делалось в управляемом приложении.
1. Контрагенты и конт. лица.
Для связи контрагентов и конт. лиц решил использовать регистр сведений “КонтактныеЛицаКонтрагентов” (Измерения – Контрагент, КонтактноеЛицо, Реквизит – Должность).
У контрагента на форму элемента добавил динамический список по таблице регистра. Теперь необходимо реализовать отбор списка по текущему контрагенту. Реализовал это использованием отбора.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭлементыОтбора = КонтактныеЛица.Отбор.Элементы;
ОтборПоКонтрагенту = ЭлементыОтбора.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
ОтборПоКонтрагенту.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Контрагент”);
ОтборПоКонтрагенту.ПравоеЗначение = Объект.Ссылка;
ОтборПоКонтрагенту.Использование = Истина;
КонецПроцедуры
Тоже самое можно было бы сделать и через запрос динамического списка (установив флаг “ПроизвольныйЗапрос” и добавив условие по контрагенту в текст запроса), а текущего контрагента передавать в параметре при открытии формы. Но вариант с отбором думаю предпочтительнее, т.к. в этом случае система автоматически передает в параметре ЗначенияЗаполнения текущего контрагента при открытии формы записи регистра сведений, когда мы будем добавлять новую запись о контактном лице. Форму естественно нужно создать и в обработчике ПриСозданииНаСервере() можно поймать и установить нашего контрагента.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Перем Контрагент;
Если Параметры.ЗначенияЗаполнения.Свойство(“Контрагент”, Контрагент) Тогда //т.к. можем создавать и через форму списка самого регистра
Запись.Контрагент = Контрагент;
КонецЕсли;
КонецПроцедуры
Аналогичные действия проделываем и со справочником “КонтактныеЛица”, отборы разумеется устанавляваем уже по контактному лицу.
Также неплохо бы скрывать одноименные колонки в таблице регистра на форме (т.к. в форме контрагента нам уже не резон показывать колонку “Контрагент”, ведь все записи у нас отфильтрованы по текущему контрагенту, поэтому скрываем, тоже самое по контактному лицу).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Перем Контрагент;
Если Параметры.ЗначенияЗаполнения.Свойство(“Контрагент”, Контрагент) Тогда
Запись.Контрагент = Контрагент;
КонецЕсли;
КонецПроцедуры
2. Номенклатура и единицы измерения
ВидНоменклатуры – создаем перечисление с необходимыми значениями
Для обоих реквизитов номенклатуры устанавливаем в конфигураторе свойство “ПроверкаЗаполнения” в положение “Выдавать ошибку”.
Для выполнения условий задачи в модуле объекта справочника “Номенклатура” в обработчике ОбработкаПроверкиЗаполнения() пишем код:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Очистить(); //можем очистить, потому как ВидНоменклатуры у нас итак в условии
КонецЕсли;
КонецПроцедуры
Более того, желательно вовсе скрыть поле базовой единицы при установке вида номенклатуры – “Услуга”. Для этого в модуле формы создаем необходимый обработчик у поля “ВидНоменклатуры:
&НаКлиенте
Процедура ВидНоменклатурыПриИзменении(Элемент)
Элементы.БазоваяЕдиницаИзмерения.Видимость = НЕ (Объект.ВидНоменклатуры = Услуга);
КонецПроцедуры
А чтобы в клиентской процедуре можно было писать такое условие НЕ (Объект.ВидНоменклатуры = Услуга), предварительно требуется создать реквизит формы (невидимый) “Услуга” и проинициализировать его, там же заполним и “ВидНоменклатуры” по родительской группе:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Услуга = Перечисления.ВидыНоменклатуры.Услуга;
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда //новый элемент, установим “ВидНоменклатуры” по родителю
Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
КонецЕсли;
КонецПроцедуры
Для хранения списка доступных единиц измерения используем подчиненный справочник. При необходимости его также можно вывести непосредственно на форму элемента номенклатуры. В реквизиты естественно добавляем “Коэффициент” для пересчета.
2. Номенклатура и единицы измерения
ВидНоменклатуры – создаем перечисление с необходимыми значениямиДля обоих реквизитов номенклатуры устанавливаем в конфигураторе свойство “ПроверкаЗаполнения” в положение “Выдавать ошибку”.
Для выполнения условий задачи в модуле объекта справочника “Номенклатура” в обработчике ОбработкаПроверкиЗаполнения() пишем код:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Если ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда ПроверяемыеРеквизиты.Очистить(); //можем очистить, потому как ВидНоменклатуры у нас итак в условии КонецЕсли; КонецПроцедуры
Более того, желательно вовсе скрыть поле базовой единицы при установке вида номенклатуры – “Услуга”. Для этого в модуле формы создаем необходимый обработчик у поля “ВидНоменклатуры:
&НаКлиентеПроцедура ВидНоменклатурыПриИзменении(Элемент) Элементы.БазоваяЕдиницаИзмерения.Видимость = НЕ (Объект.ВидНоменклатуры = Услуга); КонецПроцедуры
А чтобы в клиентской процедуре можно было писать такое условие НЕ (Объект.ВидНоменклатуры = Услуга), предварительно требуется создать реквизит формы (невидимый) “Услуга” и проинициализировать его, там же заполним и “ВидНоменклатуры” по родительской группе:
&НаСервереПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Услуга = Перечисления.ВидыНоменклатуры.Услуга; Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда //новый элемент, установим “ВидНоменклатуры” по родителю Объект.ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры; КонецЕсли; КонецПроцедуры
Для хранения списка доступных единиц измерения используем подчиненный справочник. При необходимости его также можно вывести непосредственно на форму элемента номенклатуры. В реквизиты естественно добавляем “Коэффициент” для пересчета.
Похоже стало ясно какие действия приводят к задвоению текста в комментарии. Если уже после копипаста подправить какой-либо фрагмент в форме добавления комментария – имеем весь текст в двойном объеме, с правками и без них. В общем чето надо делать…
3. Служебная обработка “Проверка контрагентов”
&НаКлиенте
Процедура ВыполнитьПоиск(Команда) НайтиКонтрагентовБезКонтактныхЛиц();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура НайтиКонтрагентовБезКонтактныхЛиц() Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | Контрагенты.Ссылка КАК Контрагент, | ЕСТЬNULL(КонтактныеЛицаКонтрагентов.КонтактноеЛицо, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК КонтактноеЛицо |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов | ПО (КонтактныеЛицаКонтрагентов.Контрагент = Контрагенты.Ссылка) |ГДЕ | (НЕ Контрагенты.ЭтоГруппа) | И (НЕ Контрагенты.ПометкаУдаления)”; Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.КонтактноеЛицо.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Отсутствует контактное лицо у контрагента ” + ВыборкаДетальныеЗаписи.Контрагент; Сообщение.Сообщить(); КонецЕсли; КонецЦикла;
КонецПроцедуры
3. Служебная обработка “Проверка контрагентов”
&НаКлиенте
Процедура ВыполнитьПоиск(Команда) НайтиКонтрагентовБезКонтактныхЛиц();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура НайтиКонтрагентовБезКонтактныхЛиц() Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | Контрагенты.Ссылка КАК Контрагент, | ЕСТЬNULL(КонтактныеЛицаКонтрагентов.КонтактноеЛицо, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК КонтактноеЛицо |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов | ПО (КонтактныеЛицаКонтрагентов.Контрагент = Контрагенты.Ссылка) |ГДЕ | (НЕ Контрагенты.ЭтоГруппа) | И (НЕ Контрагенты.ПометкаУдаления)”; Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.КонтактноеЛицо.Пустая() Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Отсутствует контактное лицо у контрагента ” + ВыборкаДетальныеЗаписи.Контрагент; Сообщение.Сообщить(); КонецЕсли; КонецЦикла;
КонецПроцедуры
Все, с листингами завязываю :) Впредь постараюсь быть краток.
Уважаемый Jury, зачем Вы делали запрос, если у Вас идет обработка результата запроса как
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ВыборкаДетальныеЗаписи.КонтактноеЛицо.Пустая() Тогда
Вы должны были получить список контрагентов в результате запроса, а не формировать его перебирая запрос.
Да легко. Просто сделал скидку на уровень базового курса. По-хорошему конечно же нужно было фильтровать в запросе.
Скидку на базовый курс не нужно делать :)
Пишите наиболее оптимально, используя все инструменты, которыми владеете.
Задание выполнено.
В спр Номенклатура для проверки заполнения использовала в МодулеОбъекта “ОбработкаПроверкиЗаполнения” и для заполнения на основе родителя “ОбработкаЗаполнения”
Для учета покупки и реализации товара не только в базовых величинах в спр Номенклатура бала добавлена таб. часть с указанием единиц и коэф., но этот момент особенно интересен как его лучше реализовать.
По запросу для хранения контактных лиц использовала таб часть
ВЫБРАТЬ
Контрагенты.Ссылка КАК Котрагенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
(НЕ Контрагенты.ЭтоГруппа)
И (НЕ Контрагенты.Ссылка В
(ВЫБРАТЬ
КонтрагентыКотракты.Ссылка
ИЗ
Справочник.Контрагенты.Котракты КАК КонтрагентыКотракты
ГДЕ
(НЕ КонтрагентыКотракты.Ссылка.ЭтоГруппа)))
ВЫБРАТЬ Контрагенты.Ссылка КАК Котрагенты ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (НЕ Контрагенты.ЭтоГруппа) И (НЕ Контрагенты.Ссылка В (ВЫБРАТЬ КонтрагентыКотракты.Ссылка ИЗ Справочник.Контрагенты.Котракты КАК КонтрагентыКотракты ГДЕ (НЕ КонтрагентыКотракты.Ссылка.ЭтоГруппа)))
По вопросам:
Новое все что касается Клиент, Сервер и обращение между ними.
Задание выполнил!
Пришлось возвращаться и переслушивать некоторые моменты, голова еще «дырявая» в некоторых моментах.
1) Что касается задания. Справочники создал, Контрагенты не владелец справочника Контактные лица.
Справочник Номенклатура оба созданных реквизита проверка заполнения – выдавать ошибку.
Проверка вида номенклатуры выполнялась в модуле объекта, в процедуре ОбработкаПроверкиЗаполнения.
Если видноменклатуры=Перечисления.ВидНоменклатуры.Услуга тогда
ПроверяемыеРеквизиты.удалить(2);
конецесли;
Определение вида номенклатуры у родительской группы. МодульОбъекта
Процедура ОбработкаЗаполнения. Основное что хотел бы отметить если добавляю группу выскакивала ошибка, добавил условие
если не типзнч(ДанныеЗаполнения)=тип(“Неопределено”) тогда
а проверка вида номенклатуры:
Если ДанныеЗаполнения.родитель.видноменклатуры=перечисления.ВидНоменклатуры.Товар
Что касается «Проверки контрагентов» выкладываю модуль формы процедура на сервере:
выборка=справочники.Контрагенты.Выбрать();
пока выборка.Следующий() цикл
если не выборка.ссылка.ЭтоГруппа тогда
если выборка.КонтактноеЛицо.Пустая() тогда
сообщить(выборка.Ссылка);
конецесли;
конецесли;
конеццикла;
обратную связь
2)
А)«Мужики все супер!!». После 7.7 на 8.1/8.2 глаза по-другому смотрят, информации море.
Конечно приходится жертвовать рабочим временем, да и семейным тоже.
Б) Наибольшее затруднение вызвала тема по GUID ссылкам, справочников. Несколько раз просматривал и все же, есть какое-то непонимаение.
В) Помоему пока подробнее ничего не нужно, хотелось бы побольше заданий и желательно после каждой темы.
Задание выполнил. Вроде бы сложностей не возникло, но как показал опыт предыдущих заданий есть подводные камни и нюансы, буду ждать решения.
Обратная связь.
1. Изучаю не с нуля. Но полезных нюансов и мелочей много, спасибо.
2. Затруднений нет, всё изложено очень хорошо.
3. Пока пожеланий нет, возможно это связано с большим объемом – просто нет времени ещё на что-то. Хочется и над монетизацией подумать.
Задание сделал.
– Невнимательно прочитав задание, решил что справочник «Контактные лица» должен быть подчинен «Контрагентам». Создал реквизит у справочника «Контрагенты» содержащий код контактного лица, далее передаю его (ч/з глобальную переменную) в ФормуСписка контактных лиц. Затем очищаю и создаю свой собственный ЭлементОтбораКомпоновкиДанных. Увидев как это работает я вообще убрал подчиненность и в панель навигации (перейти) ФормыЭлемента добавил глобальную команду (контрагенты).
Потом, когда начал создавать реквизиты день рождения и телефон, до меня дошло что нужна табличная часть :)
– Со справочниками «Номенклатура» и «Классификатор единиц измерения» особых проблем не было. По поводу учета не только базовых единиц – нужна была реализация только Пакет-Упаковка-Паллета (я сделал только для них), или универсальный алгоритм?
– Служебная обработка «Проверка контрагентов» без проблем.
Обратная связь:
1) Не то чтобы все новое, но и сказать что я целиком знал хотя бы одну главу я не могу.
2) Затруднения возникают как только начинаю делать ДЗ. Вроде как понимаю, что материал идет для новичков, но вот осмыслить в полном объеме лично я не могу (работа не связанна с 1С).
3) Попробую спросить на примере: ФормаЭлемента Контрагента Алхимов, «перейти», ФормаСписка КонтактныеЛица и там уже установлен отбор (по Алхимову). Так вот как передается этот Алхимов?
3. Это системные вещи. То есть нет кода, который устанавливает этот отбор.
Подобную команду можно было бы реализовать и “вручную”, с помощью кода 1С.
Для этого нужно передавать в метод ОткрытьФорму() второй параметр.
Подробнее см. в решении ДЗ№5, там мы отбираем только не помеченные на удаление объекты.
Сделано. Сложностей не возникло. Поскольку использование регистров сведений пока не рассматривалось, хранение информации о привязке контактных лиц реализовал в табличной части справочника “контрагенты”. В ТЧ 2 реквизита – “Должность” и “КонтактноеЛицо” с типом “СправочникСсылка.КонтактныеЛица”. В качестве типа значения для реквизита “ВидНоменклатуры” использовал перечисление. На счет единиц измерения – опять-таки через ТЧ справочника Номенклатура. В качестве одного из реквизитов – коэффициент пересчета к базовой.
1) Полезного много, не смотря на то, что изучаю не с нуля. Особенно это касается приемов работы, которые при самостоятельном изучении были пропущены. Кроме того, интенсивность занятий и объем материала подталкивает к большей самоорганизации и лучшему планированию своего времени, что тоже приносит свои плоды;
2) Материал понятен;
3) Более подробно про резервное копирование в клиент-серверном варианте, но, полагаю, там слишком много особенностей для каждой из СУБД, да и материал уже к более продвинутому относится.
При создании справочника Контактные лица я вначале хотел сделать его подчиненным справочнику Контрагенты. Но дальнейшая постановка задачи, требующая реализации возможности указания одного и того же контактного лица для разных контрагентов, заставила от этого отказаться и создать независимый справочник контактных лиц, а связь со справочником Контрагенты реализовать добавлением в справочник Контрагенты табличной части Работники, состоящей из двух реквизитов: Должность (тип Строка) и Работник (тип справочник Контактные лица).
Реализовать проверку заполнения реквизита ВидНоменклатуры в справочнике Номенклатура сначала планировал на уровне свойств реквизита, установив свойство «Проверка заполнения» в значение «Выдавать ошибку». Но поскольку из условия дальнейшей задачи следовало, что нужно анализировать определен ли вид номенклатуры у родительской группы, а это значит, что для группы значение этого реквизита может оставляться пустым. Первоначальный способ не подходит, поскольку нужно обеспечить обязательность заполнения реквизита только для элементов, а не групп. Поэтому для реализации проверки заполнения использовал обработку события ОбработкаЗаполнения модуля объекта. При этом сначала для обращения к родителю нового элемента я использовал просто реквизит Родитель как в 8.1, оказалось, что значение этого реквизита пустая ссылка, а чтобы правильно сослаться на родителя необходимо использовать конструкцию ДанныеЗаполнения.Родитель.
Проверку обязательности заполнения реквизитов ВидНомеклатуры и БазоваяЕдиницаИзмерения реализовал в обработчике события ОбработкаПроверкиЗаполнения добавляя ВидНомеклатуры в ПроверяемыеРеквизиты безусловно, а БазоваяЕдиницаИзмерения если ВидНоменклатуры не Услуга.
Для хранения различных единиц измерения создал справочник ЕдиницыИзмерения с реквизитами ЕдиницаИзмерения (тип СпроавчникСсылка.КлассификаторЕдиницИзмерения) и Коэффициент (тип число 10.3) подчиненный справочнику Номенклатура. В обработчике ОбработкаПроверкиЗаполнения которого реализовал проверку на, то что выбранная единица не была равна базовой вводить которую в этот справочник не имеет смысла. А значение реквизита Коэффициент не должно быть нулевым, эту проверку удобно реализовать на уровне свойства «Проверка заполнения».
При создании обработки ПроверкаКонтрагентов следует учитывать, что могут быть контрагенты у которых во-первых пустая табличная часть, а во-вторых табличная часть не пустая, но реквизит работник (контактное лицо) не заполнен. Т.е. итоговый запрос имеет смысл составить как объединение двух запросов, первый из которых находит контрагентов первого типа, а второй соответственно второго. Здесь проще привести текст запроса, чем его описывать:
<CODE>
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.Работники КАК КонтрагентыРаботники
ПО (КонтрагентыРаботники.Ссылка = Контрагенты.Ссылка)
ГДЕ
(НЕ Контрагенты.ЭтоГруппа)
СГРУППИРОВАТЬ ПО
Контрагенты.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыРаботники.Работник) = 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Работники.Работник = ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка) </CODE>
Обратная связь.
Считаю, что данные вопросы имеет смысл задавать сразу при выкладывании материалов блока, поскольку если их держать в голове при изучении блока делая соответствующие пометки обратная связь будет более качественная. Чем нежели вспоминать это после просмотра материалов, по крайней мере для меня.
В первом вопросе, наверно ошибка:
«1. Что нового я узнал в нулевом блоке или в чем поменялись взгляды после изучения
материала?» имеется в виду первый блок, а не нулевой.
Ответы на вопросы:
Узнал много нового, основное из этого разделение контекста на клиентский и серверный.
Особых затруднений материал этого блока не вызвал.
Все темы, кроме запросов раскрыты достаточно полно, но я так понимая запросы будт рассматривать и далее, а вообще на мой взгляд по запросам имеетсмысл сделать отдельный блок.
Задание выполнила.
Сильных затруднений не было.
Контактное лицо и его должность определила как реквизиты справочника контрагентов. Поэтому контрагентов без контактных лиц получилось выбрать запросом только с двумя условиями: КонтактноеЛицо = Значение(Справочник.КонтактныеЛица.ПустаяСслыка) И Не ЭтоГруппа.
Обязательность заполнение реквизитов спр.Номенклатура задала в свойствах реквизитов, а в процедуре ОбработкаПроверкиЗаполнения отменяла обязательное заполнение ед.измерения для услуг.
Вид номенклатуры вновь создаваемого элемента заполняла в процедуре ОбработкаЗаполнения, извлекая Родителя из ДанныхЗаполнения.
Для хранения доступных единиц измерения создала в справочнике номенклатуры табличную часть.
Обратная связь:
1. Новое все.
2. С первым блоком сложностей не возникало.
3. Нет, мне пока имеющихся материалов больше чем достаточно. Даже тематические сессии мастер групп пока оставляю на будущее. Несмотря на очень ясную, систематизированную подачу материала сложно впитывать информацию такими дозами :)
Задание выполнил.
Создал справочники КонтактноеЛицо и Должности.
Создал иерархический справочник Контрагенты. В нем определил 2 реквизита – КонтактноеЛицо и ДолжностьКЛ с типом ссылка на сооветствующие справочники.
Создал перечисление ВидНоменклатуры со значениями товар, услуга, набор.
Создал справочник КлассификаторЕдиницИзмерения. В нем определил табличную часть с двумя реквизитами : ДоступныеЕдиницы (строка), КоэффПересчета(число).
Создал справочник Номенклатура с двумя реквизитами : ВидНоменклатуры типа ПеречислениеСсылка, и БазоваяЕдиницаИзмерения типа ссылка на справочник КлассификаторЕдиницИзмерения.
В модуле объекта справочника Номенклатура в обработчике ОбработкаЗаполнения() делается проверка
Если ДанныеЗаполнения<>Неопределено Тогда ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры.
Там же в обработчике ОбработкаПроверкиЗаполнения() делается проверка
Если ВидНоменклатуры=Перечисления.ВидНоменклатуры.Услуга Тогда Отказ = Ложь
Иначе Отказ = БазоваяЕдиницаИзмерения.Пустая()
Для формы элемента справочника Номенклатура в обработчике ПриОткрытии() делается проверка на разрешение редактирования реквизита ВидНоменклатуры:
Элементы.ВидНоменклатуры.Доступность=Объект.Родитель.Пустая()
Создал обработку ПроверкаКонтрагентов. По кнопке выполняется запрос следующего вида
“ВЫБРАТЬ Контрагенты.Ссылка ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ Контрагенты.КонтактноеЛицо.Ссылка ЕСТЬ NULL И (НЕ Контрагенты.ЭтоГруппа)”
Обратная связь.
1. В 1С я новичок,так что для меня каждая глава – открытие :) Радует то, что знания становятся не обрывками, а чем-то целым.
2. Затруднений особых не было. В теоретической части схемы здорово проясняют ситуацию.
3. Были вопросы об особенностях работы обычных и управляемых форм, но этот вопрос Вы уже сняли в одном бонусных блоков, за что отдельное спасибо.
Хотелось бы побольше уроков по оптимизации клиент-серверного взаимодействия модулей – как правильно и как неправильно.
>Хотелось бы побольше уроков по оптимизации клиент-серверного взаимодействия модулей
Об этом в базовом говорить рано.
Подробно тему раскрываем в продвинутом курсе.
Здравствуйте. ДЗ №6 выполнила.
ВидНоменклатуры – перечисление.
Необязательность заполнения базовой единицы для элемента вида Услуга реализована как в уроках – с помощью обработки проверки заполнения:
<code>Если ЭтотОбъект.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
Поз = ПроверяемыеРеквизиты.Найти(“БазоваяЕдиницаИзмерения”);
ПроверяемыеРеквизиты.Удалить(Поз);
КонецЕсли ;</code>
Подстановка вида номенклатуры родителя в новый элемент в МФ элемента в процедуре при создании на сервере:
<code>Если Параметры.Ключ.Пустая() Тогда
Если Не Объект.Родитель.Пустая() Тогда
ВидНомРодителя = Объект.Родитель.ВидНоменклатуры;
Объект.ВидНоменклатуры = ВидНомРодителя;
КонецЕсли;
КонецЕсли;</code>
здесь анализ параметра формы Ключ – у нового элемента в параметре пустая ссылка.
Для хранения не базовых ед. – подчиненный справочнику Номеклатура справочник ЕдиницыИзмерения с реквизитами ЕдиницаИзКлассификатора и Коэффициент.
В справочнике Контрагенты табличная часть, в которой “живут” контактные лица (тип Справочник.КонтактныеЛица) и их должности.
Проверку на отсутствие контактного лица у контрагента с помощью запроса я не одолела…
<code>Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
КонтактноеЛицо = Выборка.КонтакнтыеЛица;
Если НЕ Выборка.ЭтоГруппа Тогда
Если КонтактноеЛицо.Количество() < 1 Тогда
Сообщить(Выборка.Наименование);
КонецЕсли;
КонецЕсли;
КонецЦикла;</code>
Ответы:
1. В этом блоке для меня уже всё новое-))
2. Главная сложность – директивы компиляции (тема Формы). Очень помогают графические схемы, которые Вы рисуете в особо запутанных местах урока. Да, еще не получилось в свою базу сразу поставить консоль запросов. Разъяснения нашла в самом последнем видео-)))
3. По потребностям новичка в 8.2, информации более чем достаточно, этот вопрос думаю актуален для более опытных. Мне б маховик времени…-)) А если серьёзно, то можно побольше домашних заданий?, для практики по каждой теме, таких чтобы набить руку. Потому что воспроизводить за тренером и делать самостоятельно – немного разные вещи. Тогда, думаю, и вопросы появятся.
P.S. можно я здесь напишу?-)) обратная связь всё же. Я просто в восторге от курса: его подачи, объема, динамичности! Спасибо.
Спасибо, Анастасия :)
Д/З Реализовал.
Снова всё достаточно тривиально.
Приведу лишь процедуры Заполнения и Проверки заполнения для номенклатуры:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Перем ТекРодитель;
Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) Тогда
Если ДанныеЗаполнения.Свойство(“Родитель”, ТекРодитель) Тогда
ДанныеЗаполнения.Вставить(“ВидНоменклатуры”, ТекРодитель.ВидНоменклатуры);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(“БазоваяЕдиница”));
КонецЕсли
КонецПроцедуры
Для хранения контактных лиц я использовал ТЧ, запрос на поиск контрагентов без контактных лиц выглядит так:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
КОЛИЧЕСТВО(КонтрагентыКонтактныеЛица.КонтактноеЛицо) КАК КолКонтЛиц,
КонтрагентыКонтактныеЛица.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
СГРУППИРОВАТЬ ПО
КонтрагентыКонтактныеЛица.Ссылка) КАК ВложенныйЗапрос
ПО Контрагенты.Ссылка = ВложенныйЗапрос.Ссылка
ГДЕ
ЕСТЬNULL(ВложенныйЗапрос.КолКонтЛиц, 0) = 0
И (НЕ Контрагенты.Ссылка.ЭтоГруппа)
Обратная связь:
1). Пользователей разумнее синхронизировать по ГУИД. Работа с универсальным временем и часовыми поясами. “Набил руку” на управляемых формах. Научился заполнять форму незаписанного документа/элемента :)
2). Не было.
3). Работу упр. формами: передача данных с клиента на сервер и обратно, оптимизация, преобразование, работа с ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д.
Задание выполнил.
Справочники “Контрагенты” и “Контактные лица” в БД уже присутствовали. Справочнику “Контрагенты” добавил реквизиты ДеньРождения (дата) и телефон (строка).
Также, добавил реквизит КонтактноеЛицо соответствующего типа. Добавил справочник “Должности”. В справочник “Контрагенты” добавил реквизит ДолжностьКонтактногоЛица соответствующего типа. Хранение информации о должностях контактных лиц в различных организациях лучше было бы наверно сделать в регистре сведений, но этот раздел еще не проходили, решил не забегать вперед.
Создал справочник “Классификатор единиц измерения”. Создал перечисление ВидыНоменклатуры (товар, услуга, набор). Справочник “Номенклатура” в БД уже был, иерархия соответствовала требованиям. Добавил ему реквизиты ВидНоменклатуры (в свойствах реквизита указал использование “Для группы и элемента”) и ЕдиницаИзмерения соответствующих типов.
Реквизит ВидНоменлкатуры сделал обязательным для заполнения через свойства реквизита (проверка заполнения – Выдавать ошибку). Проверку заполнения реквизита ЕдиницаИзмерения организовал в процедуре модуля объекта ПередЗаписью().
В процедуре модуля объекта ОбработкаЗаполнения() задаю значение реквизита ВидНоменклатуры в зависимости от родительского. Кстати, какие в данном случае подводные камни могут быть, если не анализировать заполненность реквизита у родителя, а просто задать код? <code>
ВидНоменклатуры = ДанныеЗаполнения.Родитель.ВидНоменклатуры</code>
Для справочника “Номенклатура” создал табличную часть “ЕдиницыИзмерения” с полями ЕдиницаИзмерения (тип – справочник “Классификатор единиц измерения”) и КоэффициентПересчета (число). Опять же это лучше наверно было сделать через РС, но по обозначенной выше причине не стал опережать события.
Создал обработку, на форме кнопка “Поиск”, простенький запрос выбирает всех контрагентов (кроме групп), у которых не заполнен реквизит Контактное лицо.
Обратная связь:
1. Узнал особенности работы с управляемыми формами, узнал новое о работе с модулями в различных контекстах, а также получил знания об изменившихся свойствах и методах у объектов существовавших в 8.1
2. Затруднений нет, но чувствую, что как то не до конца осознал все нюансы при работе с модулями (наклиенте/насервере). Но это претензия не к курсу и преподавателю, просто информации много, а времени чтобы её как следует переварить – мало. Думаю, четкое понимание придет с опытом работы.
3. Затрудняюсь ответить. Возможно, работа со списками в управляемых формах (заполнение не по дефолту, отборы и т.п.)
Почему то теги на код не сработали…
Как раз для вас только что опубликована новая запись на сайте :)
Это Вы про второй блок курса? :)
Именно.
Странно, у меня в файле со ссылками, нумерация глав начиная с 12 другая. Но в общем понятно, что для выполнения ДЗ нужно осилить весь первый блок.
Fixed :)
Как-бы 13 глава не про запросы а про пользователей… ну по крайней мере по оглавлению..
Совершенно верно, спасибо :)