Дополнительно
Здесь:
Д – отбор движений;
И – отбор итогов;
+ - не отрицательный;
Движения по регистру будут следующие:
Приход – приход к нам товара (общей суммой) либо денег;
Расход – отгруз нами товара (общей суммой) либо выплата денег.
Переходим к конструированию регистра.
2.13 Первый документ. Приход денег.
У нас есть контрагенты и договора с ними, у нас есть место (регистр), где мы можем хранить информацию по взаиморасчетам с ними. Теперь нам нужен документ, который позволит вводить эти взаиморасчеты. Первым нашим документом будет документ "Приход денег".
В любом документе в 1С есть два поля, присутствующих всегда. Это "ДатаДок" – дата документа и "НомерДок" – номер документа. 1С позволяет завести еще сколько надо полей, которые будут присутствовать во всех документах. Это "Общие реквизиты" документа. Заведем один такой общий реквизит – "Комментарий" текстового типа длиной не более 100 символов. Назначение его ясно из названия.
Обговорим теперь структуру нашего документа "Приход денег". Кроме полей с датой, номером и комментарием нам, разумеется, понадобится указание – кто нам эти деньги платит? – "Контрагент", на каком основании он платит нам эти деньги? – "Договор", сколько денег он нам платит? – "Сумма". Типы полей "Контрагент" и "Договор" - соответствующие справочники. Поле "Сумма" будет у нас Число 9.2. Создадим этот документ.
Здесь необходимо дать пояснение, что такое проведение документа. Проведение документа – это внесение соответствующих изменений в механизмы хранения данных (в регистры, планы счетов, журналы расчетов). Документ, у которого стоит указание на возможность проведения, может находиться в трех состояниях – не существует (наиболее частое), записан – данные сохранены, проведен – данные сохранены и учтены в механизме хранения данных (если этот механизм не указан, документ все равно считается проведенным) – т. е. совершил какое-то движение в учете.
Журнал – список документов определенного/определенных видов. Имеет экранную форму.
Периодичность – это как часто будет появляться документ с номером 1.
Этим мы покажем, что движение осуществляется по регистрам.
Справочник "Договора" у нас подчиненный, и мы в форме документа указываем, что договора мы будем брать, принадлежащие ранее указанному контрагенту.
Перем СтКонтрагент;
// Это мы добавили переменную, область действия которой
// весь модуль формы документа
//-----------------------------------------------
Процедура ПриОткрытии()
// Это предопределенная процедура, запускается при возникновении
// события – открытие формы документа
// Она сформировалась автоматически, как мы указали в визарде создания
// документов
ПриЗаписиПерепроводить(1);
// Это означает, что если мы проведенный документ изменили, то при
// попытке его сохранения программа попытается его перепровести
СтКонтрагент=Контрагент;
// Инициализируем переменную СтКонтрагент значением реквизита Контрагент
КонецПроцедуры
//-----------------------------------------------
Процедура Контрагент()
Если Контрагент<>СтКонтрагент Тогда
// В поле Контрагент содержимое изменилось
Договор="";
// Очищаем поле Договор
СтКонтрагент=Контрагент;
// Инициализируем переменную СтКонтрагент новым значением
// реквизита Контрагент
КонецЕсли;
КонецПроцедуры
// ********************
Процедура ОбработкаПроведения()
//Здесь следует написать алгоритм проведения документа
КонецПроцедуры
Модуль документа служит для задания правил внесения изменений в механизмы хранения данных.
Процедура ОбработкаПроведения()
// Предопределенная процедура, запускающая механизмы регистрации движений
Если Контрагент.Выбран()=0 Тогда
// Выбран() – метод, возвращающий состояние поля ввода = 1, если поле
// заполнено и 0 если нет
Предупреждение("Контрагент не выбран");
// Вызовем на экран информационное окно с сообщением
НеПроводитьДокумент();
// Указываем, что документ заполнен неправильно – он не должен быть проведен
КонецЕсли;
Если Договор.Выбран()=0 Тогда
Предупреждение("Договор не выбран");
НеПроводитьДокумент();
КонецЕсли;
Если Договор.ДатаДоговора>ДатаДок Тогда
// Договор еще не был заключен на дату документа
Предупреждение("Неверная дата договора");
НеПроводитьДокумент();
КонецЕсли;
// Теперь будем заполнять поля регистра "Взаиморасчеты"
Регистр.Взаиморасчеты.Контрагент = Контрагент;
Регистр.Взаиморасчеты.Договор = Договор;
Регистр.Взаиморасчеты.Сумма = Сумма;
// Движение – поступление денег за продаваемый нами товар
// ФлагДвижения = 4
Регистр.Взаиморасчеты.ФлагДвижения = 4;
// Наш долг возрос, либо долг контрагента уменьшился – на регистр
// пишем сумму приходом
Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
КонецПроцедуры
2.14 Работа с документом.
Документ готов. Проверим его в работе.
Нами точка Актуальности была выставлена на 01.10.2000, а документ от 02.10.2000 – точка актуальности перемещается на последний проведенный документ.
Тут есть еще строчка – Реквизиты справочников. Документ при проведении может менять значения периодических реквизитов справочников! (Если, конечно, это прописать в процедуре ОбработкаПроведения).
2.15 Отчет по долгам.
Мы теперь, по данным нашей программы, должны фирме "Винни-Пух и все все все" – 1000 ед. денег. Это мы можем определить из нашего единственного документа, но когда таких документов будет много, и контрагентов в документах будет тоже много, мы запутаемся. Пусть лучше машина сама показывает нам кто, кому, по какому договору и сколько должен. Для таких целей существуют отчеты. Простейший отчет – "список номенклатуры" – мы уже создавали. Этот отчет у нас был включен в форму списка справочника. Теперь мы создадим отчет, имеющий свою отдельную форму.
Процедура Сформировать()
Запрос=СоздатьОбъект("Запрос");
// Запрос – специальный объект в 1С, служит для получения структурированной
// выборки данных
ТЗ="
|Период с ВыбДата по ВыбДата;
|Контр = Регистр.Взаиморасчеты.Контрагент;
|Дог = Регистр.Взаиморасчеты.Договор;
|Сум = Регистр.Взаиморасчеты.Сумма;
|Функция СумКонОст = КонОст(Сум);
|Группировка Контр упорядочить по Контр.Код;
|";
// Это текст запроса. Подробности в "Описании языка" том 2
Если Запрос.Выполнить(ТЗ)=0 Тогда
Сообщить("Запрос не выполнен");
Возврат;
КонецЕсли;
// Если запрос будет не выполнен по какой либо причине, метод Выполнить()
// вернет 0. Мы сообщим пользователю о произошедшей ошибке, и
// командой Возврат – прервем выполнение процедуры
ИтогоМы=0;
ИтогоНам=0;
// В этих двух переменных мы будем хранить итоговую информацию по долгу
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("");
Таб.ВывестиСекцию("Шапка");
Пока Запрос.Группировка("Контр")=1 Цикл
// Получаем очередную запись из запроса
ТЭ=Запрос.Контр;
// Во временную переменную передаем значение выборки
Долг=Запрос.СумКонОст;
// Определяем суммарный долг по текущему значению выборки
// Дальше уже все знакомые нам методы
Если ТЭ.ЭтоГруппа()=1 Тогда
НазГр=СокрЛП(ТЭ.Наименование);
Если Долг=0 Тогда
ИначеЕсли Долг>0 Тогда
Мы=Долг;
Нам=0;
ИначеЕсли Долг<0 Тогда
Мы=0;
Нам=-Долг;
КонецЕсли;
Таб.ВывестиСекцию("Группа");
Иначе
Наз="("+СокрЛП(Строка(ТЭ.Код))+") "+СокрЛП(ТЭ.Наименование);
Если Долг=0 Тогда
Продолжить;
ИначеЕсли Долг>0 Тогда
Мы=Долг;
Нам=0;
ИтогоМы=ИтогоМы+Мы;
ИначеЕсли Долг<0 Тогда
Мы=0;
Нам=-Долг;
ИтогоНам=ИтогоНам+Нам;
КонецЕсли;
Таб.ВывестиСекцию("Строка");
КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,1);
Таб.Показать("");
КонецПроцедуры
2.16 Документ "Выплата денег".
Документ "Выплата денег" будет практически аналогичен документу "Приход денег". Поэтому мы его создадим простым копированием. И потом внесем в него ряд небольших изменений.
Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
напишем
Регистр.Взаиморасчеты.ДвижениеРасходВыполнить();
Регистр.Взаиморасчеты.ФлагДвижения = 4;
напишем
Регистр.Взаиморасчеты.ФлагДвижения = 3;
Глава 6
2.17 Документ "Изменение цен".
Мы уже упоминали, что документы при проведении могут изменять значения периодических реквизитов справочников. Разумеется, документы могут изменять значения и непериодических реквизитов, но это мало интересно. При изменении периодических, программа будет запоминать когда и с помощью чего меняли значения.
В справочнике "Номенклатура" мы имеем два реквизита интересующего нас типа: "ЦенаП" и "ЦенаР". В их свойствах мы указали, что они могут изменяться документами. Спроектируем такой документ.
Пусть наш документ будет иметь возможность изменять цену не одного товара, а любого количества. Значит наш документ будет содержать многострочную часть. Документ должен иметь возможность изменять сразу и цену поступления и цену реализации. При работе с ценами товара мы хотим видеть, какие цены были до изменения. Эти поля должны быть не редактируемые. Для документа будет заведен отдельный журнал. Создадим этот документ. Все данные по документу сведем в таблицу:
Идентификатор: ИзменениеЦен Журнал: ИзменениеЦен Нумератор: Нет Периодичность: Год Длина: 5 Тип: число Уникальность: да Автонумерация: да Оперативный учет: нет Может являться основанием для документа любого вида?: нет |