Цель лекции: научиться создавать
Напомним, что в предыдущей лекции мы собирались создать
Добавим новый
(рис 5.1) Вкладка Основные окна редактирования свойств документаКак видите, вкладка Основные похожа на такую же вкладку у справочников. Здесь мы, как обычно, вводим имя, синоним и комментарий. Вкладка Данные предназначена для настройки
| Имя реквизита | Тип | Параметры типа |
|---|---|---|
| Контрагент | СправочникСсылка.Контрагенты | |
| ПредставительКонтрагента | СправочникСсылка.ПредставителиКонтрагентов | |
| ОтветственныйСотрудник | СправочникСсылка.Сотрудники | |
| СтоимостьМатериалов | Число | Длина 15, точность 2 |
На рис 5.2 вы можете видеть вкладку Данные с заполненными
(рис 5.2) Вкладка Данные окна редактирования свойств документаКак мы говорили выше, с помощью этого
Табличную часть можно сравнить с обычной таблицей. Эту таблицу заполняют при создании
Мы можем добавлять в
После того, как табличная часть добавлена, мы можем добавлять ее
| Имя реквизита | Тип | Параметры типа |
|---|---|---|
| Номенклатура | СправочникСсылка.Номенклатура | |
| Цена | Число | Длина 10, точность 2 |
| Количество | Число | Длина 10, точность 3 |
| Сумма | Число | Длина 10, точность 2 |
На рис 5.3 вы можете видеть список
(рис 5.3) Реквизиты табличной части МатериалыПерейдем на вкладку ).
(рис 5.4) Создание формы документаЗдесь мы оставим всё по умолчанию и нажмем на кнопку .
(рис 5.5) Выбор элемента управленияВ предыдущей лекции мы рассматривали вариант ограничения ввода пользователя, блокируя поле. Можно пойти другим путем - изначально, на этапе использования Конструктора форм выбрать для отображения
Обратите внимание на то, что
Нажмем кнопку .
(рис 5.6) Форма документа после работы редактора формПонятно, что
Есть ли у нашей
Для того, чтобы ответить на этот вопрос, лучше всего уже на данном этапе работы с
Поработав с
Перечислим доработки, которые мы планируем выполнить:
Для начала свяжем поле ).
(рис 5.7) Настройка связи по владельцу Проверим поведение
Для того, чтобы это исправить, нам нужно придумать механизм, который отслеживал бы правильность заполнения поля ПредставительКонтрагента при смене значения поля Контрагент. Если при смене контрагента окажется, что новый контрагент не является владельцем элемента справочника ПредставителиКонтрагентов, выбранного в поле ПредставительКонтрагент - поле очищается.
Создадим обработчик события ПриИзменении для поля Контрагент. Он будет выглядеть следующим образом:
Процедура КонтрагентПриИзменении(Элемент)
Если Не ПредставительКонтрагента.Пустая() Тогда
Если Контрагент<>ПредставительКонтрагента.Владелец Тогда
ПредставительКонтрагента =
Справочники.ПредставителиКонтрагентов.ПустаяСсылка();
Сообщить("Поле ""Представитель контрагента"" очищено");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом коде есть некоторые команды, новые для вас. Рассмотрим их. Управляющая конструкция Если - Тогда - КонецЕсли позволяет управлять ходом программы. На обычном языке вышеприведенный код можно описать так:
Если поле ПредставительКонтрагента не пустое, тогда, если в поле Контрагент записан контрагент, который не является владельцем данных, записанных в поле ПредставительКонтрагента, очистить поле ПредставительКонтрагента и сообщить об этом.
Если логическое выражение, которое вычисляется после ключевого слова Если, истинно, выполняется код, расположенный между Тогда и КонецЕсли. В нашем случае этот код выполнится только в том случае, если в поле ПредставительКонтрагента что-то есть.
Функция Пустая() возвращает значение Истина, если ссылка (в нашем случае - ссылка на элемент справочника) не указывает ни на какой объект, то есть ссылка пустая. Если ссылка не пустая - функция возвращает Ложь. Результат вычисления логического выражения Не Ложь получается Истина и начинается выполнение кода. Если же ссылка пустая, ничего модифицировать не нужно и выполнение программы прекращается.
Когда выполнилось первое условие, проверяется второе условие. А именно - если владелец элемента справочника, ссылка на который соответствует данным, хранящимся в поле ) при выводе сообщения.
(рис 5.8) Сообщение, выводимое программойКак видите, с проблемой взаимосвязи полей Контрагент и Представитель контрагента мы справились. Но впереди еще одна проблема - автоматический расчет сумм по каждой номенклатурной позиции, добавленной в табличное поле.
Для того, чтобы система автоматически рассчитывала поле Сумма для каждой номенклатурной позиции, нам понадобится написать обработчик событий изменений полей таблицы. А именно - при изменении поля Цена или Количество в поле Сумма должен подставляться результат умножения цены и количества материалов.
Сразу же можно обратить внимание на то, что код, который будет пересчитывать значение в поле Сумма будет одинаковым и при изменении поля Цена и при изменении поля Количество, поэтому его мы сразу вынесем в отдельную процедуру. Создадим эту процедуру:
Процедура РассчитатьСумму() ТекущаяСтрока=ЭлементыФормы.Материалы.ТекущиеДанные; ТекущаяСтрока.Сумма=ТекущаяСтрока.Цена* ТекущаяСтрока.Количество; КонецПроцедуры
Свойство табличного поля ТекущиеДанные содержит данные текущей строки. Для доступа к этим данным мы используем переменную ТекущаяСтрока.
Создадим два обработчика событий для полей ввода Цена и Количество. Они будут выглядеть так:
Процедура МатериалыЦенаПриИзменении(Элемент) РассчитатьСумму(); КонецПроцедуры Процедура МатериалыКоличествоПриИзменении(Элемент) РассчитатьСумму(); КонецПроцедуры
Теперь перейдем к следующему этапу нашей работы - настроим автоматический расчет поля СтоимостьМатериалов. Для этого создадим обработчик события табличного поля ПриОкончанииРедактирования и добавим в него команду для расчета значения общей стоимости материалов:
Процедура МатериалыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
СтоимостьМатериалов = Материалы.Итог("Сумма");
КонецПроцедуры
Напомним, что табличная часть, с которой мы работаем, называется Материалы. У табличных частей есть метод Итог, который возвращает сумму всех строк в колонке, указанной при его вызове. В нашем случае это - колонка Сумма. В итоге, после каждого изменения табличного поля итоги будут пересчитаны и внесены в поле, связанное с данными СтоимостьМатериалов.
Напомним еще раз о пользе синтакс-помощника при работе над кодом. Не забывайте пользоваться им для того, чтобы лучше разобраться в предложенных фрагментах кода и узнать что-нибудь новое.
При добавлении новых строк и редактировании существующих наш механизм работает верно. Но если на данном этапе работы попытаться удалить строку из уже заполненного табличного поля, окажется, что итоговая сумма не пересчитывается. Для того чтобы предусмотреть такую ситуацию, добавим в модуль
Процедура МатериалыПослеУдаления(Элемент)
СтоимостьМатериалов = Материалы.Итог("Сумма");
КонецПроцедуры
Теперь можно снова испытать наш
(рис 5.9) Работа с формой документаОстановимся теперь на некоторых особенностях работы с
То есть, записанный
Когда информация, введенная в
Выше мы упоминали, что в 1С:Предприятие существуют различные регистры. В частности, это
Создадим новый
(рис 5.10) Создание нового регистра накопленияСуществует два вида
Перейдем на вкладку Данные. Здесь можно настроить состав
Мы хотели бы получать информацию о количестве и стоимости отдельных видов материалов по отдельным ответственным сотрудникам.
Для этого создадим следующую структуру
| Имя измерения или ресурса | Тип | Параметры типа |
|---|---|---|
| Измерение: Номенклатура | СправочникСсылка.Номенклатура | |
| Измерение: ЦентрОтветственности | СправочникСсылка.Сотрудники | |
| Ресурс: Количество | Число | Длина 10, точность 3 |
| Ресурс: Сумма | Число | Длина 10, точность 2 |
На рис 5.11 вы можете видеть вкладку Данные редактируемого
(рис 5.11) Состав измерений и ресурсов регистра накопленияЕсли мы попытаемся на данном этапе работы запустить конфигурацию в режиме 1С:Предприятие - мы получим следующее сообщение об ошибке:
РегистрНакопления.ОстаткиМатериалов: Ни один из документов не является регистратором для регистра.
Данные для хранения в регистры попадают из
Для того чтобы назначить
(рис 5.12) Начало настройки движений документаОбратите внимание на настройки, которые можно задавать на вкладке Движения.
Сейчас мы готовы к тому, чтобы настроить процедуру
(рис 5.13) Форма конструктора движенийВ окне конструктора мы можем выбрать регистр, по которому следует сформировать движение (в нашем случае - это единственный регистр ОстаткиМатериалов. Параметр Тип движения регистра может принимать одно из двух значений: Приход или Расход. В нашем случае здесь нужно оставить значение по умолчанию - то есть - Приход.
Здесь же нужно указать, какие
Теперь, если нажать на кнопку Заполнить выражения, конструктор попытается автоматически сопоставить данные
Автоматическое заполнение производится, во-первых, с учетом типов, во-вторых, с учетом названий. На рис 5.14 вы можете видеть окно конструктора движений после выбора в поле Табличная часть табличной части Материалы и нажатия на кнопку Заполнить выражения.
(рис 5.14) Результаты автоматического заполнения выраженийАвтоматическое заполнение сопоставляет
Выделим поле вы можете видеть результат заполнения поля ЦентрОтветственности.
(рис 5.15) Заполнение поля ЦентрОтветственностиВ поле ЦентрОтветственности подставлен
ТекСтрокаМатериалы.Номенклатура ТекСтрокаМатериалы.Количество ТекСтрокаМатериалы.Сумма
Сейчас работа с конструктором движений завершена, нажмем на кнопку .
(рис 5.16) Процедура ОбработкаПроведения, сформированная автоматическиНиже приведен текст процедуры:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
Движение.ЦентрОтветственности = ОтветственныйСотрудник;
Движение.Количество = ТекСтрокаМатериалы.Количество;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Эта процедура расположена в модуле объекта - то есть -
Основой процедуры является цикл:
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл КонецЦикла;
Этот цикл выполняется для каждой строки (на нее ссылается переменная ТекСтрокаМатериалы ) табличной части Материалы. То есть, в цикле последовательно перебираются все строки табличной части
В теле цикла создается новое движение из коллекции движений
Движение = Движения.ОстаткиМатериалов.Добавить();
Далее устанавливается вид движения и заполняются
Проверим созданный механизм на практике. В пользовательском режиме создадим новый
(рис 5.17) Заполненный, но непроведенный документ и регистр накопленияПровести
Проведем
(рис 5.18) Проведение документаВ регистре появились записи. Это - записи по приходу материалов (в левой части каждой строки мы видим знак "+"), регистратором выступает
Теперь в нашей конфигурации есть
Цель лекции: научиться создавать
Напомним, что в предыдущей лекции мы собирались создать
Добавим новый
(рис 5.1) Вкладка Основные окна редактирования свойств документаКак видите, вкладка Основные похожа на такую же вкладку у справочников. Здесь мы, как обычно, вводим имя, синоним и комментарий. Вкладка Данные предназначена для настройки
| Имя реквизита | Тип | Параметры типа |
|---|---|---|
| Контрагент | СправочникСсылка.Контрагенты | |
| ПредставительКонтрагента | СправочникСсылка.ПредставителиКонтрагентов | |
| ОтветственныйСотрудник | СправочникСсылка.Сотрудники | |
| СтоимостьМатериалов | Число | Длина 15, точность 2 |
На рис 5.2 вы можете видеть вкладку Данные с заполненными
(рис 5.2) Вкладка Данные окна редактирования свойств документаКак мы говорили выше, с помощью этого
Табличную часть можно сравнить с обычной таблицей. Эту таблицу заполняют при создании
Мы можем добавлять в
После того, как табличная часть добавлена, мы можем добавлять ее
| Имя реквизита | Тип | Параметры типа |
|---|---|---|
| Номенклатура | СправочникСсылка.Номенклатура | |
| Цена | Число | Длина 10, точность 2 |
| Количество | Число | Длина 10, точность 3 |
| Сумма | Число | Длина 10, точность 2 |
На рис 5.3 вы можете видеть список
(рис 5.3) Реквизиты табличной части МатериалыПерейдем на вкладку ).
(рис 5.4) Создание формы документаЗдесь мы оставим всё по умолчанию и нажмем на кнопку .
(рис 5.5) Выбор элемента управленияВ предыдущей лекции мы рассматривали вариант ограничения ввода пользователя, блокируя поле. Можно пойти другим путем - изначально, на этапе использования Конструктора форм выбрать для отображения
Обратите внимание на то, что
Нажмем кнопку .
(рис 5.6) Форма документа после работы редактора формПонятно, что
Есть ли у нашей
Для того, чтобы ответить на этот вопрос, лучше всего уже на данном этапе работы с
Поработав с
Перечислим доработки, которые мы планируем выполнить:
Для начала свяжем поле ).
(рис 5.7) Настройка связи по владельцуПроверим поведение
Для того, чтобы это исправить, нам нужно придумать механизм, который отслеживал бы правильность заполнения поля ПредставительКонтрагента при смене значения поля Контрагент. Если при смене контрагента окажется, что новый контрагент не является владельцем элемента справочника ПредставителиКонтрагентов, выбранного в поле ПредставительКонтрагент - поле очищается.
Создадим обработчик события ПриИзменении для поля Контрагент. Он будет выглядеть следующим образом:
Процедура КонтрагентПриИзменении(Элемент)
Если Не ПредставительКонтрагента.Пустая() Тогда
Если Контрагент<>ПредставительКонтрагента.Владелец Тогда
ПредставительКонтрагента =
Справочники.ПредставителиКонтрагентов.ПустаяСсылка();
Сообщить("Поле ""Представитель контрагента"" очищено");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом коде есть некоторые команды, новые для вас. Рассмотрим их. Управляющая конструкция Если - Тогда - КонецЕсли позволяет управлять ходом программы. На обычном языке вышеприведенный код можно описать так:
Если поле ПредставительКонтрагента не пустое, тогда, если в поле Контрагент записан контрагент, который не является владельцем данных, записанных в поле ПредставительКонтрагента, очистить поле ПредставительКонтрагента и сообщить об этом.
Если логическое выражение, которое вычисляется после ключевого слова Если, истинно, выполняется код, расположенный между Тогда и КонецЕсли. В нашем случае этот код выполнится только в том случае, если в поле ПредставительКонтрагента что-то есть.
Функция Пустая() возвращает значение Истина, если ссылка (в нашем случае - ссылка на элемент справочника) не указывает ни на какой объект, то есть ссылка пустая. Если ссылка не пустая - функция возвращает Ложь. Результат вычисления логического выражения Не Ложь получается Истина и начинается выполнение кода. Если же ссылка пустая, ничего модифицировать не нужно и выполнение программы прекращается.
Когда выполнилось первое условие, проверяется второе условие. А именно - если владелец элемента справочника, ссылка на который соответствует данным, хранящимся в поле ) при выводе сообщения.
(рис 5.8) Сообщение, выводимое программойКак видите, с проблемой взаимосвязи полей Контрагент и Представитель контрагента мы справились. Но впереди еще одна проблема - автоматический расчет сумм по каждой номенклатурной позиции, добавленной в табличное поле.
Для того, чтобы система автоматически рассчитывала поле Сумма для каждой номенклатурной позиции, нам понадобится написать обработчик событий изменений полей таблицы. А именно - при изменении поля Цена или Количество в поле Сумма должен подставляться результат умножения цены и количества материалов.
Сразу же можно обратить внимание на то, что код, который будет пересчитывать значение в поле Сумма будет одинаковым и при изменении поля Цена и при изменении поля Количество, поэтому его мы сразу вынесем в отдельную процедуру. Создадим эту процедуру:
Процедура РассчитатьСумму() ТекущаяСтрока=ЭлементыФормы.Материалы.ТекущиеДанные; ТекущаяСтрока.Сумма=ТекущаяСтрока.Цена* ТекущаяСтрока.Количество; КонецПроцедуры
Свойство табличного поля ТекущиеДанные содержит данные текущей строки. Для доступа к этим данным мы используем переменную ТекущаяСтрока.
Создадим два обработчика событий для полей ввода Цена и Количество. Они будут выглядеть так:
Процедура МатериалыЦенаПриИзменении(Элемент) РассчитатьСумму(); КонецПроцедуры Процедура МатериалыКоличествоПриИзменении(Элемент) РассчитатьСумму(); КонецПроцедуры
Теперь перейдем к следующему этапу нашей работы - настроим автоматический расчет поля СтоимостьМатериалов. Для этого создадим обработчик события табличного поля ПриОкончанииРедактирования и добавим в него команду для расчета значения общей стоимости материалов:
Процедура МатериалыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
СтоимостьМатериалов = Материалы.Итог("Сумма");
КонецПроцедуры
Напомним, что табличная часть, с которой мы работаем, называется Материалы. У табличных частей есть метод Итог, который возвращает сумму всех строк в колонке, указанной при его вызове. В нашем случае это - колонка Сумма. В итоге, после каждого изменения табличного поля итоги будут пересчитаны и внесены в поле, связанное с данными СтоимостьМатериалов.
Напомним еще раз о пользе синтакс-помощника при работе над кодом. Не забывайте пользоваться им для того, чтобы лучше разобраться в предложенных фрагментах кода и узнать что-нибудь новое.
При добавлении новых строк и редактировании существующих наш механизм работает верно. Но если на данном этапе работы попытаться удалить строку из уже заполненного табличного поля, окажется, что итоговая сумма не пересчитывается. Для того чтобы предусмотреть такую ситуацию, добавим в модуль
Процедура МатериалыПослеУдаления(Элемент)
СтоимостьМатериалов = Материалы.Итог("Сумма");
КонецПроцедуры
Теперь можно снова испытать наш
(рис 5.9) Работа с формой документаОстановимся теперь на некоторых особенностях работы с
То есть, записанный
Когда информация, введенная в
Выше мы упоминали, что в 1С:Предприятие существуют различные регистры. В частности, это
Создадим новый
(рис 5.10) Создание нового регистра накопленияСуществует два вида
Перейдем на вкладку Данные. Здесь можно настроить состав
Мы хотели бы получать информацию о количестве и стоимости отдельных видов материалов по отдельным ответственным сотрудникам.
Для этого создадим следующую структуру
| Имя измерения или ресурса | Тип | Параметры типа |
|---|---|---|
| Измерение: Номенклатура | СправочникСсылка.Номенклатура | |
| Измерение: ЦентрОтветственности | СправочникСсылка.Сотрудники | |
| Ресурс: Количество | Число | Длина 10, точность 3 |
| Ресурс: Сумма | Число | Длина 10, точность 2 |
На рис 5.11 вы можете видеть вкладку Данные редактируемого
(рис 5.11) Состав измерений и ресурсов регистра накопленияЕсли мы попытаемся на данном этапе работы запустить конфигурацию в режиме 1С:Предприятие - мы получим следующее сообщение об ошибке:
РегистрНакопления.ОстаткиМатериалов: Ни один из документов не является регистратором для регистра.
Данные для хранения в регистры попадают из
Для того чтобы назначить
(рис 5.12) Начало настройки движений документаОбратите внимание на настройки, которые можно задавать на вкладке Движения.
Сейчас мы готовы к тому, чтобы настроить процедуру
(рис 5.13) Форма конструктора движенийВ окне конструктора мы можем выбрать регистр, по которому следует сформировать движение (в нашем случае - это единственный регистр ОстаткиМатериалов. Параметр Тип движения регистра может принимать одно из двух значений: Приход или Расход. В нашем случае здесь нужно оставить значение по умолчанию - то есть - Приход.
Здесь же нужно указать, какие
Теперь, если нажать на кнопку Заполнить выражения, конструктор попытается автоматически сопоставить данные
Автоматическое заполнение производится, во-первых, с учетом типов, во-вторых, с учетом названий. На рис 5.14 вы можете видеть окно конструктора движений после выбора в поле Табличная часть табличной части Материалы и нажатия на кнопку Заполнить выражения.
(рис 5.14) Результаты автоматического заполнения выраженийАвтоматическое заполнение сопоставляет
Выделим поле вы можете видеть результат заполнения поля ЦентрОтветственности.
(рис 5.15) Заполнение поля ЦентрОтветственностиВ поле ЦентрОтветственности подставлен
ТекСтрокаМатериалы.Номенклатура ТекСтрокаМатериалы.Количество ТекСтрокаМатериалы.Сумма
Сейчас работа с конструктором движений завершена, нажмем на кнопку .
(рис 5.16) Процедура ОбработкаПроведения, сформированная автоматическиНиже приведен текст процедуры:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
Движение.ЦентрОтветственности = ОтветственныйСотрудник;
Движение.Количество = ТекСтрокаМатериалы.Количество;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Эта процедура расположена в модуле объекта - то есть -
Основой процедуры является цикл:
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл КонецЦикла;
Этот цикл выполняется для каждой строки (на нее ссылается переменная ТекСтрокаМатериалы ) табличной части Материалы. То есть, в цикле последовательно перебираются все строки табличной части
В теле цикла создается новое движение из коллекции движений
Движение = Движения.ОстаткиМатериалов.Добавить();
Далее устанавливается вид движения и заполняются
Проверим созданный механизм на практике. В пользовательском режиме создадим новый
(рис 5.17) Заполненный, но непроведенный документ и регистр накопленияПровести
Проведем
(рис 5.18) Проведение документаВ регистре появились записи. Это - записи по приходу материалов (в левой части каждой строки мы видим знак "+"), регистратором выступает
Теперь в нашей конфигурации есть
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.