Для определения поведения прикладных объектов, отличающегося от стандартного, и создания собственных алгоритмов их поведения используется встроенный язык. Программный код выполняется в заранее известных ситуациях, называемых событиями.
Напомним, что в справочнике «Контрагенты» у нас хранится краткое и полное наименование контрагента. Логично предположить, что эти названия будут похожи.
Следовательно, когда пользователь вводит краткое наименование, то желательно его же продублировать в полное наименование, т.е. при событии изменение наименования необходимо выполнить определенные действия. Какие именно действия мы желаем выполнять при наступлении события, система сама предсказать не может, поэтому необходимо самостоятельно написать процедуру, которая должна будет выполняться системой и связать эту процедуру с тем событием, которое обрабатывается.
Откройте форму элемента справочника «Контрагенты» и в палитре свойств поля «Наименование» на закладке «События» нажмите кнопку с лупой (рис. 7.1). Система предложит создать вам новый обработчик события, соглашаемся с созданием обработчика на клиенте и жмем кнопку «ОК».
Рис. 7.1. – Создание события ПриИзменении
Система автоматически добавит на модуль формы текущего справочника
новую процедуру «НаименованиеПриИзменении». Вам необходимо удалить в
процедуре комментарии (как мы уже говорили выше они обозначаются символом //) и
54
написать в процедуру программный код заполнения реквизита
«ПолноеНаименование». Текст процедуры обработчика события у вас должен
получиться следующим:
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
Если Объект.ПолноеНаименование=”” Тогда
Объект.ПолноеНаименование=Объект.Наименование;
КонецЕсли;
КонецПроцедуры
Сохраните конфигурацию и проверьте исполнение вашего кода в пользовательском режиме. Обратите внимание, что система добавляет полное наименование
только при условии, что данное поле пустое. За это отвечает условие «Если Объект.ПолноеНаименование=”” Тогда».
Помимо того, что имеется возможность выполнять какие-то действия при
наступлении события, иногда можно управлять и соответствующими стандартными
действиями платформы, т.е. фактически указывать, произойдет ли данное событие
или нет.
Рассмотрим следующую ситуацию: необходимо, чтобы у услуг ставка НДС
была только 18%. В этом случае необходимо проверить при сохранении элемента,
является ли данный элемент справочника услугой. В том случае, когда элемент номенклатуры является услугой и ставка НДС не 18%, необходимо указать пользователю на недопустимость данной ситуации и не записывать элемент до тех пор, пока
пользователь либо не укажет нужную ставку НДС, либо не укажет, что это товар
(снимет галочку «Услуга»).
Для решения этой задачи откроем форму элемента справочника «Номенклатура» и воспользуемся обработчиком события «ПередЗаписьюНаСервере» для самой
формы – встаньте в корень формы, откройте палитру ее свойств, перейдите на закладку «События» и создайте обработчик события как показано на рис.7.2 и описано
ниже.
Рис. 7.2. – Создание события «ПередЗаписьюНаСервере»
Текст обработчика события:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект,
ПараметрыЗаписи)
Если ТекущийОбъект.Услуга И
(ТекущийОбъект.СтавкаНДС <>
Справочники.СтавкиНДС.НДС18) Тогда
Сообщить(«У услуги ставка НДС может быть только 18%»);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Сохраните сделанные изменения, откройте конфигурацию в пользовательском
режиме и проверьте работоспособность созданного события.
Задание к занятию «Модули»
Результатом всего домашнего задания должен быть один общий файл выгрузки информационной базы (.dt) с конфигурацией, содержащей решения по всем трем задачам.
Задача 1 «Обработчики событий модуля приложения»
Описание задачи
Создать обработчик события ПриНачалеРаботыСистемы, выводящий простейшее приветствие.
Требования к результату
При запуске пользовательского режима выводится простейшее приветствие.
Процесс выполнения
- Используйте конфигурацию УправлениеИТФирмой (https://github.com/netology-code/1c-homeworks/blob/master/homework-1-3.md)
- В модуле приложения создайте обработчик события ПриНачалеРаботыСистемы.
- В его коде выведите простейшее приветствие вызовом Сообщить() или ПоказатьПредупреждение().
Задача 2 «Обработчики событий модуля формы»
Описание задачи
Создать обработчик события ПриИзменении элемента Наименование формы справочника Контрагенты, заполняющий полное наименование — измененным наименованием.
Требования к результату
В справочник Контрагенты добавлена форма элемента, на которой реквизит ПолноеНаименование заполняется значением стандартного реквизита Наименование при его (Наименования) изменении.
Процесс выполнения
- Используйте ту же конфигурацию УправлениеИТФирмой, которую дорабатывали в прошлом задании. Убедитесь, что в справочнике Контрагенты есть реквизит ПолноеНаименование.
- Создайте для справочника Контрагенты форму элемента
- Выберите в форме элемента стандартный реквизит Наименование и создайте обработчик события ПриИзменении этого элемента.
- Проще всего — выбрать это событие из контекстного меню элемента.
- В коде обработчика присвойте реквизиту Объект.ПолноеНаименование значение наименования. Подумайте, требуется ли в данном случае переход на сервер, или действия можно выполнить на клиенте?
- В режиме Предприятия удостоверьтесь, что любое изменение наименования отражается в полном наименовании, но не наоборот.
Задача 3 «Обработчики событий модуля объекта»
Описание задачи
Создать обработчик заполнения справочника Контрагенты, назначающий по умолчанию тип ЮридическоеЛицо.
Требования к результату
При создании нового элемента справочника Контрагенты, реквизит ЮридическоеФизическоеЛицо заполняется автоматически значением ЮридическоеЛицо.
Процесс выполнения
- Используйте ту же конфигурацию УправлениеИТФирмой, которую дорабатывали в прошлом задании. Убедитесь, что в конфигурации есть перечисление ЮридическоеФизическоеЛицо (было описано в https://github.com/netology-code/1c-homeworks/blob/master/homework-1-3.md).
- Откройте модуль объекта справочника Контрагенты и создайте в нем обработчик события ОбработкаЗаполнения.
- Присвойте значению реквизита ЮридическоеФизическоеЛицо значение Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо.
- В режиме Предприятия удостоверьтесь в том, что новым контрагентам сразу назначается тип ЮридическоеЛицо.
Заполнить поле справочника — ПолноеНаименование |
Я |
09.08.17 — 09:12
Есть справочник Контагенты, Необходимо при заполнении стандартного реквизита Наименвание автоматически заполнять реквизит -ПолноеНаименование
в ФормеЭлемента справочника ввожу след код
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
Стр = Элементы.ПолноеНаименование;
Стр = ПолучитьНаименование(ВыбранноеЗначение);
КонецПроцедуры
&НаСервере
Функция ПолучитьНаименование(ВыбранноеЗначение)
Возврат ВыбранноеЗначение.Наименование ;
КонецФункции
ошибка — Справочник.Контрагент.Форма.ФормаЭлемента — переменная не определена ВыбраноеЗначение
что не так?
1 — 09.08.17 — 09:15
Не поверишь — переменная не определена!!!
2 — 09.08.17 — 09:16
Верю )) , признаю, но блин ткните носом что не так
3 — 09.08.17 — 09:17
Ты передаешь в функцию переменную, которая непонятно откуда берется. Ее до этого вызова не существует, определи, что ты передаешь в функцию.
4 — 09.08.17 — 09:19
(2) стаж 10 лет…откуда ты взял ВыбранноеЗначение?
5 — 09.08.17 — 09:20
(0) А что такое ВыбранноеЗначение на клиенте?
6 — 09.08.17 — 09:25
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
Стр = Элементы.ПолноеНаименование;
Стр = ПолучитьНаименование(Элемент);
КонецПроцедуры
&НаСервере
Функция ПолучитьНаименование(Элемент)
Возврат Элемент.Наименование ;
КонецФункции
7 — 09.08.17 — 09:25
правильно?
8 — 09.08.17 — 09:27
(6) кажется, ты вообще не понимаешь, что делаешь
9 — 09.08.17 — 09:28
через функцию нужно вернуть значение поля элемента формы — наименование
10 — 09.08.17 — 09:28
(6) какой смысл у строки Стр = Элементы.ПолноеНаименование;?
11 — 09.08.17 — 09:36
Процедура НаименованиеПриИзменении(Элемент)
Объект.ПолноеНаименование=ОБъект.Наименвание;
КонецПроцедуры
12 — 09.08.17 — 09:40
(11)Взял и сломал мозг ТС. Это не может быть так просто, это же ПРОГРАММИРОВАНИЕ!!!
13 — 09.08.17 — 09:40
(12)Может со сломанным мозгом у него лучше будет получаться:-)
14 — 09.08.17 — 09:44
Респект, Рейв , неужели не нужно вызывать функцию что бы передать значение?
15 — 09.08.17 — 09:47
(14) какую функцию? КОму-то пора отдохнуть похоже
16 — 09.08.17 — 09:59
(14)открой для себя «=»
17 — 09.08.17 — 10:03
(14) Это нужно, если у ссылочного значения пытаешься достучаться до реквизитов
AsadRoman
18 — 09.08.17 — 10:05
По ходу его франчи обучали
0 / 0 / 0 Регистрация: 10.07.2019 Сообщений: 2 |
|
1 |
|
1C 8.x ПолноеНаименование вместо Наименование10.07.2019, 14:48. Показов 5162. Ответов 3
Всем доброго дня! Имеется Справочник Склады с реквизитом ПолноеНаименование. Стандартный реквизит Наименование не заполнен. Также имеется Документ Поступление с реквизитом Склад. Реквизит имеет Тип СправочникСсылка.Склады. Как сделать так, чтобы после выбора склада поле заполнялось данными из реквизита ПолноеНаименование?
0 |
polax 1808 / 1228 / 442 Регистрация: 16.01.2015 Сообщений: 5,394 |
||||
11.07.2019, 00:14 |
2 |
|||
Сообщение было отмечено owlbro как решение Решениеowlbro, Вот любим мы геморрой для себя выдумывать.
Но еще раз. Такой подход доставит просто миллион глупейших проблем. Делай как надо и не выдумывай фигню
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
11.07.2019, 00:33 |
3 |
owlbro, действительно не понятно зачем ломать документ. Легче же починить справочник, почему руками не перезаполнить все склады. Ну или на край написать обработку которая заполнить Наименования как ПолноеНаименования и перезапишет склад.
0 |
0 / 0 / 0 Регистрация: 10.07.2019 Сообщений: 2 |
|
11.07.2019, 00:37 [ТС] |
4 |
polax, спасибо за ответ! Добавлено через 3 минуты
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
11.07.2019, 00:37 |
Помогаю со студенческими работами здесь Нужно чтобы вместо отрицательных чисел становились -1, а вместо положительных + 1. Вместо заглавных вывести строчные буквы, вместо строчных заглавные Hайти и записать вместо x[1] наибольший элемент, а вместо x[2] -наименьший для массива x[1],x[2],…, x[100]. Модифицируйте, пожалуйста, программу так, чтобы вместо 0 выводилось “false”, а вместо 1 – ”true” Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 4 |
Такие реквизиты как Наименование и ПолноеНаименование, в форме списка справочника на графе реквизита ПолноеНаименование позиционируюсь и изменяю свойства, далее создаю процедуру:»СправочникСписокПолноеНаименованиеПриИзменении(Элемент)» в которой пишу «Наименование=ПолноеНаименование;», — что не так, как нужно?
Нужно обратиться к данным строки списка
что значит официально? с 8кой 2005 скуль идет
Я бы попробовал так: ЭлементыФормы.Наименование=ЭлементыФормы.ПолноеНаименование;
Я бы не стал так пробовать
2 NDV: пишет следующее: Справочник.Контрагенты.Форма.ФормаСписка}: Поле объекта не обнаружено (Наименование) ЭлементыФормы.Наименование=ЭлементыФормы.ПолноеНаименование;
2 dimoff: как обратиться?
Например, так: ЭлементыФормы.СправочникСписок.ТекущиеДанные.Наименование = ЭлементыФормы.СправочникСписок.ТекущиеДанные.ПолноеНаименование
Тэги:
Комментарии доступны только авторизированным пользователям
6. Обработчик события
Для определения поведения прикладных объектов отличного от
стандартного и создания собственных алгоритмов их поведения используется
встроенный язык. Программный код выполняется в заранее известных
ситуациях, называемых событиями.
В справочнике Контрагенты у нас храниться краткое и полное
наименование контрагента. Логично предположить, что эти названия будут
похожи. Следовательно, когда пользователь вводит краткое наименование
желательно его же продублировать в полное, т.е. при событии изменение
наименования необходимо выполнить определенные действия. Какие именно
действия мы желаем выполнять при наступлении события, система сама
предсказать не может. Необходимо самостоятельно написать процедуру, которая
должна будет выполняться системой, и связать эту процедуру с тем событием,
которое обрабатывается (Рис. 7.1).
Рис. 7.1.
Текст процедуры обработчика события:
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
Если Объект.ПолноеНаименование = «» Тогда
Объект.ПолноеНаименование = Объект.Наименование;
КонецЕсли;
КонецПроцедуры
Помимо того, что имеется возможность выполнять какие-то действия при
наступлении события, иногда можно управлять и соответствующими
стандартными действиями платформы, т.е. фактически указывать, произойдет
ли данное событие или нет.
Рассмотрим следующую ситуацию: необходимо для каждой
номенклатурной позиции указать ставку НДС, причем у услуг ставка НДС
должна быть только 18%. В этом случае необходимо проверить при сохранении
элемента, является ли данный элемент справочника услугой.
0
Присваивание значений реквизитам по их идентификатору
Казалось бы, что может быть проще — пишем через точку идентификатор реквизита и присваиваем.
Что-то вроде вот этого:
Код 1C v 8.х
СправочникОбъект.Наименование = "Новое наименование";
Но бывают случаи, когда идентификатор реквизита формируется динамически и какой именно реквизит сейчас надо обработать неизвестно. Что тогда делать?
В 1С 7.7 существовали такие методы объектов, как Справочник.УстановитьАтрибут() и Справочник.ПолучитьАтрибут(), которые позволяли установить значение атрибута объекта по его идентификатору.
А в 1С 8.1 таких методов нет! Что же делать?!
Можно, конечно, написать кучу условий, что-то типа:
Код 1C v 8.х
Если ИмяРеквизита="Наименование" тогда
СправочникОбъект.Наименование = ЗначениеРеквизита;
ИначеЕсли ИмяРеквизита="Код" тогда
СправочникОбъект.Код = ЗначениеРеквизита;
ИначеЕсли
.....
КонецЕсли;
Выглядит совершенно прямолинейно, но работать будет. Вот только если реквизитов будет с полсотни — замучаетесь условия писать.
А на самом деле все просто. Можно использовать вот такую конструкцию:
Код 1C v 8.х
СправочникОбъект[ИмяРеквизита] = ЗначениеРеквизита;
где : ИмяРеквизита — строка идентификатора реквизита справочника (например, «Наименование»)
И вся наша куча условий сводится всего к одной строке кода….
Автор: Николай Николаев