Основы разработки прикладных решений для 1С:Предприятие 8.1

Документы, регистры накопления

Разбить на страницы
Показывать лекцию целиком

Цель лекции: научиться создавать документы и настраивать проведение документов по регистрам накопления.

5.1. Создание документа

Напомним, что в предыдущей лекции мы собирались создать документ ПоступлениеМатериалов, который планировалось использовать для отражения в учетной системе факта поступления материалов.

Добавим новый документ в ветви дерева конфигурации .

(рис 5.1) Вкладка Основные окна редактирования свойств документа

Как видите, вкладка Основные похожа на такую же вкладку у справочников. Здесь мы, как обычно, вводим имя, синоним и комментарий. Вкладка Данные предназначена для настройки реквизитов документа. Добавим следующие реквизиты, табл. 5.1.

Реквизиты документа ПоступлениеМатериалов
Имя реквизита Тип Параметры типа
Контрагент СправочникСсылка.Контрагенты
ПредставительКонтрагента СправочникСсылка.ПредставителиКонтрагентов
ОтветственныйСотрудник СправочникСсылка.Сотрудники
СтоимостьМатериалов Число Длина 15, точность 2

На рис 5.2 вы можете видеть вкладку Данные с заполненными реквизитами.

(рис 5.2) Вкладка Данные окна редактирования свойств документа

Как мы говорили выше, с помощью этого документа мы собираемся отражать факт поступления в организацию материалов. Обратите внимание на группу параметров, расположенную в нижней части вкладки Данные. Здесь можно добавлять в документ табличные части и настраивать их свойства.

Табличную часть можно сравнить с обычной таблицей. Эту таблицу заполняют при создании документа. На этапе конфигурирования задаются реквизиты табличной части (то есть - набор колонок, которые входят в состав таблицы), а строки создаются на этапе работы с программой конечного пользователя.

Мы можем добавлять в документ столько табличных частей, сколько нам нужно. В нашем случае мы добавим в документ одну табличную часть, которую назовем Материалы. Для добавления табличной части воспользуемся кнопкой Добавить табличную часть.

После того, как табличная часть добавлена, мы можем добавлять ее реквизиты. При добавлении реквизитов табличной части их параметры настраиваются аналогично параметрам обычных реквизитов документа. В таблице 5.2 вы можете видеть список реквизитов табличной части документа.

Реквизиты табличной части Материалы документа Поступление Материалов
Имя реквизита Тип Параметры типа
Номенклатура СправочникСсылка.Номенклатура
Цена Число Длина 10, точность 2
Количество Число Длина 10, точность 3
Сумма Число Длина 10, точность 2

На рис 5.3 вы можете видеть список реквизитов табличной части Материалы и окно настройки свойств одного из них.

(рис 5.3) Реквизиты табличной части Материалы

Перейдем на вкладку ).

(рис 5.4) Создание формы документа

Здесь мы оставим всё по умолчанию и нажмем на кнопку .

(рис 5.5) Выбор элемента управления

Реквизит СтоимостьМатериалов будет содержать итоговую сумму по стоимости каждой номенклатурной позиции материалов, которые будут добавлены в табличное поле Материалы. Мы планируем автоматически заполнять этот реквизит после ввода данных в табличную часть Материалы. Пользователь не должен вручную редактировать этот параметр.

В предыдущей лекции мы рассматривали вариант ограничения ввода пользователя, блокируя поле. Можно пойти другим путем - изначально, на этапе использования Конструктора форм выбрать для отображения реквизита СтоимостьМатериалов элемент управления, который не предусматривает редактирование данных пользователем. Это - элемент управления Надпись.

Обратите внимание на то, что документ имеет реквизиты по умолчанию Номер и Дата.

Нажмем кнопку .

(рис 5.6) Форма документа после работы редактора форм

Понятно, что форма требует доработки. В частности, нам обязательно нужно написать код, который будет поддерживать в актуальном состоянии поле, которое должно отображать стоимость материалов (сейчас в нем можно видеть текст Надпись7).

Есть ли у нашей формы еще какие-нибудь проблемы, которые нужно решить перед началом ее практического использования?

Для того, чтобы ответить на этот вопрос, лучше всего уже на данном этапе работы с формой запустить решение в режиме 1С:Предприятие и попытаться поработать с формой. Так и поступим.

Поработав с формой в режиме 1С:Предприятие, понимаем, что ей нужны еще некоторые улучшения.

