Опубликован: 21.09.2010 | Доступ: свободный | Студентов: 6881 / 2129 | Оценка: 4.62 / 4.38 | Длительность: 06:15:00
Специальности: Бухгалтер
Лекция 5:

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

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Работа с формой документа

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

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

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

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

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

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

Создадим новый регистр накопления ОстаткиМатериалов. Окно редактирования объекта регистра накопления устроено точно так же, как другие подобные окна. На первой вкладке ( рис. 5.10) можно задать имя, синоним, комментарий, и задать очень важный для регистра накопления параметр - вид регистра.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >
Олег Санин
Олег Санин
Украина, Феодосия
Дмитрий Горский
Дмитрий Горский
Россия, Ростов-на-Дону, РГЭУ РИНХ, 2006