Получение соответствующего реквизита при изменении какого-либо другого реквизита в форме документа.
Базовый приём программирования.
Ocean5
Чем отличается спортсмен-разрядник по дзюдо от уличного драчуна. Прежде всего тем, что дзюдоист до автоматизма натренировал базовые приемы борьбы, неплохо знает технику сложных приемов и имеет хорошую общефизическую подготовку. Уличный боец ознакомился с какими-то, порой сомнительными приёмчиками и самоуверенность его не уже знает границ.
Иногда приходится наблюдать, как некоторые начинающие программисты пытаясь конструировать сложные программные модули, напрочь забывают об элементарных, казалось бы вопросах. Или другая крайность, освоив несколько методов кодирования, программист пытается решить с их помощью не решаемые задачи. Хорошо, когда есть время подумать, спросить на форумах, у коллег. Когда же работаешь на выезде у заказчика и времени в обрез, тогда могут возникнуть серьезные проблемы.
Мастера программирования настоятельно рекомендуют иметь под рукой некоторые часто применяемые части кода, что бы можно быстро было найти и подсмотреть. Ибо даже самая гениальная голова имеет способность что-то забыть, причем в самый неподходящий момент. Материал данной статьи рассчитан для новичков и далее будет описан вполне конкретный случай из практики молодого программиста.
Вдруг, откуда ни возьмись, поступила задача. Изобразить справочник «Должности». Дозаполнить справочник «Сотрудники» должностями сотрудников и сформировать документ «Приказ», в котором при выборе в табличной части сотрудника, должность в соседней графе проставлялась бы автоматически. Друг, опытный программист, уехал в отпуск, на форуме отвечали расплывчатыми формулировками или откровенно ёрничали.. Время шло, а все попытки успеха не имели.
Что делать? Начнем с двух теоретических вопроса. Первый. Что может связывать в документе «Приказ» конкретного сотрудника из одного справочника и должность из другого? Или по другому: как в документе образовать связку между фамилией сотрудника и занимаемой должностью. Таким связующим элементом в системе 1С является параметр. Если нам требуется один выбрать реквизит и соответственно выбрать связанный с ним другой реквизит, то мы должны использовать параметр.
Второй вопрос. Где или на каком уровне мы будем осуществлять поиск соответствующих справочных реквизитов при заполнении документа «Приказ»? Конечно же, на уровне сервера, т.к. нам с нужно обращаться к данным справочника, т.е к данным базы. Отсюда следует то, что мы в модуле документа «Приказ» Должны написать серверный вызов.
Начинаем реализовывать задачу.
1. Создаем объекты конфигурации.
- Справочник «Сотрудники» На закладке данные указываем реквизит должность. Реквизит «Наименование», в котором мы будем указывать фамилия сотрудника задан по умолчанию. В свойствах реквизита «Наименование» можно указать название «Фамилия», которое будет выведено на форме в пользовательском режиме;
- Справочник «Должность» без каких либо реквизитов. В этом справочнике также Реквизит «Наименование», в котором мы будем указывать фамилия сотрудника задан по умолчанию. В свойствах реквизита «Наименование» можно указать название «Фамилия», которое будет выведено на форме в пользовательском режиме;
- Документ «Приказ» имеющий табличную часть с реквизитами «Фамилия» и «Должность»
2. Создаём форму документа «Приказ» и открываем модуль формы этого документа. Когда у нас должна проставляться должность? При изменении фамилии. Следовательно мы должны написать обработчик события при изменении у реквизита «Фамилия». Нажимаем на кнопку с увеличительным стеклом и нас система переводит в модуль формы документа, прописывает название процедуры на клиенте
ТаблицаФамилияПриИзменении(Элемент)
Что нам нужно добиться в данном обработчике? Нам нужно «достучаться» до табличной части. Табличная часть будет нам доступна
Элементы.Таблица.ТекущиеДанные;
Далее нам необходимо обращение на сервер и вот здесь мы в качестве параметров обращения на сервер проставляем Фамилию нашей табличной части Элементы.Таблица.ТекущиеДанные
Что нам сделать: серверную функцию или серверную процедуру? Это – глядя что мы хотим получить. В данном случае мы хотим получить должность Она должна быть нам возвращена. Следовательно, нам более всего подходить функция на сервере Назовем эту функцию ПодставитьДолжность
И так на клиенте мы получаем
Элементы.Таблица.ТекущиеДанные.Должность = ПодставитьДолжность(Элементы.Таблица.ТекущиеДанные.Фамилия)
Скажем прямо такой код читать весьма трудно, поэтому для удобства чтения вводим несколько переменных. После чего Обработчик события ТаблицаФамилияПриИзменении(Элемент) будет выглядеть следующим образом:
&НаКлиенте
Процедура ТаблицаФамилияПриИзменении(Элемент)
ТЧ = Элементы.Таблица.ТекущиеДанные;
Дол = ПодставитьДолжность(ТЧ.Фамилия);
ТЧ.Должность = Дол;
КонецПроцедуры
Как мы должны сконструировать серверную функцию?
Мы должны найти по наименованию сотрудника с параметром Фамилия. Конструкция этой операции выглядит как Справочники.Сотрудники.НайтиПоНаименованию(Фамилия)
И возвратить (т.е. получить) должность найденного сотрудника с параметром фамилия
Возврат Справочники.Сотрудники.НайтиПоНаименованию(Фамилия).Должность
Но опять повторюсь, такой код читать весьма трудно, поэтому для удобства чтения вводим несколько переменных. После чего серверная функция ПодставитьДолжность с параметром Фамилия будет выглядеть следующим образом:
&НаСервере
Функция ПодставитьДолжность(Фамилия)
Спр = Справочники.Сотрудники.НайтиПоНаименованию(Фамилия);
Возврат Спр.Должность;
КонецФункции
Главное во всей этой истории четко определиться параметры и правильно определить объекты конфигурации.