Перечислим доработки, которые мы планируем выполнить:

  • Автоматическое заполнение поля СтоимостьМатериалов на основании данных, введенных в табличное поле.
  • Автоматическое заполнение поля Сумма для каждой строки табличного поля.
  • Ограничение списка представителей контрагентов (поле ПредставительКонтрагента ) тем контрагентом, который выбран в поле Контрагент.
  • Для начала свяжем поле ).

    (рис 5.7) Настройка связи по владельцу

    Проверим поведение формы документа после указанной настройки. Можно отметить одну проблему при использовании полей Контрагент и ПредставительКонтрагента. Опишем эту проблему. Предположим, у нас есть контрагент А, которому соответствуют представители кА1 и кА2. Так же имеется контрагент В, которому соответствуют представители кВ1 и кВ2. В поле Контрагент мы выбрали контрагента А. После этого в поле ПредставительКонтрагента мы можем выбирать лишь из представителей кА1 и кА2. Выберем в поле ПредставительКонтрагента представителя кА1. Если теперь в поле Контрагент выбрать контрагента В, то в поле представителя останется все тот же кА1. В нашей форме нет механизма, который отслеживал бы правильность заполнения поля ПредставительКонтрагента при изменении содержимого поля Контрагент.

    Для того, чтобы это исправить, нам нужно придумать механизм, который отслеживал бы правильность заполнения поля ПредставительКонтрагента при смене значения поля Контрагент. Если при смене контрагента окажется, что новый контрагент не является владельцем элемента справочника ПредставителиКонтрагентов, выбранного в поле ПредставительКонтрагент - поле очищается.

    Создадим обработчик события ПриИзменении для поля Контрагент. Он будет выглядеть следующим образом:

    Процедура КонтрагентПриИзменении(Элемент)
    	Если Не ПредставительКонтрагента.Пустая() Тогда
    		Если Контрагент<>ПредставительКонтрагента.Владелец Тогда
    			ПредставительКонтрагента = 
    			Справочники.ПредставителиКонтрагентов.ПустаяСсылка();
    			Сообщить("Поле ""Представитель контрагента"" очищено");
    		КонецЕсли;
    	КонецЕсли;
    КонецПроцедуры

    В этом коде есть некоторые команды, новые для вас. Рассмотрим их. Управляющая конструкция Если - Тогда - КонецЕсли позволяет управлять ходом программы. На обычном языке вышеприведенный код можно описать так:

    Если поле ПредставительКонтрагента не пустое, тогда, если в поле Контрагент записан контрагент, который не является владельцем данных, записанных в поле ПредставительКонтрагента, очистить поле ПредставительКонтрагента и сообщить об этом.

    Если логическое выражение, которое вычисляется после ключевого слова Если, истинно, выполняется код, расположенный между Тогда и КонецЕсли. В нашем случае этот код выполнится только в том случае, если в поле ПредставительКонтрагента что-то есть.

    Функция Пустая() возвращает значение Истина, если ссылка (в нашем случае - ссылка на элемент справочника) не указывает ни на какой объект, то есть ссылка пустая. Если ссылка не пустая - функция возвращает Ложь. Результат вычисления логического выражения Не Ложь получается Истина и начинается выполнение кода. Если же ссылка пустая, ничего модифицировать не нужно и выполнение программы прекращается.

    Когда выполнилось первое условие, проверяется второе условие. А именно - если владелец элемента справочника, ссылка на который соответствует данным, хранящимся в поле ) при выводе сообщения.

    (рис 5.8) Сообщение, выводимое программой

    Как видите, с проблемой взаимосвязи полей Контрагент и Представитель контрагента мы справились. Но впереди еще одна проблема - автоматический расчет сумм по каждой номенклатурной позиции, добавленной в табличное поле.

    Для того, чтобы система автоматически рассчитывала поле Сумма для каждой номенклатурной позиции, нам понадобится написать обработчик событий изменений полей таблицы. А именно - при изменении поля Цена или Количество в поле Сумма должен подставляться результат умножения цены и количества материалов.

    Сразу же можно обратить внимание на то, что код, который будет пересчитывать значение в поле Сумма будет одинаковым и при изменении поля Цена и при изменении поля Количество, поэтому его мы сразу вынесем в отдельную процедуру. Создадим эту процедуру:

    Процедура РассчитатьСумму()
    	ТекущаяСтрока=ЭлементыФормы.Материалы.ТекущиеДанные;
    	ТекущаяСтрока.Сумма=ТекущаяСтрока.Цена*
    	ТекущаяСтрока.Количество;
    КонецПроцедуры

    Свойство табличного поля ТекущиеДанные содержит данные текущей строки. Для доступа к этим данным мы используем переменную ТекущаяСтрока.

    Создадим два обработчика событий для полей ввода Цена и Количество. Они будут выглядеть так:

    Процедура МатериалыЦенаПриИзменении(Элемент)
    	РассчитатьСумму();
    КонецПроцедуры
    
    Процедура МатериалыКоличествоПриИзменении(Элемент)
    	РассчитатьСумму();
    КонецПроцедуры

    Теперь перейдем к следующему этапу нашей работы - настроим автоматический расчет поля СтоимостьМатериалов. Для этого создадим обработчик события табличного поля ПриОкончанииРедактирования и добавим в него команду для расчета значения общей стоимости материалов:

    Процедура МатериалыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    	СтоимостьМатериалов = Материалы.Итог("Сумма");
    КонецПроцедуры

    Напомним, что табличная часть, с которой мы работаем, называется Материалы. У табличных частей есть метод Итог, который возвращает сумму всех строк в колонке, указанной при его вызове. В нашем случае это - колонка Сумма. В итоге, после каждого изменения табличного поля итоги будут пересчитаны и внесены в поле, связанное с данными СтоимостьМатериалов.

    Напомним еще раз о пользе синтакс-помощника при работе над кодом. Не забывайте пользоваться им для того, чтобы лучше разобраться в предложенных фрагментах кода и узнать что-нибудь новое.

    При добавлении новых строк и редактировании существующих наш механизм работает верно. Но если на данном этапе работы попытаться удалить строку из уже заполненного табличного поля, окажется, что итоговая сумма не пересчитывается. Для того чтобы предусмотреть такую ситуацию, добавим в модуль формы обработчик события ПослеУдаления для табличного поля Материалы:

    Процедура МатериалыПослеУдаления(Элемент)
    	СтоимостьМатериалов = Материалы.Итог("Сумма");
    КонецПроцедуры

    Теперь можно снова испытать наш документ в режиме 1С:Предприятие и убедиться в том, что описанные механизмы функционируют (рис 5.9).

    (рис 5.9) Работа с формой документа

    Остановимся теперь на некоторых особенностях работы с документами в режиме 1С:Предприятие. А именно, обратите внимание на кнопки ОК и Записать, которые расположены в нижней части формы. Кнопка Записать приводит к сохранению информации, введенной в документ (обычно говорят - "к сохранению документа ") в информационной базе. По нажатию на кнопку ОК документ сначала сохраняется в информационной базе, после чего выполняется его проведение. При проведении документ вносит изменения в различные регистры, модификация которых при проведении задана на этапе конфигурирования.

    То есть, записанный документ лишь хранит данные, введенные в него, не оказывая влияния на другие объекты информационной системы, а проведенный документ не только хранится в базе, но и выполняет изменения в других объектах системы. В частности, такими объектами служат регистры.

    5.2. Регистры накопления

    Когда информация, введенная в документ, записана в базу данных, мы уже можем с ней работать. Например, в течение недели в организацию поступали материалы, каждый раз это оформлялось с помощью соответствующего документа. Как можно узнать, сколько и каких материалов имеется в организации? Если информацию о поступивших материалах хранят лишь документы, то для того, чтобы узнать некие итоговые суммы, придется сначала собирать данные о материалах, просматривая все документы (или документы за какой-то период), потом эти данные обрабатывать. Просматривать документы для того, чтобы получить итоговую информацию о материалах, это слишком медленный процесс. Гораздо лучше было бы при проведении документа выписывать важнейшие данные этого документа в какую-нибудь таблицу, работать с которой быстрее и удобнее, чем со множеством документов. Такие таблицы в 1С:Предприятие называются регистрами.

    Выше мы упоминали, что в 1С:Предприятие существуют различные регистры. В частности, это регистры накопления, регистры сведений, регистры расчета и регистры бухгалтерии. В данный момент нас интересуют регистры накопления.

    Создадим новый регистр накопления ) можно задать имя, синоним, комментарий, и задать очень важный для регистра накопления параметр - вид регистра.

    (рис 5.10) Создание нового регистра накопления

    Существует два вида регистров накопления - регистры остатков и регистры оборотов. Сейчас нас интересует регистр остатков, который позволит получить остатки по отдельным материалам на заданную дату.

    Перейдем на вкладку Данные. Здесь можно настроить состав измерений, ресурсов и реквизитов регистра.

    Регистр накопления можно представить в виде многомерной системы координат, осями которой являются измерения, а ресурсы - это данные (числовые), которые хранятся в узлах этой системы координат. Реквизиты позволяют хранить дополнительную информацию произвольного типа.

    Мы хотели бы получать информацию о количестве и стоимости отдельных видов материалов по отдельным ответственным сотрудникам.

    Для этого создадим следующую структуру измерений и ресурсов регистра (табл. 5.3):

    Измерения и ресурсы регистра ОстаткиМатериалов
    Имя измерения или ресурса Тип Параметры типа
    Измерение: Номенклатура СправочникСсылка.Номенклатура
    Измерение: ЦентрОтветственности СправочникСсылка.Сотрудники
    Ресурс: Количество Число Длина 10, точность 3
    Ресурс: Сумма Число Длина 10, точность 2

    На рис 5.11 вы можете видеть вкладку Данные редактируемого регистра накопления.

    (рис 5.11) Состав измерений и ресурсов регистра накопления

    Если мы попытаемся на данном этапе работы запустить конфигурацию в режиме 1С:Предприятие - мы получим следующее сообщение об ошибке:

    РегистрНакопления.ОстаткиМатериалов: Ни один из документов не является регистратором для регистра.

    Регистры накопления не существуют автономно. С регистром обязательно должен быть сопоставлен хотя бы один документ -регистратор.

    5.3. Настройка проведения документа

    Данные для хранения в регистры попадают из документов. В регистре накопления хранятся записи с нужным набором измерений, ресурсов и реквизитов. Каждой записи соответствует регистратор - документ, который сделал эту запись. Записи в регистры выполняются при проведении документа. Этот процесс еще называют формированием движений по регистру.

    Для того чтобы назначить документ ). Сразу после этого станет активна кнопка Конструктор движений в нижней части формы. Документ можно назначить регистратором и из формы настройки свойств регистра.

    (рис 5.12) Начало настройки движений документа

    Обратите внимание на настройки, которые можно задавать на вкладке Движения.

  • Проведение. Может принимать значения Разрешить и Запретить. Определяет возможность проведения документа.
  • Оперативное проведение. Так же принимает значения Разрешить и Запретить. Оперативное проведение - это проведение документа в режиме реального времени. При оперативном проведении документ получает оперативную отметку времени, которая либо соответствует текущему системному времени, либо превышает его - в том случае, если другой документ получил оперативную отметку времени, равную текущему системному времени. В итоге, документы, проведенные в оперативном режиме, выстраиваются в логически верную последовательность, соответствующую последовательности их ввода. При оперативном проведении документов производится контроль различных параметров реального времени. Например, если документ, проводимый оперативно, должен списывать какие-либо материалы, можно осуществить контроль фактического наличия материалов. Если дата документа отличается от текущей, документ может быть проведен в неоперативном режиме.
  • Удаление движений. По умолчанию этот параметр установлен в значение Удалять движения автоматически. Такая установка позволяет автоматически удалять движения, сформированные документом ранее, при перепроведении документа или при отмене проведения. Если вы хотите управлять удалением движений самостоятельно (например, для того, чтобы ускорить работу системы при перепроведении больших документов ), это свойство можно установить в значение Не удалять движения автоматически, но тогда удалять ненужные движения придется, используя средства встроенного языка.
  • Сейчас мы готовы к тому, чтобы настроить процедуру проведения документа. Нажмем на кнопку ).

    (рис 5.13) Форма конструктора движений

    В окне конструктора мы можем выбрать регистр, по которому следует сформировать движение (в нашем случае - это единственный регистр ОстаткиМатериалов. Параметр Тип движения регистра может принимать одно из двух значений: Приход или Расход. В нашем случае здесь нужно оставить значение по умолчанию - то есть - Приход.

    Здесь же нужно указать, какие реквизиты документа и реквизиты табличных частей документа соответствуют измерениям, ресурсам и реквизитам регистра. В нашем случае документ имеет одну табличную часть Материалы - ее следует указать в поле Табличная часть.

    Теперь, если нажать на кнопку Заполнить выражения, конструктор попытается автоматически сопоставить данные документа и регистра.

    Автоматическое заполнение производится, во-первых, с учетом типов, во-вторых, с учетом названий. На рис 5.14 вы можете видеть окно конструктора движений после выбора в поле Табличная часть табличной части Материалы и нажатия на кнопку Заполнить выражения.

    (рис 5.14) Результаты автоматического заполнения выражений

    Автоматическое заполнение сопоставляет документ и регистр, основываясь на именах и типах параметров. Следует обязательно проверять результаты автоматического заполнения выражений. В частности, в нашем случае три выражения заполнены верно. А вот выражение для измерения ЦентрОтветственности, которое, напомним, имеет тип СправочникСсылка.Сотрудники, осталось незаполненным. Обратите внимание на то, что система подсказывает, какой именно реквизит документа (или табличной части документа ) подходит к выделенному в таблице полю регистра. В таблице Реквизиты документа выделяется галочкой тот реквизит, который соответствует выделенному в таблице полю регистра. Причем, одному и тому же полю регистра могут соответствовать несколько реквизитов документа.

    Выделим поле вы можете видеть результат заполнения поля ЦентрОтветственности.

    (рис 5.15) Заполнение поля ЦентрОтветственности

    В поле ЦентрОтветственности подставлен реквизит документа, а в остальные поля - реквизиты табличной части документа. Особенность табличной части заключается в том, что она может содержать несколько строк с информацией о полученных материалах. Одна запись соответствует одной строке. Табличная часть обрабатывается построчно, поэтому мы видим записи такого содержания:

    ТекСтрокаМатериалы.Номенклатура
    ТекСтрокаМатериалы.Количество
    ТекСтрокаМатериалы.Сумма

    Сейчас работа с конструктором движений завершена, нажмем на кнопку .

    (рис 5.16) Процедура ОбработкаПроведения, сформированная автоматически

    Ниже приведен текст процедуры:

    Процедура ОбработкаПроведения(Отказ, Режим)
    	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    	// Данный фрагмент построен конструктором.
    	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    	Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
    		// регистр ОстаткиМатериалов Приход
    		Движение = Движения.ОстаткиМатериалов.Добавить();
    		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    		Движение.Период = Дата;
    		Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
    		Движение.ЦентрОтветственности = ОтветственныйСотрудник;
    		Движение.Количество = ТекСтрокаМатериалы.Количество;
    		Движение.Сумма = ТекСтрокаМатериалы.Сумма;
    	КонецЦикла;
    	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры

    Эта процедура расположена в модуле объекта - то есть - документа.

    Основой процедуры является цикл:

    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
    КонецЦикла;

    Этот цикл выполняется для каждой строки (на нее ссылается переменная ТекСтрокаМатериалы ) табличной части Материалы. То есть, в цикле последовательно перебираются все строки табличной части

    В теле цикла создается новое движение из коллекции движений документа:

    Движение = Движения.ОстаткиМатериалов.Добавить();

    Далее устанавливается вид движения и заполняются реквизиты движения.

    Проверим созданный механизм на практике. В пользовательском режиме создадим новый документ .

    (рис 5.17) Заполненный, но непроведенный документ и регистр накопления

    Провести документ можно нажатием на кнопку ОК - тогда он будет сохранен, проведен и закрыт. Так же можно воспользоваться кнопкой Провести, которая находится на панели управления документа. Этой кнопкой удобно пользоваться в тех случаях, когда вы хотите проверить результаты проведения документа и предполагаете, при необходимости, продолжить заполнение документа или исправить его, и провести снова, или, для отмены проведения, воспользоваться кнопкой Отмена проведения, которая становится активной после проведения документа. Обратите внимание на кнопку Перейти на панели инструментов документа. С ее помощью можно перейти к регистру накопления ОстаткиМатериалов.

    Проведем документ нажатием на кнопку .

    (рис 5.18) Проведение документа

    В регистре появились записи. Это - записи по приходу материалов (в левой части каждой строки мы видим знак "+"), регистратором выступает документ, который мы только что сформировали. Реквизиты Номенклатура, Центр ответственности, Количество, Сумма, заполнены верно.

    5.4. Выводы

    Теперь в нашей конфигурации есть документ, который позволяет отражать в учетной системе поступление материалов, есть механизмы для хранения данных о поступивших материалах и "инфраструктура" в виде набора справочников. Следующим шагом нашей работы станет дальнейшее расширение возможностей документа.

    Страницы:

    Цель лекции: научиться создавать документы и настраивать проведение документов по регистрам накопления.

    5.1. Создание документа

    Напомним, что в предыдущей лекции мы собирались создать документ ПоступлениеМатериалов, который планировалось использовать для отражения в учетной системе факта поступления материалов.

    Добавим новый документ в ветви дерева конфигурации .

    (рис 5.1) Вкладка Основные окна редактирования свойств документа

    Как видите, вкладка Основные похожа на такую же вкладку у справочников. Здесь мы, как обычно, вводим имя, синоним и комментарий. Вкладка Данные предназначена для настройки реквизитов документа. Добавим следующие реквизиты, табл. 5.1.

    Реквизиты документа ПоступлениеМатериалов
    Имя реквизита Тип Параметры типа
    Контрагент СправочникСсылка.Контрагенты
    ПредставительКонтрагента СправочникСсылка.ПредставителиКонтрагентов
    ОтветственныйСотрудник СправочникСсылка.Сотрудники
    СтоимостьМатериалов Число Длина 15, точность 2

    На рис 5.2 вы можете видеть вкладку Данные с заполненными реквизитами.

    (рис 5.2) Вкладка Данные окна редактирования свойств документа

    Как мы говорили выше, с помощью этого документа мы собираемся отражать факт поступления в организацию материалов. Обратите внимание на группу параметров, расположенную в нижней части вкладки Данные. Здесь можно добавлять в документ табличные части и настраивать их свойства.

    Табличную часть можно сравнить с обычной таблицей. Эту таблицу заполняют при создании документа. На этапе конфигурирования задаются реквизиты табличной части (то есть - набор колонок, которые входят в состав таблицы), а строки создаются на этапе работы с программой конечного пользователя.

    Мы можем добавлять в документ столько табличных частей, сколько нам нужно. В нашем случае мы добавим в документ одну табличную часть, которую назовем Материалы. Для добавления табличной части воспользуемся кнопкой Добавить табличную часть.

    После того, как табличная часть добавлена, мы можем добавлять ее реквизиты. При добавлении реквизитов табличной части их параметры настраиваются аналогично параметрам обычных реквизитов документа. В таблице 5.2 вы можете видеть список реквизитов табличной части документа.

    Реквизиты табличной части Материалы документа Поступление Материалов
    Имя реквизита Тип Параметры типа
    Номенклатура СправочникСсылка.Номенклатура
    Цена Число Длина 10, точность 2
    Количество Число Длина 10, точность 3
    Сумма Число Длина 10, точность 2

    На рис 5.3 вы можете видеть список реквизитов табличной части Материалы и окно настройки свойств одного из них.

    (рис 5.3) Реквизиты табличной части Материалы

    Перейдем на вкладку ).

    (рис 5.4) Создание формы документа

    Здесь мы оставим всё по умолчанию и нажмем на кнопку .

    (рис 5.5) Выбор элемента управления

    Реквизит СтоимостьМатериалов будет содержать итоговую сумму по стоимости каждой номенклатурной позиции материалов, которые будут добавлены в табличное поле Материалы. Мы планируем автоматически заполнять этот реквизит после ввода данных в табличную часть Материалы. Пользователь не должен вручную редактировать этот параметр.

    В предыдущей лекции мы рассматривали вариант ограничения ввода пользователя, блокируя поле. Можно пойти другим путем - изначально, на этапе использования Конструктора форм выбрать для отображения реквизита СтоимостьМатериалов элемент управления, который не предусматривает редактирование данных пользователем. Это - элемент управления Надпись.

    Обратите внимание на то, что документ имеет реквизиты по умолчанию Номер и Дата.

    Нажмем кнопку .

    (рис 5.6) Форма документа после работы редактора форм

    Понятно, что форма требует доработки. В частности, нам обязательно нужно написать код, который будет поддерживать в актуальном состоянии поле, которое должно отображать стоимость материалов (сейчас в нем можно видеть текст Надпись7).

    Есть ли у нашей формы еще какие-нибудь проблемы, которые нужно решить перед началом ее практического использования?

    Для того, чтобы ответить на этот вопрос, лучше всего уже на данном этапе работы с формой запустить решение в режиме 1С:Предприятие и попытаться поработать с формой. Так и поступим.

    Поработав с формой в режиме 1С:Предприятие, понимаем, что ей нужны еще некоторые улучшения.

    Перечислим доработки, которые мы планируем выполнить:

  • Автоматическое заполнение поля СтоимостьМатериалов на основании данных, введенных в табличное поле.
  • Автоматическое заполнение поля Сумма для каждой строки табличного поля.
  • Ограничение списка представителей контрагентов (поле ПредставительКонтрагента ) тем контрагентом, который выбран в поле Контрагент.
  • Для начала свяжем поле ).

    (рис 5.7) Настройка связи по владельцу

    Проверим поведение формы документа после указанной настройки. Можно отметить одну проблему при использовании полей Контрагент и ПредставительКонтрагента. Опишем эту проблему. Предположим, у нас есть контрагент А, которому соответствуют представители кА1 и кА2. Так же имеется контрагент В, которому соответствуют представители кВ1 и кВ2. В поле Контрагент мы выбрали контрагента А. После этого в поле ПредставительКонтрагента мы можем выбирать лишь из представителей кА1 и кА2. Выберем в поле ПредставительКонтрагента представителя кА1. Если теперь в поле Контрагент выбрать контрагента В, то в поле представителя останется все тот же кА1. В нашей форме нет механизма, который отслеживал бы правильность заполнения поля ПредставительКонтрагента при изменении содержимого поля Контрагент.

    Для того, чтобы это исправить, нам нужно придумать механизм, который отслеживал бы правильность заполнения поля ПредставительКонтрагента при смене значения поля Контрагент. Если при смене контрагента окажется, что новый контрагент не является владельцем элемента справочника ПредставителиКонтрагентов, выбранного в поле ПредставительКонтрагент - поле очищается.

    Создадим обработчик события ПриИзменении для поля Контрагент. Он будет выглядеть следующим образом:

    Процедура КонтрагентПриИзменении(Элемент)
    	Если Не ПредставительКонтрагента.Пустая() Тогда
    		Если Контрагент<>ПредставительКонтрагента.Владелец Тогда
    			ПредставительКонтрагента = 
    			Справочники.ПредставителиКонтрагентов.ПустаяСсылка();
    			Сообщить("Поле ""Представитель контрагента"" очищено");
    		КонецЕсли;
    	КонецЕсли;
    КонецПроцедуры

    В этом коде есть некоторые команды, новые для вас. Рассмотрим их. Управляющая конструкция Если - Тогда - КонецЕсли позволяет управлять ходом программы. На обычном языке вышеприведенный код можно описать так:

    Если поле ПредставительКонтрагента не пустое, тогда, если в поле Контрагент записан контрагент, который не является владельцем данных, записанных в поле ПредставительКонтрагента, очистить поле ПредставительКонтрагента и сообщить об этом.

    Если логическое выражение, которое вычисляется после ключевого слова Если, истинно, выполняется код, расположенный между Тогда и КонецЕсли. В нашем случае этот код выполнится только в том случае, если в поле ПредставительКонтрагента что-то есть.

    Функция Пустая() возвращает значение Истина, если ссылка (в нашем случае - ссылка на элемент справочника) не указывает ни на какой объект, то есть ссылка пустая. Если ссылка не пустая - функция возвращает Ложь. Результат вычисления логического выражения Не Ложь получается Истина и начинается выполнение кода. Если же ссылка пустая, ничего модифицировать не нужно и выполнение программы прекращается.

    Когда выполнилось первое условие, проверяется второе условие. А именно - если владелец элемента справочника, ссылка на который соответствует данным, хранящимся в поле ) при выводе сообщения.

    (рис 5.8) Сообщение, выводимое программой

    Как видите, с проблемой взаимосвязи полей Контрагент и Представитель контрагента мы справились. Но впереди еще одна проблема - автоматический расчет сумм по каждой номенклатурной позиции, добавленной в табличное поле.

    Для того, чтобы система автоматически рассчитывала поле Сумма для каждой номенклатурной позиции, нам понадобится написать обработчик событий изменений полей таблицы. А именно - при изменении поля Цена или Количество в поле Сумма должен подставляться результат умножения цены и количества материалов.

    Сразу же можно обратить внимание на то, что код, который будет пересчитывать значение в поле Сумма будет одинаковым и при изменении поля Цена и при изменении поля Количество, поэтому его мы сразу вынесем в отдельную процедуру. Создадим эту процедуру:

    Процедура РассчитатьСумму()
    	ТекущаяСтрока=ЭлементыФормы.Материалы.ТекущиеДанные;
    	ТекущаяСтрока.Сумма=ТекущаяСтрока.Цена*
    	ТекущаяСтрока.Количество;
    КонецПроцедуры

    Свойство табличного поля ТекущиеДанные содержит данные текущей строки. Для доступа к этим данным мы используем переменную ТекущаяСтрока.

    Создадим два обработчика событий для полей ввода Цена и Количество. Они будут выглядеть так:

    Процедура МатериалыЦенаПриИзменении(Элемент)
    	РассчитатьСумму();
    КонецПроцедуры
    
    Процедура МатериалыКоличествоПриИзменении(Элемент)
    	РассчитатьСумму();
    КонецПроцедуры

    Теперь перейдем к следующему этапу нашей работы - настроим автоматический расчет поля СтоимостьМатериалов. Для этого создадим обработчик события табличного поля ПриОкончанииРедактирования и добавим в него команду для расчета значения общей стоимости материалов:

    Процедура МатериалыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    	СтоимостьМатериалов = Материалы.Итог("Сумма");
    КонецПроцедуры

    Напомним, что табличная часть, с которой мы работаем, называется Материалы. У табличных частей есть метод Итог, который возвращает сумму всех строк в колонке, указанной при его вызове. В нашем случае это - колонка Сумма. В итоге, после каждого изменения табличного поля итоги будут пересчитаны и внесены в поле, связанное с данными СтоимостьМатериалов.

    Напомним еще раз о пользе синтакс-помощника при работе над кодом. Не забывайте пользоваться им для того, чтобы лучше разобраться в предложенных фрагментах кода и узнать что-нибудь новое.

    При добавлении новых строк и редактировании существующих наш механизм работает верно. Но если на данном этапе работы попытаться удалить строку из уже заполненного табличного поля, окажется, что итоговая сумма не пересчитывается. Для того чтобы предусмотреть такую ситуацию, добавим в модуль формы обработчик события ПослеУдаления для табличного поля Материалы:

    Процедура МатериалыПослеУдаления(Элемент)
    	СтоимостьМатериалов = Материалы.Итог("Сумма");
    КонецПроцедуры

    Теперь можно снова испытать наш документ в режиме 1С:Предприятие и убедиться в том, что описанные механизмы функционируют (рис 5.9).

    (рис 5.9) Работа с формой документа

    Остановимся теперь на некоторых особенностях работы с документами в режиме 1С:Предприятие. А именно, обратите внимание на кнопки ОК и Записать, которые расположены в нижней части формы. Кнопка Записать приводит к сохранению информации, введенной в документ (обычно говорят - "к сохранению документа ") в информационной базе. По нажатию на кнопку ОК документ сначала сохраняется в информационной базе, после чего выполняется его проведение. При проведении документ вносит изменения в различные регистры, модификация которых при проведении задана на этапе конфигурирования.

    То есть, записанный документ лишь хранит данные, введенные в него, не оказывая влияния на другие объекты информационной системы, а проведенный документ не только хранится в базе, но и выполняет изменения в других объектах системы. В частности, такими объектами служат регистры.

    5.2. Регистры накопления

    Когда информация, введенная в документ, записана в базу данных, мы уже можем с ней работать. Например, в течение недели в организацию поступали материалы, каждый раз это оформлялось с помощью соответствующего документа. Как можно узнать, сколько и каких материалов имеется в организации? Если информацию о поступивших материалах хранят лишь документы, то для того, чтобы узнать некие итоговые суммы, придется сначала собирать данные о материалах, просматривая все документы (или документы за какой-то период), потом эти данные обрабатывать. Просматривать документы для того, чтобы получить итоговую информацию о материалах, это слишком медленный процесс. Гораздо лучше было бы при проведении документа выписывать важнейшие данные этого документа в какую-нибудь таблицу, работать с которой быстрее и удобнее, чем со множеством документов. Такие таблицы в 1С:Предприятие называются регистрами.

    Выше мы упоминали, что в 1С:Предприятие существуют различные регистры. В частности, это регистры накопления, регистры сведений, регистры расчета и регистры бухгалтерии. В данный момент нас интересуют регистры накопления.

    Создадим новый регистр накопления ) можно задать имя, синоним, комментарий, и задать очень важный для регистра накопления параметр - вид регистра.

    (рис 5.10) Создание нового регистра накопления

    Существует два вида регистров накопления - регистры остатков и регистры оборотов. Сейчас нас интересует регистр остатков, который позволит получить остатки по отдельным материалам на заданную дату.

    Перейдем на вкладку Данные. Здесь можно настроить состав измерений, ресурсов и реквизитов регистра.

    Регистр накопления можно представить в виде многомерной системы координат, осями которой являются измерения, а ресурсы - это данные (числовые), которые хранятся в узлах этой системы координат. Реквизиты позволяют хранить дополнительную информацию произвольного типа.

    Мы хотели бы получать информацию о количестве и стоимости отдельных видов материалов по отдельным ответственным сотрудникам.

    Для этого создадим следующую структуру измерений и ресурсов регистра (табл. 5.3):

    Измерения и ресурсы регистра ОстаткиМатериалов
    Имя измерения или ресурса Тип Параметры типа
    Измерение: Номенклатура СправочникСсылка.Номенклатура
    Измерение: ЦентрОтветственности СправочникСсылка.Сотрудники
    Ресурс: Количество Число Длина 10, точность 3
    Ресурс: Сумма Число Длина 10, точность 2

    На рис 5.11 вы можете видеть вкладку Данные редактируемого регистра накопления.

    (рис 5.11) Состав измерений и ресурсов регистра накопления

    Если мы попытаемся на данном этапе работы запустить конфигурацию в режиме 1С:Предприятие - мы получим следующее сообщение об ошибке:

    РегистрНакопления.ОстаткиМатериалов: Ни один из документов не является регистратором для регистра.

    Регистры накопления не существуют автономно. С регистром обязательно должен быть сопоставлен хотя бы один документ -регистратор.

    5.3. Настройка проведения документа

    Данные для хранения в регистры попадают из документов. В регистре накопления хранятся записи с нужным набором измерений, ресурсов и реквизитов. Каждой записи соответствует регистратор - документ, который сделал эту запись. Записи в регистры выполняются при проведении документа. Этот процесс еще называют формированием движений по регистру.

    Для того чтобы назначить документ ). Сразу после этого станет активна кнопка Конструктор движений в нижней части формы. Документ можно назначить регистратором и из формы настройки свойств регистра.

    (рис 5.12) Начало настройки движений документа

    Обратите внимание на настройки, которые можно задавать на вкладке Движения.

  • Проведение. Может принимать значения Разрешить и Запретить. Определяет возможность проведения документа.
  • Оперативное проведение. Так же принимает значения Разрешить и Запретить. Оперативное проведение - это проведение документа в режиме реального времени. При оперативном проведении документ получает оперативную отметку времени, которая либо соответствует текущему системному времени, либо превышает его - в том случае, если другой документ получил оперативную отметку времени, равную текущему системному времени. В итоге, документы, проведенные в оперативном режиме, выстраиваются в логически верную последовательность, соответствующую последовательности их ввода. При оперативном проведении документов производится контроль различных параметров реального времени. Например, если документ, проводимый оперативно, должен списывать какие-либо материалы, можно осуществить контроль фактического наличия материалов. Если дата документа отличается от текущей, документ может быть проведен в неоперативном режиме.
  • Удаление движений. По умолчанию этот параметр установлен в значение Удалять движения автоматически. Такая установка позволяет автоматически удалять движения, сформированные документом ранее, при перепроведении документа или при отмене проведения. Если вы хотите управлять удалением движений самостоятельно (например, для того, чтобы ускорить работу системы при перепроведении больших документов ), это свойство можно установить в значение Не удалять движения автоматически, но тогда удалять ненужные движения придется, используя средства встроенного языка.
  • Сейчас мы готовы к тому, чтобы настроить процедуру проведения документа. Нажмем на кнопку ).

    (рис 5.13) Форма конструктора движений

    В окне конструктора мы можем выбрать регистр, по которому следует сформировать движение (в нашем случае - это единственный регистр ОстаткиМатериалов. Параметр Тип движения регистра может принимать одно из двух значений: Приход или Расход. В нашем случае здесь нужно оставить значение по умолчанию - то есть - Приход.

    Здесь же нужно указать, какие реквизиты документа и реквизиты табличных частей документа соответствуют измерениям, ресурсам и реквизитам регистра. В нашем случае документ имеет одну табличную часть Материалы - ее следует указать в поле Табличная часть.

    Теперь, если нажать на кнопку Заполнить выражения, конструктор попытается автоматически сопоставить данные документа и регистра.

    Автоматическое заполнение производится, во-первых, с учетом типов, во-вторых, с учетом названий. На рис 5.14 вы можете видеть окно конструктора движений после выбора в поле Табличная часть табличной части Материалы и нажатия на кнопку Заполнить выражения.

    (рис 5.14) Результаты автоматического заполнения выражений

    Автоматическое заполнение сопоставляет документ и регистр, основываясь на именах и типах параметров. Следует обязательно проверять результаты автоматического заполнения выражений. В частности, в нашем случае три выражения заполнены верно. А вот выражение для измерения ЦентрОтветственности, которое, напомним, имеет тип СправочникСсылка.Сотрудники, осталось незаполненным. Обратите внимание на то, что система подсказывает, какой именно реквизит документа (или табличной части документа ) подходит к выделенному в таблице полю регистра. В таблице Реквизиты документа выделяется галочкой тот реквизит, который соответствует выделенному в таблице полю регистра. Причем, одному и тому же полю регистра могут соответствовать несколько реквизитов документа.

    Выделим поле вы можете видеть результат заполнения поля ЦентрОтветственности.

    (рис 5.15) Заполнение поля ЦентрОтветственности

    В поле ЦентрОтветственности подставлен реквизит документа, а в остальные поля - реквизиты табличной части документа. Особенность табличной части заключается в том, что она может содержать несколько строк с информацией о полученных материалах. Одна запись соответствует одной строке. Табличная часть обрабатывается построчно, поэтому мы видим записи такого содержания:

    ТекСтрокаМатериалы.Номенклатура
    ТекСтрокаМатериалы.Количество
    ТекСтрокаМатериалы.Сумма

    Сейчас работа с конструктором движений завершена, нажмем на кнопку .

    (рис 5.16) Процедура ОбработкаПроведения, сформированная автоматически

    Ниже приведен текст процедуры:

    Процедура ОбработкаПроведения(Отказ, Режим)
    	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    	// Данный фрагмент построен конструктором.
    	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    	Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
    		// регистр ОстаткиМатериалов Приход
    		Движение = Движения.ОстаткиМатериалов.Добавить();
    		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    		Движение.Период = Дата;
    		Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
    		Движение.ЦентрОтветственности = ОтветственныйСотрудник;
    		Движение.Количество = ТекСтрокаМатериалы.Количество;
    		Движение.Сумма = ТекСтрокаМатериалы.Сумма;
    	КонецЦикла;
    	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры

    Эта процедура расположена в модуле объекта - то есть - документа.

    Основой процедуры является цикл:

    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
    КонецЦикла;

    Этот цикл выполняется для каждой строки (на нее ссылается переменная ТекСтрокаМатериалы ) табличной части Материалы. То есть, в цикле последовательно перебираются все строки табличной части

    В теле цикла создается новое движение из коллекции движений документа:

    Движение = Движения.ОстаткиМатериалов.Добавить();

    Далее устанавливается вид движения и заполняются реквизиты движения.

    Проверим созданный механизм на практике. В пользовательском режиме создадим новый документ .

    (рис 5.17) Заполненный, но непроведенный документ и регистр накопления

    Провести документ можно нажатием на кнопку ОК - тогда он будет сохранен, проведен и закрыт. Так же можно воспользоваться кнопкой Провести, которая находится на панели управления документа. Этой кнопкой удобно пользоваться в тех случаях, когда вы хотите проверить результаты проведения документа и предполагаете, при необходимости, продолжить заполнение документа или исправить его, и провести снова, или, для отмены проведения, воспользоваться кнопкой Отмена проведения, которая становится активной после проведения документа. Обратите внимание на кнопку Перейти на панели инструментов документа. С ее помощью можно перейти к регистру накопления ОстаткиМатериалов.

    Проведем документ нажатием на кнопку .

    (рис 5.18) Проведение документа

    В регистре появились записи. Это - записи по приходу материалов (в левой части каждой строки мы видим знак "+"), регистратором выступает документ, который мы только что сформировали. Реквизиты Номенклатура, Центр ответственности, Количество, Сумма, заполнены верно.

    5.4. Выводы

    Теперь в нашей конфигурации есть документ, который позволяет отражать в учетной системе поступление материалов, есть механизмы для хранения данных о поступивших материалах и "инфраструктура" в виде набора справочников. Следующим шагом нашей работы станет дальнейшее расширение возможностей документа.

    Вернуться к учебному плану